From 9693720a3941d8aacb0f38cdc7af5dd86889bb46 Mon Sep 17 00:00:00 2001 From: Grzegorz Zdunek Date: Tue, 30 Jul 2024 11:38:32 +0200 Subject: [PATCH 001/139] [v16] Enable ConPTY by default in terminals on Windows (#44742) * Add `terminal.windowsUseConpty` config option * Calculate `windowsPty` options * Pass `useConpty` to node-pty * Pass `windowsPty` to xterm * Fix test * Replace `terminal.windowsUseConpty` with `terminal.windowsBackend`, pass boolean all the way through * Wait for pty processes to exit before closing the app * Simplify `Array.from` * `GRACEFUL_KILL_MESSAGE` -> `TERMINATE_MESSAGE` * Adjust callsites to async `dispose` * Add `winpty` to ignored words in `cspell.json` --- docs/cspell.json | 1 + .../connect-your-client/teleport-connect.mdx | 2 + .../teleterm/src/mainProcess/mainProcess.ts | 7 ++- .../teleterm/src/mainProcess/types.ts | 9 +++ web/packages/teleterm/src/preload.ts | 9 ++- .../src/services/config/appConfigSchema.ts | 9 +++ .../src/services/pty/fixtures/mocks.ts | 5 +- .../pty/ptyHost/buildPtyOptions.test.ts | 6 +- .../services/pty/ptyHost/buildPtyOptions.ts | 22 +++++-- .../src/services/pty/ptyHost/ptyHostClient.ts | 1 + .../src/services/pty/ptyHost/ptyProcess.ts | 2 +- .../services/pty/ptyHost/windowsPty.test.ts | 61 +++++++++++++++++++ .../src/services/pty/ptyHost/windowsPty.ts | 49 +++++++++++++++ .../teleterm/src/services/pty/ptyService.ts | 12 +++- .../teleterm/src/services/pty/types.ts | 21 +++++++ .../api/proto/ptyHostService.proto | 1 + .../api/protogen/ptyHostService_pb.ts | 14 ++++- .../ptyHost/ptyEventsStreamHandler.ts | 8 +-- .../sharedProcess/ptyHost/ptyHostService.ts | 12 +++- .../sharedProcess/ptyHost/ptyProcess.test.ts | 1 + .../src/sharedProcess/ptyHost/ptyProcess.ts | 49 +++++++++++++-- .../src/sharedProcess/ptyHost/types.ts | 4 +- .../src/sharedProcess/sharedProcess.ts | 14 +++-- .../ui/DocumentTerminal/DocumentTerminal.tsx | 1 + .../ui/DocumentTerminal/Terminal/Terminal.tsx | 3 + .../src/ui/DocumentTerminal/Terminal/ctrl.ts | 6 ++ .../useDocumentTerminal.test.tsx | 2 + .../DocumentTerminal/useDocumentTerminal.ts | 17 ++++-- 28 files changed, 311 insertions(+), 37 deletions(-) create mode 100644 web/packages/teleterm/src/services/pty/ptyHost/windowsPty.test.ts create mode 100644 web/packages/teleterm/src/services/pty/ptyHost/windowsPty.ts diff --git a/docs/cspell.json b/docs/cspell.json index 34e99df55ff2e..ce8e71e5ad1d3 100644 --- a/docs/cspell.json +++ b/docs/cspell.json @@ -958,6 +958,7 @@ "winadj", "windowsaccountname", "windowsdesktop", + "winpty", "winscp", "winserver", "workgroups", diff --git a/docs/pages/connect-your-client/teleport-connect.mdx b/docs/pages/connect-your-client/teleport-connect.mdx index 30c974cf86495..91739ecb26aa4 100644 --- a/docs/pages/connect-your-client/teleport-connect.mdx +++ b/docs/pages/connect-your-client/teleport-connect.mdx @@ -446,6 +446,7 @@ Below is the list of the supported config properties. | `theme` | `system` | Color theme for the app. Available modes: `light`, `dark`, `system`. | | `terminal.fontFamily` | `Menlo, Monaco, monospace` on macOS
`Consolas, monospace` on Windows
`'Droid Sans Mono', monospace` on Linux | Font family for the terminal. | | `terminal.fontSize` | 15 | Font size for the terminal. | +| `terminal.windowsBackend` | `auto` | `auto` uses modern [ConPTY](https://devblogs.microsoft.com/commandline/windows-command-line-introducing-the-windows-pseudo-console-conpty/) system if available, which requires Windows 10 (19H1) or above. Set to `winpty` to use winpty even if ConPTY is available. | | `usageReporting.enabled` | `false` | Enables collecting anonymous usage data (see [Telemetry](#telemetry)). | | `keymap.tab1` - `keymap.tab9` | `Command+1` - `Command+9` on macOS
`Ctrl+1` - `Ctrl+9` on Windows
`Alt+1` - `Alt+9` on Linux | Shortcut to open tab 1–9. | | `keymap.closeTab` | `Command+W` on macOS
`Ctrl+Shift+W` on Windows/Linux | Shortcut to close a tab. | @@ -458,6 +459,7 @@ Below is the list of the supported config properties. | `keymap.openProfiles` | `Command+I` on macOS
`Ctrl+Shift+I` on Windows/Linux | Shortcut to open the profile selector. | | `keymap.openSearchBar` | `Command+K` on macOS
`Ctrl+Shift+K` on Windows/Linux | Shortcut to open the search bar. | | `headless.skipConfirm` | false | Skips the confirmation prompt for Headless WebAuthn approval and instead prompts for WebAuthn immediately. | +| `ssh.noResume` | false | Disables SSH connection resumption. | { this.gracefullyKillTshdProcess(); }), - terminateWithTimeout(this.sharedProcess), + terminateWithTimeout(this.sharedProcess, 5_000, process => + // process.kill doesn't allow running a cleanup code in the child process + // on Windows + process.send(TERMINATE_MESSAGE) + ), this.agentRunner.killAll(), ]); } diff --git a/web/packages/teleterm/src/mainProcess/types.ts b/web/packages/teleterm/src/mainProcess/types.ts index 78e73e9fe1e90..be48373f056c2 100644 --- a/web/packages/teleterm/src/mainProcess/types.ts +++ b/web/packages/teleterm/src/mainProcess/types.ts @@ -276,3 +276,12 @@ export enum MainProcessIpc { export enum WindowsManagerIpc { SignalUserInterfaceReadiness = 'windows-manager-signal-user-interface-readiness', } + +/** + * A custom message to gracefully quit a process. + * It is sent to the child process with `process.send`. + * + * We need this because `process.kill('SIGTERM')` doesn't work on Windows, + * so we couldn't run any cleanup logic. + */ +export const TERMINATE_MESSAGE = 'TERMINATE_MESSAGE'; diff --git a/web/packages/teleterm/src/preload.ts b/web/packages/teleterm/src/preload.ts index c5b72720ca7a1..9a691d4ebf085 100644 --- a/web/packages/teleterm/src/preload.ts +++ b/web/packages/teleterm/src/preload.ts @@ -74,7 +74,14 @@ async function getElectronGlobals(): Promise { credentials.shared, runtimeSettings, { - noResume: mainProcessClient.configService.get('ssh.noResume').value, + ssh: { + noResume: mainProcessClient.configService.get('ssh.noResume').value, + }, + terminal: { + windowsBackend: mainProcessClient.configService.get( + 'terminal.windowsBackend' + ).value, + }, } ); const { diff --git a/web/packages/teleterm/src/services/config/appConfigSchema.ts b/web/packages/teleterm/src/services/config/appConfigSchema.ts index 91950eed522b1..bc8713886aa58 100644 --- a/web/packages/teleterm/src/services/config/appConfigSchema.ts +++ b/web/packages/teleterm/src/services/config/appConfigSchema.ts @@ -22,6 +22,9 @@ import { Platform } from 'teleterm/mainProcess/types'; import { createKeyboardShortcutSchema } from './keyboardShortcutSchema'; +// When adding a new config property, add it to the docs too +// (teleport-connect.mdx#configuration). + export type AppConfigSchema = ReturnType; export type AppConfig = z.infer; @@ -54,6 +57,12 @@ export const createAppConfigSchema = (platform: Platform) => { .max(256) .default(15) .describe('Font size for the terminal.'), + 'terminal.windowsBackend': z + .enum(['auto', 'winpty']) + .default('auto') + .describe( + '`auto` uses modern ConPTY system if available, which requires Windows 10 (19H1) or above. Set to `winpty` to use winpty even if ConPTY is available.' + ), 'usageReporting.enabled': z .boolean() .default(false) diff --git a/web/packages/teleterm/src/services/pty/fixtures/mocks.ts b/web/packages/teleterm/src/services/pty/fixtures/mocks.ts index c9e2c62e392c7..9cefda658c666 100644 --- a/web/packages/teleterm/src/services/pty/fixtures/mocks.ts +++ b/web/packages/teleterm/src/services/pty/fixtures/mocks.ts @@ -20,6 +20,7 @@ import { IPtyProcess } from 'teleterm/sharedProcess/ptyHost'; import { PtyProcessCreationStatus, PtyServiceClient, + WindowsPty, } from 'teleterm/services/pty'; export class MockPtyProcess implements IPtyProcess { @@ -29,7 +30,7 @@ export class MockPtyProcess implements IPtyProcess { resize() {} - dispose() {} + async dispose() {} onData() { return () => {}; @@ -64,10 +65,12 @@ export class MockPtyServiceClient implements PtyServiceClient { createPtyProcess(): Promise<{ process: IPtyProcess; creationStatus: PtyProcessCreationStatus; + windowsPty: WindowsPty; }> { return Promise.resolve({ process: new MockPtyProcess(), creationStatus: PtyProcessCreationStatus.Ok, + windowsPty: undefined, }); } } diff --git a/web/packages/teleterm/src/services/pty/ptyHost/buildPtyOptions.test.ts b/web/packages/teleterm/src/services/pty/ptyHost/buildPtyOptions.test.ts index b37187ed4f5cd..4f8720d3d2482 100644 --- a/web/packages/teleterm/src/services/pty/ptyHost/buildPtyOptions.test.ts +++ b/web/packages/teleterm/src/services/pty/ptyHost/buildPtyOptions.test.ts @@ -47,7 +47,7 @@ describe('getPtyProcessOptions', () => { const { env } = getPtyProcessOptions( makeRuntimeSettings(), - { noResume: false }, + { ssh: { noResume: false }, windowsPty: { useConpty: true } }, cmd, processEnv ); @@ -76,7 +76,7 @@ describe('getPtyProcessOptions', () => { const { env } = getPtyProcessOptions( makeRuntimeSettings(), - { noResume: false }, + { ssh: { noResume: false }, windowsPty: { useConpty: true } }, cmd, processEnv ); @@ -103,7 +103,7 @@ describe('getPtyProcessOptions', () => { const { args } = getPtyProcessOptions( makeRuntimeSettings(), - { noResume: true }, + { ssh: { noResume: true }, windowsPty: { useConpty: true } }, cmd, processEnv ); diff --git a/web/packages/teleterm/src/services/pty/ptyHost/buildPtyOptions.ts b/web/packages/teleterm/src/services/pty/ptyHost/buildPtyOptions.ts index 4857d3a498694..e4b34c934b782 100644 --- a/web/packages/teleterm/src/services/pty/ptyHost/buildPtyOptions.ts +++ b/web/packages/teleterm/src/services/pty/ptyHost/buildPtyOptions.ts @@ -25,8 +25,9 @@ import { assertUnreachable } from 'teleterm/ui/utils'; import { PtyCommand, PtyProcessCreationStatus, - SshOptions, TshKubeLoginCommand, + SshOptions, + WindowsPty, } from '../types'; import { @@ -34,9 +35,14 @@ import { ResolveShellEnvTimeoutError, } from './resolveShellEnv'; +type PtyOptions = { + ssh: SshOptions; + windowsPty: Pick; +}; + export async function buildPtyOptions( settings: RuntimeSettings, - sshOptions: SshOptions, + options: PtyOptions, cmd: PtyCommand ): Promise<{ processOptions: PtyProcessOptions; @@ -68,7 +74,7 @@ export async function buildPtyOptions( return { processOptions: getPtyProcessOptions( settings, - sshOptions, + options, cmd, combinedEnv ), @@ -79,10 +85,12 @@ export async function buildPtyOptions( export function getPtyProcessOptions( settings: RuntimeSettings, - sshOptions: SshOptions, + options: PtyOptions, cmd: PtyCommand, env: typeof process.env ): PtyProcessOptions { + const useConpty = options.windowsPty?.useConpty; + switch (cmd.kind) { case 'pty.shell': { // Teleport Connect bundles a tsh binary, but the user might have one already on their system. @@ -104,6 +112,7 @@ export function getPtyProcessOptions( cwd: cmd.cwd, env: { ...env, ...cmd.env }, initMessage: cmd.initMessage, + useConpty, }; } @@ -129,6 +138,7 @@ export function getPtyProcessOptions( path: settings.defaultShell, args: isWindows ? powershellCommandArgs : bashCommandArgs, env: { ...env, KUBECONFIG: getKubeConfigFilePath(cmd, settings) }, + useConpty, }; } @@ -140,7 +150,7 @@ export function getPtyProcessOptions( const args = [ `--proxy=${cmd.rootClusterId}`, 'ssh', - ...(sshOptions.noResume ? ['--no-resume'] : []), + ...(options.ssh.noResume ? ['--no-resume'] : []), '--forward-agent', loginHost, ]; @@ -149,6 +159,7 @@ export function getPtyProcessOptions( path: settings.tshd.binaryPath, args, env, + useConpty, }; } @@ -159,6 +170,7 @@ export function getPtyProcessOptions( path: cmd.path, args: cmd.args, env: { ...env, ...cmd.env }, + useConpty, }; } diff --git a/web/packages/teleterm/src/services/pty/ptyHost/ptyHostClient.ts b/web/packages/teleterm/src/services/pty/ptyHost/ptyHostClient.ts index 74c9dfd90fa29..8990bfb0a1f64 100644 --- a/web/packages/teleterm/src/services/pty/ptyHost/ptyHostClient.ts +++ b/web/packages/teleterm/src/services/pty/ptyHost/ptyHostClient.ts @@ -41,6 +41,7 @@ export function createPtyHostClient( args: ptyOptions.args, path: ptyOptions.path, env: Struct.fromJson(ptyOptions.env), + useConpty: ptyOptions.useConpty, }); if (ptyOptions.cwd) { diff --git a/web/packages/teleterm/src/services/pty/ptyHost/ptyProcess.ts b/web/packages/teleterm/src/services/pty/ptyHost/ptyProcess.ts index 8b97c017f7a93..cec0ba3d246f3 100644 --- a/web/packages/teleterm/src/services/pty/ptyHost/ptyProcess.ts +++ b/web/packages/teleterm/src/services/pty/ptyHost/ptyProcess.ts @@ -47,7 +47,7 @@ export function createPtyProcess( exchangeEventsStream.resize(columns, rows); }, - dispose(): void { + async dispose(): Promise { exchangeEventsStream.dispose(); }, diff --git a/web/packages/teleterm/src/services/pty/ptyHost/windowsPty.test.ts b/web/packages/teleterm/src/services/pty/ptyHost/windowsPty.test.ts new file mode 100644 index 0000000000000..28e89c7e26ccc --- /dev/null +++ b/web/packages/teleterm/src/services/pty/ptyHost/windowsPty.test.ts @@ -0,0 +1,61 @@ +/** + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import { makeRuntimeSettings } from 'teleterm/mainProcess/fixtures/mocks'; + +import { getWindowsPty } from './windowsPty'; + +test.each([ + { + name: 'uses conpty on supported Windows version', + platform: 'win32' as const, + osVersion: '10.0.22621', + terminalOptions: { windowsBackend: 'auto' as const }, + expected: { useConpty: true, buildNumber: 22621 }, + }, + { + name: 'uses winpty on unsupported Windows version', + platform: 'win32' as const, + osVersion: '10.0.18308', + terminalOptions: { windowsBackend: 'auto' as const }, + expected: { useConpty: false, buildNumber: 18308 }, + }, + { + name: 'uses winpty when Windows version is supported, but conpty is disabled in options', + platform: 'win32' as const, + osVersion: '10.0.22621', + terminalOptions: { windowsBackend: 'winpty' as const }, + expected: { useConpty: false, buildNumber: 22621 }, + }, + { + name: 'undefined on non-Windows OS', + platform: 'darwin' as const, + osVersion: '23.5.0', + terminalOptions: { windowsBackend: 'auto' as const }, + expected: undefined, + }, +])('$name', ({ platform, osVersion, terminalOptions, expected }) => { + const pty = getWindowsPty( + makeRuntimeSettings({ + platform, + osVersion, + }), + terminalOptions + ); + expect(pty).toEqual(expected); +}); diff --git a/web/packages/teleterm/src/services/pty/ptyHost/windowsPty.ts b/web/packages/teleterm/src/services/pty/ptyHost/windowsPty.ts new file mode 100644 index 0000000000000..8bd69d0d9de32 --- /dev/null +++ b/web/packages/teleterm/src/services/pty/ptyHost/windowsPty.ts @@ -0,0 +1,49 @@ +/** + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import { RuntimeSettings } from 'teleterm/mainProcess/types'; + +import { TerminalOptions, WindowsPty } from '../types'; + +export const WIN_BUILD_STABLE_CONPTY = 18309; + +export function getWindowsPty( + runtimeSettings: RuntimeSettings, + terminalOptions: TerminalOptions +): WindowsPty { + if (runtimeSettings.platform !== 'win32') { + return undefined; + } + + const buildNumber = getWindowsBuildNumber(runtimeSettings.osVersion); + const useConpty = + terminalOptions.windowsBackend === 'auto' && + buildNumber >= WIN_BUILD_STABLE_CONPTY; + return { + useConpty, + buildNumber, + }; +} + +function getWindowsBuildNumber(osVersion: string): number { + const parsedOsVersion = /(\d+)\.(\d+)\.(\d+)/g.exec(osVersion); + if (parsedOsVersion?.length === 4) { + return parseInt(parsedOsVersion[3]); + } + return 0; +} diff --git a/web/packages/teleterm/src/services/pty/ptyService.ts b/web/packages/teleterm/src/services/pty/ptyService.ts index b13c11325179f..3b82021e8868d 100644 --- a/web/packages/teleterm/src/services/pty/ptyService.ts +++ b/web/packages/teleterm/src/services/pty/ptyService.ts @@ -23,21 +23,26 @@ import { RuntimeSettings } from 'teleterm/mainProcess/types'; import { buildPtyOptions } from './ptyHost/buildPtyOptions'; import { createPtyHostClient } from './ptyHost/ptyHostClient'; import { createPtyProcess } from './ptyHost/ptyProcess'; -import { PtyServiceClient, SshOptions } from './types'; +import { PtyServiceClient, PtyOptions } from './types'; +import { getWindowsPty } from './ptyHost/windowsPty'; export function createPtyService( address: string, credentials: ChannelCredentials, runtimeSettings: RuntimeSettings, - sshOptions: SshOptions + options: PtyOptions ): PtyServiceClient { const ptyHostClient = createPtyHostClient(address, credentials); return { createPtyProcess: async command => { + const windowsPty = getWindowsPty(runtimeSettings, options.terminal); const { processOptions, creationStatus } = await buildPtyOptions( runtimeSettings, - sshOptions, + { + ssh: options.ssh, + windowsPty, + }, command ); const ptyId = await ptyHostClient.createPtyProcess(processOptions); @@ -46,6 +51,7 @@ export function createPtyService( return { process: createPtyProcess(ptyHostClient, ptyId), creationStatus, + windowsPty, }; }, }; diff --git a/web/packages/teleterm/src/services/pty/types.ts b/web/packages/teleterm/src/services/pty/types.ts index 7119a89ea993c..aaac99a224ede 100644 --- a/web/packages/teleterm/src/services/pty/types.ts +++ b/web/packages/teleterm/src/services/pty/types.ts @@ -37,9 +37,21 @@ export type PtyServiceClient = { createPtyProcess: (cmd: PtyCommand) => Promise<{ process: IPtyProcess; creationStatus: PtyProcessCreationStatus; + windowsPty: WindowsPty; }>; }; +/** + * Pty information for Windows. + * undefined for non-Windows OS. + */ +export type WindowsPty = + | { + useConpty: boolean; + buildNumber: number; + } + | undefined; + export type ShellCommand = PtyCommandBase & { kind: 'pty.shell'; cwd?: string; @@ -107,3 +119,12 @@ export type SshOptions = { */ noResume: boolean; }; + +export type TerminalOptions = { + windowsBackend: 'auto' | 'winpty'; +}; + +export type PtyOptions = { + ssh: SshOptions; + terminal: TerminalOptions; +}; diff --git a/web/packages/teleterm/src/sharedProcess/api/proto/ptyHostService.proto b/web/packages/teleterm/src/sharedProcess/api/proto/ptyHostService.proto index f9baea4f2c9fc..98a0519c61a81 100644 --- a/web/packages/teleterm/src/sharedProcess/api/proto/ptyHostService.proto +++ b/web/packages/teleterm/src/sharedProcess/api/proto/ptyHostService.proto @@ -41,6 +41,7 @@ message PtyCreate { reserved "init_command"; google.protobuf.Struct env = 7; string init_message = 8; + bool use_conpty = 9; } message PtyClientEvent { diff --git a/web/packages/teleterm/src/sharedProcess/api/protogen/ptyHostService_pb.ts b/web/packages/teleterm/src/sharedProcess/api/protogen/ptyHostService_pb.ts index cd6cd61badcea..35f043a2d4624 100644 --- a/web/packages/teleterm/src/sharedProcess/api/protogen/ptyHostService_pb.ts +++ b/web/packages/teleterm/src/sharedProcess/api/protogen/ptyHostService_pb.ts @@ -69,6 +69,10 @@ export interface PtyCreate { * @generated from protobuf field: string init_message = 8; */ initMessage: string; + /** + * @generated from protobuf field: bool use_conpty = 9; + */ + useConpty: boolean; } /** * @generated from protobuf message PtyClientEvent @@ -266,7 +270,8 @@ class PtyCreate$Type extends MessageType { { no: 4, name: "args", kind: "scalar", repeat: 2 /*RepeatType.UNPACKED*/, T: 9 /*ScalarType.STRING*/ }, { no: 5, name: "cwd", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, { no: 7, name: "env", kind: "message", T: () => Struct }, - { no: 8, name: "init_message", kind: "scalar", T: 9 /*ScalarType.STRING*/ } + { no: 8, name: "init_message", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 9, name: "use_conpty", kind: "scalar", T: 8 /*ScalarType.BOOL*/ } ]); } create(value?: PartialMessage): PtyCreate { @@ -275,6 +280,7 @@ class PtyCreate$Type extends MessageType { message.args = []; message.cwd = ""; message.initMessage = ""; + message.useConpty = false; if (value !== undefined) reflectionMergePartial(this, message, value); return message; @@ -299,6 +305,9 @@ class PtyCreate$Type extends MessageType { case /* string init_message */ 8: message.initMessage = reader.string(); break; + case /* bool use_conpty */ 9: + message.useConpty = reader.bool(); + break; default: let u = options.readUnknownField; if (u === "throw") @@ -326,6 +335,9 @@ class PtyCreate$Type extends MessageType { /* string init_message = 8; */ if (message.initMessage !== "") writer.tag(8, WireType.LengthDelimited).string(message.initMessage); + /* bool use_conpty = 9; */ + if (message.useConpty !== false) + writer.tag(9, WireType.Varint).bool(message.useConpty); let u = options.writeUnknownFields; if (u !== false) (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); diff --git a/web/packages/teleterm/src/sharedProcess/ptyHost/ptyEventsStreamHandler.ts b/web/packages/teleterm/src/sharedProcess/ptyHost/ptyEventsStreamHandler.ts index 0417408cc1ba7..a9aa281451131 100644 --- a/web/packages/teleterm/src/sharedProcess/ptyHost/ptyEventsStreamHandler.ts +++ b/web/packages/teleterm/src/sharedProcess/ptyHost/ptyEventsStreamHandler.ts @@ -131,16 +131,16 @@ export class PtyEventsStreamHandler { private handleStreamError(error: Error): void { this.logger.error(`stream has ended with error`, error); - this.cleanResources(); + void this.cleanResources(); } private handleStreamEnd(): void { this.logger.info(`stream has ended`); - this.cleanResources(); + void this.cleanResources(); } - private cleanResources(): void { - this.ptyProcess.dispose(); + private async cleanResources(): Promise { + await this.ptyProcess.dispose(); if (this.ptyId) { this.ptyProcesses.delete(this.ptyId); } diff --git a/web/packages/teleterm/src/sharedProcess/ptyHost/ptyHostService.ts b/web/packages/teleterm/src/sharedProcess/ptyHost/ptyHostService.ts index 651a196e5ad6d..ffb1cb524321b 100644 --- a/web/packages/teleterm/src/sharedProcess/ptyHost/ptyHostService.ts +++ b/web/packages/teleterm/src/sharedProcess/ptyHost/ptyHostService.ts @@ -27,7 +27,9 @@ import { IPtyHost } from './../api/protogen/ptyHostService_pb.grpc-server'; import { PtyCwd, PtyId } from './../api/protogen/ptyHostService_pb'; import { PtyEventsStreamHandler } from './ptyEventsStreamHandler'; -export function createPtyHostService(): IPtyHost { +export function createPtyHostService(): IPtyHost & { + dispose(): Promise; +} { const logger = new Logger('PtyHostService'); const ptyProcesses = new Map(); @@ -43,6 +45,7 @@ export function createPtyHostService(): IPtyHost { ptyId, env: Struct.toJson(call.request.env!) as Record, initMessage: ptyOptions.initMessage, + useConpty: ptyOptions.useConpty, }); ptyProcesses.set(ptyId, ptyProcess); } catch (error) { @@ -73,5 +76,12 @@ export function createPtyHostService(): IPtyHost { }); }, exchangeEvents: stream => new PtyEventsStreamHandler(stream, ptyProcesses), + dispose: async () => { + await Promise.all( + Array.from(ptyProcesses.values()).map(ptyProcess => + ptyProcess.dispose() + ) + ); + }, }; } diff --git a/web/packages/teleterm/src/sharedProcess/ptyHost/ptyProcess.test.ts b/web/packages/teleterm/src/sharedProcess/ptyHost/ptyProcess.test.ts index 18288c307d981..77d8a7dddad68 100644 --- a/web/packages/teleterm/src/sharedProcess/ptyHost/ptyProcess.test.ts +++ b/web/packages/teleterm/src/sharedProcess/ptyHost/ptyProcess.test.ts @@ -38,6 +38,7 @@ describe('PtyProcess', () => { args: [], env: { PATH: '/foo/bar' }, ptyId: '1234', + useConpty: true, }); const startErrorCb = jest.fn(); diff --git a/web/packages/teleterm/src/sharedProcess/ptyHost/ptyProcess.ts b/web/packages/teleterm/src/sharedProcess/ptyHost/ptyProcess.ts index ededa80e5ffc4..f38e1503ffacf 100644 --- a/web/packages/teleterm/src/sharedProcess/ptyHost/ptyProcess.ts +++ b/web/packages/teleterm/src/sharedProcess/ptyHost/ptyProcess.ts @@ -24,6 +24,8 @@ import { EventEmitter } from 'node:events'; import * as nodePTY from 'node-pty'; import which from 'which'; +import { wait } from 'shared/utils/wait'; + import Logger from 'teleterm/logger'; import { PtyProcessOptions, IPtyProcess } from './types'; @@ -59,6 +61,12 @@ export class PtyProcess extends EventEmitter implements IPtyProcess { * It emits TermEventEnum.StartError on error. start itself always returns a fulfilled promise. */ async start(cols: number, rows: number) { + if (process.platform === 'win32') { + this._logger.info( + this.options.useConpty ? 'ConPTY enabled' : 'ConPTY disabled' + ); + } + try { // which throws an error if the argument is not found in path. // TODO(ravicious): Remove the manual check for the existence of the executable after node-pty @@ -76,8 +84,7 @@ export class PtyProcess extends EventEmitter implements IPtyProcess { // https://unix.stackexchange.com/questions/123858 cwd: this.options.cwd || getDefaultCwd(this.options.env), env: this.options.env, - // Turn off ConPTY due to an uncaught exception being thrown when a PTY is closed. - useConpty: false, + useConpty: this.options.useConpty, }); } catch (error) { this._logger.error(error); @@ -132,10 +139,38 @@ export class PtyProcess extends EventEmitter implements IPtyProcess { } } - dispose() { + async dispose() { + if (this._disposed) { + this._logger.info(`PTY process is not running. Nothing to kill`); + return; + } + const controller = new AbortController(); + const processExit = promisifyProcessExit(this._process); + this.removeAllListeners(); - this._process?.kill(); - this._disposed = true; + this._process.kill(); + + // Wait for the process to exit. + // It's needed for ssh sessions on Windows with ConPTY enabled. + // When we didn't wait, conhost.exe processes started by node-pty + // were left running after closing the app. + // Killing a process doesn't happen immediately, but instead appears to be + // queued, so we need to give it time to execute. + // + // Although this was added specifically for Windows, + // we run the same cleanup code for all platforms. + const hasExited = await Promise.race([ + processExit.then(() => controller.abort()).then(() => true), + // timeout for killing the shared process is 5 seconds + wait(4_000, controller.signal) + .catch(() => {}) // ignore abort errors + .then(() => false), + ]); + if (hasExited) { + this._disposed = true; + } else { + this._logger.error('Failed to dispose PTY process within the timeout'); + } } onData(cb: (data: string) => void) { @@ -254,3 +289,7 @@ function getDefaultCwd(env: Record): string { return userDir || process.cwd(); } + +function promisifyProcessExit(childProcess: nodePTY.IPty): Promise { + return new Promise(resolve => childProcess.onExit(() => resolve())); +} diff --git a/web/packages/teleterm/src/sharedProcess/ptyHost/types.ts b/web/packages/teleterm/src/sharedProcess/ptyHost/types.ts index a43e82c033458..cd0f4b8bce4c6 100644 --- a/web/packages/teleterm/src/sharedProcess/ptyHost/types.ts +++ b/web/packages/teleterm/src/sharedProcess/ptyHost/types.ts @@ -22,13 +22,15 @@ export type PtyProcessOptions = { args: string[]; cwd?: string; initMessage?: string; + /** Whether to use the ConPTY system on Windows. */ + useConpty: boolean; }; export type IPtyProcess = { start(cols: number, rows: number): void; write(data: string): void; resize(cols: number, rows: number): void; - dispose(): void; + dispose(): Promise; getCwd(): Promise; getPtyId(): string; // The listener removal functions are used only on the frontend app side from the renderer process. diff --git a/web/packages/teleterm/src/sharedProcess/sharedProcess.ts b/web/packages/teleterm/src/sharedProcess/sharedProcess.ts index b4f0f5c06c861..1b9be627d8f3e 100644 --- a/web/packages/teleterm/src/sharedProcess/sharedProcess.ts +++ b/web/packages/teleterm/src/sharedProcess/sharedProcess.ts @@ -28,7 +28,7 @@ import { readGrpcCert, shouldEncryptConnection, } from 'teleterm/services/grpcCredentials'; -import { RuntimeSettings } from 'teleterm/mainProcess/types'; +import { RuntimeSettings, TERMINATE_MESSAGE } from 'teleterm/mainProcess/types'; import Logger from 'teleterm/logger'; import { ptyHostDefinition } from 'teleterm/sharedProcess/api/protogen/ptyHostService_pb.grpc-server'; @@ -74,7 +74,8 @@ async function initializeServer( } const server = new Server(); - server.addService(ptyHostDefinition, createPtyHostService()); + const ptyHostService = createPtyHostService(); + server.addService(ptyHostDefinition, ptyHostService); // grpc-js requires us to pass localhost:port for TCP connections, const grpcServerAddress = address.replace('tcp://', ''); @@ -95,8 +96,13 @@ async function initializeServer( logger.error('Could not start shared server', e); } - process.once('exit', () => { - server.forceShutdown(); + process.on('message', async message => { + if (message === TERMINATE_MESSAGE) { + new Logger('Process').info('Received terminate message, exiting'); + server.forceShutdown(); + await ptyHostService.dispose(); + process.exit(0); + } }); } diff --git a/web/packages/teleterm/src/ui/DocumentTerminal/DocumentTerminal.tsx b/web/packages/teleterm/src/ui/DocumentTerminal/DocumentTerminal.tsx index 440029df07578..15e53b53b36b6 100644 --- a/web/packages/teleterm/src/ui/DocumentTerminal/DocumentTerminal.tsx +++ b/web/packages/teleterm/src/ui/DocumentTerminal/DocumentTerminal.tsx @@ -132,6 +132,7 @@ export function DocumentTerminal(props: { unsanitizedFontFamily={unsanitizedTerminalFontFamily} fontSize={terminalFontSize} onEnterKey={attempt.data.refreshTitle} + windowsPty={attempt.data.windowsPty} /> )} diff --git a/web/packages/teleterm/src/ui/DocumentTerminal/Terminal/Terminal.tsx b/web/packages/teleterm/src/ui/DocumentTerminal/Terminal/Terminal.tsx index b51605f63a810..fb6f2f4e7cc50 100644 --- a/web/packages/teleterm/src/ui/DocumentTerminal/Terminal/Terminal.tsx +++ b/web/packages/teleterm/src/ui/DocumentTerminal/Terminal/Terminal.tsx @@ -27,6 +27,7 @@ import { makeSuccessAttempt, } from 'shared/hooks/useAsync'; +import { WindowsPty } from 'teleterm/services/pty'; import { IPtyProcess } from 'teleterm/sharedProcess/ptyHost'; import { DocumentTerminal } from 'teleterm/ui/services/workspacesService'; @@ -48,6 +49,7 @@ type TerminalProps = { unsanitizedFontFamily: string; fontSize: number; onEnterKey?(): void; + windowsPty: WindowsPty; }; export function Terminal(props: TerminalProps) { @@ -72,6 +74,7 @@ export function Terminal(props: TerminalProps) { el: refElement.current, fontSize: props.fontSize, theme: theme.colors.terminal, + windowsPty: props.windowsPty, }); // Start the PTY process. diff --git a/web/packages/teleterm/src/ui/DocumentTerminal/Terminal/ctrl.ts b/web/packages/teleterm/src/ui/DocumentTerminal/Terminal/ctrl.ts index fdae12dcad53e..1af5663dda7f3 100644 --- a/web/packages/teleterm/src/ui/DocumentTerminal/Terminal/ctrl.ts +++ b/web/packages/teleterm/src/ui/DocumentTerminal/Terminal/ctrl.ts @@ -21,6 +21,7 @@ import { IDisposable, ITheme, Terminal } from 'xterm'; import { FitAddon } from 'xterm-addon-fit'; import { debounce } from 'shared/utils/highbar'; +import { WindowsPty } from 'teleterm/services/pty'; import { IPtyProcess } from 'teleterm/sharedProcess/ptyHost'; import Logger from 'teleterm/logger'; @@ -30,6 +31,7 @@ type Options = { el: HTMLElement; fontSize: number; theme: ITheme; + windowsPty: WindowsPty; }; export default class TtyTerminal { @@ -68,6 +70,10 @@ export default class TtyTerminal { scrollback: 5000, minimumContrastRatio: 4.5, // minimum for WCAG AA compliance theme: this.options.theme, + windowsPty: this.options.windowsPty && { + backend: this.options.windowsPty.useConpty ? 'conpty' : 'winpty', + buildNumber: this.options.windowsPty.buildNumber, + }, windowOptions: { setWinSizeChars: true, }, diff --git a/web/packages/teleterm/src/ui/DocumentTerminal/useDocumentTerminal.test.tsx b/web/packages/teleterm/src/ui/DocumentTerminal/useDocumentTerminal.test.tsx index 6aad2d0c4dceb..3280880988f4a 100644 --- a/web/packages/teleterm/src/ui/DocumentTerminal/useDocumentTerminal.test.tsx +++ b/web/packages/teleterm/src/ui/DocumentTerminal/useDocumentTerminal.test.tsx @@ -237,6 +237,7 @@ test('useDocumentTerminal shows a warning notification if the call to TerminalsS jest.spyOn(terminalsService, 'createPtyProcess').mockResolvedValue({ process: getPtyProcessMock(), creationStatus: PtyProcessCreationStatus.ResolveShellEnvTimeout, + windowsPty: undefined, }); jest.spyOn(notificationsService, 'notifyWarning'); @@ -574,6 +575,7 @@ const testSetup = ( return { process: getPtyProcessMock(), creationStatus: PtyProcessCreationStatus.Ok, + windowsPty: undefined, }; }); diff --git a/web/packages/teleterm/src/ui/DocumentTerminal/useDocumentTerminal.ts b/web/packages/teleterm/src/ui/DocumentTerminal/useDocumentTerminal.ts index 029d7df11f38d..155cc3e36c200 100644 --- a/web/packages/teleterm/src/ui/DocumentTerminal/useDocumentTerminal.ts +++ b/web/packages/teleterm/src/ui/DocumentTerminal/useDocumentTerminal.ts @@ -29,7 +29,11 @@ import { import { IPtyProcess } from 'teleterm/sharedProcess/ptyHost'; import { useWorkspaceContext } from 'teleterm/ui/Documents'; import { routing } from 'teleterm/ui/uri'; -import { PtyCommand, PtyProcessCreationStatus } from 'teleterm/services/pty'; +import { + PtyCommand, + PtyProcessCreationStatus, + WindowsPty, +} from 'teleterm/services/pty'; import { AmbiguousHostnameError } from 'teleterm/ui/services/resources'; import { retryWithRelogin } from 'teleterm/ui/utils'; import Logger from 'teleterm/logger'; @@ -72,7 +76,7 @@ export function useDocumentTerminal(doc: types.DocumentTerminal) { return () => { if (attempt.status === 'success') { - attempt.data.ptyProcess.dispose(); + void attempt.data.ptyProcess.dispose(); } }; // This cannot be run only mount. If the user has initialized a new PTY process by clicking the @@ -230,7 +234,7 @@ async function setUpPtyProcess( getClusterName() ); - const ptyProcess = await createPtyProcess(ctx, cmd); + const { process: ptyProcess, windowsPty } = await createPtyProcess(ctx, cmd); if (doc.kind === 'doc.terminal_tsh_node') { ctx.usageService.captureProtocolUse({ @@ -317,14 +321,15 @@ async function setUpPtyProcess( ptyProcess, refreshTitle, openContextMenu, + windowsPty, }; } async function createPtyProcess( ctx: IAppContext, cmd: PtyCommand -): Promise { - const { process, creationStatus } = +): Promise<{ process: IPtyProcess; windowsPty: WindowsPty }> { + const { process, creationStatus, windowsPty } = await ctx.terminalsService.createPtyProcess(cmd); if (creationStatus === PtyProcessCreationStatus.ResolveShellEnvTimeout) { @@ -336,7 +341,7 @@ async function createPtyProcess( }); } - return process; + return { process, windowsPty }; } // TODO(ravicious): Instead of creating cmd within useDocumentTerminal, make useDocumentTerminal From 4194ff064d03589c593e4d9bb75336a332ef3673 Mon Sep 17 00:00:00 2001 From: Tiago Silva Date: Tue, 30 Jul 2024 10:48:34 +0100 Subject: [PATCH 002/139] [kube] add `namespace/podName` as `SessionTracker` hostname (#44649) This PR changes the `SessionTracker.Hostname` to include the namespace instead of just the podname. The final result is `podNamespace/podName` as it uniquely identifies a pod within a Kubernetes cluster. Helps https://github.com/gravitational/teleport/pull/44496 Signed-off-by: Tiago Silva --- lib/kube/proxy/sess.go | 5 +++-- lib/kube/proxy/sess_test.go | 22 +++++++++++++++++++--- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/lib/kube/proxy/sess.go b/lib/kube/proxy/sess.go index ccd1ee620b119..b05352096f92b 100644 --- a/lib/kube/proxy/sess.go +++ b/lib/kube/proxy/sess.go @@ -23,6 +23,7 @@ import ( "fmt" "io" "net/http" + "path" "reflect" "slices" "strings" @@ -1325,7 +1326,7 @@ func (s *session) trackSession(p *party, policySet []*types.SessionTrackerPolicy SessionID: s.id.String(), Kind: string(types.KubernetesSessionKind), State: types.SessionState_SessionStatePending, - Hostname: s.podName, + Hostname: path.Join(s.podNamespace, s.podName), ClusterName: s.ctx.teleportCluster.name, KubernetesCluster: s.ctx.kubeClusterName, HostUser: p.Ctx.User.GetName(), @@ -1362,7 +1363,7 @@ func (s *session) trackSession(p *party, policySet []*types.SessionTrackerPolicy case err != nil: return trace.Wrap(err) // the tracker was created successfully - case err == nil: + default: s.tracker = tracker } diff --git a/lib/kube/proxy/sess_test.go b/lib/kube/proxy/sess_test.go index a25848766666b..469fe2c4df27a 100644 --- a/lib/kube/proxy/sess_test.go +++ b/lib/kube/proxy/sess_test.go @@ -281,16 +281,18 @@ func Test_session_trackSession(t *testing.T) { assertErr: require.NoError, }, } - for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { sess := &session{ log: logrus.New().WithField(teleport.ComponentKey, "test"), id: uuid.New(), req: &http.Request{ - URL: &url.URL{}, + URL: &url.URL{ + RawQuery: "command=command&command=arg1&command=arg2", + }, }, podName: "podName", + podNamespace: "podNamespace", accessEvaluator: auth.NewSessionAccessEvaluator(tt.args.policies, types.KubernetesSessionKind, "username"), ctx: authContext{ Context: authz.Context{ @@ -319,6 +321,18 @@ func Test_session_trackSession(t *testing.T) { } err := sess.trackSession(p, tt.args.policies) tt.assertErr(t, err) + if err != nil { + return + } + tracker := tt.args.authClient.(*mockSessionTrackerService).tracker + require.Equal(t, "username", tracker.GetHostUser()) + require.Equal(t, "name", tracker.GetClusterName()) + require.Equal(t, "kubeClusterName", tracker.GetKubeCluster()) + require.Equal(t, sess.id.String(), tracker.GetSessionID()) + require.Equal(t, []string{"command", "arg1", "arg2"}, tracker.GetCommand()) + require.Equal(t, "podNamespace/podName", tracker.GetHostname()) + require.Equal(t, types.KubernetesSessionKind, tracker.GetSessionKind()) + }) } } @@ -326,9 +340,11 @@ func Test_session_trackSession(t *testing.T) { type mockSessionTrackerService struct { authclient.ClientI returnErr bool + tracker types.SessionTracker } -func (m *mockSessionTrackerService) CreateSessionTracker(ctx context.Context, tracker types.SessionTracker) (types.SessionTracker, error) { +func (m *mockSessionTrackerService) CreateSessionTracker(_ context.Context, tracker types.SessionTracker) (types.SessionTracker, error) { + m.tracker = tracker if m.returnErr { return nil, trace.ConnectionProblem(nil, "mock error") } From 03588e6a4113d461b47f2ec46109de2bdedbb9a6 Mon Sep 17 00:00:00 2001 From: Sakshyam Shah Date: Tue, 30 Jul 2024 09:13:39 -0400 Subject: [PATCH 003/139] [v16] web: support SAML resource deletion in unified resources view (#44746) * web: support SAML resource deletion in unified resources view * remove import newlines --- .../CardsView/ResourceCard.story.tsx | 96 +++++++------- web/packages/teleport/src/Main/Main.tsx | 2 +- .../SamlApplications/useSamlAppActions.tsx | 118 ++++++++++++++++++ .../UnifiedResources/ResourceActionButton.tsx | 47 ++++--- .../src/UnifiedResources/UnifiedResources.tsx | 42 +++++-- .../teleport/src/services/samlidp/types.ts | 18 +++ 6 files changed, 244 insertions(+), 79 deletions(-) create mode 100644 web/packages/teleport/src/SamlApplications/useSamlAppActions.tsx diff --git a/web/packages/shared/components/UnifiedResources/CardsView/ResourceCard.story.tsx b/web/packages/shared/components/UnifiedResources/CardsView/ResourceCard.story.tsx index ea05565de2150..a8b95d64ba316 100644 --- a/web/packages/shared/components/UnifiedResources/CardsView/ResourceCard.story.tsx +++ b/web/packages/shared/components/UnifiedResources/CardsView/ResourceCard.story.tsx @@ -33,6 +33,7 @@ import { nodes } from 'teleport/Nodes/fixtures'; import makeApp from 'teleport/services/apps/makeApps'; import { ResourceActionButton } from 'teleport/UnifiedResources/ResourceActionButton'; +import { SamlAppActionProvider } from 'teleport/SamlApplications/useSamlAppActions'; import { makeUnifiedResourceViewItemApp, @@ -102,56 +103,51 @@ const ActionButton = Action; export const Cards: Story = { render() { return ( - - {[ - ...apps.map(resource => - makeUnifiedResourceViewItemApp(resource, { - ActionButton: ( - - alert('Sets resource spec and opens update dialog') - } - /> - ), - }) - ), - ...databases.map(resource => - makeUnifiedResourceViewItemDatabase(resource, { - ActionButton, - }) - ), - ...kubes.map(resource => - makeUnifiedResourceViewItemKube(resource, { ActionButton }) - ), - ...nodes.map(resource => - makeUnifiedResourceViewItemNode(resource, { - ActionButton, - }) - ), - ...additionalResources.map(resource => - makeUnifiedResourceViewItemApp(resource, { ActionButton }) - ), - ...desktops.map(resource => - makeUnifiedResourceViewItemDesktop(resource, { ActionButton }) - ), - ].map((res, i) => ( - {}} - selectResource={() => {}} - selected={false} - pinningSupport={PinningSupport.Supported} - name={res.name} - primaryIconName={res.primaryIconName} - SecondaryIcon={res.SecondaryIcon} - cardViewProps={res.cardViewProps} - labels={res.labels} - ActionButton={res.ActionButton} - /> - ))} - + + + {[ + ...apps.map(resource => + makeUnifiedResourceViewItemApp(resource, { + ActionButton: , + }) + ), + ...databases.map(resource => + makeUnifiedResourceViewItemDatabase(resource, { + ActionButton, + }) + ), + ...kubes.map(resource => + makeUnifiedResourceViewItemKube(resource, { ActionButton }) + ), + ...nodes.map(resource => + makeUnifiedResourceViewItemNode(resource, { + ActionButton, + }) + ), + ...additionalResources.map(resource => + makeUnifiedResourceViewItemApp(resource, { ActionButton }) + ), + ...desktops.map(resource => + makeUnifiedResourceViewItemDesktop(resource, { ActionButton }) + ), + ].map((res, i) => ( + {}} + selectResource={() => {}} + selected={false} + pinningSupport={PinningSupport.Supported} + name={res.name} + primaryIconName={res.primaryIconName} + SecondaryIcon={res.SecondaryIcon} + cardViewProps={res.cardViewProps} + labels={res.labels} + ActionButton={res.ActionButton} + /> + ))} + + ); }, }; diff --git a/web/packages/teleport/src/Main/Main.tsx b/web/packages/teleport/src/Main/Main.tsx index a0105ea9cfe7c..bfaec119415b1 100644 --- a/web/packages/teleport/src/Main/Main.tsx +++ b/web/packages/teleport/src/Main/Main.tsx @@ -327,7 +327,7 @@ export const useNoMinWidth = () => { }, []); }; -const ContentMinWidth = ({ children }: { children: ReactNode }) => { +export const ContentMinWidth = ({ children }: { children: ReactNode }) => { const [enforceMinWidth, setEnforceMinWidth] = useState(true); return ( diff --git a/web/packages/teleport/src/SamlApplications/useSamlAppActions.tsx b/web/packages/teleport/src/SamlApplications/useSamlAppActions.tsx new file mode 100644 index 0000000000000..929f4ff149e78 --- /dev/null +++ b/web/packages/teleport/src/SamlApplications/useSamlAppActions.tsx @@ -0,0 +1,118 @@ +/** + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import React, { createContext, useContext } from 'react'; +import { Attempt } from 'shared/hooks/useAsync'; + +import { SamlMeta } from 'teleport/Discover/useDiscover'; + +import type { SamlAppToDelete } from 'teleport/services/samlidp/types'; +import type { ResourceSpec } from 'teleport/Discover/SelectResource/types'; +import type { Access } from 'teleport/services/user'; + +/** + * SamlAppAction defines Saml application edit and delete actions. + */ +export interface SamlAppAction { + /** + * actions controls Saml menu button view and edit and delete onClick behaviour. + */ + actions: { + /** + * showActions dictates whether to show or hide the Saml menu button. + */ + showActions: boolean; + /** + * startEdit triggers Saml app edit flow. + */ + startEdit: (resourceSpec: ResourceSpec) => void; + /** + * startDelete triggers Saml app delete flow. + */ + startDelete: (resourceSpec: ResourceSpec) => void; + }; + /** + * currentAction specifies edit or delete mode. + */ + currentAction?: SamlAppActionMode; + /** + * deleteSamlAppAttempt is an attempt to delete Saml + * app in the backend. + */ + deleteSamlAppAttempt?: Attempt; + /** + * samlAppToDelete defines Saml app item that is to be + * deleted from the unified view. + */ + samlAppToDelete?: SamlAppToDelete; + /** + * fetchSamlResourceAttempt is an attempt to fetch + * Saml resource spec from the backend. It is used to + * pre-populate input fields in the Saml Discover flow. + */ + fetchSamlResourceAttempt?: Attempt; + /** + * resourceSpec holds current Saml app resource spec. + */ + resourceSpec?: ResourceSpec; + /** + * userSamlIdPPerm holds user's RBAC permissions to + * saml_idp_service_provider resource. + */ + userSamlIdPPerm?: Access; + /** + * clearAction clears edit or delete flow. + */ + clearAction?: () => void; + /** + * onDelete handles Saml app delete in the backend. + */ + onDelete?: () => void; +} + +export const SamlAppActionContext = createContext(null); + +export function useSamlAppAction() { + return useContext(SamlAppActionContext); +} + +/** + * SamlAppActionProvider is a dummy provider to satisfy + * SamlAppActionContext in Teleport community edition. + */ +export function SamlAppActionProvider({ + children, +}: { + children: React.ReactNode; +}) { + const value: SamlAppAction = { + actions: { + showActions: false, + startEdit: null, + startDelete: null, + }, + }; + + return ( + + {children} + + ); +} + +export type SamlAppActionMode = 'edit' | 'delete'; diff --git a/web/packages/teleport/src/UnifiedResources/ResourceActionButton.tsx b/web/packages/teleport/src/UnifiedResources/ResourceActionButton.tsx index ce9e23e6e0008..05fcfe3de05ce 100644 --- a/web/packages/teleport/src/UnifiedResources/ResourceActionButton.tsx +++ b/web/packages/teleport/src/UnifiedResources/ResourceActionButton.tsx @@ -16,14 +16,13 @@ * along with this program. If not, see . */ -import React, { useState, Dispatch, SetStateAction } from 'react'; +import React, { useState } from 'react'; import { ButtonBorder, ButtonWithMenu, MenuItem } from 'design'; import { LoginItem, MenuLogin } from 'shared/components/MenuLogin'; import { AwsLaunchButton } from 'shared/components/AwsLaunchButton'; import { UnifiedResource } from 'teleport/services/agents'; import cfg from 'teleport/config'; - import useTeleport from 'teleport/useTeleport'; import { Database } from 'teleport/services/databases'; import { openNewTab } from 'teleport/lib/util'; @@ -34,23 +33,22 @@ import KubeConnectDialog from 'teleport/Kubes/ConnectDialog'; import useStickyClusterId from 'teleport/useStickyClusterId'; import { Node, sortNodeLogins } from 'teleport/services/nodes'; import { App } from 'teleport/services/apps'; - import { ResourceKind } from 'teleport/Discover/Shared'; import { DiscoverEventResource } from 'teleport/services/userEvent'; +import { useSamlAppAction } from 'teleport/SamlApplications/useSamlAppActions'; import type { ResourceSpec } from 'teleport/Discover/SelectResource/types'; type Props = { resource: UnifiedResource; - setResourceSpec?: Dispatch>; }; -export const ResourceActionButton = ({ resource, setResourceSpec }: Props) => { +export const ResourceActionButton = ({ resource }: Props) => { switch (resource.kind) { case 'node': return ; case 'app': - return ; + return ; case 'db': return ; case 'kube_cluster': @@ -144,9 +142,8 @@ const DesktopConnect = ({ desktop }: { desktop: Desktop }) => { type AppLaunchProps = { app: App; - setResourceSpec?: Dispatch>; }; -const AppLaunch = ({ app, setResourceSpec }: AppLaunchProps) => { +const AppLaunch = ({ app }: AppLaunchProps) => { const { name, launchUrl, @@ -160,6 +157,7 @@ const AppLaunch = ({ app, setResourceSpec }: AppLaunchProps) => { samlAppSsoUrl, samlAppPreset, } = app; + const { actions, userSamlIdPPerm } = useSamlAppAction(); if (awsConsole) { return ( { ); } - function handleSamlAppEditButtonClick() { - setResourceSpec({ - name: name, - event: DiscoverEventResource.SamlApplication, - kind: ResourceKind.SamlApplication, - samlMeta: { preset: samlAppPreset }, - icon: 'application', - keywords: 'saml', - }); - } if (samlApp) { - if (setResourceSpec) { + if (actions.showActions) { + const currentSamlAppSpec: ResourceSpec = { + name: name, + event: DiscoverEventResource.SamlApplication, + kind: ResourceKind.SamlApplication, + samlMeta: { preset: samlAppPreset }, + icon: 'application', + keywords: 'saml', + }; return ( { forwardedAs="a" title="Log in to SAML application" > - Edit + actions.startEdit(currentSamlAppSpec)} + disabled={!userSamlIdPPerm.edit} // disable props does not disable onClick + > + Edit + + actions.startDelete(currentSamlAppSpec)} + disabled={!userSamlIdPPerm.remove} // disable props does not disable onClick + > + Delete + ); } else { diff --git a/web/packages/teleport/src/UnifiedResources/UnifiedResources.tsx b/web/packages/teleport/src/UnifiedResources/UnifiedResources.tsx index c7fff86888bb3..df2215f13a40d 100644 --- a/web/packages/teleport/src/UnifiedResources/UnifiedResources.tsx +++ b/web/packages/teleport/src/UnifiedResources/UnifiedResources.tsx @@ -16,8 +16,7 @@ * along with this program. If not, see . */ -import React, { useCallback, useState } from 'react'; - +import React, { useCallback, useState, useMemo } from 'react'; import { Flex } from 'design'; import { Danger } from 'design/Alert'; @@ -50,6 +49,10 @@ import { encodeUrlQueryParams } from 'teleport/components/hooks/useUrlFiltering' import Empty, { EmptyStateInfo } from 'teleport/components/Empty'; import { FeatureFlags } from 'teleport/types'; import { UnifiedResource } from 'teleport/services/agents'; +import { + useSamlAppAction, + SamlAppActionProvider, +} from 'teleport/SamlApplications/useSamlAppActions'; import { ResourceActionButton } from './ResourceActionButton'; import SearchPanel from './SearchPanel'; @@ -59,11 +62,13 @@ export function UnifiedResources() { return ( - + + + ); } @@ -149,7 +154,12 @@ export function ClusterResources({ getClusterPinnedResources: getCurrentClusterPinnedResources, }; - const { fetch, resources, attempt, clear } = useUnifiedResourcesFetch({ + const { + fetch, + resources: unfilteredResources, + attempt, + clear, + } = useUnifiedResourcesFetch({ fetchFunc: useCallback( async (paginationParams, signal) => { const response = await teleCtx.resourceService.fetchUnifiedResources( @@ -187,6 +197,22 @@ export function ClusterResources({ ), }); + const { samlAppToDelete } = useSamlAppAction(); + const resources = useMemo( + () => + samlAppToDelete?.backendDeleted + ? unfilteredResources.filter( + res => + !( + res.kind === 'app' && + res.samlApp && + res.name === samlAppToDelete.name + ) + ) + : unfilteredResources, + [samlAppToDelete, unfilteredResources] + ); + // This state is used to recognize when the `params` value has changed, // and reset the overall state of `useUnifiedResourcesFetch` hook. It's tempting to use a // `useEffect` here, but doing so can cause unwanted behavior where the previous, diff --git a/web/packages/teleport/src/services/samlidp/types.ts b/web/packages/teleport/src/services/samlidp/types.ts index 12add6ec1ed78..2270fed85ed43 100644 --- a/web/packages/teleport/src/services/samlidp/types.ts +++ b/web/packages/teleport/src/services/samlidp/types.ts @@ -75,3 +75,21 @@ export type SamlGcpWorkforce = { poolName: string; poolProviderName: string; }; + +/** + * SamlAppToDelete is used to define the name of an + * SAML app item to be deleted and its deletion state in the + * backend. Intended to be used in the unified resource view. + */ +export type SamlAppToDelete = { + /** + * name is the name of Saml app item to delete. + */ + name: string; + // kind: string; + /** + * backendDeleted specifies if the item is deleted + * in the backend. + */ + backendDeleted: boolean; +}; From 766bf72206b22078795d3d6c95233e862f221086 Mon Sep 17 00:00:00 2001 From: Noah Stride Date: Tue, 30 Jul 2024 14:18:05 +0100 Subject: [PATCH 004/139] Allow configuration of Kubernetes Secret destination from command-line flags (#44801) --- lib/tbot/config/config.go | 21 +++++++++++++++++++++ lib/tbot/config/config_test.go | 13 +++++++++++++ 2 files changed, 34 insertions(+) diff --git a/lib/tbot/config/config.go b/lib/tbot/config/config.go index 6ffae7a328c08..bebde8968c81c 100644 --- a/lib/tbot/config/config.go +++ b/lib/tbot/config/config.go @@ -631,6 +631,27 @@ func destinationFromURI(uriString string) (bot.Destination, error) { ) } return &DestinationMemory{}, nil + case "kubernetes-secret": + if uri.Host != "" { + return nil, trace.BadParameter( + "kubernetes-secret scheme should not be specified with host", + ) + } + if uri.Path == "" { + return nil, trace.BadParameter( + "kubernetes-secret scheme should have a path specified", + ) + } + // kubernetes-secret:///my-secret + // TODO(noah): Eventually we'll support namespace in the host part of + // the URI. For now, we'll default to the namespace tbot is running in. + + // Path will be prefixed with '/' so we'll strip it off. + secretName := strings.TrimPrefix(uri.Path, "/") + + return &DestinationKubernetesSecret{ + Name: secretName, + }, nil default: return nil, trace.BadParameter( "unrecognized data storage scheme", diff --git a/lib/tbot/config/config_test.go b/lib/tbot/config/config_test.go index c98e4a0cee227..123e1b6b6c8e3 100644 --- a/lib/tbot/config/config_test.go +++ b/lib/tbot/config/config_test.go @@ -198,6 +198,19 @@ func TestDestinationFromURI(t *testing.T) { in: "foobar://", wantErr: true, }, + { + in: "kubernetes-secret:///my-secret", + want: &DestinationKubernetesSecret{ + Name: "my-secret", + }, + }, + { + in: "kubernetes-secret://my-secret", + want: &DestinationKubernetesSecret{ + Name: "my-secret", + }, + wantErr: true, + }, } for _, tt := range tests { t.Run(tt.in, func(t *testing.T) { From 7c00f8efd375aa01fee9bd89c0709c96dc0c6b78 Mon Sep 17 00:00:00 2001 From: Zac Bergquist Date: Tue, 30 Jul 2024 07:49:04 -0600 Subject: [PATCH 005/139] tsh: use package filepath for working with file paths (#44773) We were using package path to date, which assumes a path separator of '/' and does not work correctly on Windows. --- tool/tsh/common/tsh.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tool/tsh/common/tsh.go b/tool/tsh/common/tsh.go index 0771199a406cc..96022fda4fd9f 100644 --- a/tool/tsh/common/tsh.go +++ b/tool/tsh/common/tsh.go @@ -31,7 +31,7 @@ import ( "os" "os/exec" "os/signal" - "path" + "path/filepath" "regexp" "runtime" "runtime/pprof" @@ -596,7 +596,7 @@ func Main() { // lets see: if the executable name is 'ssh' or 'scp' we convert // that to "tsh ssh" or "tsh scp" - switch path.Base(os.Args[0]) { + switch filepath.Base(os.Args[0]) { case "ssh": cmdLine = append([]string{"ssh"}, cmdLineOrig...) case "scp": @@ -5169,10 +5169,10 @@ func serializeEnvironment(profile *client.ProfileStatus, format string) (string, func setEnvFlags(cf *CLIConf) { // these can only be set with env vars. if homeDir := os.Getenv(types.HomeEnvVar); homeDir != "" { - cf.HomePath = path.Clean(homeDir) + cf.HomePath = filepath.Clean(homeDir) } if configPath := os.Getenv(globalTshConfigEnvVar); configPath != "" { - cf.GlobalTshConfigPath = path.Clean(configPath) + cf.GlobalTshConfigPath = filepath.Clean(configPath) } // prioritize CLI input for the rest. From 36a9d1f8b98bc65bf4153ec79b030091488a02a2 Mon Sep 17 00:00:00 2001 From: Sakshyam Shah Date: Tue, 30 Jul 2024 10:17:17 -0400 Subject: [PATCH 006/139] update v16 e-ref (#44809) --- e | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e b/e index 90a05a1286e7d..8c671ad7b60bd 160000 --- a/e +++ b/e @@ -1 +1 @@ -Subproject commit 90a05a1286e7d6538b00de6e31cde6b7140dce07 +Subproject commit 8c671ad7b60bd83e6b8f247c366320400fe4d44e From f55f55dd77e76151ad502388a5cb99326e77520a Mon Sep 17 00:00:00 2001 From: Yassine Bounekhla <56373201+rudream@users.noreply.github.com> Date: Tue, 30 Jul 2024 11:28:24 -0400 Subject: [PATCH 007/139] emit app.session.start when creating an app session (#43636) (#44792) --- api/client/proto/authservice.pb.go | 2048 +++++++++-------- .../legacy/client/proto/authservice.proto | 8 + .../teleport/legacy/types/events/events.proto | 2 + api/types/events/events.pb.go | 1901 +++++++-------- .../teleport/legacy/types/events/events.proto | 2 + lib/auth/auth.go | 3 + lib/auth/auth_with_roles.go | 3 + lib/auth/authclient/clt.go | 2 + lib/auth/sessions.go | 48 + lib/teleterm/clusters/cluster_apps.go | 1 + lib/tlsca/ca.go | 4 + lib/web/apps.go | 54 +- tool/tctl/common/auth_command.go | 1 + tool/tsh/common/app.go | 3 + tool/tsh/common/app_test.go | 22 + tool/tsh/common/vnet_common.go | 1 + 16 files changed, 2206 insertions(+), 1897 deletions(-) diff --git a/api/client/proto/authservice.pb.go b/api/client/proto/authservice.pb.go index 7b0da9c93095c..34aa03b4ba113 100644 --- a/api/client/proto/authservice.pb.go +++ b/api/client/proto/authservice.pb.go @@ -1255,7 +1255,9 @@ type RouteToApp struct { // AzureIdentity is the Azure identity to assume when accessing Azure API. AzureIdentity string `protobuf:"bytes,6,opt,name=AzureIdentity,proto3" json:"azure_identity,omitempty"` // GCPServiceAccount is the GCP service account to assume when accessing GCP API. - GCPServiceAccount string `protobuf:"bytes,7,opt,name=GCPServiceAccount,proto3" json:"gcp_service_account,omitempty"` + GCPServiceAccount string `protobuf:"bytes,7,opt,name=GCPServiceAccount,proto3" json:"gcp_service_account,omitempty"` + // URI is the URI of the app. This is the internal endpoint where the application is running and isn't user-facing. + URI string `protobuf:"bytes,8,opt,name=URI,proto3" json:"uri,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -1344,6 +1346,13 @@ func (m *RouteToApp) GetGCPServiceAccount() string { return "" } +func (m *RouteToApp) GetURI() string { + if m != nil { + return m.URI + } + return "" +} + // GetUserRequest specifies parameters for the GetUser method. type GetUserRequest struct { // Name is the name of the desired user. @@ -3853,10 +3862,16 @@ type CreateAppSessionRequest struct { // MFAResponse is a response to a challenge from a user's MFA device. // An optional field, that when provided, the response will be validated and // the ID of the validated MFA device will be stored in session's certificate. - MFAResponse *MFAAuthenticateResponse `protobuf:"bytes,8,opt,name=MFAResponse,proto3" json:"mfa_response,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + MFAResponse *MFAAuthenticateResponse `protobuf:"bytes,8,opt,name=MFAResponse,proto3" json:"mfa_response,omitempty"` + // AppName is the name of the application. + AppName string `protobuf:"bytes,9,opt,name=AppName,proto3" json:"app_name"` + // URI is the URI of the app. This is the internal endpoint where the application is running and isn't user-facing. + URI string `protobuf:"bytes,10,opt,name=URI,proto3" json:"uri"` + // ClientAddr is a client (user's) address. + ClientAddr string `protobuf:"bytes,11,opt,name=ClientAddr,proto3" json:"client_addr,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *CreateAppSessionRequest) Reset() { *m = CreateAppSessionRequest{} } @@ -3941,6 +3956,27 @@ func (m *CreateAppSessionRequest) GetMFAResponse() *MFAAuthenticateResponse { return nil } +func (m *CreateAppSessionRequest) GetAppName() string { + if m != nil { + return m.AppName + } + return "" +} + +func (m *CreateAppSessionRequest) GetURI() string { + if m != nil { + return m.URI + } + return "" +} + +func (m *CreateAppSessionRequest) GetClientAddr() string { + if m != nil { + return m.ClientAddr + } + return "" +} + // CreateAppSessionResponse contains the requested application web session. type CreateAppSessionResponse struct { // Session is the application web session. @@ -15440,920 +15476,924 @@ func init() { } var fileDescriptor_0ffcffcda38ae159 = []byte{ - // 14607 bytes of a gzipped FileDescriptorProto + // 14667 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0xbd, 0x5b, 0x6c, 0x5c, 0x49, - 0x76, 0x20, 0xc8, 0xe4, 0x9b, 0x87, 0x0f, 0xa5, 0x82, 0xa4, 0x48, 0x51, 0x94, 0x52, 0xba, 0xf5, - 0x52, 0xa9, 0xab, 0xf5, 0xa0, 0xaa, 0xaa, 0xeb, 0xd5, 0x55, 0x9d, 0x7c, 0x48, 0xa4, 0xc4, 0x57, - 0xdd, 0x24, 0xa9, 0xaa, 0xea, 0x72, 0x67, 0x5f, 0x66, 0x86, 0xc8, 0x6b, 0x25, 0xef, 0xcd, 0xbe, - 0xf7, 0xa6, 0x54, 0x6a, 0xaf, 0xbd, 0x70, 0x7b, 0x17, 0xeb, 0x9f, 0xdd, 0xb5, 0x81, 0xf5, 0xc2, - 0x0b, 0x7f, 0x18, 0x0b, 0x8c, 0x81, 0xc1, 0x7c, 0xf9, 0x67, 0xc6, 0x3f, 0x03, 0x0c, 0xe6, 0x6b, - 0x7a, 0x0c, 0x78, 0x1e, 0xb0, 0xfd, 0x33, 0x1f, 0xf4, 0x4c, 0x03, 0xf3, 0x43, 0xcc, 0x7c, 0x18, - 0x83, 0x19, 0x60, 0x1a, 0x30, 0x30, 0x88, 0x13, 0x8f, 0x1b, 0x71, 0x5f, 0x49, 0x4a, 0xaa, 0xf6, - 0xfc, 0x48, 0xcc, 0x13, 0xe7, 0x9c, 0x88, 0x38, 0x11, 0x37, 0xe2, 0xc4, 0x89, 0x13, 0xe7, 0xc0, - 0xcd, 0x88, 0xb6, 0x68, 0xdb, 0x0f, 0xa2, 0x5b, 0x2d, 0x7a, 0xe0, 0x34, 0x9e, 0xdf, 0x6a, 0xb4, - 0x5c, 0xea, 0x45, 0xb7, 0xda, 0x81, 0x1f, 0xf9, 0xb7, 0x9c, 0x4e, 0x74, 0x18, 0xd2, 0xe0, 0xa9, - 0xdb, 0xa0, 0x37, 0x11, 0x42, 0x06, 0xf0, 0xbf, 0xb9, 0xa9, 0x03, 0xff, 0xc0, 0xe7, 0x38, 0xec, - 0x2f, 0x5e, 0x38, 0x77, 0xe9, 0xc0, 0xf7, 0x0f, 0x5a, 0x94, 0x13, 0xef, 0x77, 0x1e, 0xdf, 0xa2, - 0x47, 0xed, 0xe8, 0xb9, 0x28, 0xac, 0x24, 0x0b, 0x23, 0xf7, 0x88, 0x86, 0x91, 0x73, 0xd4, 0x16, - 0x08, 0x6f, 0xab, 0xa6, 0x38, 0x51, 0xc4, 0x4a, 0x22, 0xd7, 0xf7, 0x6e, 0x3d, 0xbd, 0xa3, 0xff, - 0x14, 0xa8, 0xd7, 0x0b, 0x5b, 0xdd, 0xa0, 0x41, 0x14, 0x9e, 0x0a, 0x93, 0x3e, 0xa5, 0x5e, 0x94, - 0xaa, 0x5e, 0x60, 0x46, 0xcf, 0xdb, 0x34, 0xe4, 0x28, 0xf2, 0x3f, 0x81, 0x7a, 0x2d, 0x1b, 0x15, - 0xff, 0x15, 0x28, 0xdf, 0xcd, 0x46, 0x79, 0x46, 0xf7, 0x99, 0x4c, 0x3d, 0xf5, 0x47, 0x17, 0xf4, - 0xc0, 0x69, 0xb7, 0x69, 0x10, 0xff, 0x21, 0xd0, 0x2f, 0x2a, 0xf4, 0xa3, 0xc7, 0x0e, 0x13, 0xd1, - 0xd1, 0x63, 0x27, 0xd5, 0x8d, 0x4e, 0xe8, 0x1c, 0x50, 0xd1, 0xfc, 0xa7, 0x77, 0xf4, 0x9f, 0x1c, - 0xd5, 0xfa, 0xe3, 0x12, 0x0c, 0x3c, 0x72, 0xa2, 0xc6, 0x21, 0xf9, 0x0c, 0x06, 0x1e, 0xba, 0x5e, - 0x33, 0x9c, 0x2d, 0x5d, 0xed, 0xbb, 0x3e, 0xba, 0x50, 0xbe, 0xc9, 0xbb, 0x82, 0x85, 0xac, 0x60, - 0x71, 0xe6, 0xe7, 0xc7, 0x95, 0x9e, 0x93, 0xe3, 0xca, 0xb9, 0x27, 0x0c, 0xed, 0x1d, 0xff, 0xc8, - 0x8d, 0x70, 0x6c, 0x6d, 0x4e, 0x47, 0x76, 0x61, 0xb2, 0xda, 0x6a, 0xf9, 0xcf, 0xb6, 0x9d, 0x20, - 0x72, 0x9d, 0x56, 0xad, 0xd3, 0x68, 0xd0, 0x30, 0x9c, 0xed, 0xbd, 0x5a, 0xba, 0x3e, 0xbc, 0xf8, - 0xda, 0xc9, 0x71, 0xa5, 0xe2, 0xb0, 0xe2, 0x7a, 0x9b, 0x97, 0xd7, 0x43, 0x8e, 0xa0, 0x31, 0xca, - 0xa2, 0xb7, 0xfe, 0x7c, 0x10, 0xca, 0xab, 0x7e, 0x18, 0x2d, 0xb1, 0x11, 0xb5, 0xe9, 0x4f, 0x3a, - 0x34, 0x8c, 0xc8, 0x6b, 0x30, 0xc8, 0x60, 0x6b, 0xcb, 0xb3, 0xa5, 0xab, 0xa5, 0xeb, 0x23, 0x8b, - 0xa3, 0x27, 0xc7, 0x95, 0xa1, 0x43, 0x3f, 0x8c, 0xea, 0x6e, 0xd3, 0x16, 0x45, 0xe4, 0x6d, 0x18, - 0xde, 0xf4, 0x9b, 0x74, 0xd3, 0x39, 0xa2, 0xd8, 0x8a, 0x91, 0xc5, 0xf1, 0x93, 0xe3, 0xca, 0x88, - 0xe7, 0x37, 0x69, 0xdd, 0x73, 0x8e, 0xa8, 0xad, 0x8a, 0xc9, 0x1e, 0xf4, 0xdb, 0x7e, 0x8b, 0xce, - 0xf6, 0x21, 0xda, 0xe2, 0xc9, 0x71, 0xa5, 0x3f, 0xf0, 0x5b, 0xf4, 0x97, 0xc7, 0x95, 0xf7, 0x0f, - 0xdc, 0xe8, 0xb0, 0xb3, 0x7f, 0xb3, 0xe1, 0x1f, 0xdd, 0x3a, 0x08, 0x9c, 0xa7, 0x2e, 0x9f, 0x84, - 0x4e, 0xeb, 0x56, 0x3c, 0x55, 0xdb, 0xae, 0x18, 0xf7, 0xda, 0xf3, 0x30, 0xa2, 0x47, 0x8c, 0x93, - 0x8d, 0xfc, 0xc8, 0x23, 0x98, 0xaa, 0x36, 0x9b, 0x2e, 0xa7, 0xd8, 0x0e, 0x5c, 0xaf, 0xe1, 0xb6, - 0x9d, 0x56, 0x38, 0xdb, 0x7f, 0xb5, 0xef, 0xfa, 0x88, 0x10, 0x8a, 0x2a, 0xaf, 0xb7, 0x15, 0x82, - 0x26, 0x94, 0x4c, 0x06, 0xe4, 0x2e, 0x0c, 0x2f, 0x6f, 0xd6, 0x58, 0xdb, 0xc3, 0xd9, 0x01, 0x64, - 0x36, 0x73, 0x72, 0x5c, 0x99, 0x6c, 0x7a, 0x21, 0x76, 0x4d, 0x67, 0xa0, 0x10, 0xc9, 0xfb, 0x30, - 0xb6, 0xdd, 0xd9, 0x6f, 0xb9, 0x8d, 0x9d, 0xf5, 0xda, 0x43, 0xfa, 0x7c, 0x76, 0xf0, 0x6a, 0xe9, - 0xfa, 0xd8, 0x22, 0x39, 0x39, 0xae, 0x4c, 0xb4, 0x11, 0x5e, 0x8f, 0x5a, 0x61, 0xfd, 0x09, 0x7d, - 0x6e, 0x1b, 0x78, 0x31, 0x5d, 0xad, 0xb6, 0xca, 0xe8, 0x86, 0x52, 0x74, 0x61, 0x78, 0xa8, 0xd3, - 0x71, 0x3c, 0x72, 0x0b, 0xc0, 0xa6, 0x47, 0x7e, 0x44, 0xab, 0xcd, 0x66, 0x30, 0x3b, 0x8c, 0xb2, - 0x3d, 0x77, 0x72, 0x5c, 0x19, 0x0d, 0x10, 0x5a, 0x77, 0x9a, 0xcd, 0xc0, 0xd6, 0x50, 0xc8, 0x12, - 0x0c, 0xdb, 0x3e, 0x17, 0xf0, 0xec, 0xc8, 0xd5, 0xd2, 0xf5, 0xd1, 0x85, 0x73, 0x62, 0x1a, 0x4a, - 0xf0, 0xe2, 0x85, 0x93, 0xe3, 0x0a, 0x09, 0xc4, 0x2f, 0xbd, 0x97, 0x12, 0x83, 0x54, 0x60, 0x68, - 0xd3, 0x5f, 0x72, 0x1a, 0x87, 0x74, 0x16, 0x70, 0xee, 0x0d, 0x9c, 0x1c, 0x57, 0x4a, 0xdf, 0xb5, - 0x25, 0x94, 0x3c, 0x85, 0xd1, 0x78, 0xa0, 0xc2, 0xd9, 0x51, 0x14, 0xdf, 0xce, 0xc9, 0x71, 0xe5, - 0x42, 0x88, 0xe0, 0x3a, 0x1b, 0x7a, 0x4d, 0x82, 0x2f, 0x31, 0x0b, 0xf4, 0x8a, 0xc8, 0xd7, 0x30, - 0x1d, 0xff, 0xac, 0x86, 0x21, 0x0d, 0x18, 0x8f, 0xb5, 0xe5, 0xd9, 0x71, 0x94, 0xcc, 0x9b, 0x27, - 0xc7, 0x15, 0x4b, 0x6b, 0x41, 0xdd, 0x91, 0x28, 0x75, 0xb7, 0xa9, 0xf5, 0x34, 0x9b, 0xc9, 0x83, - 0xfe, 0xe1, 0xb1, 0xf2, 0xb8, 0x7d, 0x79, 0xd7, 0x0b, 0x23, 0x67, 0xbf, 0x45, 0x33, 0x91, 0xac, - 0xbf, 0x2b, 0x01, 0xd9, 0x6a, 0x53, 0xaf, 0x56, 0x5b, 0x65, 0xdf, 0x93, 0xfc, 0x9c, 0xde, 0x81, - 0x11, 0x3e, 0x70, 0x6c, 0x74, 0x7b, 0x71, 0x74, 0x27, 0x4e, 0x8e, 0x2b, 0x20, 0x46, 0x97, 0x8d, - 0x6c, 0x8c, 0x40, 0xde, 0x80, 0xbe, 0x9d, 0x9d, 0x75, 0xfc, 0x56, 0xfa, 0x16, 0x27, 0x4f, 0x8e, - 0x2b, 0x7d, 0x51, 0xd4, 0xfa, 0xe5, 0x71, 0x65, 0x78, 0xb9, 0x13, 0xa0, 0x58, 0x6c, 0x56, 0x4e, - 0xde, 0x80, 0xa1, 0xa5, 0x56, 0x27, 0x8c, 0x68, 0x30, 0xdb, 0x1f, 0x7f, 0xa4, 0x0d, 0x0e, 0xb2, - 0x65, 0x19, 0xf9, 0x0e, 0xf4, 0xef, 0x86, 0x34, 0x98, 0x1d, 0xc0, 0xf1, 0x1e, 0x17, 0xe3, 0xcd, - 0x40, 0x7b, 0x0b, 0x8b, 0xc3, 0xec, 0x4b, 0xec, 0x84, 0x34, 0xb0, 0x11, 0x89, 0xdc, 0x84, 0x01, - 0x3e, 0x68, 0x83, 0xb8, 0x48, 0x8d, 0xab, 0xd9, 0xd1, 0xa2, 0x7b, 0xef, 0x2f, 0x8e, 0x9c, 0x1c, - 0x57, 0x06, 0x70, 0xf0, 0x6c, 0x8e, 0xf6, 0xa0, 0x7f, 0xb8, 0x54, 0xee, 0xb5, 0x87, 0x19, 0x2d, - 0xfb, 0x2c, 0xac, 0xef, 0xc0, 0xa8, 0xd6, 0x7d, 0x32, 0x0f, 0xfd, 0xec, 0x7f, 0x5c, 0x44, 0xc6, - 0x78, 0x65, 0x6c, 0xe3, 0xb0, 0x11, 0x6a, 0xfd, 0x93, 0x73, 0x50, 0x66, 0x94, 0xc6, 0xca, 0x63, - 0x88, 0xaa, 0xd4, 0x4d, 0x54, 0xd7, 0x41, 0xd5, 0x2d, 0x96, 0xa0, 0xb1, 0x93, 0xe3, 0xca, 0x70, - 0x47, 0xc0, 0xe2, 0x96, 0x91, 0x1a, 0x0c, 0xad, 0x7c, 0xd3, 0x76, 0x03, 0x1a, 0xa2, 0x60, 0x47, - 0x17, 0xe6, 0x6e, 0xf2, 0xcd, 0xf2, 0xa6, 0xdc, 0x2c, 0x6f, 0xee, 0xc8, 0xcd, 0x72, 0xf1, 0xb2, - 0x58, 0x8a, 0xcf, 0x53, 0x4e, 0x12, 0xcf, 0x8e, 0xdf, 0xfb, 0x9b, 0x4a, 0xc9, 0x96, 0x9c, 0xc8, - 0x3b, 0x30, 0x78, 0xcf, 0x0f, 0x8e, 0x9c, 0x48, 0x8c, 0xc0, 0xd4, 0xc9, 0x71, 0xa5, 0xfc, 0x18, - 0x21, 0xda, 0x84, 0x12, 0x38, 0xe4, 0x1e, 0x4c, 0xd8, 0x7e, 0x27, 0xa2, 0x3b, 0xbe, 0x1c, 0xb7, - 0x01, 0xa4, 0xba, 0x72, 0x72, 0x5c, 0x99, 0x0b, 0x58, 0x49, 0x3d, 0xf2, 0xeb, 0x62, 0x00, 0x35, - 0xfa, 0x04, 0x15, 0x59, 0x81, 0x89, 0x2a, 0xae, 0xdd, 0x42, 0x66, 0x7c, 0xb4, 0x46, 0x16, 0x2f, - 0x9f, 0x1c, 0x57, 0x2e, 0x3a, 0x58, 0x52, 0x0f, 0x44, 0x91, 0xce, 0xc6, 0x24, 0x22, 0x9b, 0x70, - 0xfe, 0x61, 0x67, 0x9f, 0x06, 0x1e, 0x8d, 0x68, 0x28, 0x5b, 0x34, 0x84, 0x2d, 0xba, 0x7a, 0x72, - 0x5c, 0x99, 0x7f, 0xa2, 0x0a, 0x33, 0xda, 0x94, 0x26, 0x25, 0x14, 0xce, 0x89, 0x86, 0x2e, 0x3b, - 0x91, 0xb3, 0xef, 0x84, 0x14, 0x97, 0xa4, 0xd1, 0x85, 0x0b, 0x5c, 0xc4, 0x37, 0x13, 0xa5, 0x8b, - 0xaf, 0x09, 0x29, 0x5f, 0x52, 0x7d, 0x6f, 0x8a, 0x22, 0xad, 0xa2, 0x24, 0x4f, 0xb6, 0x32, 0xab, - 0x5d, 0x67, 0x04, 0x5b, 0x8b, 0x2b, 0xb3, 0xda, 0x75, 0xf4, 0x35, 0x4b, 0xed, 0x3f, 0xeb, 0x30, - 0xb0, 0xcb, 0xf6, 0x66, 0x5c, 0xb1, 0x26, 0x16, 0xae, 0x89, 0x16, 0x25, 0x67, 0xdf, 0x4d, 0xf6, - 0x03, 0x11, 0xf1, 0xbb, 0x3b, 0x87, 0xfb, 0xb9, 0xbe, 0x13, 0x63, 0x19, 0xf9, 0x1c, 0x40, 0xb4, - 0xaa, 0xda, 0x6e, 0xcf, 0x8e, 0x62, 0x27, 0xcf, 0x9b, 0x9d, 0xac, 0xb6, 0xdb, 0x8b, 0x57, 0x44, - 0xff, 0x2e, 0xa8, 0xfe, 0x39, 0xed, 0xb6, 0xc6, 0x4d, 0x63, 0x42, 0x3e, 0x83, 0x31, 0x5c, 0xd0, - 0xe4, 0x88, 0x8e, 0xe1, 0x88, 0x5e, 0x3a, 0x39, 0xae, 0xcc, 0xe0, 0x5a, 0x95, 0x31, 0x9e, 0x06, - 0x01, 0xf9, 0x2d, 0x98, 0x16, 0xec, 0x1e, 0xb9, 0x5e, 0xd3, 0x7f, 0x16, 0x2e, 0xd3, 0xf0, 0x49, - 0xe4, 0xb7, 0x71, 0xf1, 0x1b, 0x5d, 0x98, 0x37, 0x9b, 0x67, 0xe2, 0x2c, 0xde, 0x10, 0x2d, 0xb5, - 0x54, 0x4b, 0x9f, 0x71, 0x84, 0x7a, 0x93, 0x63, 0xe8, 0xcb, 0x63, 0x26, 0x0b, 0xb2, 0x06, 0xe7, - 0x76, 0x43, 0x6a, 0xf4, 0x61, 0x02, 0x77, 0x87, 0x0a, 0x1b, 0xe1, 0x4e, 0x48, 0xeb, 0x79, 0xfd, - 0x48, 0xd2, 0x11, 0x1b, 0xc8, 0x72, 0xe0, 0xb7, 0x13, 0x73, 0xfc, 0x1c, 0x4a, 0xc4, 0x3a, 0x39, - 0xae, 0x5c, 0x69, 0x06, 0x7e, 0xbb, 0x9e, 0x3f, 0xd1, 0x33, 0xa8, 0xc9, 0x8f, 0xe0, 0xc2, 0x92, - 0xef, 0x79, 0xb4, 0xc1, 0xd6, 0xcf, 0x65, 0xd7, 0x39, 0xf0, 0xfc, 0x30, 0x72, 0x1b, 0x6b, 0xcb, - 0xb3, 0xe5, 0x78, 0x73, 0x68, 0x28, 0x8c, 0x7a, 0x53, 0xa1, 0x98, 0x9b, 0x43, 0x0e, 0x17, 0xf2, - 0x43, 0x18, 0x17, 0x75, 0xd1, 0x00, 0xa7, 0xe6, 0xf9, 0xe2, 0x89, 0xa6, 0x90, 0xf9, 0x36, 0x1f, - 0xc8, 0x9f, 0x5c, 0x71, 0x32, 0x79, 0x91, 0xaf, 0x61, 0x74, 0xe3, 0x5e, 0xd5, 0xa6, 0x61, 0xdb, - 0xf7, 0x42, 0x3a, 0x4b, 0x70, 0x44, 0xaf, 0x08, 0xd6, 0x1b, 0xf7, 0xaa, 0xd5, 0x4e, 0x74, 0x48, - 0xbd, 0xc8, 0x6d, 0x38, 0x11, 0x95, 0x58, 0x8b, 0x73, 0x6c, 0xe6, 0x1d, 0x3d, 0x76, 0xea, 0x81, - 0x80, 0x68, 0xbd, 0xd0, 0xd9, 0x91, 0x39, 0x18, 0xae, 0xd5, 0x56, 0xd7, 0xfd, 0x03, 0xd7, 0x9b, - 0x9d, 0x64, 0xc2, 0xb0, 0xd5, 0x6f, 0xb2, 0x0f, 0xd3, 0xda, 0xc9, 0xa0, 0xce, 0xfe, 0xa7, 0x47, - 0xd4, 0x8b, 0x66, 0xa7, 0xb0, 0x0d, 0xdf, 0x55, 0x47, 0x9b, 0x9b, 0xfa, 0x01, 0xe2, 0xe9, 0x9d, - 0x9b, 0xd5, 0xf8, 0x67, 0x4d, 0x12, 0xd9, 0x53, 0x4e, 0x06, 0x94, 0xec, 0xc0, 0xd0, 0x76, 0x27, - 0x68, 0xfb, 0x21, 0x9d, 0x9d, 0x46, 0xa1, 0xbd, 0x56, 0xf4, 0x75, 0x0a, 0xd4, 0xc5, 0x69, 0xb6, - 0x3c, 0xb7, 0xf9, 0x0f, 0xad, 0x67, 0x92, 0x95, 0xf5, 0x05, 0x8c, 0xa8, 0x8f, 0x99, 0x0c, 0x41, - 0x5f, 0xb5, 0xd5, 0x2a, 0xf7, 0xb0, 0x3f, 0x6a, 0xb5, 0xd5, 0x72, 0x89, 0x4c, 0x00, 0xc4, 0x2b, - 0x58, 0xb9, 0x97, 0x8c, 0xc1, 0xb0, 0x5c, 0x61, 0xca, 0x7d, 0x88, 0xdf, 0x6e, 0x97, 0xfb, 0x09, - 0x81, 0x09, 0x73, 0x9e, 0x97, 0x07, 0xac, 0xdf, 0x2f, 0xc1, 0x88, 0x1a, 0x1f, 0x72, 0x0e, 0x46, - 0x77, 0x37, 0x6b, 0xdb, 0x2b, 0x4b, 0x6b, 0xf7, 0xd6, 0x56, 0x96, 0xcb, 0x3d, 0xe4, 0x32, 0x5c, - 0xdc, 0xa9, 0xad, 0xd6, 0x97, 0x17, 0xeb, 0xeb, 0x5b, 0x4b, 0xd5, 0xf5, 0xfa, 0xb6, 0xbd, 0xf5, - 0xc5, 0x97, 0xf5, 0x9d, 0xdd, 0xcd, 0xcd, 0x95, 0xf5, 0x72, 0x89, 0xcc, 0xc2, 0x14, 0x2b, 0x7e, - 0xb8, 0xbb, 0xb8, 0xa2, 0x23, 0x94, 0x7b, 0xc9, 0x35, 0xb8, 0x9c, 0x55, 0x52, 0x5f, 0x5d, 0xa9, - 0x2e, 0xaf, 0xaf, 0xd4, 0x6a, 0xe5, 0x3e, 0x32, 0x03, 0x93, 0x0c, 0xa5, 0xba, 0xbd, 0x6d, 0xd0, - 0xf6, 0x5b, 0x2d, 0x18, 0xd5, 0x84, 0x43, 0xe6, 0x61, 0x76, 0x69, 0xc5, 0xde, 0xa9, 0x6f, 0xef, - 0xda, 0xdb, 0x5b, 0xb5, 0x95, 0xba, 0xd9, 0xc2, 0x64, 0xe9, 0xfa, 0xd6, 0xfd, 0xb5, 0xcd, 0x3a, - 0x03, 0xd5, 0xca, 0x25, 0xd6, 0x0c, 0xa3, 0xb4, 0xb6, 0xb6, 0x79, 0x7f, 0x7d, 0xa5, 0xbe, 0x5b, - 0x5b, 0x11, 0x28, 0xbd, 0xd6, 0xcf, 0x7a, 0x53, 0x4b, 0x3d, 0x59, 0x80, 0xd1, 0x1a, 0x3f, 0xc5, - 0xe2, 0xf4, 0xe7, 0xc7, 0x86, 0xf2, 0xc9, 0x71, 0x65, 0x4c, 0x1c, 0x6e, 0xf9, 0xcc, 0xd6, 0x91, - 0xd8, 0xee, 0xbd, 0xcd, 0x46, 0xba, 0xe1, 0xb7, 0xf4, 0xdd, 0xbb, 0x2d, 0x60, 0xb6, 0x2a, 0x25, - 0x0b, 0xda, 0x3e, 0xcf, 0xcf, 0x10, 0xa8, 0xa7, 0xca, 0x7d, 0x5e, 0x5f, 0xf3, 0xd5, 0x8e, 0xbf, - 0x10, 0x0f, 0xa9, 0xd8, 0x9e, 0x91, 0x26, 0x63, 0x8f, 0x51, 0x78, 0xe4, 0x6d, 0xa9, 0xff, 0x70, - 0x9d, 0x1f, 0x37, 0x81, 0x84, 0xb6, 0x2a, 0x54, 0x1f, 0xab, 0x93, 0xb3, 0xe0, 0x92, 0x8f, 0x93, - 0x73, 0x46, 0x08, 0x03, 0x99, 0x25, 0xd6, 0x55, 0x3b, 0x81, 0x4a, 0x2a, 0x30, 0xc0, 0xbf, 0x44, - 0x2e, 0x0f, 0xd4, 0xb8, 0x5a, 0x0c, 0x60, 0x73, 0xb8, 0xf5, 0x7b, 0x7d, 0xfa, 0xe6, 0xc3, 0x34, - 0x2c, 0x4d, 0xde, 0xa8, 0x61, 0xa1, 0x9c, 0x11, 0x4a, 0x6e, 0xc2, 0x48, 0x8d, 0x86, 0x21, 0xd7, - 0x82, 0x7b, 0xd5, 0x90, 0x40, 0xc8, 0x81, 0x75, 0xb7, 0x39, 0x5b, 0xb2, 0x63, 0x14, 0x76, 0xa0, - 0xe0, 0xba, 0x15, 0x1e, 0x28, 0xfa, 0xe2, 0x03, 0x85, 0xd0, 0xbe, 0xf8, 0x81, 0x22, 0x46, 0x61, - 0xa3, 0x2e, 0xb6, 0x7f, 0x6c, 0x45, 0x7f, 0x3c, 0xea, 0x42, 0x65, 0x10, 0xa3, 0xae, 0x21, 0x91, - 0x8f, 0x00, 0xaa, 0x8f, 0x6a, 0xa8, 0x39, 0xdb, 0x9b, 0x42, 0x05, 0xc2, 0xc5, 0xca, 0x79, 0x16, - 0x0a, 0xc5, 0x3c, 0xd0, 0x4f, 0x1e, 0x1a, 0x36, 0x59, 0x84, 0xf1, 0xea, 0x4f, 0x3b, 0x01, 0x5d, - 0x6b, 0xb2, 0xf5, 0x2e, 0xe2, 0x47, 0xac, 0x91, 0xc5, 0xf9, 0x93, 0xe3, 0xca, 0xac, 0xc3, 0x0a, - 0xea, 0xae, 0x28, 0xd1, 0x18, 0x98, 0x24, 0x64, 0x0b, 0xce, 0xdf, 0x5f, 0xda, 0x16, 0xf3, 0xb0, - 0xda, 0x68, 0xf8, 0x1d, 0x2f, 0x12, 0x7a, 0xcf, 0xb5, 0x93, 0xe3, 0xca, 0xe5, 0x83, 0x46, 0xbb, - 0x2e, 0xe7, 0xac, 0xc3, 0x8b, 0x75, 0xc5, 0x27, 0x45, 0x6b, 0xb5, 0x60, 0xe2, 0x3e, 0x8d, 0xd8, - 0xbc, 0x93, 0x4a, 0x6c, 0xf1, 0xa8, 0x7c, 0x02, 0xa3, 0x8f, 0xdc, 0xe8, 0xb0, 0x46, 0x1b, 0x01, - 0x8d, 0xe4, 0x01, 0x1e, 0x25, 0xf0, 0xcc, 0x8d, 0x0e, 0xeb, 0x21, 0x87, 0xeb, 0xcb, 0xb5, 0x86, - 0x6e, 0xad, 0xc0, 0x39, 0x51, 0x9b, 0xd2, 0x99, 0x17, 0x4c, 0x86, 0x25, 0x64, 0x88, 0xa3, 0xa0, - 0x33, 0x34, 0xd9, 0xfc, 0xe3, 0x5e, 0x98, 0x5e, 0x3a, 0x74, 0xbc, 0x03, 0xba, 0xed, 0x84, 0xe1, - 0x33, 0x3f, 0x68, 0x6a, 0x8d, 0xc7, 0x03, 0x43, 0xaa, 0xf1, 0x78, 0x42, 0x58, 0x80, 0xd1, 0xad, - 0x56, 0x53, 0xd2, 0x88, 0xc3, 0x0c, 0xd6, 0xe5, 0xb7, 0x9a, 0xf5, 0xb6, 0xe4, 0xa5, 0x23, 0x31, - 0x9a, 0x4d, 0xfa, 0x4c, 0xd1, 0xf4, 0xc5, 0x34, 0x1e, 0x7d, 0xa6, 0xd1, 0x68, 0x48, 0x64, 0x05, - 0xce, 0xd7, 0x68, 0xc3, 0xf7, 0x9a, 0xf7, 0x9c, 0x46, 0xe4, 0x07, 0x3b, 0xfe, 0x13, 0xea, 0x89, - 0xf9, 0x85, 0xfa, 0x5e, 0x88, 0x85, 0xf5, 0xc7, 0x58, 0x5a, 0x8f, 0x58, 0xb1, 0x9d, 0xa6, 0x20, - 0x5b, 0x30, 0xfc, 0x48, 0x98, 0x81, 0xc4, 0x09, 0xe8, 0x8d, 0x9b, 0xca, 0x2e, 0xb4, 0x14, 0x50, - 0x9c, 0x14, 0x4e, 0x4b, 0x9d, 0xe1, 0xd4, 0xf6, 0x89, 0x2b, 0x91, 0xc4, 0xb4, 0x15, 0x13, 0x6b, - 0x17, 0xc6, 0xb7, 0x5b, 0x9d, 0x03, 0xd7, 0x63, 0x6b, 0x46, 0x8d, 0xfe, 0x84, 0x2c, 0x03, 0xc4, - 0x00, 0x61, 0xdc, 0x99, 0x14, 0xe7, 0xa6, 0xb8, 0x60, 0xef, 0xae, 0xf8, 0x90, 0x10, 0x82, 0x8a, - 0xae, 0xad, 0xd1, 0x59, 0xff, 0xbd, 0x0f, 0x88, 0x18, 0x00, 0xdc, 0x19, 0x6b, 0x34, 0x62, 0xbb, - 0xcb, 0x05, 0xe8, 0x55, 0x36, 0x98, 0xc1, 0x93, 0xe3, 0x4a, 0xaf, 0xdb, 0xb4, 0x7b, 0xd7, 0x96, - 0xc9, 0xbb, 0x30, 0x80, 0x68, 0x28, 0xff, 0x09, 0x55, 0x9f, 0xce, 0x81, 0xaf, 0x1d, 0xb8, 0x63, - 0xdb, 0x1c, 0x99, 0xbc, 0x07, 0x23, 0xcb, 0xb4, 0x45, 0x0f, 0x9c, 0xc8, 0x97, 0x5f, 0x37, 0xb7, - 0x6a, 0x48, 0xa0, 0x36, 0xe7, 0x62, 0x4c, 0x76, 0xca, 0xb1, 0xa9, 0x13, 0xfa, 0x9e, 0x7e, 0xca, - 0x09, 0x10, 0xa2, 0x9f, 0x72, 0x38, 0x0e, 0xf9, 0x83, 0x12, 0x8c, 0x56, 0x3d, 0x4f, 0x58, 0x0b, - 0x42, 0x21, 0xf5, 0xe9, 0x9b, 0xca, 0xbc, 0xb6, 0xee, 0xec, 0xd3, 0xd6, 0x9e, 0xd3, 0xea, 0xd0, - 0x70, 0xf1, 0x6b, 0xa6, 0x78, 0xfe, 0xbb, 0xe3, 0xca, 0xc7, 0x67, 0x38, 0xff, 0xc7, 0x86, 0xba, - 0x9d, 0xc0, 0x71, 0xa3, 0xf0, 0xe4, 0xb8, 0x32, 0xed, 0xc4, 0x15, 0xea, 0xdf, 0x8d, 0xd6, 0x8e, - 0x78, 0x69, 0x1f, 0xec, 0xb6, 0xb4, 0x93, 0x23, 0x38, 0x57, 0x0d, 0xc3, 0xce, 0x11, 0xad, 0x45, - 0x4e, 0x10, 0xb1, 0x63, 0x21, 0xae, 0x0f, 0xc5, 0x67, 0xc6, 0xb7, 0x7e, 0x7e, 0x5c, 0x29, 0x31, - 0x5d, 0xd7, 0x41, 0x52, 0xa6, 0x2b, 0x05, 0x51, 0x3d, 0x72, 0xf5, 0xdd, 0x09, 0x4f, 0x8f, 0x49, - 0xde, 0xd6, 0x6b, 0x4a, 0x9f, 0x58, 0x5b, 0xce, 0x1b, 0x71, 0x6b, 0x09, 0xe6, 0xef, 0xd3, 0xc8, - 0xa6, 0x21, 0x8d, 0xe4, 0x37, 0x82, 0x33, 0x3c, 0xb6, 0xd8, 0x0d, 0xe1, 0x6f, 0x45, 0x8c, 0xc3, - 0xcf, 0xbf, 0x0b, 0x59, 0x62, 0xfd, 0x6f, 0x25, 0xa8, 0x2c, 0x05, 0x94, 0xab, 0x89, 0x39, 0x8c, - 0x8a, 0xd7, 0xae, 0x79, 0xe8, 0xdf, 0x79, 0xde, 0x96, 0x87, 0x6d, 0x2c, 0x65, 0x83, 0x62, 0x23, - 0xf4, 0x94, 0x96, 0x0b, 0xeb, 0x31, 0x4c, 0xdb, 0xd4, 0xa3, 0xcf, 0x9c, 0xfd, 0x16, 0x35, 0x0e, - 0xff, 0x15, 0x18, 0xe0, 0x1f, 0x7a, 0xaa, 0x0b, 0x1c, 0x7e, 0x36, 0x43, 0x8a, 0x35, 0x0e, 0xa3, - 0xdb, 0xae, 0x77, 0x20, 0xb8, 0x5b, 0x7f, 0xda, 0x07, 0x63, 0xfc, 0xb7, 0xd0, 0x7c, 0x13, 0xbb, - 0x57, 0xe9, 0x34, 0xbb, 0xd7, 0x07, 0x30, 0xce, 0x96, 0x7f, 0x1a, 0xec, 0xd1, 0x80, 0xed, 0x9a, - 0x42, 0x12, 0xa8, 0xc5, 0x87, 0x58, 0x50, 0x7f, 0xca, 0x4b, 0x6c, 0x13, 0x91, 0xac, 0xc3, 0x04, - 0x07, 0xdc, 0xa3, 0x4e, 0xd4, 0x89, 0x0d, 0x11, 0xe7, 0x84, 0xba, 0x2b, 0xc1, 0x7c, 0x6a, 0x0a, - 0x5e, 0x8f, 0x05, 0xd0, 0x4e, 0xd0, 0x92, 0xcf, 0xe0, 0xdc, 0x76, 0xe0, 0x7f, 0xf3, 0x5c, 0xdb, - 0xaf, 0xf9, 0xd7, 0xc9, 0x15, 0x63, 0x56, 0x54, 0xd7, 0x77, 0xed, 0x24, 0x36, 0x79, 0x1b, 0x86, - 0xd7, 0xc2, 0x45, 0x3f, 0x70, 0xbd, 0x03, 0xfc, 0x46, 0x87, 0xb9, 0xf5, 0xd6, 0x0d, 0xeb, 0xfb, - 0x08, 0xb4, 0x55, 0x71, 0xc2, 0xce, 0x38, 0xd4, 0xdd, 0xce, 0x78, 0x1b, 0x60, 0xdd, 0x77, 0x9a, - 0xd5, 0x56, 0x6b, 0xa9, 0x1a, 0xa2, 0x15, 0x40, 0xec, 0x47, 0x2d, 0xdf, 0x69, 0xd6, 0x9d, 0x56, - 0xab, 0xde, 0x70, 0x42, 0x5b, 0xc3, 0x79, 0xd0, 0x3f, 0x3c, 0x58, 0x1e, 0xb2, 0xcf, 0xad, 0xbb, - 0x0d, 0xea, 0x85, 0xf4, 0x91, 0x13, 0x78, 0xae, 0x77, 0x10, 0x5a, 0xff, 0xea, 0x1c, 0x0c, 0xab, - 0x2e, 0xdf, 0xd4, 0x75, 0x76, 0xb1, 0xcb, 0xe1, 0xe8, 0xc7, 0x96, 0x0a, 0x5b, 0xc3, 0x20, 0x17, - 0x51, 0x8b, 0x17, 0xfb, 0xeb, 0x10, 0x9b, 0x8d, 0x4e, 0xbb, 0x6d, 0x33, 0x18, 0xfb, 0xca, 0x96, - 0x17, 0x51, 0xfe, 0xc3, 0xfc, 0x2b, 0x6b, 0xee, 0xdb, 0xbd, 0xcb, 0x8b, 0x6c, 0x7a, 0x6f, 0xad, - 0x2d, 0x2f, 0xa1, 0x28, 0x87, 0xf9, 0xf4, 0xf6, 0xdd, 0x66, 0xc3, 0x46, 0x28, 0x2b, 0xad, 0x55, - 0x37, 0xd6, 0x85, 0xb8, 0xb0, 0x34, 0x74, 0x8e, 0x5a, 0x36, 0x42, 0x99, 0xde, 0xc7, 0x0f, 0x9d, - 0x4b, 0xbe, 0x17, 0x05, 0x7e, 0x2b, 0x44, 0xe5, 0x64, 0x98, 0x0f, 0xa7, 0x38, 0xad, 0x36, 0x44, - 0x91, 0x9d, 0x40, 0x25, 0x8f, 0x60, 0xa6, 0xda, 0x7c, 0xea, 0x78, 0x0d, 0xda, 0xe4, 0x25, 0x8f, - 0xfc, 0xe0, 0xc9, 0xe3, 0x96, 0xff, 0x2c, 0x44, 0x79, 0x0f, 0x0b, 0xe3, 0x8e, 0x40, 0x91, 0x87, - 0xdf, 0x67, 0x12, 0xc9, 0xce, 0xa3, 0x66, 0x9f, 0xd4, 0x52, 0xcb, 0xef, 0x34, 0xc5, 0x28, 0xe0, - 0x27, 0xd5, 0x60, 0x00, 0x9b, 0xc3, 0x99, 0x94, 0x56, 0x6b, 0x1b, 0x68, 0x4a, 0x11, 0x52, 0x3a, - 0x0c, 0x8f, 0x6c, 0x06, 0x23, 0x6f, 0xc0, 0x90, 0x54, 0x61, 0xb9, 0xa5, 0x17, 0x2d, 0x8c, 0x52, - 0x75, 0x95, 0x65, 0xec, 0x93, 0xb0, 0x69, 0xc3, 0x7f, 0x4a, 0x83, 0xe7, 0x4b, 0x7e, 0x93, 0xca, - 0x83, 0xbf, 0x38, 0xd8, 0xf2, 0x82, 0x7a, 0x83, 0x95, 0xd8, 0x26, 0x22, 0xab, 0x80, 0xef, 0x81, - 0xec, 0x78, 0xaf, 0x2a, 0xe0, 0x7b, 0x64, 0x68, 0xcb, 0x32, 0xb2, 0x0c, 0xe7, 0xab, 0x9d, 0xc8, - 0x3f, 0x72, 0x22, 0xb7, 0xb1, 0xdb, 0x3e, 0x08, 0x1c, 0x56, 0x49, 0x19, 0x09, 0x50, 0xa5, 0x77, - 0x64, 0x61, 0xbd, 0x23, 0x4a, 0xed, 0x34, 0x01, 0x79, 0x1f, 0xc6, 0xd6, 0x42, 0x6e, 0xdc, 0x71, - 0x42, 0xda, 0xc4, 0x13, 0xba, 0x68, 0xa5, 0x1b, 0xd6, 0xd1, 0xd4, 0x53, 0x67, 0x87, 0x80, 0xa6, - 0x6d, 0xe0, 0x11, 0x0b, 0x06, 0xab, 0x61, 0xe8, 0x86, 0x11, 0x1e, 0xbc, 0x87, 0x17, 0xe1, 0xe4, - 0xb8, 0x32, 0xe8, 0x20, 0xc4, 0x16, 0x25, 0xe4, 0x11, 0x8c, 0x2e, 0x53, 0xa6, 0x13, 0xee, 0x04, - 0x9d, 0x30, 0xc2, 0x63, 0xf4, 0xe8, 0xc2, 0x45, 0xf1, 0x61, 0x6b, 0x25, 0x62, 0x2e, 0x73, 0x6d, - 0xaf, 0x89, 0xf0, 0x7a, 0xc4, 0x0a, 0xf4, 0x5d, 0x4b, 0xc3, 0x67, 0x0a, 0xaf, 0xa0, 0x59, 0x75, - 0x9b, 0xec, 0x53, 0x9d, 0xc2, 0x36, 0xa0, 0xc2, 0x2b, 0xd6, 0x86, 0xfa, 0x21, 0x96, 0xe8, 0x0a, - 0xaf, 0x41, 0x42, 0x1a, 0x29, 0x7b, 0xe1, 0xb4, 0x61, 0x13, 0x32, 0x0b, 0x65, 0x13, 0xcf, 0x68, - 0x4d, 0xfc, 0x04, 0x46, 0x97, 0x3a, 0x61, 0xe4, 0x1f, 0xed, 0x1c, 0xd2, 0x23, 0x3a, 0x7b, 0x21, - 0x56, 0xeb, 0x1b, 0x08, 0xae, 0x47, 0x0c, 0xae, 0x77, 0x53, 0x43, 0x27, 0x9f, 0x03, 0x91, 0xfa, - 0xf9, 0x7d, 0x36, 0x3f, 0x3c, 0x36, 0x97, 0x67, 0x67, 0xb0, 0xaf, 0xa8, 0x94, 0x4b, 0xb5, 0xbe, - 0x7e, 0xa0, 0x8a, 0x75, 0x8b, 0x4f, 0x9a, 0x98, 0x35, 0x88, 0x37, 0xf1, 0x7e, 0xe0, 0xb4, 0x0f, - 0x67, 0x67, 0x63, 0x2d, 0x5b, 0x74, 0xea, 0x80, 0xc1, 0x0d, 0x6d, 0x21, 0x46, 0x27, 0x35, 0x00, - 0xfe, 0x73, 0x9d, 0x0d, 0xfc, 0x45, 0x94, 0xd7, 0xac, 0x21, 0x2f, 0x56, 0x20, 0x65, 0x75, 0x11, - 0x75, 0x10, 0xce, 0xb6, 0xe5, 0x1a, 0xa3, 0xa9, 0xb1, 0x21, 0x4f, 0xa0, 0xcc, 0x7f, 0x6d, 0xf8, - 0x9e, 0x1b, 0xf1, 0xa5, 0x77, 0xce, 0x30, 0xe6, 0x24, 0x8b, 0x65, 0x05, 0x68, 0x44, 0x13, 0x15, - 0x1c, 0xa9, 0x52, 0xad, 0x9a, 0x14, 0x63, 0xb2, 0x0d, 0xa3, 0xdb, 0x81, 0xdf, 0xec, 0x34, 0x22, - 0xdc, 0xb0, 0x2f, 0xa1, 0xa2, 0x48, 0x44, 0x3d, 0x5a, 0x09, 0x97, 0x49, 0x9b, 0x03, 0xea, 0x6c, - 0x33, 0xd7, 0x65, 0xa2, 0x21, 0x92, 0x45, 0x18, 0xdc, 0xf6, 0x5b, 0x6e, 0xe3, 0xf9, 0xec, 0x3c, - 0x36, 0x7a, 0x4a, 0x32, 0x43, 0xa0, 0x6c, 0x2a, 0x6a, 0x87, 0x6d, 0x04, 0xe9, 0xda, 0x21, 0x47, - 0x22, 0x55, 0x18, 0xff, 0x9c, 0x4d, 0x18, 0xd7, 0xf7, 0x3c, 0xc7, 0x0d, 0xe8, 0xec, 0x65, 0x1c, - 0x17, 0x34, 0x74, 0xfe, 0x44, 0x2f, 0xd0, 0xa7, 0xb3, 0x41, 0x41, 0xd6, 0xe0, 0xdc, 0x5a, 0x58, - 0x8b, 0x02, 0xb7, 0x4d, 0x37, 0x1c, 0xcf, 0x39, 0xa0, 0xcd, 0xd9, 0x2b, 0xb1, 0xa5, 0xd1, 0x0d, - 0xeb, 0x21, 0x96, 0xd5, 0x8f, 0x78, 0xa1, 0x6e, 0x69, 0x4c, 0xd0, 0x91, 0x2f, 0x60, 0x6a, 0xe5, - 0x9b, 0x88, 0xcd, 0x98, 0x56, 0xb5, 0xd3, 0x74, 0xa3, 0x5a, 0xe4, 0x07, 0xce, 0x01, 0x9d, 0xad, - 0x20, 0xbf, 0xd7, 0x4f, 0x8e, 0x2b, 0x57, 0xa9, 0x28, 0xaf, 0x3b, 0x0c, 0xa1, 0x1e, 0x72, 0x0c, - 0xfd, 0xfe, 0x30, 0x8b, 0x03, 0x93, 0x7e, 0xad, 0xd3, 0x66, 0x8a, 0x2b, 0x4a, 0xff, 0xaa, 0x21, - 0x7d, 0xad, 0x84, 0x4b, 0x3f, 0xe4, 0x80, 0x94, 0xf4, 0x35, 0x44, 0x62, 0x03, 0x79, 0xe0, 0xbb, - 0x5e, 0xb5, 0x11, 0xb9, 0x4f, 0xa9, 0x38, 0xb2, 0x87, 0xb3, 0xd7, 0xb0, 0xa5, 0x68, 0x15, 0xfd, - 0x75, 0xdf, 0xf5, 0xea, 0x0e, 0x16, 0xd7, 0xc5, 0x01, 0xdf, 0xb0, 0x8a, 0xa6, 0xa9, 0xc9, 0x8f, - 0xe0, 0xc2, 0x86, 0xbf, 0xef, 0xb6, 0x28, 0x5f, 0x72, 0xb8, 0x58, 0xd0, 0xbe, 0x67, 0x21, 0x5f, - 0xb4, 0x8a, 0x1e, 0x21, 0x46, 0x5d, 0xac, 0x56, 0x47, 0x0a, 0x47, 0xb7, 0x8a, 0x66, 0x73, 0x79, - 0xd0, 0x3f, 0x3c, 0x5a, 0x1e, 0xe3, 0x37, 0x67, 0x0f, 0xfa, 0x87, 0xc7, 0xcb, 0x13, 0xd6, 0x1f, - 0x96, 0x80, 0xa4, 0xd7, 0x43, 0x72, 0x0b, 0x86, 0xa8, 0xc7, 0xd4, 0xc1, 0xa6, 0xd8, 0xd7, 0x51, - 0x8b, 0x11, 0x20, 0xdd, 0xbc, 0x27, 0x40, 0xe4, 0x73, 0x98, 0xe4, 0x0d, 0x92, 0x2b, 0x77, 0xcb, - 0x3d, 0x72, 0x23, 0xdc, 0xeb, 0x07, 0xf8, 0x8a, 0x91, 0x51, 0xac, 0x1f, 0xe3, 0x45, 0x31, 0xae, - 0xf3, 0xeb, 0xac, 0xd0, 0xea, 0xc0, 0x74, 0xe6, 0x4a, 0x48, 0x36, 0x60, 0xfa, 0xc8, 0xf7, 0xa2, - 0xc3, 0xd6, 0x73, 0xb9, 0x10, 0x8a, 0xda, 0x4a, 0x58, 0x1b, 0x7e, 0xfc, 0x99, 0x08, 0xf6, 0xa4, - 0x00, 0x0b, 0x8e, 0x58, 0xcf, 0x83, 0xfe, 0xe1, 0xde, 0x72, 0x9f, 0xea, 0x89, 0x65, 0xc3, 0xf9, - 0xd4, 0x82, 0x42, 0xbe, 0x0f, 0x63, 0x0d, 0xd4, 0xd3, 0x8d, 0x9a, 0xf8, 0x72, 0xaa, 0xc1, 0xf5, - 0xb9, 0xc2, 0xe1, 0xbc, 0x2b, 0x7f, 0x52, 0x82, 0x99, 0x9c, 0xa5, 0xe4, 0xec, 0xa2, 0xfe, 0x12, - 0x2e, 0x1c, 0x39, 0xdf, 0xd4, 0x03, 0x3c, 0x86, 0xd5, 0x03, 0xc7, 0x4b, 0x48, 0x1b, 0x3f, 0x93, - 0x6c, 0x0c, 0xdd, 0xf7, 0xe0, 0xc8, 0xf9, 0xc6, 0x46, 0x04, 0x9b, 0x95, 0xf3, 0x76, 0xfe, 0x00, - 0xc6, 0x8d, 0xc5, 0xe3, 0xcc, 0x8d, 0xb3, 0xee, 0xc0, 0x79, 0x76, 0x50, 0x8d, 0xe8, 0xa9, 0xcd, - 0x2f, 0xd6, 0x36, 0x40, 0x8d, 0x1e, 0x39, 0xed, 0x43, 0x9f, 0x29, 0x95, 0x8b, 0xfa, 0x2f, 0x71, - 0x7c, 0x27, 0xe2, 0x38, 0xad, 0x0a, 0xf6, 0xee, 0x72, 0x45, 0x33, 0x54, 0x98, 0xb6, 0x46, 0x65, - 0xfd, 0x45, 0x2f, 0x10, 0xf1, 0xf5, 0x07, 0xd4, 0x39, 0x92, 0xcd, 0xf8, 0x10, 0xc6, 0xf8, 0x61, - 0x8b, 0x83, 0xb1, 0x39, 0xa3, 0x0b, 0x93, 0x62, 0x11, 0xd0, 0x8b, 0x56, 0x7b, 0x6c, 0x03, 0x95, - 0x91, 0xda, 0x94, 0x9f, 0x12, 0x91, 0xb4, 0xd7, 0x20, 0xd5, 0x8b, 0x18, 0xa9, 0xfe, 0x9b, 0x7c, - 0x06, 0x13, 0x4b, 0xfe, 0x51, 0x9b, 0xc9, 0x44, 0x10, 0xf7, 0x89, 0x13, 0xb8, 0xa8, 0xd7, 0x28, - 0x5c, 0xed, 0xb1, 0x13, 0xe8, 0x64, 0x13, 0x26, 0xef, 0xb5, 0x3a, 0xe1, 0x61, 0xd5, 0x6b, 0x2e, - 0xb5, 0xfc, 0x50, 0x72, 0xe9, 0x17, 0x27, 0x60, 0x71, 0x58, 0x49, 0x63, 0xac, 0xf6, 0xd8, 0x59, - 0x84, 0xe4, 0x0d, 0x18, 0x58, 0x79, 0xca, 0xd6, 0x14, 0x79, 0x03, 0x2d, 0x1c, 0x64, 0xb6, 0x3c, - 0xba, 0xf5, 0x78, 0xb5, 0xc7, 0xe6, 0xa5, 0x8b, 0x23, 0x30, 0x24, 0x0f, 0x6a, 0xb7, 0x98, 0xbe, - 0xa7, 0xc4, 0x59, 0x8b, 0x9c, 0xa8, 0x13, 0x92, 0x39, 0x18, 0xde, 0x6d, 0xb3, 0xf3, 0x83, 0x3c, - 0xe1, 0xda, 0xea, 0xb7, 0xf5, 0x8e, 0x29, 0x69, 0x32, 0xaf, 0xdb, 0x3d, 0x39, 0x72, 0x0c, 0xb0, - 0x56, 0x4d, 0xe1, 0x16, 0x63, 0x1b, 0xf5, 0xf6, 0x26, 0xea, 0x2d, 0x27, 0x65, 0x6d, 0x4d, 0x67, - 0x0a, 0xcf, 0xfa, 0x02, 0xae, 0xec, 0xb6, 0x43, 0x1a, 0x44, 0xd5, 0x76, 0xbb, 0xe5, 0x36, 0xf8, - 0x0d, 0x08, 0x1e, 0xe8, 0xe4, 0x64, 0x79, 0x1f, 0x06, 0x39, 0x40, 0x4c, 0x13, 0x39, 0x07, 0xab, - 0xed, 0xb6, 0x38, 0x46, 0xde, 0xe5, 0x9a, 0x27, 0x3f, 0x18, 0xda, 0x02, 0xdb, 0xfa, 0xbd, 0x12, - 0x5c, 0xe1, 0x5f, 0x40, 0x2e, 0xeb, 0xef, 0xc0, 0x08, 0xfa, 0xa7, 0xb4, 0x9d, 0x86, 0xfc, 0x26, - 0xb8, 0xa3, 0x8e, 0x04, 0xda, 0x71, 0xb9, 0xe6, 0xf9, 0xd3, 0x9b, 0xef, 0xf9, 0x23, 0x3f, 0xb0, - 0xbe, 0xcc, 0x0f, 0xec, 0x73, 0xb0, 0x44, 0x8b, 0x5a, 0xad, 0x54, 0xa3, 0xc2, 0x17, 0x69, 0x95, - 0xf5, 0x9f, 0x7b, 0x61, 0xe6, 0x3e, 0xf5, 0x68, 0xe0, 0x60, 0x3f, 0x0d, 0x83, 0x85, 0xee, 0x03, - 0x50, 0x2a, 0xf4, 0x01, 0xa8, 0x48, 0x13, 0x50, 0x2f, 0x9a, 0x80, 0x52, 0xee, 0x0c, 0xec, 0x2c, - 0xb4, 0x6b, 0xaf, 0x89, 0x6e, 0xe1, 0x59, 0xa8, 0x13, 0xb8, 0x36, 0x83, 0x91, 0xb5, 0xd8, 0x7f, - 0xa0, 0xbf, 0xab, 0x2d, 0x68, 0x52, 0xdc, 0xa7, 0x0e, 0x09, 0xff, 0x01, 0xd3, 0x6b, 0x60, 0x13, - 0x06, 0xb9, 0xe5, 0x0a, 0x6f, 0x19, 0x46, 0x17, 0x6e, 0x88, 0x6f, 0x2a, 0xa7, 0x83, 0xc2, 0xcc, - 0xb5, 0xe2, 0x45, 0xc1, 0x73, 0x3e, 0x05, 0x22, 0x04, 0xd8, 0x82, 0xcb, 0xdc, 0xe7, 0x30, 0xaa, - 0xa1, 0x90, 0x32, 0xf4, 0x3d, 0x11, 0xbe, 0x13, 0x23, 0x36, 0xfb, 0x93, 0xbc, 0x03, 0x03, 0x4f, - 0x9d, 0x56, 0x87, 0x8a, 0x65, 0xe4, 0x42, 0x6c, 0x8b, 0x63, 0xea, 0x90, 0x77, 0xc0, 0x8d, 0x71, - 0x36, 0x47, 0xfa, 0xa8, 0xf7, 0x83, 0x92, 0xf5, 0x31, 0xcc, 0xa6, 0x5b, 0x23, 0xac, 0x26, 0xdd, - 0x8c, 0x34, 0xd6, 0x32, 0x4c, 0xdd, 0xa7, 0x11, 0x4e, 0x5c, 0xfc, 0x88, 0x34, 0xd7, 0x8e, 0xc4, - 0x77, 0x26, 0x57, 0x55, 0x79, 0x1b, 0xa1, 0x7f, 0xa5, 0x35, 0x98, 0x4e, 0x70, 0x11, 0xf5, 0x7f, - 0x04, 0x43, 0x02, 0xa4, 0x56, 0x54, 0xe1, 0x4a, 0x47, 0xf7, 0x45, 0xc1, 0xde, 0x02, 0x9f, 0xb7, - 0x82, 0xb3, 0x2d, 0x09, 0xac, 0x43, 0xb8, 0xc0, 0xb6, 0xd9, 0x98, 0xab, 0x9a, 0x8e, 0x97, 0x60, - 0xa4, 0xcd, 0x14, 0x85, 0xd0, 0xfd, 0x29, 0x9f, 0x46, 0x03, 0xf6, 0x30, 0x03, 0xd4, 0xdc, 0x9f, - 0x52, 0x72, 0x19, 0x00, 0x0b, 0xb1, 0x9b, 0x62, 0x15, 0x40, 0x74, 0x6e, 0x95, 0x22, 0x80, 0x3e, - 0x34, 0x7c, 0xde, 0xd8, 0xf8, 0xb7, 0x15, 0xc0, 0x4c, 0xaa, 0x26, 0xd1, 0x81, 0x5b, 0x30, 0x2c, - 0xf5, 0xb3, 0x84, 0xbd, 0x58, 0xef, 0x81, 0xad, 0x90, 0xc8, 0x9b, 0x70, 0xce, 0xa3, 0xdf, 0x44, - 0xf5, 0x54, 0x1b, 0xc6, 0x19, 0x78, 0x5b, 0xb6, 0xc3, 0xfa, 0x35, 0xb4, 0x11, 0xd6, 0x3c, 0xff, - 0xd9, 0xe3, 0x96, 0xf3, 0x84, 0xa6, 0x2a, 0xfe, 0x3e, 0x0c, 0xd7, 0xba, 0x57, 0xcc, 0x3f, 0x1f, - 0x59, 0xb9, 0xad, 0x48, 0xac, 0x16, 0xcc, 0xb1, 0x2e, 0xd5, 0xaa, 0x1b, 0xeb, 0x6b, 0xcd, 0xed, - 0x6f, 0x5b, 0x80, 0x4f, 0xe1, 0x52, 0x66, 0x6d, 0xdf, 0xb6, 0x10, 0xff, 0x59, 0x1f, 0xcc, 0xf0, - 0xcd, 0x24, 0x3d, 0x83, 0x4f, 0xbf, 0xd4, 0xfc, 0x4a, 0x6e, 0xd2, 0x6e, 0x67, 0xdc, 0xa4, 0x21, - 0x89, 0x7e, 0x93, 0x66, 0xdc, 0x9f, 0x7d, 0x90, 0x7d, 0x7f, 0x86, 0x46, 0x10, 0xf3, 0xfe, 0x2c, - 0x79, 0x6b, 0xb6, 0x92, 0x7f, 0x6b, 0x86, 0x77, 0x08, 0x19, 0xb7, 0x66, 0x19, 0x77, 0x65, 0x49, - 0x57, 0x86, 0xe1, 0x57, 0xea, 0xca, 0xc0, 0x55, 0x6b, 0x6b, 0x0f, 0x66, 0xd3, 0x03, 0xf8, 0x0a, - 0x16, 0x8f, 0x3f, 0x2b, 0xc1, 0x65, 0xa1, 0x66, 0x24, 0x3e, 0xb1, 0xb3, 0xcf, 0x8f, 0xf7, 0x60, - 0x4c, 0xd0, 0xee, 0xc4, 0x53, 0x71, 0xf1, 0xfc, 0xc9, 0x71, 0x65, 0x5c, 0x2e, 0x87, 0x7c, 0x4d, - 0x35, 0xd0, 0xc8, 0x7b, 0x30, 0x8c, 0x7f, 0xc4, 0x56, 0x76, 0x76, 0xfa, 0x18, 0x41, 0xd4, 0x7a, - 0xd2, 0xd6, 0xae, 0x50, 0xad, 0xaf, 0xe1, 0x4a, 0x5e, 0xc3, 0x5f, 0x81, 0x5c, 0xfe, 0x79, 0x09, - 0x2e, 0x09, 0xf6, 0xc6, 0xc7, 0xfa, 0x42, 0xeb, 0xfe, 0x19, 0x5c, 0xfa, 0x1e, 0xc0, 0x28, 0xab, - 0x50, 0xb6, 0xbb, 0x4f, 0x6c, 0x6e, 0x42, 0x77, 0x8f, 0x4b, 0x96, 0x9d, 0xc8, 0x11, 0xae, 0x08, - 0xce, 0x51, 0x4b, 0x9e, 0x8d, 0x6d, 0x9d, 0xd8, 0xfa, 0x0a, 0xe6, 0xb3, 0xbb, 0xf0, 0x0a, 0xe4, - 0xf3, 0x00, 0xe6, 0x32, 0x96, 0xe5, 0x17, 0xdb, 0x15, 0xbf, 0x84, 0x4b, 0x99, 0xbc, 0x5e, 0x41, - 0x33, 0x57, 0xd9, 0x9e, 0x1f, 0xbd, 0x82, 0x21, 0xb4, 0x1e, 0xc1, 0xc5, 0x0c, 0x4e, 0xaf, 0xa0, - 0x89, 0xf7, 0x61, 0x46, 0xe9, 0xba, 0x2f, 0xd5, 0xc2, 0x0d, 0xb8, 0xcc, 0x19, 0xbd, 0x9a, 0x51, - 0x79, 0x08, 0x97, 0x04, 0xbb, 0x57, 0x20, 0xbd, 0x55, 0x98, 0x8f, 0x8f, 0xb4, 0x19, 0x9a, 0xca, - 0xa9, 0x17, 0x19, 0x6b, 0x1d, 0xae, 0xc6, 0x9c, 0x72, 0xb6, 0xed, 0xd3, 0x73, 0xe3, 0x0a, 0x59, - 0x3c, 0x4a, 0xaf, 0x64, 0x44, 0x1f, 0xc1, 0x05, 0x83, 0xe9, 0x2b, 0x53, 0x56, 0xd6, 0x60, 0x92, - 0x33, 0x36, 0x95, 0xd7, 0x05, 0x5d, 0x79, 0x1d, 0x5d, 0x38, 0x1f, 0xb3, 0x44, 0xf0, 0xde, 0xdd, - 0x0c, 0x7d, 0x76, 0x03, 0xf5, 0x59, 0x89, 0x12, 0xb7, 0xf0, 0x3d, 0x18, 0xe4, 0x10, 0xd1, 0xbe, - 0x0c, 0x66, 0x5c, 0x5d, 0xe7, 0x64, 0x02, 0xd9, 0xfa, 0x11, 0x5c, 0xe6, 0x67, 0xc1, 0xf8, 0xaa, - 0xca, 0x3c, 0xaf, 0x7d, 0x3f, 0x71, 0x14, 0xbc, 0x28, 0xf8, 0x26, 0xf1, 0x73, 0x4e, 0x84, 0xfb, - 0x72, 0x6e, 0xe7, 0xf1, 0x3f, 0xd5, 0xe3, 0x0e, 0x79, 0xc4, 0xeb, 0xcd, 0x3c, 0xe2, 0xbd, 0x06, - 0xd7, 0xd4, 0x11, 0x2f, 0x59, 0x8d, 0x9c, 0x5a, 0xd6, 0x57, 0x70, 0x89, 0x77, 0x54, 0xba, 0x57, - 0x99, 0xcd, 0xf8, 0x38, 0xd1, 0xcd, 0x19, 0xd1, 0x4d, 0x13, 0x3b, 0xa7, 0x93, 0xff, 0x67, 0x49, - 0x7e, 0x72, 0xd9, 0xcc, 0x7f, 0xd5, 0x67, 0xde, 0x4d, 0xa8, 0x28, 0x81, 0x98, 0x2d, 0x7a, 0xb1, - 0x03, 0xef, 0x06, 0x4c, 0xeb, 0x6c, 0xdc, 0x06, 0xdd, 0xbb, 0x83, 0x77, 0x08, 0xef, 0xb2, 0xcf, - 0x02, 0x01, 0x72, 0xda, 0xcd, 0x66, 0xc8, 0x0d, 0xf1, 0x6d, 0x85, 0x69, 0xd5, 0x61, 0x3e, 0x3d, - 0x14, 0x6e, 0x43, 0xfa, 0xdc, 0x92, 0xcf, 0xd8, 0x27, 0x8c, 0x10, 0x31, 0x18, 0xb9, 0x4c, 0xe5, - 0x77, 0xcc, 0xc9, 0x25, 0x95, 0x65, 0xc9, 0xa5, 0x26, 0xd1, 0x7f, 0x56, 0xbb, 0x9c, 0x0f, 0xbf, - 0x09, 0x44, 0x16, 0x2d, 0xd5, 0x6c, 0x59, 0xf5, 0x45, 0xe8, 0x5b, 0xaa, 0xd9, 0xc2, 0xd5, 0x1f, - 0xcf, 0xdc, 0x8d, 0x30, 0xb0, 0x19, 0x2c, 0xa9, 0x13, 0xf7, 0x9e, 0x42, 0x27, 0x7e, 0xd0, 0x3f, - 0xdc, 0x57, 0xee, 0xb7, 0x49, 0xcd, 0x3d, 0xf0, 0x1e, 0xb9, 0xd1, 0xa1, 0xaa, 0xb0, 0x6a, 0xfd, - 0x10, 0x26, 0x8d, 0xea, 0xc5, 0x57, 0x5c, 0xf8, 0x46, 0x81, 0xbc, 0x09, 0x43, 0x4b, 0x55, 0xf4, - 0x51, 0x40, 0xa3, 0xc1, 0x18, 0x5f, 0x6f, 0x1a, 0x4e, 0x1d, 0x1f, 0xc0, 0xd9, 0xb2, 0xd0, 0xfa, - 0x07, 0xfd, 0x1a, 0x77, 0xed, 0xe5, 0x47, 0x41, 0xef, 0xee, 0x00, 0xf0, 0x19, 0xa2, 0x75, 0x8e, - 0x29, 0x80, 0xa3, 0xe2, 0xea, 0x9f, 0x2f, 0xc9, 0xb6, 0x86, 0x74, 0xda, 0x97, 0x21, 0xc2, 0x17, - 0x93, 0x13, 0xc9, 0xc7, 0x50, 0xca, 0x17, 0x53, 0xb0, 0x0e, 0x6d, 0x1d, 0x89, 0xfc, 0x28, 0xe9, - 0xc0, 0x3c, 0x80, 0x57, 0x16, 0xaf, 0xcb, 0x3b, 0xcc, 0x74, 0xdf, 0xce, 0xe6, 0xc3, 0xfc, 0x0c, - 0xa6, 0x19, 0xad, 0xfb, 0x18, 0x55, 0xfb, 0x95, 0x6f, 0x22, 0xea, 0xf1, 0xb5, 0x7d, 0x10, 0xeb, - 0x79, 0xa3, 0xa0, 0x9e, 0x18, 0x59, 0x58, 0xc0, 0x63, 0x3e, 0x75, 0xaa, 0xca, 0xec, 0x6c, 0xfe, - 0x38, 0x89, 0xec, 0xf5, 0x15, 0xaf, 0xd9, 0xf6, 0x5d, 0x75, 0x64, 0xe1, 0x93, 0x28, 0x68, 0xd5, - 0xa9, 0x80, 0xdb, 0x3a, 0x92, 0xf5, 0x66, 0xa1, 0x87, 0xef, 0x30, 0xf4, 0xef, 0x2c, 0xed, 0xac, - 0x97, 0x4b, 0xd6, 0x2d, 0x00, 0xad, 0x26, 0x80, 0xc1, 0xcd, 0x2d, 0x7b, 0xa3, 0xba, 0x5e, 0xee, - 0x21, 0xd3, 0x70, 0xfe, 0xd1, 0xda, 0xe6, 0xf2, 0xd6, 0xa3, 0x5a, 0xbd, 0xb6, 0x51, 0xb5, 0x77, - 0x96, 0xaa, 0xf6, 0x72, 0xb9, 0x64, 0x7d, 0x0d, 0x53, 0x66, 0x0f, 0x5f, 0xe9, 0x24, 0x8c, 0x60, - 0x52, 0xe9, 0x33, 0x0f, 0x1e, 0xed, 0x68, 0xee, 0x81, 0xe2, 0xf8, 0x95, 0x74, 0x73, 0x11, 0x07, - 0x35, 0xf1, 0x19, 0x69, 0x48, 0xe4, 0x6d, 0xae, 0x16, 0x24, 0xdf, 0xf6, 0x31, 0xb5, 0xa0, 0x1e, - 0xeb, 0x05, 0xb8, 0xf4, 0x7d, 0x0f, 0xa6, 0xcc, 0x5a, 0x4f, 0x6b, 0x27, 0x7a, 0x1d, 0xfd, 0x26, - 0x35, 0xd7, 0x7f, 0x42, 0x74, 0xc3, 0xbd, 0x58, 0x59, 0xbf, 0x07, 0x65, 0x81, 0x15, 0xef, 0xbc, - 0xaf, 0x49, 0x43, 0x5e, 0x29, 0xe3, 0x99, 0x92, 0x74, 0xd0, 0xf5, 0xa1, 0xcc, 0x56, 0x4c, 0x41, - 0xc9, 0x2b, 0x98, 0x82, 0x81, 0xf5, 0xf8, 0x42, 0xc5, 0xe6, 0x3f, 0xd0, 0x03, 0x3e, 0x72, 0x82, - 0x48, 0x3a, 0x15, 0x8d, 0xd8, 0xea, 0x37, 0x79, 0x1b, 0x06, 0xef, 0xb9, 0xad, 0x48, 0x18, 0x27, - 0xe2, 0x4d, 0x9e, 0xb1, 0xe5, 0x05, 0xb6, 0x40, 0xb0, 0x6c, 0x38, 0xaf, 0x55, 0x78, 0x86, 0xa6, - 0x92, 0x59, 0x18, 0xda, 0xa4, 0xdf, 0x68, 0xf5, 0xcb, 0x9f, 0xd6, 0xfb, 0x70, 0x5e, 0x38, 0x6c, - 0x69, 0x62, 0xba, 0x26, 0x5e, 0x53, 0x96, 0x8c, 0x27, 0x5d, 0x82, 0x25, 0x16, 0x31, 0xba, 0xdd, - 0x76, 0xf3, 0x05, 0xe9, 0xd8, 0x46, 0x71, 0x46, 0xba, 0xb7, 0xe4, 0x3d, 0x4c, 0xb7, 0xe1, 0xfc, - 0x8b, 0x12, 0xcc, 0x26, 0xce, 0xf9, 0x4b, 0x87, 0x4e, 0xab, 0x45, 0xbd, 0x03, 0x4a, 0xae, 0x43, - 0xff, 0xce, 0xd6, 0xce, 0xb6, 0xb0, 0x53, 0xca, 0xfb, 0x65, 0x06, 0x52, 0x38, 0x36, 0x62, 0x90, - 0x87, 0x70, 0x5e, 0xba, 0x64, 0xaa, 0x22, 0x31, 0x42, 0x97, 0x8b, 0x1d, 0x3c, 0xd3, 0x74, 0xe4, - 0x5d, 0x61, 0x94, 0xf8, 0x49, 0xc7, 0x0d, 0x68, 0x13, 0x6d, 0x2f, 0xf1, 0x65, 0xad, 0x56, 0x62, - 0xeb, 0x68, 0xfc, 0xed, 0x9b, 0xf5, 0x07, 0x25, 0x98, 0xc9, 0xb1, 0x5b, 0x90, 0xb7, 0x8d, 0xee, - 0x4c, 0x6a, 0xdd, 0x91, 0x28, 0xab, 0x3d, 0xa2, 0x3f, 0x4b, 0x9a, 0x9f, 0x6a, 0xdf, 0x19, 0xfc, - 0x54, 0x57, 0x7b, 0x62, 0xdf, 0xd4, 0x45, 0x80, 0x61, 0x09, 0xb7, 0xce, 0xc1, 0xb8, 0x21, 0x37, - 0xcb, 0x82, 0x31, 0xbd, 0x66, 0x36, 0x38, 0x4b, 0x7e, 0x53, 0x0d, 0x0e, 0xfb, 0xdb, 0xfa, 0xfd, - 0x12, 0x4c, 0x61, 0x17, 0x0f, 0x5c, 0xb6, 0xf4, 0xc5, 0x12, 0x5a, 0x30, 0x7a, 0x32, 0x6f, 0xf4, - 0x24, 0x81, 0xab, 0xba, 0xf4, 0x51, 0xaa, 0x4b, 0xf3, 0x59, 0x5d, 0xc2, 0xe9, 0xed, 0xfa, 0x9e, - 0xd1, 0x13, 0xed, 0x32, 0xe8, 0x0f, 0x4b, 0x30, 0xa9, 0xb5, 0x49, 0xb5, 0xff, 0x8e, 0xd1, 0xa4, - 0x4b, 0x19, 0x4d, 0x4a, 0x09, 0x79, 0x31, 0xd5, 0xa2, 0xd7, 0x8b, 0x5a, 0xd4, 0x55, 0xc6, 0xff, - 0xb1, 0x04, 0xd3, 0x99, 0x32, 0x20, 0x17, 0x98, 0x6e, 0xdb, 0x08, 0x68, 0x24, 0xc4, 0x2b, 0x7e, - 0x31, 0xf8, 0x5a, 0x18, 0x76, 0x68, 0x20, 0xbe, 0x73, 0xf1, 0x8b, 0xbc, 0x0e, 0xe3, 0xdb, 0x34, - 0x70, 0xfd, 0x26, 0xf7, 0x60, 0xe6, 0xae, 0x81, 0xe3, 0xb6, 0x09, 0x24, 0xf3, 0x30, 0x52, 0x6d, - 0x1d, 0xf8, 0x81, 0x1b, 0x1d, 0xf2, 0xfb, 0xb8, 0x11, 0x3b, 0x06, 0x30, 0xde, 0xcb, 0xee, 0x01, - 0xbf, 0x56, 0x60, 0xc4, 0xe2, 0x17, 0x5b, 0x5c, 0xa4, 0xbd, 0x6e, 0x90, 0x2f, 0x2e, 0xd2, 0x18, - 0x77, 0x01, 0x06, 0x3f, 0xb7, 0x71, 0x12, 0xe0, 0x8b, 0x63, 0x5b, 0xfc, 0x22, 0x13, 0xe8, 0x83, - 0x8a, 0xef, 0x89, 0xd1, 0xf7, 0xf4, 0x23, 0x98, 0xca, 0x92, 0x6b, 0xd6, 0x14, 0x12, 0xb4, 0xbd, - 0x8a, 0xf6, 0x2b, 0x98, 0xac, 0x36, 0x9b, 0x1b, 0xf7, 0xaa, 0xfc, 0xd6, 0x5f, 0x8c, 0x2a, 0xff, - 0x78, 0xb8, 0xbd, 0x4e, 0xa8, 0x6c, 0xfd, 0x6b, 0x9e, 0x1b, 0xd9, 0x93, 0x2b, 0xdf, 0xb8, 0x61, - 0xe4, 0x7a, 0x07, 0x9a, 0x59, 0xcf, 0xbe, 0xb0, 0x49, 0x9f, 0x65, 0x4c, 0x01, 0xb6, 0x9b, 0x9a, - 0xbc, 0x95, 0x19, 0x30, 0xc9, 0x7c, 0x4a, 0x63, 0x1b, 0x2f, 0x25, 0x33, 0x26, 0xdf, 0xb8, 0xa0, - 0xaf, 0xda, 0x78, 0x62, 0x7d, 0x0f, 0x2e, 0xf0, 0x25, 0xad, 0xa8, 0xf1, 0xa2, 0xd9, 0xba, 0x15, - 0xd2, 0xfa, 0x40, 0x5a, 0x29, 0x0a, 0x5b, 0x66, 0x8f, 0x19, 0x6d, 0xc1, 0x2a, 0xff, 0x53, 0x09, - 0xe6, 0x12, 0xa4, 0xb5, 0xe7, 0x5e, 0x43, 0xae, 0xa7, 0x6f, 0x26, 0x7d, 0x7c, 0x51, 0x0f, 0xe0, - 0xc6, 0x3f, 0xb7, 0xa9, 0xdc, 0x7c, 0xc9, 0x2d, 0x00, 0x4e, 0xac, 0x6d, 0xdf, 0x68, 0x7c, 0x16, - 0x3e, 0x1c, 0xb8, 0x81, 0x6b, 0x28, 0xa4, 0x03, 0x59, 0x72, 0x17, 0xdf, 0x48, 0x37, 0xeb, 0x2c, - 0xbe, 0xb2, 0xa7, 0x82, 0xbc, 0x9e, 0x63, 0xa6, 0xcd, 0xe2, 0x6f, 0xfd, 0x5f, 0x7d, 0x30, 0xa3, - 0x0f, 0xe0, 0x8b, 0xf4, 0x75, 0x1b, 0x46, 0x97, 0x7c, 0x2f, 0xa2, 0xdf, 0x44, 0xda, 0x2b, 0x67, - 0xa2, 0xee, 0xba, 0x55, 0x89, 0x50, 0x1d, 0x39, 0xa0, 0xce, 0xf4, 0x18, 0xc3, 0x17, 0x2d, 0x46, - 0x24, 0x4b, 0x30, 0xbe, 0x49, 0x9f, 0xa5, 0x04, 0x88, 0xfe, 0x70, 0x1e, 0x7d, 0x56, 0xd7, 0x84, - 0xa8, 0x3b, 0x29, 0x19, 0x34, 0x64, 0x1f, 0x26, 0xe4, 0xe4, 0x32, 0x84, 0x39, 0xa7, 0xef, 0x2a, - 0xe6, 0x74, 0xe6, 0xef, 0x80, 0x59, 0x0d, 0x39, 0x32, 0x4c, 0x70, 0x64, 0x5d, 0xe7, 0x35, 0xf2, - 0xa7, 0xad, 0xe6, 0xb6, 0xa5, 0x95, 0x18, 0xde, 0x86, 0xc9, 0x27, 0xad, 0x3a, 0x0b, 0x6b, 0x1b, - 0x66, 0xd3, 0xe3, 0x21, 0x6a, 0x7b, 0x17, 0x06, 0x39, 0x54, 0xa8, 0x01, 0x32, 0x80, 0x85, 0xc2, - 0xe6, 0xe7, 0x74, 0x5e, 0x8d, 0x2d, 0x70, 0xad, 0x55, 0xb4, 0x9d, 0x28, 0x1c, 0xa5, 0x88, 0xdd, - 0x4e, 0x0e, 0x2f, 0x3a, 0x72, 0xca, 0xe1, 0xd5, 0x3d, 0x3d, 0xa4, 0xef, 0xfa, 0x12, 0x9a, 0x9f, - 0x74, 0x4e, 0xa2, 0x61, 0x37, 0x60, 0x48, 0x80, 0x12, 0xa1, 0x35, 0xe2, 0xcf, 0x4f, 0x22, 0x58, - 0x1f, 0xc1, 0x45, 0xb4, 0x85, 0xb9, 0xde, 0x41, 0x8b, 0xee, 0x86, 0x86, 0xf7, 0x79, 0xb7, 0xcf, - 0xfa, 0x13, 0x98, 0xcb, 0xa2, 0xed, 0xfa, 0x65, 0xf3, 0xc7, 0xee, 0x7f, 0xdd, 0x0b, 0x53, 0x6b, - 0xa1, 0xae, 0x4c, 0x08, 0x49, 0xdc, 0xcc, 0x7a, 0x86, 0x8d, 0x32, 0x59, 0xed, 0xc9, 0x7a, 0x66, - 0xfd, 0xae, 0xf6, 0xac, 0xad, 0xb7, 0xe8, 0x7d, 0x35, 0xdb, 0xb6, 0xd4, 0xc3, 0xb6, 0x37, 0xa1, - 0x7f, 0x93, 0x2d, 0xd5, 0x7d, 0x62, 0xec, 0x38, 0x05, 0x03, 0xe1, 0xb3, 0x32, 0xb6, 0x45, 0xb2, - 0x1f, 0xe4, 0x5e, 0xea, 0xf1, 0x5a, 0x7f, 0xf7, 0xf7, 0xc3, 0xab, 0x3d, 0xa9, 0x77, 0x6c, 0xef, - 0xc3, 0x68, 0xb5, 0x79, 0xc4, 0x1d, 0xce, 0x7c, 0x2f, 0xf1, 0x59, 0x6a, 0x25, 0xab, 0x3d, 0xb6, - 0x8e, 0xc8, 0x4e, 0xb8, 0xd5, 0x76, 0x1b, 0x37, 0xaa, 0xac, 0x37, 0xd5, 0xab, 0x3d, 0xe8, 0xbf, - 0xbd, 0x38, 0x0c, 0x83, 0x3b, 0x4e, 0x70, 0x40, 0x23, 0xeb, 0x2b, 0x98, 0x13, 0x6e, 0x22, 0xdc, - 0xf2, 0x87, 0xce, 0x24, 0x61, 0xec, 0x09, 0x54, 0xe4, 0xda, 0x71, 0x05, 0x00, 0xf5, 0xfc, 0x35, - 0xaf, 0x49, 0xbf, 0xe1, 0xde, 0x4c, 0xb6, 0x06, 0xb1, 0xde, 0x83, 0x11, 0x25, 0x21, 0x54, 0x66, - 0xb5, 0xcd, 0x0e, 0xa5, 0x35, 0x65, 0xbc, 0xd6, 0x93, 0x4f, 0xf4, 0x2e, 0x1a, 0x7d, 0x17, 0x31, - 0x12, 0xb8, 0xf6, 0xeb, 0xc2, 0x74, 0x62, 0x12, 0xc4, 0x8f, 0x70, 0x95, 0xfe, 0x89, 0x9e, 0x4f, - 0xb6, 0xfa, 0x9d, 0x54, 0x4f, 0x7b, 0x4f, 0xa5, 0x9e, 0x5a, 0xff, 0xa8, 0x17, 0x0f, 0x4e, 0x29, - 0x79, 0x24, 0x6c, 0x50, 0xba, 0x1d, 0x6c, 0x11, 0x46, 0xb0, 0xf7, 0xcb, 0xf2, 0x65, 0x51, 0xb1, - 0x97, 0xc3, 0xf0, 0xcf, 0x8f, 0x2b, 0x3d, 0xe8, 0xda, 0x10, 0x93, 0x91, 0x4f, 0x61, 0x68, 0xc5, - 0x6b, 0x22, 0x87, 0xbe, 0x33, 0x70, 0x90, 0x44, 0x6c, 0x4c, 0xb0, 0xc9, 0x3b, 0xec, 0x13, 0xe6, - 0xa6, 0x0b, 0x5b, 0x83, 0xc4, 0x27, 0xb8, 0x81, 0xbc, 0x13, 0xdc, 0x60, 0xe2, 0x04, 0x67, 0xc1, - 0xc0, 0x56, 0xd0, 0x14, 0xb1, 0x0d, 0x26, 0x16, 0xc6, 0x84, 0xe0, 0x10, 0x66, 0xf3, 0x22, 0xeb, - 0xbf, 0x94, 0x60, 0xe6, 0x3e, 0x8d, 0x32, 0xe7, 0x90, 0x21, 0x95, 0xd2, 0x4b, 0x4b, 0xa5, 0xf7, - 0x45, 0xa4, 0xa2, 0x7a, 0xdd, 0x97, 0xd7, 0xeb, 0xfe, 0xbc, 0x5e, 0x0f, 0xe4, 0xf7, 0xfa, 0x3e, - 0x0c, 0xf2, 0xae, 0xb2, 0x53, 0xea, 0x5a, 0x44, 0x8f, 0xe2, 0x53, 0xaa, 0xee, 0xa3, 0x65, 0xf3, - 0x32, 0xa6, 0x48, 0xae, 0x3b, 0xa1, 0x7e, 0x4a, 0x15, 0x3f, 0xad, 0x1f, 0xe3, 0x9b, 0xc4, 0x75, - 0xbf, 0xf1, 0x44, 0xb3, 0x76, 0x0e, 0xf1, 0x2f, 0x34, 0x69, 0x1d, 0x67, 0x58, 0xbc, 0xc4, 0x96, - 0x18, 0xe4, 0x2a, 0x8c, 0xae, 0x79, 0xf7, 0xfc, 0xa0, 0x41, 0xb7, 0xbc, 0x16, 0xe7, 0x3e, 0x6c, - 0xeb, 0x20, 0x61, 0x05, 0x10, 0x35, 0xc4, 0x47, 0x6b, 0x04, 0x24, 0x8e, 0xd6, 0x0c, 0xb6, 0xb7, - 0x60, 0xf3, 0x32, 0x61, 0x64, 0x60, 0x7f, 0x17, 0x9d, 0x4a, 0xd5, 0xf1, 0xb5, 0x1b, 0xe2, 0x3e, - 0x5c, 0xb4, 0x69, 0xbb, 0xe5, 0x30, 0x9d, 0xee, 0xc8, 0xe7, 0xf8, 0xaa, 0xcf, 0x57, 0x33, 0xde, - 0x13, 0x99, 0x37, 0xf6, 0xaa, 0xc9, 0xbd, 0x05, 0x4d, 0x3e, 0x82, 0x6b, 0xf7, 0x69, 0x64, 0x2e, - 0xa8, 0xb1, 0x2d, 0x55, 0x74, 0x7e, 0x15, 0x86, 0x43, 0xd3, 0x0e, 0x7c, 0x45, 0x5e, 0x3f, 0x64, - 0x11, 0xee, 0xdd, 0x95, 0x37, 0x25, 0x82, 0x8f, 0xfa, 0xcb, 0xfa, 0x0c, 0x2a, 0x79, 0xd5, 0x9d, - 0xce, 0xa1, 0xd2, 0x85, 0xab, 0xf9, 0x0c, 0x44, 0x73, 0x57, 0x40, 0xda, 0x8c, 0xc5, 0x27, 0xd4, - 0xad, 0xb5, 0xa6, 0x99, 0x59, 0xfc, 0x61, 0x2d, 0x4a, 0xd7, 0xb2, 0x97, 0x68, 0x6e, 0x1d, 0xaf, - 0x63, 0x4d, 0x06, 0xb1, 0x5c, 0xab, 0x30, 0x2c, 0x61, 0x42, 0xae, 0x33, 0x99, 0x2d, 0x95, 0x02, - 0x6d, 0x4a, 0x06, 0x8a, 0xcc, 0xfa, 0xb1, 0xbc, 0x9a, 0x30, 0x29, 0x4e, 0xf7, 0xc0, 0xee, 0x34, - 0x77, 0x11, 0x96, 0x0f, 0x17, 0x4d, 0xde, 0xba, 0xc9, 0xb9, 0xac, 0x99, 0x9c, 0xb9, 0xa5, 0xf9, - 0xaa, 0x69, 0x02, 0xed, 0x15, 0xf3, 0x32, 0x06, 0x91, 0x2b, 0xba, 0x61, 0x79, 0x2c, 0xfd, 0x62, - 0xef, 0x36, 0xcc, 0x65, 0x55, 0xa8, 0x9d, 0x03, 0x95, 0xf5, 0x52, 0xe8, 0x3b, 0xcb, 0x70, 0x45, - 0x46, 0x17, 0xf1, 0xfd, 0x28, 0x8c, 0x02, 0xa7, 0x5d, 0x6b, 0x04, 0x6e, 0x3b, 0xa6, 0xb2, 0x60, - 0x90, 0x43, 0x84, 0x24, 0xf8, 0x35, 0x0f, 0xc7, 0x11, 0x25, 0xd6, 0x6f, 0x97, 0xc0, 0x32, 0xbc, - 0x80, 0x70, 0x9c, 0xb7, 0x03, 0xff, 0xa9, 0xdb, 0xd4, 0xae, 0x56, 0xde, 0x36, 0xcc, 0x7a, 0xfc, - 0xc5, 0x55, 0xd2, 0x01, 0x59, 0xac, 0x99, 0xb7, 0x13, 0xa6, 0x36, 0xae, 0x78, 0xa2, 0x67, 0xd0, - 0x13, 0xaa, 0xbf, 0x58, 0x50, 0x26, 0xb8, 0xff, 0x56, 0x82, 0xd7, 0x0a, 0xdb, 0x20, 0xfa, 0xb3, - 0x0f, 0xe5, 0x64, 0x99, 0x98, 0x41, 0x15, 0xcd, 0x27, 0x21, 0xcd, 0x61, 0xef, 0x0e, 0xf7, 0x72, - 0x96, 0xde, 0x33, 0x6d, 0xc5, 0x39, 0xc5, 0xef, 0xec, 0xad, 0x27, 0x1f, 0x02, 0xec, 0xf8, 0x91, - 0xd3, 0x5a, 0x42, 0x03, 0x40, 0x5f, 0xec, 0xb1, 0x1e, 0x31, 0x68, 0x3d, 0xf9, 0xbc, 0x5d, 0x43, - 0xb6, 0x7e, 0x80, 0xdf, 0x75, 0x76, 0xa3, 0x4f, 0xf7, 0xa9, 0x2d, 0xc1, 0x6b, 0x89, 0x7b, 0xf1, - 0x17, 0x60, 0x12, 0xc1, 0x34, 0x13, 0x3f, 0xd3, 0xbd, 0xef, 0x07, 0x7e, 0xa7, 0xfd, 0xab, 0x19, - 0xf5, 0x3f, 0x2f, 0x71, 0x57, 0x41, 0xbd, 0x5a, 0x31, 0xd0, 0x4b, 0x00, 0x31, 0x34, 0xe1, 0x32, - 0xae, 0x0a, 0xf6, 0xee, 0xf0, 0x23, 0x37, 0x5a, 0xcc, 0x0f, 0x38, 0x03, 0x8d, 0xec, 0x57, 0x3b, - 0x92, 0x77, 0xf1, 0x32, 0x5c, 0xd5, 0x7e, 0x3a, 0xb9, 0xbf, 0x2f, 0xed, 0x1f, 0x67, 0xa4, 0x3b, - 0x84, 0x29, 0xb6, 0x02, 0x54, 0x3b, 0xd1, 0xa1, 0x1f, 0xb8, 0x91, 0x7c, 0xfc, 0x40, 0xb6, 0xc5, - 0xd3, 0x61, 0x4e, 0xf5, 0xc9, 0x2f, 0x8f, 0x2b, 0x1f, 0x9c, 0x25, 0xea, 0x9b, 0xe4, 0xb9, 0xa3, - 0x9e, 0x1b, 0x5b, 0x33, 0xd0, 0xb7, 0x64, 0xaf, 0xe3, 0x82, 0x67, 0xaf, 0xab, 0x05, 0xcf, 0x5e, - 0xb7, 0xfe, 0xb6, 0x17, 0x2a, 0x3c, 0xb8, 0x01, 0xfa, 0x50, 0xc4, 0x56, 0x0b, 0xcd, 0x29, 0xe3, - 0xb4, 0x06, 0x86, 0x44, 0xf0, 0x82, 0xde, 0xd3, 0x04, 0x2f, 0xf8, 0x0d, 0xc8, 0x31, 0x59, 0x9d, - 0xc2, 0x0a, 0xf0, 0xd6, 0xc9, 0x71, 0xe5, 0xb5, 0xd8, 0x0a, 0xc0, 0x4b, 0xb3, 0xcc, 0x01, 0x39, - 0x55, 0xa4, 0xed, 0x17, 0xfd, 0x2f, 0x60, 0xbf, 0xb8, 0x0d, 0x43, 0x78, 0x98, 0x59, 0xdb, 0x16, - 0x7e, 0x85, 0x38, 0x3d, 0x31, 0x12, 0x49, 0xdd, 0xd5, 0xc3, 0x41, 0x49, 0x34, 0xeb, 0xff, 0xed, - 0x85, 0xab, 0xf9, 0x32, 0x17, 0x6d, 0x5b, 0x06, 0x88, 0xbd, 0x37, 0x8a, 0xbc, 0x45, 0xf0, 0xdb, - 0x79, 0x46, 0xf7, 0x95, 0xb7, 0x96, 0x46, 0xc7, 0x74, 0x1f, 0xf9, 0x8e, 0x34, 0x71, 0x55, 0x60, - 0x3c, 0x2f, 0x15, 0xb1, 0x0c, 0x05, 0xc8, 0x88, 0x65, 0x28, 0x60, 0x64, 0x1f, 0x66, 0xb6, 0x03, - 0xf7, 0xa9, 0x13, 0xd1, 0x87, 0xf4, 0x39, 0x7f, 0x8a, 0xb2, 0x22, 0xde, 0x9f, 0xf0, 0xc7, 0xc1, - 0xd7, 0x4f, 0x8e, 0x2b, 0xaf, 0xb7, 0x39, 0x0a, 0xfb, 0x30, 0xeb, 0xfc, 0x65, 0x5b, 0x3d, 0xfd, - 0x24, 0x25, 0x8f, 0x91, 0xf5, 0x2f, 0x4b, 0x70, 0x09, 0xd5, 0x72, 0x61, 0x76, 0x95, 0x95, 0xbf, - 0x90, 0xd3, 0xa0, 0xde, 0x41, 0x31, 0x17, 0xd1, 0x69, 0xd0, 0x78, 0x67, 0x6b, 0x1b, 0x68, 0x64, - 0x0d, 0x46, 0xc5, 0x6f, 0xfc, 0xfe, 0xfa, 0xf0, 0x40, 0x30, 0xad, 0x2d, 0x58, 0x38, 0xd5, 0xb9, - 0xa9, 0x08, 0x27, 0xb6, 0x60, 0x86, 0xcf, 0xd1, 0x6c, 0x9d, 0xd6, 0xfa, 0x45, 0x2f, 0xcc, 0xef, - 0xd1, 0xc0, 0x7d, 0xfc, 0x3c, 0xa7, 0x33, 0x5b, 0x30, 0x25, 0x41, 0x3c, 0xc0, 0x81, 0xf1, 0x89, - 0xf1, 0x78, 0x66, 0xb2, 0xa9, 0x22, 0x42, 0x82, 0xfc, 0xe2, 0x32, 0x09, 0xcf, 0xe0, 0x0e, 0xf8, - 0x2e, 0x0c, 0x27, 0x42, 0x8c, 0xe0, 0xf8, 0xcb, 0x2f, 0x34, 0x1e, 0xaa, 0xd5, 0x1e, 0x5b, 0x61, - 0x92, 0xdf, 0xc9, 0xbf, 0xbf, 0x11, 0xa6, 0x8f, 0x6e, 0xf6, 0x4f, 0xfc, 0x60, 0xd9, 0xc7, 0xea, - 0x68, 0xa5, 0x19, 0x1f, 0xec, 0x6a, 0x8f, 0x9d, 0x57, 0xd3, 0xe2, 0x28, 0x8c, 0x54, 0xf1, 0x4e, - 0x8a, 0x9d, 0xdc, 0xff, 0x6b, 0x2f, 0x5c, 0x91, 0xcf, 0x4a, 0x72, 0xc4, 0xfc, 0x05, 0xcc, 0x48, - 0x50, 0xb5, 0xcd, 0x14, 0x06, 0xda, 0x34, 0x25, 0xcd, 0x63, 0x0a, 0x4a, 0x49, 0x3b, 0x02, 0x27, - 0x16, 0x76, 0x1e, 0xf9, 0xab, 0xb1, 0x7e, 0x7e, 0x9a, 0x15, 0xf0, 0x05, 0xad, 0x90, 0xfa, 0x9a, - 0x69, 0x88, 0xc6, 0x58, 0x3f, 0x9b, 0x29, 0xeb, 0x69, 0xff, 0xcb, 0x5a, 0x4f, 0x57, 0x7b, 0x92, - 0xf6, 0xd3, 0xc5, 0x09, 0x18, 0xdb, 0xa4, 0xcf, 0x62, 0xb9, 0xff, 0xef, 0xa5, 0xc4, 0x43, 0x76, - 0xa6, 0x61, 0xf0, 0x17, 0xed, 0xa5, 0x38, 0x66, 0x08, 0x3e, 0x64, 0xd7, 0x35, 0x0c, 0x8e, 0xba, - 0x06, 0x43, 0xfc, 0xa2, 0xb6, 0x79, 0x8a, 0x13, 0xbe, 0x7a, 0x1f, 0xc2, 0x1f, 0xed, 0x35, 0xf9, - 0x61, 0x5f, 0xd0, 0x5b, 0x0f, 0xe1, 0x9a, 0xf0, 0x5f, 0x36, 0x07, 0x1f, 0x2b, 0x3a, 0xe3, 0xf6, - 0x65, 0x39, 0x70, 0xe5, 0x3e, 0x4d, 0x2e, 0x3d, 0xc6, 0xfb, 0x99, 0xcf, 0xe0, 0x9c, 0x01, 0x57, - 0x1c, 0x51, 0x2b, 0x55, 0x73, 0x48, 0xb1, 0x4e, 0x62, 0x5b, 0x57, 0xb3, 0xaa, 0xd0, 0x1b, 0x6b, - 0x51, 0x0c, 0x0e, 0x18, 0xc4, 0x57, 0x6c, 0xe1, 0x19, 0x56, 0xbd, 0xeb, 0xda, 0x77, 0xcd, 0x57, - 0x3c, 0x1e, 0x25, 0x4c, 0xee, 0xbc, 0xaa, 0xd4, 0x1a, 0x37, 0xee, 0x02, 0xac, 0x09, 0x18, 0x93, - 0x45, 0x2d, 0x1a, 0x86, 0xd6, 0xcf, 0x06, 0xc0, 0x12, 0x82, 0xcd, 0xba, 0x7d, 0x96, 0xf2, 0xd8, - 0x4f, 0x35, 0x56, 0x6c, 0x54, 0x17, 0xf4, 0xb8, 0x74, 0x71, 0x29, 0x9f, 0x79, 0xa8, 0xe7, 0x35, - 0x62, 0xa8, 0x31, 0xf3, 0x52, 0xbd, 0xff, 0x61, 0xce, 0x32, 0xc9, 0x3f, 0xb6, 0x37, 0x4e, 0x8e, - 0x2b, 0xd7, 0x72, 0x96, 0x49, 0x83, 0x6f, 0xf6, 0x92, 0x69, 0x9b, 0x57, 0x22, 0x7d, 0x2f, 0x72, - 0x25, 0xc2, 0xbe, 0x48, 0xfd, 0x52, 0x64, 0xd7, 0x94, 0xa5, 0xf8, 0x1e, 0xe5, 0x95, 0xb6, 0x5e, - 0x24, 0xde, 0x93, 0x6b, 0x10, 0x83, 0xab, 0xc1, 0x86, 0xb8, 0x50, 0xd6, 0x6c, 0x96, 0x4b, 0x87, - 0xb4, 0xf1, 0x44, 0xd8, 0x8a, 0xe5, 0x85, 0x6e, 0x96, 0xcd, 0x9c, 0xc7, 0x27, 0xe5, 0xdf, 0x39, - 0x2f, 0xa8, 0x37, 0x18, 0xa9, 0xfe, 0x1e, 0x3e, 0xc9, 0x96, 0xfc, 0x14, 0x26, 0xd5, 0x50, 0x27, - 0xdc, 0x8f, 0x46, 0x17, 0x5e, 0x8f, 0x03, 0x19, 0x1e, 0x3d, 0x76, 0x6e, 0x3e, 0xbd, 0x73, 0x33, - 0x03, 0x97, 0x3f, 0xb3, 0x6e, 0xc8, 0x02, 0xcd, 0xf7, 0x48, 0xbf, 0xe8, 0xca, 0x22, 0xd4, 0xae, - 0xb3, 0xff, 0x1f, 0xe5, 0x2c, 0xcf, 0xf4, 0x05, 0xb7, 0x45, 0xc5, 0xbb, 0x13, 0x39, 0xfb, 0x72, - 0xae, 0xe2, 0x4a, 0xdf, 0xf2, 0x55, 0xdc, 0x9f, 0xf6, 0xca, 0x27, 0x02, 0xe9, 0xdb, 0xd0, 0x33, - 0xdf, 0xc8, 0x65, 0xf6, 0xe0, 0x54, 0x9b, 0x69, 0x66, 0xe3, 0xc8, 0xa2, 0xbc, 0xcf, 0x54, 0xa1, - 0x87, 0x26, 0xd4, 0xdd, 0x40, 0x5c, 0x60, 0x5c, 0x71, 0xa2, 0xea, 0xa2, 0x51, 0x25, 0x2f, 0xcb, - 0xfa, 0x5e, 0xfe, 0xb2, 0xec, 0x9f, 0x8e, 0xc0, 0xf9, 0x6d, 0xe7, 0xc0, 0xf5, 0xd8, 0xa2, 0x6d, - 0xd3, 0xd0, 0xef, 0x04, 0x0d, 0x4a, 0xaa, 0x30, 0x61, 0xfa, 0x7f, 0x76, 0xf1, 0x6e, 0x65, 0xfb, - 0x92, 0x09, 0x23, 0x0b, 0x30, 0xa2, 0x5e, 0x7d, 0x8a, 0xcd, 0x24, 0xe3, 0x35, 0xe8, 0x6a, 0x8f, - 0x1d, 0xa3, 0x91, 0x0f, 0x8d, 0xfb, 0x9d, 0x73, 0xea, 0x01, 0x33, 0xe2, 0x2e, 0x70, 0x07, 0x3d, - 0xcf, 0x6f, 0x9a, 0x1b, 0x22, 0xbf, 0xc4, 0xf8, 0x71, 0xea, 0xca, 0x67, 0xc0, 0x68, 0x71, 0xca, - 0xee, 0x85, 0xba, 0x40, 0x6e, 0x80, 0xd8, 0x8c, 0xcb, 0xa0, 0xaf, 0x60, 0xf4, 0x61, 0x67, 0x9f, - 0xca, 0xcb, 0xad, 0x41, 0xb1, 0x3f, 0x26, 0xbd, 0x9a, 0x45, 0xf9, 0xde, 0x5d, 0x3e, 0x06, 0x4f, - 0x3a, 0xfb, 0x34, 0x1d, 0x79, 0x98, 0x2d, 0x4c, 0x1a, 0x33, 0x72, 0x08, 0xe5, 0xa4, 0x03, 0xb2, - 0x08, 0xd6, 0x55, 0xe0, 0x36, 0x8d, 0x91, 0x22, 0xb4, 0xf8, 0xc6, 0xdc, 0x2d, 0xd2, 0xa8, 0x24, - 0xc5, 0x95, 0xfc, 0x26, 0x4c, 0x67, 0x5a, 0x1d, 0xd5, 0x23, 0xa6, 0x62, 0x83, 0x26, 0x2e, 0xea, - 0x09, 0xa9, 0xc9, 0x17, 0x53, 0x46, 0xcd, 0xd9, 0xb5, 0x90, 0x26, 0x9c, 0x4b, 0x38, 0xd6, 0x8a, - 0x10, 0xee, 0xf9, 0xae, 0xba, 0xb8, 0x31, 0xc9, 0x78, 0x97, 0x99, 0x75, 0x25, 0x59, 0x92, 0x75, - 0x18, 0x51, 0xc7, 0x7d, 0x0c, 0xfa, 0x93, 0x6d, 0xda, 0x98, 0x3d, 0x39, 0xae, 0x4c, 0xc5, 0xa6, - 0x0d, 0x83, 0x67, 0xcc, 0x80, 0xfc, 0x16, 0x5c, 0x53, 0x53, 0x74, 0x2b, 0xc8, 0x36, 0x02, 0x89, - 0xf8, 0xc9, 0x37, 0x92, 0x33, 0x3c, 0x0f, 0x7f, 0xef, 0xce, 0x62, 0xef, 0x6c, 0x69, 0xb5, 0xc7, - 0xee, 0xce, 0x9a, 0xfc, 0xac, 0x04, 0x17, 0x72, 0x6a, 0x1d, 0xc3, 0x5a, 0xbb, 0x5a, 0xe6, 0x50, - 0xb9, 0xc7, 0x67, 0x43, 0x6e, 0x33, 0x7e, 0xe0, 0x26, 0x4d, 0x74, 0x46, 0xbf, 0x73, 0x6a, 0x22, - 0xef, 0xc0, 0x20, 0x9e, 0x91, 0xc3, 0xd9, 0x71, 0xd4, 0x22, 0x31, 0x40, 0x0a, 0x9e, 0xa4, 0xf5, - 0x7d, 0x43, 0xe0, 0x90, 0x55, 0xa6, 0x8d, 0xe1, 0xbe, 0x25, 0xb5, 0x27, 0x11, 0x4e, 0x49, 0x68, - 0xf4, 0xbc, 0x48, 0xc6, 0x99, 0x30, 0x02, 0x65, 0x9b, 0x64, 0x8b, 0x00, 0xc3, 0x81, 0x58, 0x95, - 0x1e, 0xf4, 0x0f, 0xf7, 0x97, 0x07, 0xf8, 0x87, 0x23, 0x3d, 0xb6, 0x7f, 0x77, 0x98, 0x3f, 0xb0, - 0xdc, 0xf5, 0xdc, 0xc7, 0x6e, 0xbc, 0x80, 0xe9, 0xd6, 0xb5, 0x38, 0x5f, 0x85, 0xd0, 0x7d, 0x73, - 0x32, 0x53, 0x28, 0x43, 0x5c, 0x6f, 0x57, 0x43, 0xdc, 0x5d, 0xed, 0xca, 0x4a, 0x8b, 0x40, 0xc8, - 0x75, 0x1c, 0xd3, 0xf0, 0x15, 0xdf, 0x65, 0x7d, 0x0d, 0x83, 0x18, 0x34, 0x90, 0xdf, 0x07, 0x8e, - 0x2e, 0xdc, 0x14, 0xcb, 0x76, 0x41, 0xf3, 0x79, 0x94, 0x41, 0xf1, 0x68, 0x9a, 0x4b, 0x1c, 0x01, - 0x86, 0xc4, 0x11, 0x42, 0x76, 0x60, 0x72, 0x3b, 0xa0, 0x4d, 0xe1, 0x37, 0xdc, 0x0e, 0x84, 0x71, - 0x82, 0x9b, 0x3d, 0x70, 0xcb, 0x6f, 0xcb, 0xe2, 0x3a, 0x55, 0xe5, 0xfa, 0x86, 0x9a, 0x41, 0x4e, - 0x56, 0x60, 0xa2, 0x46, 0x9d, 0xa0, 0x71, 0xf8, 0x90, 0x3e, 0x67, 0xea, 0x8e, 0x11, 0xa4, 0x3d, - 0xc4, 0x12, 0xd6, 0x5f, 0x2c, 0xd2, 0x7d, 0x3c, 0x4c, 0x22, 0xf2, 0x03, 0x18, 0xac, 0xf9, 0x41, - 0xb4, 0xf8, 0x5c, 0x2c, 0x6a, 0xf2, 0xc6, 0x88, 0x03, 0x17, 0x2f, 0xca, 0x40, 0xf5, 0xa1, 0x1f, - 0x44, 0xf5, 0x7d, 0x23, 0xe2, 0x0e, 0x47, 0x21, 0xcf, 0x61, 0xca, 0x5c, 0x50, 0x84, 0x3b, 0xeb, - 0xb0, 0x50, 0xb3, 0xb2, 0x56, 0x2d, 0x8e, 0xb2, 0x78, 0x5d, 0x70, 0xbf, 0x9a, 0x5c, 0xb6, 0x1e, - 0x63, 0xb9, 0x1e, 0x04, 0x27, 0x8b, 0x9e, 0x6c, 0x60, 0x7c, 0x7f, 0xde, 0xa3, 0x6a, 0xc8, 0xdd, - 0x60, 0x47, 0xe2, 0x98, 0x4e, 0x1d, 0x5c, 0x94, 0x50, 0x12, 0x4e, 0x98, 0x4c, 0x0a, 0x61, 0xa7, - 0x48, 0xc9, 0x36, 0x9c, 0xdf, 0x0d, 0xe9, 0x76, 0x40, 0x9f, 0xba, 0xf4, 0x99, 0xe4, 0x07, 0x71, - 0x00, 0x1c, 0xc6, 0xaf, 0xcd, 0x4b, 0xb3, 0x18, 0xa6, 0x89, 0xc9, 0x87, 0x00, 0xdb, 0xae, 0xe7, - 0xd1, 0x26, 0x5e, 0x3b, 0x8e, 0x22, 0x2b, 0x34, 0xa9, 0xb6, 0x11, 0x5a, 0xf7, 0xbd, 0x96, 0x2e, - 0x52, 0x0d, 0x99, 0x2c, 0xc2, 0xf8, 0x9a, 0xd7, 0x68, 0x75, 0x84, 0x7b, 0x40, 0x88, 0x0b, 0x8a, - 0x08, 0xcc, 0xe5, 0xf2, 0x82, 0x7a, 0xea, 0x23, 0x37, 0x49, 0xc8, 0x43, 0x20, 0x02, 0x20, 0x66, - 0xad, 0xb3, 0xdf, 0xa2, 0xe2, 0x73, 0x47, 0x53, 0x89, 0x64, 0x84, 0xd3, 0xdd, 0x88, 0x77, 0x95, - 0x22, 0x9b, 0xfb, 0x10, 0x46, 0xb5, 0x39, 0x9f, 0x11, 0x05, 0x60, 0x4a, 0x8f, 0x02, 0x30, 0xa2, - 0xbf, 0xf6, 0xff, 0xff, 0x4b, 0x30, 0x9f, 0xfd, 0x2d, 0x09, 0x05, 0x6c, 0x0b, 0x46, 0x14, 0x50, - 0xbd, 0x3a, 0x91, 0xaa, 0x7f, 0x42, 0x03, 0xe2, 0x1f, 0xb4, 0x5c, 0x79, 0xf4, 0xde, 0xc7, 0x3c, - 0x5e, 0xc0, 0x1e, 0xff, 0x7f, 0x0c, 0xc3, 0x14, 0x7a, 0x57, 0x27, 0xd7, 0xa9, 0xcf, 0x30, 0x9a, - 0x07, 0xc2, 0x34, 0xf3, 0xb2, 0xb0, 0x34, 0x71, 0x78, 0x32, 0xae, 0x92, 0x41, 0x40, 0xde, 0xd3, - 0x7d, 0x22, 0x7a, 0xb5, 0x8c, 0x02, 0x12, 0xa8, 0x77, 0x21, 0x76, 0x96, 0x78, 0xdb, 0xb8, 0x92, - 0x3f, 0xf5, 0xa2, 0xd7, 0x7f, 0xda, 0x45, 0x6f, 0x57, 0x2d, 0x7a, 0x3c, 0x4a, 0xc4, 0x5b, 0xda, - 0xa2, 0xf7, 0xea, 0x57, 0xbb, 0xc1, 0x57, 0xbd, 0xda, 0x0d, 0xbd, 0xdc, 0x6a, 0x37, 0xfc, 0x82, - 0xab, 0xdd, 0x3d, 0x98, 0xd8, 0xa4, 0xb4, 0xa9, 0x5d, 0x94, 0x8c, 0xc4, 0xbb, 0xa7, 0x47, 0xd1, - 0x04, 0x96, 0x75, 0x5b, 0x92, 0xa0, 0xca, 0x5d, 0x35, 0xe1, 0xef, 0x67, 0xd5, 0x1c, 0x7d, 0xc5, - 0xab, 0xe6, 0xd8, 0xcb, 0xac, 0x9a, 0xa9, 0xa5, 0x6f, 0xfc, 0xcc, 0x4b, 0xdf, 0xcb, 0xac, 0x56, - 0x9f, 0xa2, 0x4b, 0x61, 0xad, 0xb6, 0x2a, 0xbc, 0x47, 0x34, 0x77, 0x8d, 0x55, 0x3f, 0x94, 0x1e, - 0xd7, 0xf8, 0x37, 0x83, 0x6d, 0xfb, 0x81, 0xbc, 0xf2, 0xc6, 0xbf, 0xad, 0x45, 0x74, 0x24, 0xd4, - 0xe9, 0x95, 0xbb, 0xfe, 0x90, 0x78, 0xb2, 0x27, 0xd6, 0xb8, 0xe4, 0x31, 0xca, 0x96, 0xe5, 0xd6, - 0x5f, 0x97, 0xf8, 0xa5, 0xe4, 0xff, 0x8c, 0x4b, 0xe5, 0xcb, 0x5c, 0x14, 0xfe, 0x4e, 0xfc, 0x94, - 0x5f, 0x84, 0x1d, 0x08, 0x9c, 0xc6, 0x93, 0xf8, 0xa6, 0xf6, 0x47, 0xec, 0x3b, 0xd7, 0x0b, 0x30, - 0x6e, 0x67, 0x7c, 0x56, 0x34, 0x0b, 0xf7, 0xee, 0xc8, 0x05, 0x40, 0x44, 0x34, 0xe0, 0x60, 0x73, - 0x01, 0xd0, 0x09, 0xd0, 0x57, 0xee, 0x9c, 0x65, 0xf3, 0x97, 0xe8, 0x99, 0x2d, 0x78, 0x3f, 0xfd, - 0x96, 0x1a, 0x0f, 0x23, 0xf1, 0x5b, 0x6a, 0x5d, 0x8c, 0xf1, 0xab, 0xea, 0x5d, 0xb8, 0x64, 0xd3, - 0x23, 0xff, 0x29, 0x7d, 0xb5, 0x6c, 0x7f, 0x08, 0x17, 0x4d, 0x86, 0xfc, 0xd5, 0x0d, 0x8f, 0xb7, - 0xfd, 0x69, 0x76, 0x94, 0x6e, 0x41, 0xc0, 0xa3, 0x74, 0xf3, 0x60, 0xbf, 0xec, 0x4f, 0x7d, 0xdf, - 0xc0, 0x32, 0xcb, 0x87, 0x79, 0x93, 0x79, 0xb5, 0xd9, 0xc4, 0xec, 0x6d, 0x0d, 0xb7, 0xed, 0x78, - 0x11, 0xd9, 0x82, 0x51, 0xed, 0x67, 0xc2, 0x54, 0xa0, 0x95, 0x08, 0x9d, 0x26, 0x06, 0x18, 0x11, - 0x1e, 0x63, 0xb0, 0x45, 0xa1, 0x92, 0x14, 0x0f, 0x13, 0x99, 0x5e, 0xe7, 0x22, 0x8c, 0x6b, 0x3f, - 0x95, 0xc9, 0x12, 0x3f, 0x7e, 0xad, 0x06, 0x53, 0x60, 0x26, 0x89, 0xd5, 0x80, 0xb9, 0x2c, 0xa1, - 0x61, 0x7c, 0xa4, 0xe7, 0x64, 0x25, 0x8e, 0xb4, 0xd4, 0xdd, 0xdb, 0xee, 0x5c, 0x5e, 0x94, 0x25, - 0xeb, 0xff, 0xee, 0x87, 0x4b, 0x62, 0x30, 0x5e, 0xe5, 0x88, 0x93, 0x1f, 0xc3, 0xa8, 0x36, 0xc6, - 0x42, 0xe8, 0x57, 0x65, 0x64, 0xc7, 0xbc, 0xb9, 0xc0, 0x4d, 0x1a, 0x1d, 0x04, 0xd4, 0x13, 0xc3, - 0xbd, 0xda, 0x63, 0xeb, 0x2c, 0x49, 0x0b, 0x26, 0xcc, 0x81, 0x16, 0x56, 0x9d, 0xd7, 0x32, 0x2b, - 0x31, 0x51, 0x65, 0x9c, 0xe0, 0x66, 0x3d, 0x73, 0xb8, 0x57, 0x7b, 0xec, 0x04, 0x6f, 0xf2, 0x0d, - 0x9c, 0x4f, 0x8d, 0xb2, 0x30, 0xd6, 0xbd, 0x99, 0x59, 0x61, 0x0a, 0x9b, 0x9b, 0x63, 0x03, 0x04, - 0xe7, 0x56, 0x9b, 0xae, 0x84, 0x34, 0x61, 0x4c, 0x1f, 0x78, 0x61, 0x76, 0xba, 0x56, 0x20, 0x4a, - 0x8e, 0xc8, 0x95, 0x3b, 0x21, 0x4b, 0x1c, 0xfb, 0xe7, 0xa6, 0x89, 0xd9, 0x40, 0x1e, 0x86, 0x41, - 0xfe, 0x9b, 0x2d, 0x01, 0xdb, 0x01, 0x0d, 0xa9, 0xd7, 0xa0, 0x86, 0x83, 0xf6, 0x4b, 0x2e, 0x01, - 0xff, 0xa2, 0x04, 0xb3, 0x59, 0x7c, 0x6b, 0xd4, 0x6b, 0x92, 0x6d, 0x28, 0x27, 0x2b, 0x12, 0xb3, - 0xda, 0x52, 0xa1, 0x58, 0x73, 0x9b, 0xb4, 0xda, 0x63, 0xa7, 0xa8, 0xc9, 0x26, 0x9c, 0xd7, 0x60, - 0xc2, 0xb8, 0xda, 0x7b, 0x1a, 0xe3, 0x2a, 0x1b, 0x85, 0x14, 0xa9, 0x6e, 0x9b, 0x5e, 0xc5, 0x9d, - 0x71, 0xd9, 0x3f, 0x72, 0x5c, 0x8f, 0x29, 0xba, 0x5a, 0xb0, 0x25, 0x88, 0xa1, 0x42, 0x36, 0xdc, - 0xda, 0x8a, 0x50, 0xf9, 0xa0, 0x44, 0xa1, 0x58, 0x9f, 0xe0, 0x0a, 0x2e, 0x6c, 0x74, 0xfc, 0x79, - 0xaa, 0x62, 0x76, 0x15, 0x06, 0x76, 0xd6, 0x6b, 0x4b, 0x55, 0xf1, 0xd8, 0x95, 0x87, 0x48, 0x68, - 0x85, 0xf5, 0x86, 0x63, 0xf3, 0x02, 0xeb, 0x63, 0x20, 0xf7, 0x69, 0x24, 0x62, 0x81, 0x2b, 0xba, - 0x37, 0x60, 0x48, 0x80, 0x04, 0x25, 0xba, 0xc6, 0xb5, 0x04, 0x96, 0x2c, 0xb3, 0xb6, 0xe5, 0x39, - 0xa1, 0x45, 0x9d, 0x50, 0xdb, 0x98, 0x3f, 0x80, 0xe1, 0x40, 0xc0, 0xc4, 0xbe, 0x3c, 0xa1, 0xb2, - 0x26, 0x20, 0x98, 0xdb, 0xb3, 0x25, 0x8e, 0xad, 0xfe, 0xb2, 0xd6, 0x31, 0x9c, 0xc9, 0xd6, 0xda, - 0xf2, 0x12, 0x93, 0xaa, 0x10, 0x96, 0x1c, 0x8e, 0x5b, 0xe8, 0x43, 0x1e, 0x51, 0xfd, 0xa9, 0x2b, - 0x8a, 0x06, 0x3f, 0x72, 0x11, 0xc4, 0x47, 0x43, 0xb1, 0xee, 0xaa, 0xe0, 0x28, 0x19, 0xdc, 0xf2, - 0xa2, 0xff, 0x6f, 0x62, 0xd8, 0x97, 0xfb, 0xe8, 0x2e, 0xf3, 0x2a, 0x1a, 0xe1, 0xc0, 0x1c, 0xdf, - 0xe6, 0x59, 0xaf, 0x44, 0x4a, 0x2b, 0x5f, 0x2d, 0x8d, 0x4b, 0x30, 0xa2, 0x60, 0xea, 0xee, 0x8b, - 0xcb, 0xca, 0xc0, 0xdf, 0xbb, 0xcb, 0x5f, 0x05, 0x37, 0x14, 0x83, 0x98, 0x8e, 0x55, 0xc1, 0xbf, - 0xbb, 0x6f, 0xb9, 0x8a, 0x90, 0x06, 0xd1, 0xb7, 0x5a, 0x45, 0x1c, 0x17, 0xe8, 0x2c, 0x55, 0x18, - 0xf8, 0x7b, 0x0b, 0xa7, 0x11, 0xd4, 0xb7, 0x5c, 0x05, 0x13, 0xd4, 0xb7, 0x57, 0x05, 0x95, 0x01, - 0x94, 0xf8, 0x24, 0x4d, 0x55, 0xb2, 0x92, 0xae, 0x44, 0x1a, 0xae, 0x13, 0x14, 0x85, 0xe3, 0x41, - 0x61, 0x9e, 0x0b, 0xeb, 0x57, 0x50, 0x0d, 0x13, 0xd8, 0xb7, 0x5b, 0xcd, 0xff, 0x57, 0xe2, 0xe1, - 0x9c, 0x6a, 0x5b, 0x5a, 0x32, 0x39, 0xef, 0xb1, 0xaf, 0x5d, 0xcd, 0x6b, 0x5f, 0xfb, 0x43, 0xd7, - 0x6b, 0xea, 0x57, 0xf3, 0x4e, 0x27, 0x3a, 0x54, 0x01, 0x87, 0x9f, 0xb8, 0x5e, 0xd3, 0x4e, 0x62, - 0x93, 0x0f, 0x61, 0x5c, 0x03, 0x29, 0x6d, 0x8d, 0xa7, 0x24, 0xd0, 0xc9, 0xdd, 0xa6, 0x6d, 0x62, - 0x5a, 0x7f, 0x57, 0x82, 0xc9, 0x8c, 0x24, 0xa7, 0x68, 0xcc, 0xc0, 0x53, 0x90, 0x5a, 0xa8, 0x44, - 0x3e, 0x1e, 0x8c, 0x2c, 0x61, 0x6c, 0x92, 0x0a, 0x11, 0x83, 0xb1, 0x6b, 0x09, 0x59, 0x7b, 0xb5, - 0xa4, 0x4f, 0xd9, 0x49, 0x58, 0x75, 0x74, 0x12, 0x02, 0xc4, 0x2d, 0x11, 0x66, 0xe3, 0x1a, 0x53, - 0x69, 0xb5, 0x6c, 0xae, 0xaf, 0x24, 0x9d, 0xac, 0x56, 0x8d, 0xf5, 0x3b, 0xbd, 0x70, 0x21, 0xa3, - 0xff, 0x35, 0x1a, 0xfd, 0x7d, 0x88, 0x20, 0x91, 0x53, 0xb7, 0xef, 0x57, 0x94, 0x53, 0xd7, 0xfa, - 0xb7, 0xbd, 0x70, 0x61, 0xb7, 0x1d, 0xe2, 0x0b, 0xab, 0x35, 0xef, 0x29, 0xf5, 0x22, 0x3f, 0x78, - 0x8e, 0xaf, 0x42, 0xc8, 0x7b, 0x30, 0xb0, 0x4a, 0x5b, 0x2d, 0x5f, 0xcc, 0xff, 0xcb, 0xd2, 0x3b, - 0x22, 0x89, 0x8d, 0x48, 0xab, 0x3d, 0x36, 0xc7, 0x26, 0x1f, 0xc2, 0xc8, 0x2a, 0x75, 0x82, 0x68, - 0x9f, 0x3a, 0xf2, 0xc8, 0x22, 0x13, 0x25, 0x68, 0x24, 0x02, 0x61, 0xb5, 0xc7, 0x8e, 0xb1, 0xc9, - 0x02, 0x3b, 0xcd, 0x7b, 0x07, 0xea, 0x35, 0x79, 0x4e, 0x85, 0x0c, 0x67, 0xb5, 0xc7, 0x46, 0x5c, - 0xb2, 0x01, 0xe3, 0xd5, 0x03, 0xea, 0x45, 0x1b, 0x34, 0x72, 0x9a, 0x4e, 0xe4, 0x08, 0xd5, 0xf6, - 0x8d, 0x3c, 0x62, 0x03, 0x79, 0xb5, 0xc7, 0x36, 0xa9, 0xc9, 0xc7, 0x30, 0x74, 0xdf, 0xf7, 0x9b, - 0xfb, 0xcf, 0xa9, 0x50, 0x57, 0x2b, 0x79, 0x8c, 0x04, 0xda, 0x6a, 0x8f, 0x2d, 0x29, 0x16, 0x07, - 0xa0, 0x6f, 0x23, 0x3c, 0xb0, 0x8e, 0x4b, 0x30, 0xbb, 0xec, 0x3f, 0xf3, 0x32, 0xa5, 0xfa, 0x3d, - 0x53, 0xaa, 0x92, 0x7d, 0x06, 0x7e, 0x42, 0xae, 0xef, 0x42, 0xff, 0xb6, 0xeb, 0x1d, 0x24, 0x54, - 0xc1, 0x0c, 0x3a, 0x86, 0x85, 0xe2, 0x71, 0xbd, 0x03, 0xb2, 0x2e, 0x75, 0x70, 0x61, 0x6b, 0xec, - 0x33, 0x14, 0xff, 0x0c, 0x6a, 0x1d, 0x3b, 0xd6, 0xb5, 0xf9, 0x6f, 0xd9, 0xc1, 0xb7, 0x61, 0x26, - 0xa7, 0x5e, 0xf1, 0x3c, 0x9c, 0xf5, 0xad, 0x1f, 0x15, 0x9b, 0xb7, 0x60, 0x3a, 0x73, 0xfc, 0x52, - 0x88, 0xff, 0x30, 0x6b, 0x22, 0xf2, 0x9e, 0xcf, 0xc2, 0x90, 0x4c, 0xc6, 0xc3, 0x6d, 0x3f, 0xf2, - 0x27, 0x3e, 0x90, 0x92, 0x1f, 0xaa, 0x0c, 0xec, 0x21, 0xbf, 0xc7, 0x3d, 0x2d, 0x90, 0x12, 0xff, - 0x9c, 0x3e, 0x7a, 0x89, 0x8f, 0x46, 0xf1, 0x62, 0x75, 0xae, 0xfa, 0x61, 0xe4, 0x29, 0xcf, 0x5b, - 0x5b, 0xfd, 0x26, 0x37, 0xa0, 0x2c, 0xb3, 0x05, 0x88, 0xb4, 0x24, 0x22, 0x07, 0xb0, 0x9d, 0x82, - 0x93, 0x0f, 0x60, 0x26, 0x09, 0x93, 0xbd, 0xe4, 0x2f, 0xdc, 0xf2, 0x8a, 0xad, 0xbf, 0xea, 0xc5, - 0x68, 0xd3, 0x05, 0xf3, 0x9a, 0x49, 0x77, 0xab, 0x26, 0xa4, 0xd5, 0xbb, 0x55, 0x23, 0xf3, 0x30, - 0xb2, 0x55, 0x33, 0x32, 0x1a, 0xd9, 0x31, 0x80, 0x35, 0x9b, 0x75, 0xa1, 0x1a, 0x34, 0x0e, 0xdd, - 0x88, 0x36, 0xa2, 0x4e, 0x20, 0x56, 0x61, 0x3b, 0x05, 0x27, 0x16, 0x8c, 0xdd, 0x6f, 0xb9, 0xfb, - 0x0d, 0xc9, 0x8c, 0x8b, 0xc0, 0x80, 0x91, 0x37, 0x61, 0x62, 0xcd, 0x0b, 0x23, 0xa7, 0xd5, 0xda, - 0xa0, 0xd1, 0xa1, 0xdf, 0x14, 0xe9, 0x16, 0xed, 0x04, 0x94, 0xd5, 0xbb, 0xe4, 0x7b, 0x91, 0xe3, - 0x7a, 0x34, 0xb0, 0x3b, 0x5e, 0xe4, 0x1e, 0x51, 0xd1, 0xf7, 0x14, 0x9c, 0xbc, 0x0b, 0xd3, 0x0a, - 0xb6, 0x15, 0x34, 0x0e, 0x69, 0x18, 0x05, 0x98, 0xe7, 0x0c, 0x03, 0xfe, 0xd8, 0xd9, 0x85, 0x58, - 0x43, 0xcb, 0xef, 0x34, 0x57, 0xbc, 0xa7, 0x6e, 0xe0, 0x7b, 0x98, 0xfa, 0x60, 0x58, 0xd4, 0x90, - 0x80, 0x5b, 0x7f, 0x3c, 0x9c, 0xf9, 0xd9, 0xbe, 0xcc, 0x1c, 0xfc, 0x12, 0xc6, 0x96, 0x9c, 0xb6, - 0xb3, 0xef, 0xb6, 0xdc, 0xc8, 0x55, 0x09, 0xa1, 0xde, 0xeb, 0xf2, 0xcd, 0xcb, 0xfc, 0x11, 0xb4, - 0xa9, 0x13, 0xdb, 0x06, 0xab, 0xb9, 0xbf, 0x1d, 0x84, 0xe9, 0x4c, 0x3c, 0x72, 0x5d, 0x64, 0x8e, - 0x52, 0xeb, 0xaa, 0xc8, 0xa5, 0x64, 0x27, 0xc1, 0x6c, 0x2c, 0x11, 0xb4, 0xd4, 0xa2, 0x8e, 0xd7, - 0x11, 0x99, 0x94, 0x6c, 0x03, 0xc6, 0xc6, 0x92, 0xe9, 0x0d, 0x1a, 0x33, 0x74, 0x9c, 0xb6, 0x13, - 0x50, 0x72, 0x15, 0x46, 0x19, 0x44, 0xb2, 0xea, 0xe7, 0x4f, 0xfc, 0x34, 0x10, 0xe3, 0xb4, 0xe9, - 0x37, 0xa9, 0xc6, 0x69, 0x80, 0x73, 0x32, 0xa1, 0x8c, 0x13, 0x83, 0x48, 0x4e, 0x83, 0x9c, 0x93, - 0x06, 0x22, 0xaf, 0xc3, 0x78, 0xb5, 0xdd, 0xd6, 0x18, 0x61, 0x0a, 0x25, 0xdb, 0x04, 0x92, 0x2b, - 0x00, 0xd5, 0x76, 0x5b, 0xb2, 0xc1, 0xf4, 0x48, 0xb6, 0x06, 0x21, 0x37, 0xe3, 0x70, 0x65, 0x1a, - 0x2b, 0xbc, 0x4e, 0xb0, 0x33, 0x4a, 0x98, 0x5c, 0x55, 0x6c, 0x27, 0xc1, 0x14, 0xb8, 0x5c, 0x13, - 0x60, 0xf2, 0x09, 0x5c, 0x4c, 0xf8, 0x5d, 0x68, 0x15, 0xa0, 0xa9, 0xdf, 0xce, 0x47, 0x20, 0xef, - 0xc3, 0x85, 0x44, 0xa1, 0xac, 0x0e, 0xad, 0xfa, 0x76, 0x4e, 0x29, 0xf9, 0x08, 0x66, 0x13, 0xcf, - 0xb6, 0xe3, 0x4a, 0xd1, 0x82, 0x6f, 0xe7, 0x96, 0xb3, 0xaf, 0x2b, 0xf1, 0xfe, 0x4b, 0x54, 0x89, - 0x97, 0x95, 0x76, 0x76, 0x21, 0x59, 0x85, 0x4a, 0xa6, 0x2f, 0x8b, 0x56, 0x31, 0xa6, 0x7d, 0xb2, - 0xbb, 0xa1, 0x91, 0x45, 0x98, 0xcf, 0x44, 0x91, 0xcd, 0xc0, 0x64, 0x50, 0x76, 0x21, 0x0e, 0x59, - 0x80, 0xa9, 0xd8, 0xa7, 0x47, 0x6b, 0x02, 0xe6, 0x81, 0xb2, 0x33, 0xcb, 0xc8, 0x3b, 0xe6, 0xe3, - 0x7c, 0x5e, 0x19, 0xa6, 0x81, 0xb2, 0xd3, 0x05, 0xd6, 0x49, 0x09, 0xe6, 0x33, 0x37, 0x4a, 0xa9, - 0xcf, 0xcf, 0x25, 0x15, 0x47, 0x6d, 0x2d, 0xb8, 0x01, 0xfd, 0xa8, 0xe0, 0x73, 0x5b, 0xb1, 0xf4, - 0x35, 0x45, 0x7a, 0xce, 0x8a, 0x95, 0xda, 0x88, 0x43, 0xee, 0xab, 0xbb, 0xc1, 0x3e, 0xb4, 0x64, - 0xdc, 0x4a, 0x2a, 0x50, 0x19, 0x95, 0xeb, 0x77, 0x84, 0xf2, 0x36, 0xf0, 0x65, 0xae, 0x61, 0xfe, - 0xaa, 0x04, 0x95, 0x2e, 0xfa, 0x81, 0xea, 0x53, 0xe9, 0x14, 0x7d, 0x7a, 0xa0, 0xfa, 0xc4, 0xdf, - 0xc6, 0x2e, 0x9c, 0x4e, 0x07, 0x79, 0xd5, 0xdd, 0xea, 0x00, 0x49, 0xab, 0xa1, 0xe4, 0xbb, 0x30, - 0x52, 0xab, 0xad, 0x1a, 0x0e, 0x7d, 0xa9, 0xcb, 0xa1, 0x18, 0x83, 0xdc, 0x3e, 0x95, 0x07, 0x9f, - 0xe6, 0xbf, 0x67, 0x2d, 0xc3, 0x6c, 0x9e, 0x06, 0x89, 0x0b, 0x0b, 0x8f, 0xad, 0xa5, 0x5d, 0x2c, - 0xf1, 0x85, 0xc5, 0x04, 0x5b, 0xef, 0xc3, 0x05, 0x45, 0xcd, 0xd3, 0x66, 0x68, 0x0f, 0xff, 0xc5, - 0xb1, 0x53, 0x05, 0x18, 0x88, 0x01, 0xd6, 0x5f, 0xf6, 0xa7, 0x08, 0x6b, 0x9d, 0xa3, 0x23, 0x27, - 0x78, 0x4e, 0xaa, 0x26, 0x61, 0x5f, 0x57, 0x4d, 0x7f, 0xb1, 0xff, 0xe7, 0xc7, 0x95, 0x1e, 0x8d, - 0x3b, 0x5b, 0x8e, 0x71, 0x63, 0xf7, 0x1a, 0x94, 0x5f, 0x49, 0xf5, 0xf2, 0xe0, 0x46, 0x06, 0x90, - 0xec, 0xc1, 0xb8, 0xd8, 0x32, 0xf1, 0xb7, 0x9c, 0xda, 0xb7, 0x93, 0x53, 0xdb, 0x68, 0xde, 0x4d, - 0x83, 0x84, 0x4f, 0x02, 0x93, 0x0d, 0xf9, 0x12, 0x26, 0xa4, 0x82, 0x24, 0x18, 0x73, 0x27, 0xa2, - 0x3b, 0xc5, 0x8c, 0x4d, 0x1a, 0xce, 0x39, 0xc1, 0x88, 0x35, 0x59, 0xae, 0x31, 0x9c, 0xf3, 0xc0, - 0x69, 0x9a, 0x6c, 0x90, 0x88, 0x26, 0x1b, 0xb0, 0xb9, 0x1f, 0x00, 0x49, 0xf7, 0xab, 0xdb, 0x2c, - 0x1e, 0xd7, 0x66, 0xf1, 0x5c, 0x15, 0x26, 0x33, 0x3a, 0x70, 0x26, 0x16, 0x3f, 0x00, 0x92, 0x6e, - 0xe9, 0x59, 0x38, 0x58, 0xd7, 0xe1, 0x4d, 0x25, 0x02, 0x35, 0x1b, 0x0c, 0x9e, 0xd2, 0xf0, 0xfc, - 0xdb, 0xbd, 0x50, 0xe9, 0x82, 0x4a, 0xfe, 0xa8, 0x94, 0x94, 0x36, 0x9f, 0x8d, 0x1f, 0x26, 0xa5, - 0x9d, 0x4d, 0x9f, 0x21, 0xf6, 0xc5, 0x8f, 0x7e, 0xf6, 0x37, 0x2f, 0xac, 0xf0, 0xa7, 0x87, 0xec, - 0xec, 0xd2, 0xea, 0xd7, 0xa5, 0x65, 0xc3, 0x94, 0x71, 0x54, 0x3a, 0xcd, 0x9e, 0x71, 0x05, 0x40, - 0x64, 0x90, 0x5c, 0xf7, 0x0f, 0x84, 0x7a, 0xa6, 0x41, 0xac, 0x7b, 0x30, 0x9d, 0xe0, 0x29, 0x8c, - 0xe1, 0xdf, 0x05, 0xf5, 0xc0, 0x1b, 0x99, 0xf6, 0x2d, 0x9e, 0xff, 0xe5, 0x71, 0x65, 0x9c, 0x69, - 0xd2, 0x37, 0xe3, 0xf8, 0xf1, 0xf2, 0x2f, 0x6b, 0x43, 0x37, 0xe7, 0x57, 0x5b, 0x7a, 0xe0, 0x1b, - 0x72, 0x07, 0x06, 0x39, 0x24, 0x11, 0xa5, 0x59, 0xc7, 0x16, 0x6b, 0x82, 0x40, 0xb4, 0xa6, 0xf1, - 0x39, 0x2a, 0xfe, 0xa8, 0xc6, 0xe1, 0x13, 0xac, 0x5d, 0x9e, 0x37, 0x24, 0x06, 0xab, 0x48, 0xd0, - 0xfd, 0xd5, 0x38, 0xcc, 0x83, 0xf4, 0xbd, 0x90, 0x78, 0x9e, 0xff, 0xac, 0x45, 0x9b, 0x3c, 0xe1, - 0xd8, 0xe2, 0x98, 0xf0, 0xbd, 0xe8, 0x77, 0x18, 0x03, 0x24, 0xb3, 0x3e, 0x83, 0x69, 0xb6, 0x41, - 0x07, 0xc9, 0xfa, 0xc8, 0x9b, 0x30, 0x84, 0x30, 0xd3, 0xa1, 0xdd, 0x61, 0x20, 0x74, 0x68, 0x17, - 0x85, 0xd6, 0x3a, 0x5c, 0xe4, 0xc6, 0x40, 0xbd, 0x4b, 0xb1, 0xe9, 0x7d, 0x00, 0x7f, 0x27, 0x1e, - 0x33, 0x66, 0xf4, 0x9e, 0xe3, 0x59, 0x9f, 0xe2, 0x6b, 0x19, 0x31, 0x49, 0x5d, 0xdf, 0x8b, 0x2d, - 0x7f, 0xa7, 0x7b, 0x5e, 0xfb, 0xbf, 0xc2, 0x7c, 0xb5, 0xdd, 0xa6, 0x5e, 0x33, 0x26, 0xdc, 0x09, - 0x9c, 0x53, 0x06, 0x3f, 0x20, 0x55, 0x18, 0x40, 0x6c, 0x75, 0x6f, 0x29, 0x9a, 0x9b, 0xd1, 0x1c, - 0xc4, 0x13, 0x61, 0x3b, 0xb1, 0x02, 0x4e, 0x69, 0x35, 0x61, 0xa6, 0xd6, 0xd9, 0x3f, 0x72, 0x23, - 0x74, 0x83, 0xc7, 0x00, 0x22, 0xb2, 0xee, 0x35, 0x99, 0xea, 0x89, 0x0b, 0xe3, 0x7a, 0xfc, 0xaa, - 0x02, 0x3d, 0xe9, 0x45, 0x50, 0x91, 0xa7, 0x77, 0x6e, 0xc6, 0xa4, 0x68, 0xf5, 0xe0, 0xb5, 0x60, - 0xb1, 0x48, 0x07, 0x65, 0x4d, 0xc2, 0x79, 0xfd, 0x0e, 0x88, 0xcf, 0x90, 0x69, 0x98, 0x34, 0xef, - 0x76, 0x38, 0xf8, 0x6b, 0x98, 0xe2, 0xb6, 0x67, 0x1e, 0x76, 0x7b, 0x21, 0x8e, 0x30, 0xdd, 0xbb, - 0xb7, 0x90, 0xf0, 0xbf, 0x47, 0xb7, 0x5c, 0x95, 0x50, 0x61, 0x6f, 0x81, 0xbf, 0x78, 0x7c, 0xba, - 0x60, 0xdc, 0x20, 0xf6, 0xee, 0x2d, 0x2c, 0x0e, 0x89, 0xf0, 0xa5, 0x8c, 0x3b, 0x1f, 0xfe, 0x6f, - 0x85, 0xfb, 0x02, 0x3e, 0xb2, 0x5f, 0xa5, 0x0e, 0x3e, 0x88, 0xc9, 0x7e, 0xaa, 0x3c, 0x01, 0xbd, - 0x6e, 0x53, 0x9e, 0xd6, 0xdd, 0xa6, 0xf5, 0x67, 0x25, 0xb8, 0xce, 0x75, 0xa0, 0x6c, 0x3a, 0xbc, - 0xe8, 0xc9, 0x21, 0x26, 0x1f, 0x00, 0x4f, 0x0a, 0x2e, 0x14, 0x4d, 0x4b, 0xb4, 0xbc, 0x88, 0x13, - 0x27, 0x20, 0x55, 0x18, 0xd3, 0x9f, 0x94, 0x9c, 0x2e, 0x3c, 0x9c, 0x3d, 0x7a, 0xf4, 0xd8, 0x51, - 0xcf, 0x4c, 0x9e, 0xc0, 0xa5, 0x95, 0x6f, 0xd8, 0x84, 0x10, 0xbb, 0x93, 0x50, 0xd8, 0xe3, 0xa7, - 0xb0, 0xe7, 0x76, 0xc4, 0x8c, 0x31, 0x4f, 0xd3, 0x49, 0x30, 0x3b, 0x9a, 0xca, 0x0d, 0x4e, 0x69, - 0xcd, 0x23, 0xb6, 0x01, 0xb3, 0xfe, 0xb2, 0x04, 0xf3, 0xd9, 0xb5, 0x89, 0x85, 0x65, 0x0d, 0xce, - 0x2f, 0x39, 0x9e, 0xef, 0xb9, 0x0d, 0xa7, 0x55, 0x6b, 0x1c, 0xd2, 0x66, 0x47, 0x05, 0x39, 0x55, - 0xab, 0xcc, 0x01, 0xf5, 0x24, 0xb9, 0x44, 0xb1, 0xd3, 0x54, 0xec, 0x50, 0x86, 0xaf, 0x12, 0xf8, - 0xda, 0xdb, 0xa2, 0x81, 0xe2, 0xc7, 0x5b, 0x96, 0x53, 0x4a, 0x6e, 0x4b, 0x23, 0x7b, 0x73, 0xd7, - 0x73, 0x23, 0x45, 0xc4, 0xad, 0x2b, 0x59, 0x45, 0xd6, 0xbf, 0x2e, 0xc1, 0x45, 0xcc, 0x2c, 0x64, - 0xe4, 0x2a, 0x8c, 0x63, 0xfd, 0xca, 0x70, 0xb5, 0x25, 0xe3, 0x95, 0x85, 0x81, 0x6d, 0xc6, 0xad, - 0x25, 0xef, 0x40, 0x7f, 0x4d, 0x3a, 0x49, 0x4d, 0x24, 0xb2, 0x9c, 0xca, 0x8c, 0xf2, 0x7e, 0x10, - 0xd9, 0x88, 0xc5, 0xf6, 0x9c, 0x65, 0x1a, 0x36, 0xa8, 0x87, 0xe9, 0x68, 0xf9, 0x61, 0x5f, 0x83, - 0xc4, 0xa1, 0x8a, 0xfa, 0xf3, 0x42, 0x15, 0x0d, 0x98, 0xa1, 0x8a, 0xac, 0xa7, 0x3c, 0xaf, 0x50, - 0xb2, 0x43, 0x62, 0x90, 0x3e, 0x4d, 0x65, 0xaf, 0xe5, 0xfb, 0xc0, 0x85, 0xac, 0x9e, 0xed, 0xdd, - 0x4d, 0x25, 0xa6, 0xcd, 0x8f, 0xad, 0xbb, 0x0d, 0xaf, 0x1b, 0xb8, 0xd5, 0x56, 0xcb, 0x7f, 0x46, - 0x9b, 0xdb, 0x81, 0x7f, 0xe4, 0x47, 0x46, 0x56, 0x17, 0x91, 0xbe, 0x39, 0xbe, 0x46, 0x11, 0xb3, - 0x32, 0x01, 0xb6, 0xfe, 0x17, 0x78, 0xa3, 0x0b, 0x47, 0xd1, 0xa9, 0x1a, 0x9c, 0x77, 0x12, 0x65, - 0xd2, 0xdb, 0xe5, 0x8d, 0xac, 0x7e, 0x25, 0x19, 0x85, 0x76, 0x9a, 0xfe, 0xc6, 0x8e, 0x91, 0xf1, - 0x95, 0xcc, 0xc2, 0xd4, 0xb6, 0xbd, 0xb5, 0xbc, 0xbb, 0xb4, 0x53, 0xdf, 0xf9, 0x72, 0x7b, 0xa5, - 0xbe, 0xbb, 0xf9, 0x70, 0x73, 0xeb, 0xd1, 0x26, 0x0f, 0x4e, 0x6d, 0x94, 0xec, 0xac, 0x54, 0x37, - 0xca, 0x25, 0x32, 0x05, 0x65, 0x03, 0xbc, 0xb2, 0xbb, 0x58, 0xee, 0xbd, 0xf1, 0xb5, 0x91, 0xc9, - 0x94, 0xcc, 0xc3, 0x6c, 0x6d, 0x77, 0x7b, 0x7b, 0xcb, 0x56, 0x5c, 0xf5, 0xd0, 0xd8, 0xd3, 0x70, - 0xde, 0x28, 0xbd, 0x67, 0xaf, 0xac, 0x94, 0x4b, 0xac, 0x29, 0x06, 0x78, 0xdb, 0x5e, 0xd9, 0x58, - 0xdb, 0xdd, 0x28, 0xf7, 0xde, 0xa8, 0xeb, 0x4f, 0xbb, 0xc8, 0x25, 0x98, 0x59, 0x5e, 0xd9, 0x5b, - 0x5b, 0x5a, 0xc9, 0xe2, 0x3d, 0x05, 0x65, 0xbd, 0x70, 0x67, 0x6b, 0x67, 0x9b, 0xb3, 0xd6, 0xa1, - 0x8f, 0x56, 0x16, 0xab, 0xbb, 0x3b, 0xab, 0x9b, 0xe5, 0x3e, 0xab, 0x7f, 0xb8, 0xb7, 0xdc, 0x7b, - 0xe3, 0xc7, 0xc6, 0xbb, 0x2f, 0xd6, 0x7c, 0x81, 0xbe, 0x5b, 0xab, 0xde, 0xcf, 0xaf, 0x82, 0x97, - 0x6e, 0xdc, 0xab, 0x96, 0x4b, 0xe4, 0x32, 0x5c, 0x34, 0xa0, 0xdb, 0xd5, 0x5a, 0xed, 0xd1, 0x96, - 0xbd, 0xbc, 0xbe, 0x52, 0xab, 0x95, 0x7b, 0x6f, 0xec, 0x19, 0xe1, 0xd9, 0x58, 0x0d, 0x1b, 0xf7, - 0xaa, 0x75, 0x7b, 0xe5, 0xf3, 0xdd, 0x35, 0x7b, 0x65, 0x39, 0x5d, 0x83, 0x51, 0xfa, 0xe5, 0x4a, - 0xad, 0x5c, 0x22, 0x93, 0x70, 0xce, 0x80, 0x6e, 0x6e, 0x95, 0x7b, 0x6f, 0xbc, 0x29, 0x22, 0x78, - 0x91, 0x09, 0x80, 0xe5, 0x95, 0xda, 0xd2, 0xca, 0xe6, 0xf2, 0xda, 0xe6, 0xfd, 0x72, 0x0f, 0x19, - 0x87, 0x91, 0xaa, 0xfa, 0x59, 0xba, 0xf1, 0x11, 0x9c, 0x4b, 0x9c, 0xa8, 0x19, 0x86, 0x3a, 0x8c, - 0x96, 0x7b, 0x50, 0xfc, 0xf2, 0x27, 0x9a, 0x35, 0xf9, 0xe1, 0xb8, 0x5c, 0xba, 0xb1, 0x28, 0x93, - 0x8f, 0x6a, 0xdf, 0x39, 0x19, 0x85, 0xa1, 0xe5, 0x95, 0x7b, 0xd5, 0xdd, 0xf5, 0x9d, 0x72, 0x0f, - 0xfb, 0xb1, 0x64, 0xaf, 0x54, 0x77, 0x56, 0x96, 0xcb, 0x25, 0x32, 0x02, 0x03, 0xb5, 0x9d, 0xea, - 0xce, 0x4a, 0xb9, 0x97, 0x0c, 0x43, 0xff, 0x6e, 0x6d, 0xc5, 0x2e, 0xf7, 0x2d, 0xfc, 0xc9, 0x1f, - 0x95, 0xb8, 0x6d, 0x4f, 0xbe, 0x21, 0xfa, 0x5a, 0x3b, 0x4c, 0x8a, 0x25, 0x4f, 0x64, 0x5a, 0xcc, - 0x3d, 0x39, 0xa2, 0x16, 0x30, 0x57, 0x70, 0xd9, 0x81, 0x08, 0xd7, 0x4b, 0xb7, 0x4b, 0xc4, 0x46, - 0xe7, 0x90, 0xc4, 0xd9, 0x4a, 0x71, 0xce, 0x3e, 0xfe, 0xce, 0x5d, 0x2e, 0x3c, 0x92, 0x91, 0xdf, - 0x00, 0x4b, 0xe7, 0x99, 0x73, 0x02, 0xf9, 0xee, 0xe9, 0x4e, 0x1a, 0xb2, 0xce, 0x37, 0x4f, 0x87, - 0x4e, 0x1e, 0xc0, 0x38, 0xd3, 0xcd, 0x15, 0x1a, 0xb9, 0x94, 0x24, 0xd4, 0x8e, 0x03, 0x73, 0xf3, - 0xd9, 0x85, 0x2a, 0x15, 0xcb, 0x18, 0x76, 0x84, 0x1f, 0xac, 0x43, 0x22, 0xa3, 0x3c, 0x48, 0x08, - 0x5f, 0xf1, 0xe7, 0xce, 0x27, 0xc0, 0x7b, 0x77, 0x6e, 0x97, 0x48, 0x0d, 0x43, 0xac, 0x19, 0x4a, - 0x3e, 0x91, 0x8f, 0xda, 0xd2, 0xda, 0x3f, 0x6f, 0x4d, 0x45, 0xa5, 0x2e, 0xcc, 0x39, 0x1d, 0x6c, - 0x02, 0x49, 0xeb, 0xce, 0xe4, 0x6a, 0x3c, 0x0f, 0xb2, 0xd5, 0xea, 0xb9, 0x0b, 0x29, 0x9f, 0xbf, - 0x15, 0xa6, 0x3d, 0x91, 0x15, 0x98, 0x10, 0x4f, 0xb8, 0x85, 0x36, 0x4f, 0x8a, 0xce, 0x03, 0xb9, - 0x6c, 0xee, 0xa3, 0x9c, 0xd4, 0x89, 0x80, 0xcc, 0xc5, 0xfd, 0x48, 0x1e, 0x13, 0xe6, 0x2e, 0x65, - 0x96, 0x89, 0xfe, 0xdd, 0x83, 0x09, 0xf3, 0x70, 0x41, 0xe4, 0x00, 0x65, 0x9e, 0x39, 0x72, 0x1b, - 0x54, 0x87, 0x99, 0x0d, 0xc7, 0xc5, 0x2b, 0x0a, 0xe1, 0x59, 0x26, 0xfd, 0xc2, 0x48, 0xa5, 0xc0, - 0x51, 0xac, 0x46, 0xbd, 0xa6, 0x1a, 0x84, 0xbc, 0xb0, 0xea, 0xf8, 0xd9, 0xd4, 0xa4, 0x8e, 0x6c, - 0xfa, 0xd5, 0x11, 0xcb, 0x4c, 0x47, 0x9b, 0xe5, 0x2a, 0x39, 0x97, 0xe7, 0xdd, 0x4b, 0x36, 0x50, - 0x49, 0x4f, 0x70, 0xd4, 0xe6, 0xc4, 0x99, 0xd9, 0xcd, 0x62, 0x20, 0x01, 0x2d, 0x47, 0xb5, 0x28, - 0x0c, 0x49, 0x8e, 0xe0, 0x72, 0x99, 0xdd, 0x2e, 0x91, 0xaf, 0xf1, 0xab, 0xce, 0x64, 0xf7, 0xc8, - 0x8d, 0x0e, 0x85, 0xf6, 0x73, 0x29, 0x93, 0x81, 0xf8, 0x50, 0x0a, 0xb8, 0xdb, 0x30, 0x95, 0xe5, - 0x50, 0xac, 0x04, 0x5a, 0xe0, 0x6d, 0x9c, 0x3b, 0x0b, 0x6c, 0x76, 0xd4, 0x68, 0xe6, 0x0f, 0x52, - 0x81, 0x3f, 0x6b, 0x2e, 0xcf, 0x4f, 0x60, 0x82, 0xcd, 0x92, 0x87, 0x94, 0xb6, 0xab, 0x2d, 0xf7, - 0x29, 0x0d, 0x89, 0x8c, 0x8f, 0xab, 0x40, 0x79, 0xb4, 0xd7, 0x4b, 0xe4, 0x3b, 0x30, 0xfa, 0xc8, - 0x89, 0x1a, 0x87, 0x22, 0x4e, 0xa4, 0x0c, 0x23, 0x89, 0xb0, 0x39, 0xf9, 0x0b, 0x0b, 0x6f, 0x97, - 0xc8, 0xf7, 0x61, 0xe8, 0x3e, 0x8d, 0xf0, 0x51, 0xf1, 0x35, 0xe5, 0x5b, 0xc7, 0x6d, 0x93, 0x6b, - 0x9e, 0x7a, 0x39, 0x23, 0x1b, 0x9c, 0x34, 0xa0, 0x92, 0x5b, 0x00, 0x7c, 0x41, 0x40, 0x0e, 0xc9, - 0xe2, 0xb9, 0x54, 0xb3, 0xc9, 0x7d, 0xa6, 0x3c, 0xb4, 0x68, 0x44, 0x4f, 0x5b, 0x65, 0x9e, 0x8c, - 0xd6, 0x61, 0x42, 0x65, 0xaf, 0xd9, 0xc4, 0x70, 0x1e, 0x56, 0x82, 0x59, 0x78, 0x06, 0x6e, 0x1f, - 0xb1, 0xaf, 0x82, 0x27, 0x4f, 0xc5, 0xb8, 0x0f, 0xb8, 0x92, 0xce, 0xe8, 0xc1, 0x23, 0xf4, 0x25, - 0x54, 0x0a, 0x91, 0xa3, 0x69, 0xb4, 0xab, 0x7e, 0x18, 0x99, 0xb4, 0x0a, 0x92, 0x4d, 0xfb, 0xeb, - 0x30, 0xa7, 0xd7, 0x6b, 0x06, 0x2a, 0x8e, 0xd7, 0xdc, 0xbc, 0xf8, 0xc7, 0x73, 0xd7, 0x0a, 0x30, - 0xc4, 0xf9, 0xad, 0xef, 0x77, 0x7b, 0x4b, 0xb8, 0x9c, 0x2c, 0xc3, 0xa4, 0xac, 0x6b, 0xab, 0x4d, - 0xbd, 0x5a, 0x6d, 0x15, 0x33, 0x95, 0x48, 0x4f, 0x0e, 0x0d, 0x26, 0xb9, 0x93, 0x74, 0x11, 0xdb, - 0xfa, 0x8c, 0xf8, 0x0e, 0xa4, 0x28, 0xea, 0x43, 0xbc, 0xf5, 0x65, 0x46, 0xd0, 0x7d, 0xc8, 0x8d, - 0x4a, 0x86, 0xf2, 0xbf, 0xb7, 0x40, 0x0a, 0x0e, 0x40, 0x73, 0x39, 0x47, 0x88, 0xdb, 0x25, 0xf2, - 0x25, 0x90, 0xf4, 0x91, 0x44, 0x89, 0x30, 0xf7, 0xf8, 0xa5, 0x44, 0x58, 0x70, 0x9e, 0x59, 0x81, - 0x49, 0x15, 0xdd, 0x25, 0x2e, 0x27, 0x39, 0x6d, 0x29, 0xd8, 0xc1, 0xa6, 0x33, 0xd8, 0xec, 0x2d, - 0x14, 0x30, 0xca, 0x84, 0x93, 0xcf, 0x60, 0x52, 0xcc, 0x7d, 0xa3, 0x3d, 0x65, 0xb5, 0x8c, 0x89, - 0xc3, 0x4d, 0x6e, 0x4b, 0x1e, 0xc0, 0x74, 0x2d, 0x21, 0x78, 0xee, 0xc7, 0x7e, 0xd1, 0x64, 0x81, - 0xc0, 0x1a, 0x8d, 0xb8, 0xe4, 0xb3, 0x79, 0x3d, 0x04, 0xc2, 0x6d, 0x4b, 0x92, 0xdd, 0x53, 0x97, - 0x3e, 0x23, 0x97, 0x13, 0x4d, 0x67, 0x40, 0x44, 0xc3, 0x75, 0x30, 0xb7, 0x67, 0x3b, 0x3c, 0x83, - 0x30, 0x42, 0x8d, 0x1b, 0xf0, 0xab, 0x06, 0x81, 0x71, 0x89, 0x2e, 0xc6, 0xf1, 0x62, 0x2e, 0x06, - 0xf9, 0x2d, 0x8c, 0xce, 0x5a, 0x7c, 0x3a, 0x23, 0xdf, 0xc9, 0x3a, 0x44, 0xe7, 0x9c, 0x2f, 0xe7, - 0xde, 0x39, 0x1d, 0xb2, 0x3a, 0x0f, 0x8f, 0xdf, 0xa7, 0xd1, 0x76, 0xab, 0x73, 0xe0, 0x62, 0x66, - 0x4b, 0xa2, 0x6c, 0x4f, 0x0a, 0x24, 0xa6, 0xb7, 0x0c, 0x8a, 0x16, 0x17, 0xd4, 0xe8, 0x4f, 0xc8, - 0x1a, 0x94, 0xf9, 0x36, 0xa2, 0xb1, 0xb8, 0x9c, 0x62, 0x21, 0x50, 0x9c, 0xc0, 0x39, 0x0a, 0x73, - 0x47, 0xeb, 0x16, 0x77, 0x39, 0x22, 0xf2, 0xd3, 0xd6, 0xf5, 0xd4, 0x49, 0x03, 0xa6, 0x22, 0xd6, - 0xb3, 0x11, 0xb1, 0x69, 0x48, 0x23, 0x19, 0x06, 0x86, 0xe7, 0x35, 0x7d, 0x2d, 0xd6, 0x19, 0xd2, - 0xa5, 0xf1, 0x0a, 0x92, 0x08, 0x59, 0xb6, 0x77, 0x97, 0xa8, 0x5c, 0xaf, 0x19, 0x4c, 0xdf, 0x34, - 0x54, 0x9b, 0xb3, 0xf1, 0x7d, 0x17, 0xb7, 0x32, 0x0c, 0x7d, 0x33, 0x1d, 0xb7, 0x8d, 0xfd, 0x96, - 0x54, 0xe3, 0x1a, 0xd5, 0xde, 0x02, 0xae, 0x8c, 0x6c, 0xaf, 0x65, 0x9a, 0x70, 0x27, 0x08, 0xa8, - 0xc7, 0x89, 0xf3, 0xd4, 0x96, 0x2c, 0xea, 0x4f, 0x71, 0x05, 0xd3, 0xa8, 0xf9, 0x73, 0xbb, 0x6e, - 0x2c, 0x78, 0x1e, 0x9e, 0xdb, 0x25, 0xf2, 0x01, 0x0c, 0x8b, 0x36, 0x32, 0x22, 0xa3, 0xd1, 0x61, - 0x41, 0xab, 0x91, 0x12, 0xb8, 0x90, 0xb0, 0xcd, 0x26, 0x4e, 0xde, 0xe8, 0xf3, 0x36, 0x7f, 0xc0, - 0xf6, 0xec, 0xe6, 0x8b, 0x50, 0x2e, 0xc9, 0xcd, 0x1b, 0x29, 0x67, 0x55, 0x24, 0x16, 0x09, 0xea, - 0xb2, 0xcb, 0x72, 0x26, 0x4c, 0xfd, 0xc6, 0x98, 0x83, 0x2a, 0x74, 0x98, 0x52, 0xbf, 0x0d, 0x70, - 0xb7, 0x2d, 0x7b, 0x0d, 0xca, 0xd5, 0x06, 0x6e, 0x28, 0x35, 0x7a, 0xe4, 0xb4, 0x0f, 0xfd, 0x80, - 0xaa, 0xb3, 0x4f, 0xb2, 0x40, 0xf2, 0x9a, 0x56, 0x0a, 0x8a, 0x28, 0x58, 0xa7, 0x0e, 0x06, 0x66, - 0x9e, 0x51, 0x1a, 0x4a, 0xa2, 0x28, 0x9b, 0xa2, 0xe0, 0xac, 0x33, 0xb5, 0xc4, 0x4e, 0x67, 0xad, - 0x97, 0x63, 0xf3, 0x11, 0x2e, 0x18, 0x0a, 0x39, 0x54, 0x3b, 0x84, 0x02, 0xa9, 0x53, 0xa1, 0x7c, - 0x79, 0xa3, 0x50, 0xab, 0xf2, 0xea, 0x39, 0x16, 0x4b, 0x1e, 0x75, 0x5e, 0xf5, 0xdf, 0x83, 0x89, - 0x15, 0xb6, 0xa0, 0x77, 0x9a, 0x2e, 0x0f, 0x46, 0x4f, 0xcc, 0xe8, 0xe2, 0xb9, 0x84, 0xab, 0x32, - 0xf5, 0x15, 0x92, 0x0a, 0x0b, 0x82, 0xdc, 0x53, 0x34, 0x98, 0x1c, 0x8f, 0x29, 0xc9, 0x56, 0xe4, - 0x03, 0xc0, 0x13, 0xbe, 0x30, 0x19, 0xcc, 0x70, 0xc5, 0xb2, 0xda, 0x6e, 0xb7, 0xa4, 0x65, 0x9b, - 0xdf, 0xd4, 0xbf, 0x61, 0x9c, 0x44, 0x53, 0xe5, 0x92, 0x77, 0x5a, 0xf7, 0xfc, 0x42, 0x4b, 0x45, - 0x9b, 0xc3, 0x33, 0xa7, 0xbc, 0xdb, 0x5c, 0x54, 0xe1, 0xa3, 0xab, 0xad, 0x56, 0x8a, 0x38, 0x24, - 0x6f, 0x9b, 0xdc, 0xb3, 0x70, 0xba, 0xd5, 0x80, 0x27, 0x7d, 0x33, 0xbb, 0x3f, 0xb9, 0xa2, 0x16, - 0x8c, 0x64, 0xda, 0xff, 0xe4, 0x49, 0x3f, 0x59, 0x2e, 0xd6, 0xf6, 0x07, 0x38, 0xcd, 0xe2, 0x7c, - 0xb5, 0x44, 0x3f, 0x37, 0x27, 0xd3, 0xf5, 0x2a, 0x5d, 0x2e, 0x3b, 0xc5, 0xff, 0x36, 0x9c, 0x4b, - 0x24, 0xcf, 0x57, 0x06, 0x9e, 0xec, 0xf4, 0xfd, 0x73, 0x57, 0xf2, 0x8a, 0x95, 0xc1, 0xb5, 0x9c, - 0xcc, 0x09, 0xae, 0xba, 0x9c, 0x93, 0xed, 0x5d, 0x75, 0x39, 0x37, 0x99, 0xf8, 0x03, 0x28, 0x27, - 0xd3, 0x11, 0x2b, 0xa6, 0x39, 0x79, 0x8a, 0x73, 0xc7, 0xe4, 0x1e, 0x4c, 0xe9, 0x23, 0xaa, 0xfa, - 0x9d, 0xb7, 0xfa, 0xe7, 0xf1, 0xd9, 0x81, 0xe9, 0xcc, 0xec, 0xc1, 0x6a, 0x8b, 0x2d, 0xca, 0x2d, - 0x9c, 0xcb, 0x95, 0xc2, 0x85, 0xec, 0x04, 0xe2, 0xe4, 0x75, 0xd3, 0x7e, 0x90, 0x9d, 0x4e, 0x79, - 0xee, 0x8d, 0x2e, 0x58, 0x42, 0xa0, 0x5f, 0xe3, 0x0e, 0x98, 0xaa, 0xe3, 0x9a, 0x66, 0x51, 0xc8, - 0xa9, 0xc0, 0x2a, 0x42, 0x51, 0x73, 0x60, 0x2a, 0xa3, 0x38, 0x5f, 0xc4, 0xaf, 0xe5, 0xf3, 0x8c, - 0x27, 0xd6, 0x9e, 0x8c, 0x92, 0x9c, 0x2b, 0x99, 0xc2, 0x44, 0xd3, 0x05, 0x47, 0xd2, 0x39, 0x35, - 0x1f, 0x4e, 0xdf, 0xe4, 0x7c, 0xf3, 0xd2, 0x54, 0x56, 0x7a, 0xf3, 0xa4, 0xf5, 0x27, 0x2b, 0x7b, - 0xb5, 0x12, 0x43, 0x61, 0x7e, 0xf4, 0x3d, 0x6e, 0x09, 0x32, 0xb9, 0xeb, 0x96, 0xa0, 0x4c, 0xd6, - 0x57, 0xf3, 0x11, 0xe2, 0x19, 0x61, 0xc4, 0x5e, 0x17, 0xfd, 0xd7, 0xcf, 0x59, 0xd9, 0x89, 0xad, - 0xd5, 0x8c, 0xc8, 0x44, 0x11, 0xdc, 0x6d, 0xf9, 0xd1, 0xe5, 0x88, 0xa5, 0x20, 0xa9, 0x77, 0xc1, - 0x71, 0x68, 0x36, 0x1e, 0xb8, 0x44, 0xb3, 0xcf, 0x3a, 0x6c, 0x5f, 0xc3, 0xc5, 0xdc, 0x04, 0xde, - 0xe4, 0xad, 0xd4, 0x07, 0x9d, 0x23, 0x89, 0xfc, 0x96, 0x8e, 0x1b, 0xb9, 0xb7, 0x95, 0x29, 0x2c, - 0x91, 0xe6, 0x3b, 0xb5, 0x62, 0x67, 0xe4, 0x00, 0xbf, 0x8f, 0x9a, 0xaf, 0x96, 0xc7, 0x3b, 0xb7, - 0xaf, 0x97, 0xb3, 0xf8, 0x84, 0xe9, 0x35, 0x55, 0x6b, 0x97, 0xd4, 0xc4, 0x92, 0x05, 0x67, 0x59, - 0x53, 0x4f, 0xd3, 0xb4, 0x3c, 0x3e, 0xcb, 0x30, 0xaa, 0x25, 0x00, 0x27, 0x17, 0x0d, 0x31, 0x19, - 0xbb, 0xe4, 0x9c, 0xd1, 0x39, 0x73, 0x83, 0x5c, 0x42, 0x9b, 0xb3, 0x4a, 0x23, 0x9e, 0xdb, 0x8a, - 0x4b, 0x69, 0x1e, 0x86, 0xbd, 0x59, 0x49, 0x81, 0xb7, 0x66, 0x3e, 0x29, 0x1c, 0xa3, 0x41, 0xf9, - 0x5d, 0x22, 0xba, 0x68, 0xba, 0x34, 0x29, 0x5f, 0x43, 0x9d, 0x14, 0x59, 0x46, 0x31, 0x19, 0x8a, - 0x8c, 0xc9, 0x77, 0x41, 0x19, 0xcf, 0x34, 0x68, 0x81, 0x2d, 0x63, 0x1b, 0x9f, 0x76, 0x64, 0x64, - 0x44, 0x57, 0x6b, 0x68, 0x61, 0xc2, 0xf4, 0x0c, 0xed, 0x4c, 0xad, 0xca, 0xb9, 0x1c, 0x0b, 0x53, - 0xa4, 0xe7, 0xb6, 0xf4, 0x47, 0xda, 0xaa, 0x9c, 0xca, 0x7b, 0x4e, 0xae, 0x27, 0x55, 0xb3, 0xbc, - 0xd4, 0xe8, 0x05, 0xab, 0xfe, 0x54, 0x56, 0xca, 0x74, 0xcd, 0x00, 0x9c, 0x9b, 0x4f, 0x3d, 0x43, - 0x0a, 0x6a, 0x79, 0xcb, 0xe1, 0x56, 0x90, 0x40, 0x3d, 0xb7, 0x85, 0x5f, 0x69, 0xcb, 0x5b, 0x22, - 0xd1, 0xb9, 0x3a, 0x70, 0x77, 0xc9, 0x84, 0x9e, 0xcb, 0x7b, 0x13, 0x1f, 0x03, 0xa5, 0xb3, 0x94, - 0x2b, 0xdd, 0xa5, 0x28, 0x87, 0x79, 0xa6, 0x7d, 0x78, 0x3a, 0xdd, 0x45, 0xc6, 0xef, 0x42, 0xc2, - 0xba, 0xdb, 0xad, 0x61, 0x6a, 0x1d, 0xce, 0xc8, 0x6e, 0x9e, 0x58, 0x87, 0xf3, 0xf3, 0x9f, 0x17, - 0x1c, 0x74, 0xce, 0xd5, 0xdc, 0x03, 0x4f, 0x4b, 0x4e, 0xae, 0x8e, 0x39, 0xe9, 0x7c, 0xe9, 0x6a, - 0x89, 0xc9, 0xca, 0x65, 0xbe, 0xc5, 0x34, 0x1c, 0xae, 0x9f, 0xeb, 0x69, 0xa6, 0xc9, 0x5c, 0x7e, - 0x76, 0x6d, 0xb5, 0xdc, 0x64, 0xe6, 0xa5, 0xd6, 0x18, 0xea, 0x39, 0x9e, 0x15, 0xc3, 0x8c, 0x74, - 0xd3, 0x8a, 0x61, 0x66, 0x52, 0xe8, 0x5b, 0x68, 0x57, 0xb1, 0xfd, 0x16, 0xd5, 0xed, 0x2a, 0x5a, - 0xd2, 0xe0, 0x84, 0x59, 0x83, 0x7c, 0x8c, 0x46, 0x8d, 0x62, 0x4b, 0xc8, 0x8c, 0xc9, 0x49, 0xf7, - 0x1d, 0x19, 0x51, 0x19, 0x99, 0x95, 0x15, 0x3d, 0x99, 0x14, 0x7a, 0x6e, 0x36, 0x5d, 0x20, 0xe8, - 0xdf, 0x93, 0x76, 0x11, 0x6c, 0xf0, 0xac, 0x69, 0x4f, 0xca, 0x6f, 0xf3, 0x7b, 0xd2, 0x28, 0x62, - 0x90, 0xa5, 0xf2, 0x31, 0x27, 0xc9, 0xbe, 0x07, 0x63, 0x71, 0xee, 0xe5, 0xbd, 0x05, 0x8d, 0x30, - 0x91, 0x90, 0x39, 0x49, 0xf8, 0x81, 0xbc, 0x38, 0xc1, 0xfa, 0xcc, 0xc2, 0x62, 0xfb, 0xc9, 0xa7, - 0xd2, 0x08, 0x63, 0xb4, 0x34, 0x95, 0xc9, 0xb9, 0x60, 0xe5, 0x1e, 0xd3, 0x13, 0x46, 0xaa, 0x79, - 0x91, 0x91, 0xf2, 0x55, 0xcd, 0x8b, 0xac, 0x94, 0xad, 0xf1, 0xc5, 0xc2, 0x97, 0xd2, 0xe2, 0x10, - 0x33, 0xbd, 0x6c, 0x34, 0x2b, 0xc5, 0xf7, 0x4a, 0x5e, 0x71, 0x92, 0x75, 0x0d, 0xca, 0xc9, 0xec, - 0x96, 0xea, 0xb8, 0x96, 0x93, 0x86, 0x54, 0x9d, 0x01, 0x73, 0xd3, 0x62, 0x6e, 0x4b, 0xf3, 0xb9, - 0xc9, 0xf7, 0x5a, 0x76, 0xa3, 0x74, 0xd6, 0xc5, 0x6a, 0x59, 0x9c, 0xe8, 0x52, 0x3f, 0x48, 0xa7, - 0x12, 0x69, 0xea, 0x6a, 0x59, 0x46, 0x6e, 0x4c, 0x57, 0x86, 0x73, 0xca, 0xce, 0xb7, 0xfd, 0xb6, - 0x79, 0xc2, 0x2d, 0x88, 0x8a, 0xde, 0xf5, 0x92, 0x99, 0xfc, 0x1a, 0xcc, 0xe4, 0x04, 0x90, 0x26, - 0x6f, 0x24, 0x0c, 0xb1, 0xd9, 0x01, 0xa6, 0xd5, 0x04, 0xc9, 0xcc, 0x40, 0xbd, 0x81, 0xde, 0x09, - 0x46, 0xe0, 0x86, 0xd4, 0x8d, 0xdf, 0x23, 0x37, 0x3a, 0xe4, 0x89, 0x96, 0xb5, 0x35, 0x37, 0x33, - 0xe2, 0x03, 0xa9, 0xe1, 0x79, 0xc5, 0x80, 0x66, 0x5c, 0xfa, 0x65, 0x30, 0x9c, 0xcb, 0x66, 0xc8, - 0xd6, 0x0e, 0x36, 0x17, 0x32, 0xa2, 0x6a, 0xa8, 0xb9, 0x90, 0x1f, 0x71, 0x23, 0xb7, 0x99, 0xdb, - 0x52, 0xc1, 0xca, 0xe6, 0x98, 0x1f, 0x60, 0x23, 0x97, 0xe3, 0x03, 0xc6, 0x31, 0x15, 0x33, 0x83, - 0xe4, 0xa0, 0x17, 0xaf, 0x1e, 0xb6, 0xdc, 0xaf, 0x4d, 0xaa, 0x05, 0xad, 0x7d, 0x79, 0xd1, 0x39, - 0x72, 0xdb, 0xb7, 0x22, 0xbf, 0xa7, 0xec, 0xf6, 0x9d, 0x76, 0xc7, 0x56, 0xd7, 0x63, 0x89, 0xb0, - 0x2d, 0x46, 0x47, 0x35, 0xf8, 0x5c, 0x0e, 0x9c, 0x6c, 0xa2, 0xbb, 0x51, 0x12, 0xaa, 0x1d, 0x5c, - 0xb3, 0xe3, 0xc2, 0xe4, 0xf2, 0xe3, 0xf3, 0xd8, 0x88, 0xab, 0x71, 0x96, 0x79, 0x9c, 0x08, 0xc8, - 0x21, 0xe6, 0xb1, 0x01, 0x3d, 0xdb, 0x3c, 0x4e, 0x30, 0x34, 0xe7, 0x71, 0xb2, 0x99, 0x49, 0x43, - 0x40, 0xee, 0xa8, 0x26, 0x9b, 0xa9, 0xe6, 0x71, 0x36, 0xc7, 0xfc, 0xf8, 0x27, 0xb9, 0x1c, 0xd5, - 0x3c, 0x36, 0x39, 0xe6, 0xa0, 0x9f, 0x72, 0x1e, 0x27, 0x2b, 0x31, 0xe7, 0xf1, 0x99, 0xda, 0xa7, - 0xe6, 0x71, 0x76, 0xfb, 0xce, 0x3c, 0x8f, 0x13, 0x01, 0x83, 0x8c, 0x8e, 0x66, 0xcd, 0xe3, 0x24, - 0x3e, 0x9f, 0xc7, 0x49, 0x68, 0xc2, 0x00, 0x53, 0x30, 0x8f, 0x93, 0x94, 0x9f, 0x23, 0xbf, 0x44, - 0xb0, 0x93, 0xd3, 0xcc, 0xe4, 0xdc, 0x38, 0x29, 0xe4, 0x11, 0x5a, 0xff, 0x12, 0xf0, 0xd3, 0xcd, - 0xe6, 0xf9, 0x3c, 0xa6, 0x38, 0x9f, 0xf7, 0xa4, 0x10, 0x93, 0xcd, 0x35, 0x4d, 0x5b, 0xd9, 0xb1, - 0x5e, 0x0a, 0x1a, 0xbc, 0xc7, 0xe6, 0x4d, 0xb3, 0x80, 0x6f, 0x51, 0xa8, 0x9a, 0x02, 0xbe, 0xea, - 0x1c, 0x94, 0xe4, 0x9b, 0x4b, 0x52, 0x3c, 0xbf, 0xbf, 0x90, 0xf7, 0x1f, 0x49, 0xba, 0x85, 0xc4, - 0xc9, 0xea, 0xcc, 0x2d, 0x55, 0x27, 0xac, 0x64, 0x4b, 0xcf, 0x3a, 0xcf, 0x37, 0xa4, 0xf6, 0x90, - 0x8a, 0x71, 0x95, 0xe8, 0xb4, 0x3e, 0xd7, 0x73, 0x4b, 0xc8, 0x0e, 0x9a, 0x7a, 0xd3, 0x70, 0xcd, - 0x4c, 0x9c, 0x17, 0x4c, 0xab, 0x2b, 0xd7, 0x54, 0xb4, 0x1e, 0x9d, 0x6b, 0x5e, 0x28, 0x1f, 0xc5, - 0x35, 0x4d, 0xfd, 0x19, 0x9a, 0xce, 0xc4, 0x9b, 0x2e, 0xef, 0xb1, 0x9f, 0x7f, 0xce, 0x99, 0x34, - 0x5c, 0xa2, 0x18, 0x2e, 0x7a, 0xa2, 0x7d, 0x22, 0x2e, 0xf8, 0x24, 0x30, 0x57, 0xf8, 0x59, 0xf4, - 0xe4, 0x33, 0x28, 0x8b, 0xe5, 0x2d, 0x66, 0x90, 0x85, 0x98, 0x3b, 0x74, 0x8b, 0xd2, 0x62, 0x77, - 0x8a, 0x16, 0x9c, 0xc6, 0x52, 0x77, 0x1a, 0x49, 0xe4, 0x9b, 0xb5, 0xd8, 0x76, 0xb8, 0x13, 0x74, - 0xc2, 0x88, 0x36, 0xd3, 0xe6, 0x28, 0xb3, 0x31, 0xd2, 0x71, 0xc2, 0x44, 0xdf, 0x5b, 0x20, 0x6b, - 0xb8, 0xb6, 0x99, 0xe0, 0x22, 0x7b, 0x5d, 0x36, 0x1b, 0x5c, 0x7a, 0x56, 0xd5, 0xe3, 0x21, 0xb3, - 0x4d, 0x79, 0x75, 0xe7, 0x37, 0x4a, 0x89, 0xe8, 0x94, 0xbd, 0xcb, 0x13, 0x11, 0x3f, 0x50, 0x73, - 0xdb, 0x61, 0x37, 0xc9, 0x24, 0x9f, 0x33, 0x91, 0x1f, 0xc0, 0x88, 0x24, 0xee, 0x2e, 0x90, 0x24, - 0x35, 0x0a, 0x64, 0x19, 0xc6, 0x8d, 0xb7, 0x5a, 0xea, 0x74, 0x93, 0xf5, 0x82, 0xab, 0x60, 0x9c, - 0xc7, 0x8d, 0x37, 0x59, 0x8a, 0x4b, 0xd6, 0x4b, 0xad, 0x5c, 0x2e, 0xdf, 0x87, 0x51, 0x21, 0xd2, - 0x42, 0x69, 0xe4, 0x1b, 0xeb, 0xa6, 0x35, 0xbf, 0xe7, 0x4e, 0xd3, 0x8d, 0x96, 0x7c, 0xef, 0xb1, - 0x7b, 0xd0, 0x55, 0x30, 0x69, 0x92, 0xbd, 0x05, 0xf2, 0x43, 0x4c, 0x4b, 0x2c, 0x93, 0x45, 0xd3, - 0xe8, 0x99, 0x1f, 0x3c, 0x71, 0xbd, 0x83, 0x2e, 0x2c, 0xaf, 0x9a, 0x2c, 0x93, 0x74, 0xd2, 0xb5, - 0xe4, 0x87, 0x30, 0x57, 0xcb, 0x67, 0xde, 0x95, 0x49, 0xf1, 0xf6, 0x52, 0x83, 0x79, 0x74, 0xae, - 0x39, 0x6b, 0xdb, 0x0b, 0x99, 0x7e, 0xc9, 0xc3, 0x24, 0x4a, 0x43, 0x7f, 0xc3, 0x0f, 0x9a, 0xdd, - 0x39, 0x56, 0x4c, 0x77, 0xdd, 0x04, 0x99, 0x14, 0xc6, 0x97, 0x70, 0xb1, 0x96, 0xcb, 0xba, 0x1b, - 0x8b, 0x6e, 0x9a, 0xe4, 0x25, 0x14, 0xc5, 0x19, 0xdb, 0x5d, 0xc8, 0x73, 0x0d, 0xd7, 0x34, 0xb6, - 0x0f, 0x6d, 0x07, 0xf4, 0x31, 0x0d, 0xd0, 0x29, 0xbc, 0x9b, 0x3b, 0xb4, 0x89, 0x2e, 0x7b, 0xbe, - 0x06, 0xe7, 0x6b, 0x29, 0x56, 0x79, 0x24, 0xc5, 0xad, 0x7a, 0x00, 0x93, 0xd8, 0xd3, 0x53, 0xb6, - 0xab, 0x8b, 0x13, 0xd1, 0xe8, 0x7d, 0x1a, 0xed, 0xae, 0x75, 0x91, 0x92, 0x7c, 0xb5, 0x20, 0x11, - 0xf7, 0xee, 0x30, 0xca, 0x9a, 0x46, 0x99, 0xc6, 0xc8, 0xfd, 0x78, 0x7f, 0x20, 0x2f, 0x52, 0xba, - 0x56, 0x9b, 0xc7, 0xe1, 0x2e, 0xae, 0x85, 0xc2, 0x31, 0x5a, 0x33, 0x41, 0x72, 0x48, 0x6c, 0xaa, - 0xd3, 0x7c, 0xa4, 0x43, 0x52, 0xe5, 0xc7, 0x3f, 0x3e, 0x3d, 0x04, 0xec, 0x4a, 0xca, 0x61, 0xbe, - 0x90, 0x05, 0x37, 0xa1, 0xae, 0xfb, 0x8d, 0x27, 0xba, 0x09, 0x55, 0x4b, 0x5c, 0x3f, 0x67, 0xa6, - 0x95, 0x17, 0x2b, 0x3e, 0xe6, 0x96, 0xd7, 0xfd, 0xc2, 0xf4, 0xd4, 0xf5, 0xba, 0x09, 0xd5, 0x4c, - 0xb2, 0x7f, 0x57, 0xda, 0x16, 0xb1, 0x42, 0x93, 0x73, 0xae, 0x68, 0x94, 0x59, 0x11, 0x89, 0x4c, - 0xb3, 0xa2, 0xde, 0xd0, 0xfc, 0x8b, 0x00, 0x92, 0xce, 0xb2, 0xaf, 0x0e, 0x2b, 0xb9, 0x09, 0xf8, - 0x0b, 0xdc, 0xbb, 0x26, 0x85, 0x53, 0x90, 0x21, 0x78, 0x15, 0x6a, 0x38, 0x5d, 0x16, 0x8b, 0x52, - 0xf7, 0x55, 0xba, 0x5d, 0x22, 0x9b, 0x70, 0xe1, 0x3e, 0x8d, 0xc4, 0x1a, 0x67, 0xd3, 0x30, 0x0a, - 0xdc, 0x46, 0x54, 0x78, 0xab, 0x28, 0xcf, 0x26, 0x19, 0x34, 0x7b, 0xef, 0x32, 0x7e, 0xb5, 0x6c, - 0x7e, 0x85, 0x74, 0x05, 0x1e, 0xb4, 0xe2, 0xaa, 0xe2, 0x2c, 0x4d, 0xcc, 0x9f, 0xe2, 0x43, 0xdc, - 0x41, 0x27, 0x9f, 0xb4, 0x1c, 0xc7, 0x35, 0x11, 0xa7, 0xad, 0x9b, 0x30, 0xc8, 0x89, 0x72, 0x37, - 0xd4, 0x31, 0x9d, 0x86, 0xdc, 0x81, 0x11, 0xe5, 0x61, 0x43, 0x8c, 0xa2, 0xdc, 0x76, 0xdd, 0x81, - 0x11, 0x7e, 0xb4, 0x3a, 0x3d, 0xc9, 0xc7, 0x30, 0xa2, 0x5c, 0x72, 0xce, 0xbc, 0xd3, 0x7f, 0x06, - 0xe3, 0xba, 0x73, 0xce, 0xd9, 0x05, 0xf9, 0x7d, 0xbc, 0xfb, 0x95, 0x57, 0x2c, 0xf9, 0xf4, 0xd3, - 0x89, 0x5c, 0x5e, 0x42, 0xa4, 0x7c, 0x81, 0x94, 0xc0, 0xdc, 0xe6, 0x9f, 0x4f, 0x51, 0x93, 0x8f, - 0xe5, 0x7b, 0x29, 0x45, 0x9c, 0x46, 0x2a, 0x90, 0xd9, 0x04, 0x17, 0xf3, 0x8b, 0x10, 0xab, 0x05, - 0xb6, 0x6b, 0xb3, 0x4f, 0x73, 0x47, 0xdd, 0x5d, 0x74, 0x79, 0x5c, 0xb6, 0x50, 0x4b, 0x4b, 0x65, - 0x99, 0xcb, 0x67, 0x74, 0x25, 0x3f, 0x31, 0x1d, 0x0e, 0xc6, 0x03, 0x3c, 0x05, 0xa6, 0x4a, 0x73, - 0xbb, 0x57, 0x90, 0xe8, 0x2e, 0x3e, 0xf6, 0xa6, 0xd9, 0x15, 0x90, 0x15, 0x9d, 0xa2, 0xc5, 0x2b, - 0xd0, 0x57, 0xc2, 0x6e, 0x4d, 0xfa, 0x38, 0x9e, 0xbe, 0xb3, 0xf9, 0x2d, 0xbb, 0x94, 0x71, 0x2b, - 0xde, 0x75, 0x2c, 0xf2, 0xd8, 0xfd, 0x1a, 0x6a, 0x87, 0x99, 0xe1, 0xbe, 0xf2, 0x99, 0x5d, 0xd7, - 0x1c, 0x2b, 0x32, 0x29, 0xd5, 0xa6, 0xf7, 0x04, 0x1f, 0xa2, 0x65, 0xe7, 0xe1, 0x7b, 0xb3, 0x0b, - 0x17, 0x29, 0x89, 0xb7, 0xba, 0xe2, 0xa9, 0x3b, 0xd6, 0x4b, 0x7c, 0x87, 0xcd, 0xae, 0xaf, 0x4b, - 0x5e, 0xc1, 0x8c, 0x6b, 0x6f, 0xe5, 0x40, 0x9a, 0xcd, 0xd0, 0x74, 0x20, 0x2d, 0xec, 0x43, 0x9e, - 0xf8, 0x3f, 0x87, 0x4a, 0xec, 0x3d, 0x72, 0xb6, 0x41, 0xc8, 0xf7, 0x5b, 0x24, 0x29, 0x49, 0x85, - 0xa4, 0x28, 0xd1, 0xce, 0xdc, 0xb5, 0x3c, 0x09, 0x87, 0x9a, 0x5b, 0x92, 0xf0, 0x7b, 0x4b, 0x64, - 0xa4, 0xcc, 0xcb, 0x6d, 0x59, 0x60, 0x87, 0x15, 0x2f, 0xf3, 0x5e, 0x09, 0xa3, 0xf4, 0x68, 0x9f, - 0x9d, 0x91, 0x72, 0xee, 0x48, 0x30, 0xb2, 0x0a, 0x86, 0xf7, 0x2c, 0xbe, 0x6b, 0xc9, 0xa1, 0x38, - 0xeb, 0x80, 0x3a, 0xf1, 0x6b, 0xb4, 0x44, 0x74, 0x40, 0xfd, 0x05, 0x70, 0xba, 0x28, 0xf9, 0x94, - 0x2a, 0x0b, 0x43, 0x79, 0x54, 0xcd, 0xca, 0x2a, 0x18, 0x9c, 0x1d, 0x45, 0xfc, 0xc0, 0x8d, 0x9e, - 0x2f, 0xd9, 0xeb, 0xb1, 0x59, 0x41, 0x2f, 0x90, 0xbc, 0x41, 0x16, 0xda, 0xeb, 0xe4, 0x2b, 0x5c, - 0x4a, 0x04, 0xfb, 0x45, 0xdf, 0x8f, 0xc2, 0x28, 0x70, 0xda, 0xb5, 0x46, 0xe0, 0xb6, 0xa3, 0xdc, - 0x4e, 0xc7, 0x2e, 0xde, 0x59, 0x64, 0x9a, 0xc7, 0xa9, 0x88, 0x1e, 0x9f, 0x15, 0x5f, 0x47, 0xbd, - 0xba, 0xc9, 0x2a, 0x2c, 0x38, 0xb9, 0xd4, 0x64, 0xbc, 0xf8, 0x57, 0xc9, 0xb4, 0x0e, 0x33, 0x39, - 0x51, 0x89, 0xd4, 0xed, 0x6d, 0x71, 0xd4, 0xa2, 0xb9, 0xe2, 0x8a, 0xc9, 0x0f, 0x61, 0x3a, 0x33, - 0x6c, 0x91, 0xb2, 0x40, 0x17, 0x05, 0x35, 0xea, 0xc6, 0xfc, 0x09, 0xcc, 0xf2, 0xf7, 0x1e, 0xe8, - 0xd6, 0x6c, 0x44, 0xb0, 0x89, 0x5f, 0x01, 0xe5, 0x20, 0x24, 0xd7, 0xeb, 0x7c, 0x3c, 0xf5, 0xa4, - 0x7d, 0x0a, 0x43, 0x97, 0x24, 0x12, 0x9e, 0xab, 0x0f, 0x2f, 0xab, 0xb0, 0xe8, 0xa9, 0xd1, 0x36, - 0x4c, 0xef, 0xd1, 0xc0, 0x7d, 0xfc, 0x3c, 0xc9, 0x50, 0x4a, 0x26, 0xb3, 0xb4, 0x88, 0xe3, 0x17, - 0x30, 0xb3, 0xe4, 0x1f, 0xb5, 0xc5, 0xa3, 0x3e, 0x83, 0xa7, 0xba, 0x8a, 0xcf, 0x2e, 0xef, 0xee, - 0x08, 0x35, 0x97, 0x9f, 0x9a, 0x5e, 0xf9, 0xbf, 0x75, 0xcd, 0x5e, 0xaf, 0x9e, 0xa6, 0x99, 0xf4, - 0x3b, 0x38, 0x09, 0xb3, 0x72, 0xd5, 0xeb, 0x93, 0xb0, 0x20, 0x97, 0x7d, 0xce, 0x13, 0xb1, 0x99, - 0x9c, 0xf4, 0xf4, 0x05, 0x5c, 0x4f, 0xd1, 0xda, 0x4d, 0xb9, 0xb7, 0x98, 0x89, 0xbc, 0x13, 0x3e, - 0xd5, 0x99, 0x59, 0xbe, 0x33, 0xdb, 0xa9, 0xc5, 0x6e, 0x68, 0xb5, 0x0a, 0x54, 0x2c, 0xa2, 0x07, - 0x6f, 0x60, 0x98, 0x68, 0xc4, 0x1f, 0xd7, 0x69, 0x8b, 0x56, 0xeb, 0x14, 0x31, 0x2a, 0xb5, 0x1f, - 0xc1, 0x58, 0x4d, 0xaf, 0x3c, 0xa3, 0x92, 0xdc, 0x49, 0xa1, 0x1e, 0x09, 0x75, 0x6f, 0x7b, 0x81, - 0x23, 0xa9, 0xda, 0x78, 0x4e, 0xd5, 0x8b, 0x5c, 0xd7, 0x19, 0x23, 0x2b, 0x9b, 0xda, 0x05, 0xb2, - 0x92, 0x26, 0x2a, 0xd7, 0x99, 0xec, 0x44, 0x6e, 0x75, 0x9e, 0x47, 0x26, 0x99, 0x13, 0x93, 0x58, - 0xdd, 0x93, 0xcf, 0x2a, 0x97, 0xf9, 0xc2, 0xa4, 0x9a, 0xdc, 0xcf, 0x27, 0xce, 0x43, 0xa7, 0xfb, - 0xf9, 0xa4, 0xb2, 0xdb, 0xe9, 0x7e, 0x3e, 0x19, 0xa9, 0xeb, 0x56, 0x90, 0x57, 0x9c, 0x80, 0xa7, - 0xc0, 0x18, 0xa1, 0xd8, 0x64, 0xe4, 0xf9, 0x79, 0xa8, 0x87, 0x00, 0xe1, 0x69, 0x7b, 0x0a, 0x6c, - 0xad, 0xc9, 0xd0, 0x1f, 0x89, 0x3c, 0x3f, 0xf7, 0xa0, 0xcc, 0x33, 0x18, 0xc4, 0x51, 0x13, 0x63, - 0xbf, 0xc1, 0x74, 0x62, 0x85, 0x82, 0x41, 0x2d, 0x27, 0xe3, 0xcd, 0x29, 0x93, 0x59, 0x4e, 0x20, - 0xba, 0x82, 0xa9, 0x0a, 0x71, 0x54, 0x39, 0x65, 0x98, 0x4a, 0x05, 0x9a, 0x9b, 0xbb, 0x98, 0x51, - 0xa2, 0x54, 0xca, 0x31, 0x3d, 0x06, 0x9d, 0xea, 0x52, 0x46, 0x60, 0xba, 0xb9, 0x4b, 0x99, 0x65, - 0x82, 0x51, 0xc4, 0xf3, 0x2f, 0x67, 0x67, 0x8d, 0x8e, 0xdf, 0x79, 0x15, 0xe0, 0xc8, 0x6a, 0x6e, - 0x9c, 0x06, 0x55, 0xd4, 0x4a, 0x55, 0xfa, 0xa1, 0x8c, 0x54, 0xd5, 0x6f, 0x65, 0xbc, 0xc7, 0x30, - 0x30, 0x62, 0x6f, 0xb0, 0xe2, 0xbc, 0xd9, 0xe4, 0x91, 0x4c, 0x07, 0x93, 0x53, 0x53, 0x37, 0x06, - 0xb9, 0x23, 0xf8, 0x48, 0x26, 0x80, 0x79, 0xd5, 0x8c, 0xf7, 0x61, 0x3e, 0xf1, 0xdc, 0xc3, 0x64, - 0x7c, 0x23, 0xfb, 0x4d, 0x48, 0xa6, 0x78, 0xf2, 0x75, 0xf6, 0xab, 0xe9, 0xb7, 0x21, 0x89, 0x71, - 0x3f, 0xeb, 0x9a, 0xb7, 0x01, 0x13, 0xb8, 0xcc, 0xc8, 0xa4, 0xeb, 0x71, 0x04, 0x1a, 0x13, 0x9c, - 0x0c, 0x85, 0x94, 0x2c, 0x55, 0x2e, 0xb3, 0x63, 0xe2, 0xcd, 0x30, 0x4f, 0xe1, 0x3e, 0x67, 0x3e, - 0x24, 0x46, 0x60, 0xd6, 0x2e, 0x26, 0x32, 0xc3, 0x93, 0xef, 0xc3, 0xb9, 0xf8, 0x29, 0x31, 0x67, - 0x91, 0x81, 0x56, 0x60, 0x28, 0x3b, 0x17, 0xbf, 0x27, 0x3e, 0x3b, 0xf9, 0xaa, 0xdc, 0x8a, 0x62, - 0xf2, 0xcb, 0xa9, 0x67, 0x32, 0x46, 0x1f, 0x4e, 0xb3, 0x23, 0x69, 0xb2, 0x3d, 0xeb, 0xe8, 0x34, - 0xf0, 0x73, 0xcb, 0x0e, 0xae, 0xa8, 0x7f, 0x6e, 0x85, 0x01, 0x20, 0x95, 0xfa, 0x9b, 0xc3, 0x67, - 0x03, 0x5e, 0xc3, 0x80, 0x2c, 0xdb, 0x3c, 0x04, 0x5f, 0x36, 0x56, 0x7e, 0xdb, 0x93, 0x61, 0x5c, - 0x5a, 0x70, 0xad, 0x6b, 0x74, 0x49, 0x72, 0xcb, 0x70, 0x71, 0xe9, 0x1e, 0x87, 0xb2, 0xe8, 0x69, - 0x5a, 0x56, 0x90, 0x46, 0xb5, 0xcf, 0x16, 0xc4, 0x8b, 0x54, 0xfb, 0x6c, 0x61, 0x94, 0xc7, 0x2f, - 0x30, 0xc7, 0x92, 0xd8, 0xa3, 0x30, 0xc8, 0x12, 0xf5, 0x78, 0xd8, 0xe9, 0xc2, 0x6b, 0x9f, 0x6b, - 0xe6, 0xa5, 0x68, 0x8a, 0x10, 0xcf, 0x34, 0x57, 0xc4, 0x49, 0x2c, 0x8f, 0x79, 0x77, 0x26, 0x05, - 0xae, 0xd5, 0x57, 0xf8, 0x04, 0x3c, 0x73, 0xcb, 0x73, 0xe0, 0x8b, 0xcb, 0x3f, 0xff, 0x0f, 0x57, - 0x4a, 0x3f, 0xff, 0xc5, 0x95, 0xd2, 0xbf, 0xf9, 0xc5, 0x95, 0xd2, 0xbf, 0xff, 0xc5, 0x95, 0xd2, - 0x57, 0x0b, 0xa7, 0x0b, 0x7e, 0xdc, 0x68, 0xb9, 0xd4, 0x8b, 0x6e, 0x71, 0x76, 0x83, 0xf8, 0xdf, - 0xdd, 0xff, 0x11, 0x00, 0x00, 0xff, 0xff, 0x4e, 0x26, 0x7b, 0x15, 0xd6, 0xe4, 0x00, 0x00, + 0x76, 0x20, 0xc8, 0xe4, 0x9b, 0x87, 0xaf, 0x54, 0x90, 0x14, 0x29, 0xea, 0x91, 0xd2, 0xad, 0x97, + 0x4a, 0x5d, 0xad, 0x07, 0x55, 0x55, 0x5d, 0xaf, 0xae, 0xea, 0xe4, 0x43, 0x22, 0x25, 0xbe, 0xea, + 0x26, 0x49, 0x55, 0x55, 0x97, 0x3b, 0xfb, 0x32, 0x33, 0x44, 0x5e, 0x2b, 0x79, 0x6f, 0xf6, 0xbd, + 0x37, 0xa5, 0x52, 0x7b, 0xed, 0x85, 0xdb, 0xbb, 0x58, 0xff, 0xec, 0xae, 0x0d, 0xac, 0x17, 0x5e, + 0xf8, 0xc3, 0x58, 0x60, 0x0d, 0x2c, 0xe6, 0xcb, 0x3f, 0x1e, 0xff, 0xcc, 0x7c, 0xcc, 0xd7, 0xf4, + 0x18, 0xf0, 0x3c, 0x60, 0xfb, 0x67, 0x3e, 0xe8, 0x99, 0x06, 0xe6, 0x87, 0x98, 0xf9, 0x30, 0x06, + 0x33, 0xc0, 0x34, 0x60, 0x60, 0x10, 0x27, 0x1e, 0x37, 0xe2, 0xbe, 0x92, 0x94, 0x54, 0xed, 0xf9, + 0x91, 0x98, 0x27, 0xce, 0x39, 0x11, 0x71, 0x22, 0x6e, 0xc4, 0x89, 0x13, 0x27, 0xce, 0x81, 0x9b, + 0x11, 0x6d, 0xd1, 0xb6, 0x1f, 0x44, 0xb7, 0x5a, 0xf4, 0xc0, 0x69, 0x3c, 0xbf, 0xd5, 0x68, 0xb9, + 0xd4, 0x8b, 0x6e, 0xb5, 0x03, 0x3f, 0xf2, 0x6f, 0x39, 0x9d, 0xe8, 0x30, 0xa4, 0xc1, 0x53, 0xb7, + 0x41, 0x6f, 0x22, 0x84, 0x0c, 0xe0, 0x7f, 0xf3, 0xd3, 0x07, 0xfe, 0x81, 0xcf, 0x71, 0xd8, 0x5f, + 0xbc, 0x70, 0xfe, 0xe2, 0x81, 0xef, 0x1f, 0xb4, 0x28, 0x27, 0xde, 0xef, 0x3c, 0xbe, 0x45, 0x8f, + 0xda, 0xd1, 0x73, 0x51, 0x58, 0x49, 0x16, 0x46, 0xee, 0x11, 0x0d, 0x23, 0xe7, 0xa8, 0x2d, 0x10, + 0xde, 0x56, 0x4d, 0x71, 0xa2, 0x88, 0x95, 0x44, 0xae, 0xef, 0xdd, 0x7a, 0x7a, 0x47, 0xff, 0x29, + 0x50, 0xaf, 0x17, 0xb6, 0xba, 0x41, 0x83, 0x28, 0x3c, 0x15, 0x26, 0x7d, 0x4a, 0xbd, 0x28, 0x55, + 0xbd, 0xc0, 0x8c, 0x9e, 0xb7, 0x69, 0xc8, 0x51, 0xe4, 0x7f, 0x02, 0xf5, 0x5a, 0x36, 0x2a, 0xfe, + 0x2b, 0x50, 0xbe, 0x9b, 0x8d, 0xf2, 0x8c, 0xee, 0x33, 0x99, 0x7a, 0xea, 0x8f, 0x2e, 0xe8, 0x81, + 0xd3, 0x6e, 0xd3, 0x20, 0xfe, 0x43, 0xa0, 0x5f, 0x50, 0xe8, 0x47, 0x8f, 0x1d, 0x26, 0xa2, 0xa3, + 0xc7, 0x4e, 0xaa, 0x1b, 0x9d, 0xd0, 0x39, 0xa0, 0xa2, 0xf9, 0x4f, 0xef, 0xe8, 0x3f, 0x39, 0xaa, + 0xf5, 0xc7, 0x25, 0x18, 0x78, 0xe4, 0x44, 0x8d, 0x43, 0xf2, 0x19, 0x0c, 0x3c, 0x74, 0xbd, 0x66, + 0x38, 0x57, 0xba, 0xda, 0x77, 0x7d, 0x74, 0xa1, 0x7c, 0x93, 0x77, 0x05, 0x0b, 0x59, 0xc1, 0xe2, + 0xec, 0xcf, 0x8f, 0x2b, 0x3d, 0x27, 0xc7, 0x95, 0xc9, 0x27, 0x0c, 0xed, 0x1d, 0xff, 0xc8, 0x8d, + 0x70, 0x6c, 0x6d, 0x4e, 0x47, 0x76, 0x61, 0xaa, 0xda, 0x6a, 0xf9, 0xcf, 0xb6, 0x9d, 0x20, 0x72, + 0x9d, 0x56, 0xad, 0xd3, 0x68, 0xd0, 0x30, 0x9c, 0xeb, 0xbd, 0x5a, 0xba, 0x3e, 0xbc, 0xf8, 0xda, + 0xc9, 0x71, 0xa5, 0xe2, 0xb0, 0xe2, 0x7a, 0x9b, 0x97, 0xd7, 0x43, 0x8e, 0xa0, 0x31, 0xca, 0xa2, + 0xb7, 0xfe, 0x62, 0x10, 0xca, 0xab, 0x7e, 0x18, 0x2d, 0xb1, 0x11, 0xb5, 0xe9, 0x4f, 0x3a, 0x34, + 0x8c, 0xc8, 0x6b, 0x30, 0xc8, 0x60, 0x6b, 0xcb, 0x73, 0xa5, 0xab, 0xa5, 0xeb, 0x23, 0x8b, 0xa3, + 0x27, 0xc7, 0x95, 0xa1, 0x43, 0x3f, 0x8c, 0xea, 0x6e, 0xd3, 0x16, 0x45, 0xe4, 0x6d, 0x18, 0xde, + 0xf4, 0x9b, 0x74, 0xd3, 0x39, 0xa2, 0xd8, 0x8a, 0x91, 0xc5, 0xf1, 0x93, 0xe3, 0xca, 0x88, 0xe7, + 0x37, 0x69, 0xdd, 0x73, 0x8e, 0xa8, 0xad, 0x8a, 0xc9, 0x1e, 0xf4, 0xdb, 0x7e, 0x8b, 0xce, 0xf5, + 0x21, 0xda, 0xe2, 0xc9, 0x71, 0xa5, 0x3f, 0xf0, 0x5b, 0xf4, 0x97, 0xc7, 0x95, 0xf7, 0x0f, 0xdc, + 0xe8, 0xb0, 0xb3, 0x7f, 0xb3, 0xe1, 0x1f, 0xdd, 0x3a, 0x08, 0x9c, 0xa7, 0x2e, 0x9f, 0x84, 0x4e, + 0xeb, 0x56, 0x3c, 0x55, 0xdb, 0xae, 0x18, 0xf7, 0xda, 0xf3, 0x30, 0xa2, 0x47, 0x8c, 0x93, 0x8d, + 0xfc, 0xc8, 0x23, 0x98, 0xae, 0x36, 0x9b, 0x2e, 0xa7, 0xd8, 0x0e, 0x5c, 0xaf, 0xe1, 0xb6, 0x9d, + 0x56, 0x38, 0xd7, 0x7f, 0xb5, 0xef, 0xfa, 0x88, 0x10, 0x8a, 0x2a, 0xaf, 0xb7, 0x15, 0x82, 0x26, + 0x94, 0x4c, 0x06, 0xe4, 0x2e, 0x0c, 0x2f, 0x6f, 0xd6, 0x58, 0xdb, 0xc3, 0xb9, 0x01, 0x64, 0x36, + 0x7b, 0x72, 0x5c, 0x99, 0x6a, 0x7a, 0x21, 0x76, 0x4d, 0x67, 0xa0, 0x10, 0xc9, 0xfb, 0x30, 0xb6, + 0xdd, 0xd9, 0x6f, 0xb9, 0x8d, 0x9d, 0xf5, 0xda, 0x43, 0xfa, 0x7c, 0x6e, 0xf0, 0x6a, 0xe9, 0xfa, + 0xd8, 0x22, 0x39, 0x39, 0xae, 0x4c, 0xb4, 0x11, 0x5e, 0x8f, 0x5a, 0x61, 0xfd, 0x09, 0x7d, 0x6e, + 0x1b, 0x78, 0x31, 0x5d, 0xad, 0xb6, 0xca, 0xe8, 0x86, 0x52, 0x74, 0x61, 0x78, 0xa8, 0xd3, 0x71, + 0x3c, 0x72, 0x0b, 0xc0, 0xa6, 0x47, 0x7e, 0x44, 0xab, 0xcd, 0x66, 0x30, 0x37, 0x8c, 0xb2, 0x9d, + 0x3c, 0x39, 0xae, 0x8c, 0x06, 0x08, 0xad, 0x3b, 0xcd, 0x66, 0x60, 0x6b, 0x28, 0x64, 0x09, 0x86, + 0x6d, 0x9f, 0x0b, 0x78, 0x6e, 0xe4, 0x6a, 0xe9, 0xfa, 0xe8, 0xc2, 0xa4, 0x98, 0x86, 0x12, 0xbc, + 0x78, 0xfe, 0xe4, 0xb8, 0x42, 0x02, 0xf1, 0x4b, 0xef, 0xa5, 0xc4, 0x20, 0x15, 0x18, 0xda, 0xf4, + 0x97, 0x9c, 0xc6, 0x21, 0x9d, 0x03, 0x9c, 0x7b, 0x03, 0x27, 0xc7, 0x95, 0xd2, 0x77, 0x6d, 0x09, + 0x25, 0x4f, 0x61, 0x34, 0x1e, 0xa8, 0x70, 0x6e, 0x14, 0xc5, 0xb7, 0x73, 0x72, 0x5c, 0x39, 0x1f, + 0x22, 0xb8, 0xce, 0x86, 0x5e, 0x93, 0xe0, 0x4b, 0xcc, 0x02, 0xbd, 0x22, 0xf2, 0x35, 0xcc, 0xc4, + 0x3f, 0xab, 0x61, 0x48, 0x03, 0xc6, 0x63, 0x6d, 0x79, 0x6e, 0x1c, 0x25, 0xf3, 0xe6, 0xc9, 0x71, + 0xc5, 0xd2, 0x5a, 0x50, 0x77, 0x24, 0x4a, 0xdd, 0x6d, 0x6a, 0x3d, 0xcd, 0x66, 0xf2, 0xa0, 0x7f, + 0x78, 0xac, 0x3c, 0x6e, 0x5f, 0xde, 0xf5, 0xc2, 0xc8, 0xd9, 0x6f, 0xd1, 0x4c, 0x24, 0xeb, 0xef, + 0x4b, 0x40, 0xb6, 0xda, 0xd4, 0xab, 0xd5, 0x56, 0xd9, 0xf7, 0x24, 0x3f, 0xa7, 0x77, 0x60, 0x84, + 0x0f, 0x1c, 0x1b, 0xdd, 0x5e, 0x1c, 0xdd, 0x89, 0x93, 0xe3, 0x0a, 0x88, 0xd1, 0x65, 0x23, 0x1b, + 0x23, 0x90, 0x37, 0xa0, 0x6f, 0x67, 0x67, 0x1d, 0xbf, 0x95, 0xbe, 0xc5, 0xa9, 0x93, 0xe3, 0x4a, + 0x5f, 0x14, 0xb5, 0x7e, 0x79, 0x5c, 0x19, 0x5e, 0xee, 0x04, 0x28, 0x16, 0x9b, 0x95, 0x93, 0x37, + 0x60, 0x68, 0xa9, 0xd5, 0x09, 0x23, 0x1a, 0xcc, 0xf5, 0xc7, 0x1f, 0x69, 0x83, 0x83, 0x6c, 0x59, + 0x46, 0xbe, 0x03, 0xfd, 0xbb, 0x21, 0x0d, 0xe6, 0x06, 0x70, 0xbc, 0xc7, 0xc5, 0x78, 0x33, 0xd0, + 0xde, 0xc2, 0xe2, 0x30, 0xfb, 0x12, 0x3b, 0x21, 0x0d, 0x6c, 0x44, 0x22, 0x37, 0x61, 0x80, 0x0f, + 0xda, 0x20, 0x2e, 0x52, 0xe3, 0x6a, 0x76, 0xb4, 0xe8, 0xde, 0xfb, 0x8b, 0x23, 0x27, 0xc7, 0x95, + 0x01, 0x1c, 0x3c, 0x9b, 0xa3, 0x3d, 0xe8, 0x1f, 0x2e, 0x95, 0x7b, 0xed, 0x61, 0x46, 0xcb, 0x3e, + 0x0b, 0xeb, 0x3b, 0x30, 0xaa, 0x75, 0x9f, 0x5c, 0x82, 0x7e, 0xf6, 0x3f, 0x2e, 0x22, 0x63, 0xbc, + 0x32, 0xb6, 0x71, 0xd8, 0x08, 0xb5, 0xfe, 0xf1, 0x24, 0x94, 0x19, 0xa5, 0xb1, 0xf2, 0x18, 0xa2, + 0x2a, 0x75, 0x13, 0xd5, 0x75, 0x50, 0x75, 0x8b, 0x25, 0x68, 0xec, 0xe4, 0xb8, 0x32, 0xdc, 0x11, + 0xb0, 0xb8, 0x65, 0xa4, 0x06, 0x43, 0x2b, 0xdf, 0xb4, 0xdd, 0x80, 0x86, 0x28, 0xd8, 0xd1, 0x85, + 0xf9, 0x9b, 0x7c, 0xb3, 0xbc, 0x29, 0x37, 0xcb, 0x9b, 0x3b, 0x72, 0xb3, 0x5c, 0xbc, 0x2c, 0x96, + 0xe2, 0x73, 0x94, 0x93, 0xc4, 0xb3, 0xe3, 0xf7, 0xfe, 0xb6, 0x52, 0xb2, 0x25, 0x27, 0xf2, 0x0e, + 0x0c, 0xde, 0xf3, 0x83, 0x23, 0x27, 0x12, 0x23, 0x30, 0x7d, 0x72, 0x5c, 0x29, 0x3f, 0x46, 0x88, + 0x36, 0xa1, 0x04, 0x0e, 0xb9, 0x07, 0x13, 0xb6, 0xdf, 0x89, 0xe8, 0x8e, 0x2f, 0xc7, 0x6d, 0x00, + 0xa9, 0xae, 0x9c, 0x1c, 0x57, 0xe6, 0x03, 0x56, 0x52, 0x8f, 0xfc, 0xba, 0x18, 0x40, 0x8d, 0x3e, + 0x41, 0x45, 0x56, 0x60, 0xa2, 0x8a, 0x6b, 0xb7, 0x90, 0x19, 0x1f, 0xad, 0x91, 0xc5, 0xcb, 0x27, + 0xc7, 0x95, 0x0b, 0x0e, 0x96, 0xd4, 0x03, 0x51, 0xa4, 0xb3, 0x31, 0x89, 0xc8, 0x26, 0x9c, 0x7b, + 0xd8, 0xd9, 0xa7, 0x81, 0x47, 0x23, 0x1a, 0xca, 0x16, 0x0d, 0x61, 0x8b, 0xae, 0x9e, 0x1c, 0x57, + 0x2e, 0x3d, 0x51, 0x85, 0x19, 0x6d, 0x4a, 0x93, 0x12, 0x0a, 0x93, 0xa2, 0xa1, 0xcb, 0x4e, 0xe4, + 0xec, 0x3b, 0x21, 0xc5, 0x25, 0x69, 0x74, 0xe1, 0x3c, 0x17, 0xf1, 0xcd, 0x44, 0xe9, 0xe2, 0x6b, + 0x42, 0xca, 0x17, 0x55, 0xdf, 0x9b, 0xa2, 0x48, 0xab, 0x28, 0xc9, 0x93, 0xad, 0xcc, 0x6a, 0xd7, + 0x19, 0xc1, 0xd6, 0xe2, 0xca, 0xac, 0x76, 0x1d, 0x7d, 0xcd, 0x52, 0xfb, 0xcf, 0x3a, 0x0c, 0xec, + 0xb2, 0xbd, 0x19, 0x57, 0xac, 0x89, 0x85, 0x6b, 0xa2, 0x45, 0xc9, 0xd9, 0x77, 0x93, 0xfd, 0x40, + 0x44, 0xfc, 0xee, 0x26, 0x71, 0x3f, 0xd7, 0x77, 0x62, 0x2c, 0x23, 0x9f, 0x03, 0x88, 0x56, 0x55, + 0xdb, 0xed, 0xb9, 0x51, 0xec, 0xe4, 0x39, 0xb3, 0x93, 0xd5, 0x76, 0x7b, 0xf1, 0x8a, 0xe8, 0xdf, + 0x79, 0xd5, 0x3f, 0xa7, 0xdd, 0xd6, 0xb8, 0x69, 0x4c, 0xc8, 0x67, 0x30, 0x86, 0x0b, 0x9a, 0x1c, + 0xd1, 0x31, 0x1c, 0xd1, 0x8b, 0x27, 0xc7, 0x95, 0x59, 0x5c, 0xab, 0x32, 0xc6, 0xd3, 0x20, 0x20, + 0xbf, 0x05, 0x33, 0x82, 0xdd, 0x23, 0xd7, 0x6b, 0xfa, 0xcf, 0xc2, 0x65, 0x1a, 0x3e, 0x89, 0xfc, + 0x36, 0x2e, 0x7e, 0xa3, 0x0b, 0x97, 0xcc, 0xe6, 0x99, 0x38, 0x8b, 0x37, 0x44, 0x4b, 0x2d, 0xd5, + 0xd2, 0x67, 0x1c, 0xa1, 0xde, 0xe4, 0x18, 0xfa, 0xf2, 0x98, 0xc9, 0x82, 0xac, 0xc1, 0xe4, 0x6e, + 0x48, 0x8d, 0x3e, 0x4c, 0xe0, 0xee, 0x50, 0x61, 0x23, 0xdc, 0x09, 0x69, 0x3d, 0xaf, 0x1f, 0x49, + 0x3a, 0x62, 0x03, 0x59, 0x0e, 0xfc, 0x76, 0x62, 0x8e, 0x4f, 0xa2, 0x44, 0xac, 0x93, 0xe3, 0xca, + 0x95, 0x66, 0xe0, 0xb7, 0xeb, 0xf9, 0x13, 0x3d, 0x83, 0x9a, 0xfc, 0x08, 0xce, 0x2f, 0xf9, 0x9e, + 0x47, 0x1b, 0x6c, 0xfd, 0x5c, 0x76, 0x9d, 0x03, 0xcf, 0x0f, 0x23, 0xb7, 0xb1, 0xb6, 0x3c, 0x57, + 0x8e, 0x37, 0x87, 0x86, 0xc2, 0xa8, 0x37, 0x15, 0x8a, 0xb9, 0x39, 0xe4, 0x70, 0x21, 0x3f, 0x84, + 0x71, 0x51, 0x17, 0x0d, 0x70, 0x6a, 0x9e, 0x2b, 0x9e, 0x68, 0x0a, 0x99, 0x6f, 0xf3, 0x81, 0xfc, + 0xc9, 0x15, 0x27, 0x93, 0x17, 0xf9, 0x1a, 0x46, 0x37, 0xee, 0x55, 0x6d, 0x1a, 0xb6, 0x7d, 0x2f, + 0xa4, 0x73, 0x04, 0x47, 0xf4, 0x8a, 0x60, 0xbd, 0x71, 0xaf, 0x5a, 0xed, 0x44, 0x87, 0xd4, 0x8b, + 0xdc, 0x86, 0x13, 0x51, 0x89, 0xb5, 0x38, 0xcf, 0x66, 0xde, 0xd1, 0x63, 0xa7, 0x1e, 0x08, 0x88, + 0xd6, 0x0b, 0x9d, 0x1d, 0x99, 0x87, 0xe1, 0x5a, 0x6d, 0x75, 0xdd, 0x3f, 0x70, 0xbd, 0xb9, 0x29, + 0x26, 0x0c, 0x5b, 0xfd, 0x26, 0xfb, 0x30, 0xa3, 0x9d, 0x0c, 0xea, 0xec, 0x7f, 0x7a, 0x44, 0xbd, + 0x68, 0x6e, 0x1a, 0xdb, 0xf0, 0x5d, 0x75, 0xb4, 0xb9, 0xa9, 0x1f, 0x20, 0x9e, 0xde, 0xb9, 0x59, + 0x8d, 0x7f, 0xd6, 0x24, 0x91, 0x3d, 0xed, 0x64, 0x40, 0xc9, 0x0e, 0x0c, 0x6d, 0x77, 0x82, 0xb6, + 0x1f, 0xd2, 0xb9, 0x19, 0x14, 0xda, 0x6b, 0x45, 0x5f, 0xa7, 0x40, 0x5d, 0x9c, 0x61, 0xcb, 0x73, + 0x9b, 0xff, 0xd0, 0x7a, 0x26, 0x59, 0x59, 0x5f, 0xc0, 0x88, 0xfa, 0x98, 0xc9, 0x10, 0xf4, 0x55, + 0x5b, 0xad, 0x72, 0x0f, 0xfb, 0xa3, 0x56, 0x5b, 0x2d, 0x97, 0xc8, 0x04, 0x40, 0xbc, 0x82, 0x95, + 0x7b, 0xc9, 0x18, 0x0c, 0xcb, 0x15, 0xa6, 0xdc, 0x87, 0xf8, 0xed, 0x76, 0xb9, 0x9f, 0x10, 0x98, + 0x30, 0xe7, 0x79, 0x79, 0xc0, 0xfa, 0xfd, 0x12, 0x8c, 0xa8, 0xf1, 0x21, 0x93, 0x30, 0xba, 0xbb, + 0x59, 0xdb, 0x5e, 0x59, 0x5a, 0xbb, 0xb7, 0xb6, 0xb2, 0x5c, 0xee, 0x21, 0x97, 0xe1, 0xc2, 0x4e, + 0x6d, 0xb5, 0xbe, 0xbc, 0x58, 0x5f, 0xdf, 0x5a, 0xaa, 0xae, 0xd7, 0xb7, 0xed, 0xad, 0x2f, 0xbe, + 0xac, 0xef, 0xec, 0x6e, 0x6e, 0xae, 0xac, 0x97, 0x4b, 0x64, 0x0e, 0xa6, 0x59, 0xf1, 0xc3, 0xdd, + 0xc5, 0x15, 0x1d, 0xa1, 0xdc, 0x4b, 0xae, 0xc1, 0xe5, 0xac, 0x92, 0xfa, 0xea, 0x4a, 0x75, 0x79, + 0x7d, 0xa5, 0x56, 0x2b, 0xf7, 0x91, 0x59, 0x98, 0x62, 0x28, 0xd5, 0xed, 0x6d, 0x83, 0xb6, 0xdf, + 0x6a, 0xc1, 0xa8, 0x26, 0x1c, 0x72, 0x09, 0xe6, 0x96, 0x56, 0xec, 0x9d, 0xfa, 0xf6, 0xae, 0xbd, + 0xbd, 0x55, 0x5b, 0xa9, 0x9b, 0x2d, 0x4c, 0x96, 0xae, 0x6f, 0xdd, 0x5f, 0xdb, 0xac, 0x33, 0x50, + 0xad, 0x5c, 0x62, 0xcd, 0x30, 0x4a, 0x6b, 0x6b, 0x9b, 0xf7, 0xd7, 0x57, 0xea, 0xbb, 0xb5, 0x15, + 0x81, 0xd2, 0x6b, 0xfd, 0xac, 0x37, 0xb5, 0xd4, 0x93, 0x05, 0x18, 0xad, 0xf1, 0x53, 0x2c, 0x4e, + 0x7f, 0x7e, 0x6c, 0x28, 0x9f, 0x1c, 0x57, 0xc6, 0xc4, 0xe1, 0x96, 0xcf, 0x6c, 0x1d, 0x89, 0xed, + 0xde, 0xdb, 0x6c, 0xa4, 0x1b, 0x7e, 0x4b, 0xdf, 0xbd, 0xdb, 0x02, 0x66, 0xab, 0x52, 0xb2, 0xa0, + 0xed, 0xf3, 0xfc, 0x0c, 0x81, 0x7a, 0xaa, 0xdc, 0xe7, 0xf5, 0x35, 0x5f, 0xed, 0xf8, 0x0b, 0xf1, + 0x90, 0x8a, 0xed, 0x19, 0x69, 0x32, 0xf6, 0x18, 0x85, 0x47, 0xde, 0x96, 0xfa, 0x0f, 0xd7, 0xf9, + 0x71, 0x13, 0x48, 0x68, 0xab, 0x42, 0xf5, 0xb1, 0x3a, 0x39, 0x0b, 0x2e, 0xf9, 0x38, 0x39, 0x67, + 0x84, 0x30, 0x90, 0x59, 0x62, 0x5d, 0xb5, 0x13, 0xa8, 0xa4, 0x02, 0x03, 0xfc, 0x4b, 0xe4, 0xf2, + 0x40, 0x8d, 0xab, 0xc5, 0x00, 0x36, 0x87, 0x5b, 0x7f, 0xd6, 0xa7, 0x6f, 0x3e, 0x4c, 0xc3, 0xd2, + 0xe4, 0x8d, 0x1a, 0x16, 0xca, 0x19, 0xa1, 0xe4, 0x26, 0x8c, 0xd4, 0x68, 0x18, 0x72, 0x2d, 0xb8, + 0x57, 0x0d, 0x09, 0x84, 0x1c, 0x58, 0x77, 0x9b, 0x73, 0x25, 0x3b, 0x46, 0x61, 0x07, 0x0a, 0xae, + 0x5b, 0xe1, 0x81, 0xa2, 0x2f, 0x3e, 0x50, 0x08, 0xed, 0x8b, 0x1f, 0x28, 0x62, 0x14, 0x36, 0xea, + 0x62, 0xfb, 0xc7, 0x56, 0xf4, 0xc7, 0xa3, 0x2e, 0x54, 0x06, 0x31, 0xea, 0x1a, 0x12, 0xf9, 0x08, + 0xa0, 0xfa, 0xa8, 0x86, 0x9a, 0xb3, 0xbd, 0x29, 0x54, 0x20, 0x5c, 0xac, 0x9c, 0x67, 0xa1, 0x50, + 0xcc, 0x03, 0xfd, 0xe4, 0xa1, 0x61, 0x93, 0x45, 0x18, 0xaf, 0xfe, 0xb4, 0x13, 0xd0, 0xb5, 0x26, + 0x5b, 0xef, 0x22, 0x7e, 0xc4, 0x1a, 0x59, 0xbc, 0x74, 0x72, 0x5c, 0x99, 0x73, 0x58, 0x41, 0xdd, + 0x15, 0x25, 0x1a, 0x03, 0x93, 0x84, 0x6c, 0xc1, 0xb9, 0xfb, 0x4b, 0xdb, 0x62, 0x1e, 0x56, 0x1b, + 0x0d, 0xbf, 0xe3, 0x45, 0x42, 0xef, 0xb9, 0x76, 0x72, 0x5c, 0xb9, 0x7c, 0xd0, 0x68, 0xd7, 0xe5, + 0x9c, 0x75, 0x78, 0xb1, 0xae, 0xf8, 0xa4, 0x68, 0xc9, 0x6b, 0xd0, 0xb7, 0x6b, 0xaf, 0x89, 0xf3, + 0xd7, 0xb9, 0x93, 0xe3, 0xca, 0x78, 0x27, 0x70, 0x35, 0x12, 0x56, 0x6a, 0xb5, 0x60, 0xe2, 0x3e, + 0x8d, 0xd8, 0xe4, 0x94, 0x9a, 0x6e, 0xf1, 0xd0, 0x7d, 0x02, 0xa3, 0x8f, 0xdc, 0xe8, 0xb0, 0x46, + 0x1b, 0x01, 0x8d, 0xe4, 0x29, 0x1f, 0xc5, 0xf4, 0xcc, 0x8d, 0x0e, 0xeb, 0x21, 0x87, 0xeb, 0x6b, + 0xba, 0x86, 0x6e, 0xad, 0xc0, 0xa4, 0xa8, 0x4d, 0x29, 0xd6, 0x0b, 0x26, 0xc3, 0x12, 0x32, 0xc4, + 0xa1, 0xd2, 0x19, 0x9a, 0x6c, 0xfe, 0xac, 0x17, 0x66, 0x96, 0x0e, 0x1d, 0xef, 0x80, 0x6e, 0x3b, + 0x61, 0xf8, 0xcc, 0x0f, 0x9a, 0x5a, 0xe3, 0xf1, 0x54, 0x91, 0x6a, 0x3c, 0x1e, 0x23, 0x16, 0x60, + 0x74, 0xab, 0xd5, 0x94, 0x34, 0xe2, 0xc4, 0x83, 0x75, 0xf9, 0xad, 0x66, 0xbd, 0x2d, 0x79, 0xe9, + 0x48, 0x8c, 0x66, 0x93, 0x3e, 0x53, 0x34, 0x7d, 0x31, 0x8d, 0x47, 0x9f, 0x69, 0x34, 0x1a, 0x12, + 0x59, 0x81, 0x73, 0x35, 0xda, 0xf0, 0xbd, 0xe6, 0x3d, 0xa7, 0x11, 0xf9, 0xc1, 0x8e, 0xff, 0x84, + 0x7a, 0x62, 0x12, 0xa2, 0x52, 0x18, 0x62, 0x61, 0xfd, 0x31, 0x96, 0xd6, 0x23, 0x56, 0x6c, 0xa7, + 0x29, 0xc8, 0x16, 0x0c, 0x3f, 0x12, 0xb6, 0x22, 0x71, 0x4c, 0x7a, 0xe3, 0xa6, 0x32, 0x1e, 0x2d, + 0x05, 0x14, 0x67, 0x8e, 0xd3, 0x52, 0x07, 0x3d, 0xb5, 0xc7, 0xe2, 0x72, 0x25, 0x31, 0x6d, 0xc5, + 0xc4, 0xda, 0x85, 0xf1, 0xed, 0x56, 0xe7, 0xc0, 0xf5, 0xd8, 0xc2, 0x52, 0xa3, 0x3f, 0x21, 0xcb, + 0x00, 0x31, 0x40, 0x58, 0x80, 0xa6, 0xc4, 0xe1, 0x2a, 0x2e, 0xd8, 0xbb, 0x2b, 0xbe, 0x36, 0x84, + 0xa0, 0x36, 0x6c, 0x6b, 0x74, 0xd6, 0x7f, 0xeb, 0x03, 0x22, 0x06, 0x00, 0xb7, 0xcf, 0x1a, 0x8d, + 0xd8, 0x16, 0x74, 0x1e, 0x7a, 0x95, 0xa1, 0x66, 0xf0, 0xe4, 0xb8, 0xd2, 0xeb, 0x36, 0xed, 0xde, + 0xb5, 0x65, 0xf2, 0x2e, 0x0c, 0x20, 0x1a, 0xca, 0x7f, 0x42, 0xd5, 0xa7, 0x73, 0xe0, 0x0b, 0x0c, + 0x6e, 0xeb, 0x36, 0x47, 0x26, 0xef, 0xc1, 0xc8, 0x32, 0x6d, 0xd1, 0x03, 0x27, 0xf2, 0xe5, 0x12, + 0xc0, 0x4d, 0x1f, 0x12, 0xa8, 0xcd, 0xb9, 0x18, 0x93, 0x1d, 0x85, 0x6c, 0xea, 0x84, 0xbe, 0xa7, + 0x1f, 0x85, 0x02, 0x84, 0xe8, 0x47, 0x21, 0x8e, 0x43, 0xfe, 0xa0, 0x04, 0xa3, 0x55, 0xcf, 0x13, + 0x26, 0x85, 0x50, 0x48, 0x7d, 0xe6, 0xa6, 0xb2, 0xc1, 0xad, 0x3b, 0xfb, 0xb4, 0xb5, 0xe7, 0xb4, + 0x3a, 0x34, 0x5c, 0xfc, 0x9a, 0x69, 0xa7, 0xff, 0xf6, 0xb8, 0xf2, 0xf1, 0x19, 0x8c, 0x04, 0xb1, + 0x35, 0x6f, 0x27, 0x70, 0xdc, 0x28, 0x3c, 0x39, 0xae, 0xcc, 0x38, 0x71, 0x85, 0xfa, 0x77, 0xa3, + 0xb5, 0x23, 0x5e, 0xff, 0x07, 0xbb, 0xad, 0xff, 0xe4, 0x08, 0x26, 0xab, 0x61, 0xd8, 0x39, 0xa2, + 0xb5, 0xc8, 0x09, 0x22, 0x76, 0x76, 0xc4, 0x45, 0xa4, 0xf8, 0x60, 0xf9, 0xd6, 0xcf, 0x8f, 0x2b, + 0x25, 0xa6, 0x10, 0x3b, 0x48, 0xca, 0x14, 0xaa, 0x20, 0xaa, 0x47, 0xae, 0xbe, 0x85, 0xe1, 0x11, + 0x33, 0xc9, 0xdb, 0x7a, 0x4d, 0x29, 0x1d, 0x6b, 0xcb, 0x79, 0x23, 0x6e, 0x2d, 0xc1, 0xa5, 0xfb, + 0x34, 0xb2, 0x69, 0x48, 0x23, 0xf9, 0x8d, 0xe0, 0x0c, 0x8f, 0xcd, 0x7a, 0x43, 0xf8, 0x5b, 0x11, + 0xe3, 0xf0, 0xf3, 0xef, 0x42, 0x96, 0x58, 0xff, 0x4b, 0x09, 0x2a, 0x4b, 0x01, 0xe5, 0xba, 0x64, + 0x0e, 0xa3, 0xe2, 0xb5, 0xeb, 0x12, 0xf4, 0xef, 0x3c, 0x6f, 0xcb, 0x13, 0x39, 0x96, 0xb2, 0x41, + 0xb1, 0x11, 0x7a, 0x4a, 0xf3, 0x86, 0xf5, 0x18, 0x66, 0x6c, 0xea, 0xd1, 0x67, 0xce, 0x7e, 0x8b, + 0x1a, 0x16, 0x82, 0x0a, 0x0c, 0xf0, 0x0f, 0x3d, 0xd5, 0x05, 0x0e, 0x3f, 0x9b, 0xb5, 0xc5, 0x1a, + 0x87, 0xd1, 0x6d, 0xd7, 0x3b, 0x10, 0xdc, 0xad, 0x3f, 0xed, 0x83, 0x31, 0xfe, 0x5b, 0xa8, 0xc7, + 0x89, 0x2d, 0xae, 0x74, 0x9a, 0x2d, 0xee, 0x03, 0x18, 0x67, 0x7b, 0x04, 0x0d, 0xf6, 0x68, 0xc0, + 0xb6, 0x56, 0x21, 0x09, 0x54, 0xf5, 0x43, 0x2c, 0xa8, 0x3f, 0xe5, 0x25, 0xb6, 0x89, 0x48, 0xd6, + 0x61, 0x82, 0x03, 0xee, 0x51, 0x27, 0xea, 0xc4, 0xd6, 0x8a, 0x49, 0xa1, 0x13, 0x4b, 0x30, 0x9f, + 0x9a, 0x82, 0xd7, 0x63, 0x01, 0xb4, 0x13, 0xb4, 0xe4, 0x33, 0x98, 0xdc, 0x0e, 0xfc, 0x6f, 0x9e, + 0x6b, 0x9b, 0x3a, 0xff, 0x3a, 0xb9, 0xf6, 0xcc, 0x8a, 0xea, 0xfa, 0xd6, 0x9e, 0xc4, 0x26, 0x6f, + 0xc3, 0xf0, 0x5a, 0xb8, 0xe8, 0x07, 0xae, 0x77, 0x80, 0xdf, 0xe8, 0x30, 0x37, 0xf1, 0xba, 0x61, + 0x7d, 0x1f, 0x81, 0xb6, 0x2a, 0x4e, 0x18, 0x23, 0x87, 0xba, 0x1b, 0x23, 0x6f, 0x03, 0xac, 0xfb, + 0x4e, 0xb3, 0xda, 0x6a, 0x2d, 0x55, 0x43, 0xdc, 0x3d, 0xc5, 0x7e, 0xd4, 0xf2, 0x9d, 0x66, 0xdd, + 0x69, 0xb5, 0xea, 0x0d, 0x27, 0xb4, 0x35, 0x9c, 0x07, 0xfd, 0xc3, 0x83, 0xe5, 0x21, 0x7b, 0x72, + 0xdd, 0x6d, 0x50, 0x2f, 0xa4, 0x8f, 0x9c, 0xc0, 0x73, 0xbd, 0x83, 0xd0, 0xfa, 0x97, 0x93, 0x30, + 0xac, 0xba, 0x7c, 0x53, 0x57, 0xec, 0xc5, 0x2e, 0x87, 0xa3, 0x1f, 0x9b, 0x33, 0x6c, 0x0d, 0x83, + 0x5c, 0x40, 0x55, 0x5f, 0xec, 0xaf, 0x43, 0x6c, 0x36, 0x3a, 0xed, 0xb6, 0xcd, 0x60, 0xec, 0x2b, + 0x5b, 0x5e, 0x44, 0xf9, 0x0f, 0xf3, 0xaf, 0xac, 0xb9, 0x6f, 0xf7, 0x2e, 0x2f, 0xb2, 0xe9, 0xbd, + 0xb5, 0xb6, 0xbc, 0x84, 0xa2, 0x1c, 0xe6, 0xd3, 0xdb, 0x77, 0x9b, 0x0d, 0x1b, 0xa1, 0xac, 0xb4, + 0x56, 0xdd, 0x58, 0x17, 0xe2, 0xc2, 0xd2, 0xd0, 0x39, 0x6a, 0xd9, 0x08, 0x65, 0xca, 0x21, 0x3f, + 0x99, 0x2e, 0xf9, 0x5e, 0x14, 0xf8, 0xad, 0x10, 0x35, 0x98, 0x61, 0x3e, 0x9c, 0xe2, 0x48, 0xdb, + 0x10, 0x45, 0x76, 0x02, 0x95, 0x3c, 0x82, 0xd9, 0x6a, 0xf3, 0xa9, 0xe3, 0x35, 0x68, 0x93, 0x97, + 0x3c, 0xf2, 0x83, 0x27, 0x8f, 0x5b, 0xfe, 0xb3, 0x10, 0xe5, 0x3d, 0x2c, 0x2c, 0x40, 0x02, 0x45, + 0x9e, 0x90, 0x9f, 0x49, 0x24, 0x3b, 0x8f, 0x9a, 0x7d, 0x52, 0x4b, 0x2d, 0xbf, 0xd3, 0x14, 0xa3, + 0x80, 0x9f, 0x54, 0x83, 0x01, 0x6c, 0x0e, 0x67, 0x52, 0x5a, 0xad, 0x6d, 0xa0, 0xbd, 0x45, 0x48, + 0xe9, 0x30, 0x3c, 0xb2, 0x19, 0x8c, 0xbc, 0x01, 0x43, 0x52, 0xcf, 0xe5, 0xe6, 0x60, 0x34, 0x43, + 0x4a, 0xfd, 0x56, 0x96, 0xb1, 0x4f, 0xc2, 0xa6, 0x0d, 0xff, 0x29, 0x0d, 0x9e, 0x2f, 0xf9, 0x4d, + 0x2a, 0xad, 0x03, 0xe2, 0xf4, 0xcb, 0x0b, 0xea, 0x0d, 0x56, 0x62, 0x9b, 0x88, 0xac, 0x02, 0xbe, + 0x07, 0x86, 0x73, 0x93, 0x71, 0x05, 0x7c, 0x8f, 0x0c, 0x6d, 0x59, 0x46, 0x96, 0xe1, 0x5c, 0xb5, + 0x13, 0xf9, 0x47, 0x4e, 0xe4, 0x36, 0x76, 0xdb, 0x07, 0x81, 0xc3, 0x2a, 0x29, 0x23, 0x01, 0xea, + 0xfd, 0x8e, 0x2c, 0xac, 0x77, 0x44, 0xa9, 0x9d, 0x26, 0x20, 0xef, 0xc3, 0xd8, 0x5a, 0xc8, 0x2d, + 0x40, 0x4e, 0x48, 0x9b, 0x78, 0x8c, 0x17, 0xad, 0x74, 0xc3, 0x3a, 0xda, 0x83, 0xea, 0xec, 0xa4, + 0xd0, 0xb4, 0x0d, 0x3c, 0x62, 0xc1, 0x60, 0x35, 0x0c, 0xdd, 0x30, 0xc2, 0xd3, 0xf9, 0xf0, 0x22, + 0x9c, 0x1c, 0x57, 0x06, 0x1d, 0x84, 0xd8, 0xa2, 0x84, 0x3c, 0x82, 0xd1, 0x65, 0xca, 0x14, 0xc7, + 0x9d, 0xa0, 0x13, 0x46, 0x78, 0xd6, 0x1e, 0x5d, 0xb8, 0x20, 0x3e, 0x6c, 0xad, 0x44, 0xcc, 0x65, + 0xae, 0xed, 0x35, 0x11, 0x5e, 0x8f, 0x58, 0x81, 0xbe, 0x6b, 0x69, 0xf8, 0x4c, 0x2b, 0x16, 0x34, + 0xab, 0x6e, 0x93, 0x7d, 0xaa, 0xd3, 0xd8, 0x06, 0xd4, 0x8a, 0xc5, 0xda, 0x50, 0x3f, 0xc4, 0x12, + 0x5d, 0x2b, 0x36, 0x48, 0x48, 0x23, 0x65, 0x54, 0x9c, 0x31, 0x0c, 0x47, 0x66, 0xa1, 0x6c, 0xe2, + 0x19, 0x4d, 0x8e, 0x9f, 0xc0, 0xe8, 0x52, 0x27, 0x8c, 0xfc, 0xa3, 0x9d, 0x43, 0x7a, 0x44, 0xe7, + 0xce, 0xc7, 0xba, 0x7f, 0x03, 0xc1, 0xf5, 0x88, 0xc1, 0xf5, 0x6e, 0x6a, 0xe8, 0xe4, 0x73, 0x20, + 0x52, 0x89, 0xbf, 0xcf, 0xe6, 0x87, 0xc7, 0xe6, 0xf2, 0xdc, 0x2c, 0xf6, 0x15, 0x35, 0x77, 0xa9, + 0xfb, 0xd7, 0x0f, 0x54, 0xb1, 0x6e, 0x16, 0x4a, 0x13, 0xb3, 0x06, 0xf1, 0x26, 0xde, 0x0f, 0x9c, + 0xf6, 0xe1, 0xdc, 0x5c, 0xac, 0x65, 0x8b, 0x4e, 0x1d, 0x30, 0xb8, 0xa1, 0x2d, 0xc4, 0xe8, 0xa4, + 0x06, 0xc0, 0x7f, 0xae, 0xb3, 0x81, 0xbf, 0x80, 0xf2, 0x9a, 0x33, 0xe4, 0xc5, 0x0a, 0xa4, 0xac, + 0x2e, 0xa0, 0x0e, 0xc2, 0xd9, 0xb6, 0x5c, 0x63, 0x34, 0x35, 0x36, 0xe4, 0x09, 0x94, 0xf9, 0xaf, + 0x0d, 0xdf, 0x73, 0x23, 0xbe, 0xf4, 0xce, 0x1b, 0x16, 0x9f, 0x64, 0xb1, 0xac, 0x00, 0x2d, 0x6d, + 0xa2, 0x82, 0x23, 0x55, 0xaa, 0x55, 0x93, 0x62, 0x4c, 0xb6, 0x61, 0x74, 0x3b, 0xf0, 0x9b, 0x9d, + 0x46, 0x84, 0x1b, 0xf6, 0x45, 0x54, 0x14, 0x89, 0xa8, 0x47, 0x2b, 0xe1, 0x32, 0x69, 0x73, 0x40, + 0x9d, 0x6d, 0xe6, 0xba, 0x4c, 0x34, 0x44, 0xb2, 0x08, 0x83, 0xdb, 0x7e, 0xcb, 0x6d, 0x3c, 0x9f, + 0xbb, 0x84, 0x8d, 0x9e, 0x96, 0xcc, 0x10, 0x28, 0x9b, 0x8a, 0xda, 0x61, 0x1b, 0x41, 0xba, 0x76, + 0xc8, 0x91, 0x48, 0x15, 0xc6, 0x3f, 0x67, 0x13, 0xc6, 0xf5, 0x3d, 0xcf, 0x71, 0x03, 0x3a, 0x77, + 0x19, 0xc7, 0x05, 0xad, 0xa1, 0x3f, 0xd1, 0x0b, 0xf4, 0xe9, 0x6c, 0x50, 0x90, 0x35, 0x98, 0x5c, + 0x0b, 0x6b, 0x51, 0xe0, 0xb6, 0xe9, 0x86, 0xe3, 0x39, 0x07, 0xb4, 0x39, 0x77, 0x25, 0x36, 0x47, + 0xba, 0x61, 0x3d, 0xc4, 0xb2, 0xfa, 0x11, 0x2f, 0xd4, 0xcd, 0x91, 0x09, 0x3a, 0xf2, 0x05, 0x4c, + 0xaf, 0x7c, 0x13, 0xb1, 0x19, 0xd3, 0xaa, 0x76, 0x9a, 0x6e, 0x54, 0x8b, 0xfc, 0xc0, 0x39, 0xa0, + 0x73, 0x15, 0xe4, 0xf7, 0xfa, 0xc9, 0x71, 0xe5, 0x2a, 0x15, 0xe5, 0x75, 0x87, 0x21, 0xd4, 0x43, + 0x8e, 0xa1, 0x5f, 0x32, 0x66, 0x71, 0x60, 0xd2, 0xaf, 0x75, 0xda, 0x4c, 0x71, 0x45, 0xe9, 0x5f, + 0x35, 0xa4, 0xaf, 0x95, 0x70, 0xe9, 0x87, 0x1c, 0x90, 0x92, 0xbe, 0x86, 0x48, 0x6c, 0x20, 0x0f, + 0x7c, 0xd7, 0xab, 0x36, 0x22, 0xf7, 0x29, 0x15, 0xe7, 0xfa, 0x70, 0xee, 0x1a, 0xb6, 0x14, 0x4d, + 0xa7, 0xbf, 0xee, 0xbb, 0x5e, 0xdd, 0xc1, 0xe2, 0xba, 0xb0, 0x02, 0x18, 0xa6, 0xd3, 0x34, 0x35, + 0xf9, 0x11, 0x9c, 0xdf, 0xf0, 0xf7, 0xdd, 0x16, 0xe5, 0x4b, 0x0e, 0x17, 0x0b, 0x1a, 0x01, 0x2d, + 0xe4, 0x8b, 0xa6, 0xd3, 0x23, 0xc4, 0xa8, 0x8b, 0xd5, 0xea, 0x48, 0xe1, 0xe8, 0xa6, 0xd3, 0x6c, + 0x2e, 0x0f, 0xfa, 0x87, 0x47, 0xcb, 0x63, 0xfc, 0x7a, 0xed, 0x41, 0xff, 0xf0, 0x78, 0x79, 0xc2, + 0xfa, 0xc3, 0x12, 0x90, 0xf4, 0x7a, 0x48, 0x6e, 0xc1, 0x10, 0xf5, 0x98, 0x3a, 0xd8, 0x14, 0xfb, + 0x3a, 0x6a, 0x31, 0x02, 0xa4, 0xdb, 0x00, 0x05, 0x88, 0x7c, 0x0e, 0x53, 0xbc, 0x41, 0x72, 0xe5, + 0x6e, 0xb9, 0x47, 0x6e, 0x84, 0x7b, 0xfd, 0x00, 0x5f, 0x31, 0x32, 0x8a, 0xf5, 0xb3, 0xbe, 0x28, + 0xc6, 0x75, 0x7e, 0x9d, 0x15, 0x5a, 0x1d, 0x98, 0xc9, 0x5c, 0x09, 0xc9, 0x06, 0xcc, 0x1c, 0xf9, + 0x5e, 0x74, 0xd8, 0x7a, 0x2e, 0x17, 0x42, 0x51, 0x5b, 0x09, 0x6b, 0xc3, 0x8f, 0x3f, 0x13, 0xc1, + 0x9e, 0x12, 0x60, 0xc1, 0x11, 0xeb, 0x79, 0xd0, 0x3f, 0xdc, 0x5b, 0xee, 0x53, 0x3d, 0xb1, 0x6c, + 0x38, 0x97, 0x5a, 0x50, 0xc8, 0xf7, 0x61, 0xac, 0x81, 0x7a, 0xba, 0x51, 0x13, 0x5f, 0x4e, 0x35, + 0xb8, 0x3e, 0x57, 0x38, 0x9c, 0x77, 0xe5, 0x4f, 0x4a, 0x30, 0x9b, 0xb3, 0x94, 0x9c, 0x5d, 0xd4, + 0x5f, 0xc2, 0xf9, 0x23, 0xe7, 0x9b, 0x7a, 0x80, 0xc7, 0xb0, 0x7a, 0xe0, 0x78, 0x09, 0x69, 0xe3, + 0x67, 0x92, 0x8d, 0xa1, 0x3b, 0x28, 0x1c, 0x39, 0xdf, 0xd8, 0x88, 0x60, 0xb3, 0x72, 0xde, 0xce, + 0x1f, 0xc0, 0xb8, 0xb1, 0x78, 0x9c, 0xb9, 0x71, 0xd6, 0x1d, 0x38, 0xc7, 0x0e, 0xaa, 0x11, 0x3d, + 0xb5, 0xf9, 0xc5, 0xda, 0x06, 0xa8, 0xd1, 0x23, 0xa7, 0x7d, 0xe8, 0x33, 0xa5, 0x72, 0x51, 0xff, + 0x25, 0x8e, 0xef, 0x44, 0x1c, 0xa7, 0x55, 0xc1, 0xde, 0x5d, 0xae, 0x68, 0x86, 0x0a, 0xd3, 0xd6, + 0xa8, 0xac, 0xbf, 0xec, 0x05, 0x22, 0xbe, 0xfe, 0x80, 0x3a, 0x47, 0xb2, 0x19, 0x1f, 0xc2, 0x18, + 0x3f, 0x6c, 0x71, 0x30, 0x36, 0x67, 0x74, 0x61, 0x4a, 0x2c, 0x02, 0x7a, 0xd1, 0x6a, 0x8f, 0x6d, + 0xa0, 0x32, 0x52, 0x9b, 0xf2, 0x53, 0x22, 0x92, 0xf6, 0x1a, 0xa4, 0x7a, 0x11, 0x23, 0xd5, 0x7f, + 0x93, 0xcf, 0x60, 0x62, 0xc9, 0x3f, 0x6a, 0x33, 0x99, 0x08, 0xe2, 0x3e, 0x71, 0x02, 0x17, 0xf5, + 0x1a, 0x85, 0xab, 0x3d, 0x76, 0x02, 0x9d, 0x6c, 0xc2, 0xd4, 0xbd, 0x56, 0x27, 0x3c, 0xac, 0x7a, + 0xcd, 0xa5, 0x96, 0x1f, 0x4a, 0x2e, 0xfd, 0xe2, 0x04, 0x2c, 0x0e, 0x2b, 0x69, 0x8c, 0xd5, 0x1e, + 0x3b, 0x8b, 0x90, 0xbc, 0x01, 0x03, 0x2b, 0x4f, 0xd9, 0x9a, 0x22, 0xaf, 0xa9, 0x85, 0x17, 0xcd, + 0x96, 0x47, 0xb7, 0x1e, 0xaf, 0xf6, 0xd8, 0xbc, 0x74, 0x71, 0x04, 0x86, 0xe4, 0x41, 0xed, 0x16, + 0xd3, 0xf7, 0x94, 0x38, 0x6b, 0x91, 0x13, 0x75, 0x42, 0x32, 0x0f, 0xc3, 0xbb, 0x6d, 0x76, 0x7e, + 0x90, 0x27, 0x5c, 0x5b, 0xfd, 0xb6, 0xde, 0x31, 0x25, 0x4d, 0x2e, 0xe9, 0xc6, 0x51, 0x8e, 0x1c, + 0x03, 0xac, 0x55, 0x53, 0xb8, 0xc5, 0xd8, 0x46, 0xbd, 0xbd, 0x89, 0x7a, 0xcb, 0x49, 0x59, 0x5b, + 0x33, 0x99, 0xc2, 0xb3, 0xbe, 0x80, 0x2b, 0xbb, 0xed, 0x90, 0x06, 0x51, 0xb5, 0xdd, 0x6e, 0xb9, + 0x0d, 0x7e, 0x4d, 0x82, 0x07, 0x3a, 0x39, 0x59, 0xde, 0x87, 0x41, 0x0e, 0x10, 0xd3, 0x44, 0xce, + 0xc1, 0x6a, 0xbb, 0x2d, 0x8e, 0x91, 0x77, 0xb9, 0xe6, 0xc9, 0x0f, 0x86, 0xb6, 0xc0, 0xb6, 0x7e, + 0xaf, 0x04, 0x57, 0xf8, 0x17, 0x90, 0xcb, 0xfa, 0x3b, 0x30, 0x82, 0x4e, 0x2c, 0x6d, 0xa7, 0x21, + 0xbf, 0x09, 0xee, 0xcd, 0x23, 0x81, 0x76, 0x5c, 0xae, 0xb9, 0x07, 0xf5, 0xe6, 0xbb, 0x07, 0xc9, + 0x0f, 0xac, 0x2f, 0xf3, 0x03, 0xfb, 0x1c, 0x2c, 0xd1, 0xa2, 0x56, 0x2b, 0xd5, 0xa8, 0xf0, 0x45, + 0x5a, 0x65, 0xfd, 0xa7, 0x5e, 0x98, 0xbd, 0x4f, 0x3d, 0x1a, 0x38, 0xd8, 0x4f, 0xc3, 0x60, 0xa1, + 0x3b, 0x0a, 0x94, 0x0a, 0x1d, 0x05, 0x2a, 0xd2, 0x04, 0xd4, 0x8b, 0x26, 0xa0, 0x94, 0xcf, 0x03, + 0x3b, 0x0b, 0xed, 0xda, 0x6b, 0xa2, 0x5b, 0x78, 0x16, 0xea, 0x04, 0x2e, 0x1a, 0x79, 0xc9, 0x5a, + 0xec, 0x64, 0xd0, 0xdf, 0xd5, 0x16, 0x34, 0x25, 0x2e, 0x5d, 0x87, 0x84, 0x93, 0x81, 0xe9, 0x5a, + 0xb0, 0x09, 0x83, 0xdc, 0x72, 0x85, 0x57, 0x11, 0xa3, 0x0b, 0x37, 0xc4, 0x37, 0x95, 0xd3, 0x41, + 0x61, 0xe6, 0x5a, 0xf1, 0xa2, 0xe0, 0x39, 0x9f, 0x02, 0x11, 0x02, 0x6c, 0xc1, 0x65, 0xfe, 0x73, + 0x18, 0xd5, 0x50, 0x48, 0x19, 0xfa, 0x9e, 0x08, 0x07, 0x8b, 0x11, 0x9b, 0xfd, 0x49, 0xde, 0x81, + 0x81, 0xa7, 0x4e, 0xab, 0x43, 0xc5, 0x32, 0x72, 0x3e, 0xb6, 0xc5, 0x31, 0x75, 0xc8, 0x3b, 0xe0, + 0xc6, 0x38, 0x9b, 0x23, 0x7d, 0xd4, 0xfb, 0x41, 0xc9, 0xfa, 0x18, 0xe6, 0xd2, 0xad, 0x11, 0x56, + 0x93, 0x6e, 0x46, 0x1a, 0x6b, 0x19, 0xa6, 0xef, 0xd3, 0x08, 0x27, 0x2e, 0x7e, 0x44, 0x9a, 0xff, + 0x47, 0xe2, 0x3b, 0x93, 0xab, 0xaa, 0xbc, 0xb2, 0xd0, 0xbf, 0xd2, 0x1a, 0xcc, 0x24, 0xb8, 0x88, + 0xfa, 0x3f, 0x82, 0x21, 0x01, 0x52, 0x2b, 0xaa, 0xf0, 0xb7, 0xa3, 0xfb, 0xa2, 0x60, 0x6f, 0x81, + 0xcf, 0x5b, 0xc1, 0xd9, 0x96, 0x04, 0xd6, 0x21, 0x9c, 0x67, 0xdb, 0x6c, 0xcc, 0x55, 0x4d, 0xc7, + 0x8b, 0x30, 0xd2, 0x66, 0x8a, 0x42, 0xe8, 0xfe, 0x94, 0x4f, 0xa3, 0x01, 0x7b, 0x98, 0x01, 0x6a, + 0xee, 0x4f, 0x29, 0xb9, 0x0c, 0x80, 0x85, 0xd8, 0x4d, 0xb1, 0x0a, 0x20, 0x3a, 0xb7, 0x4a, 0x11, + 0x40, 0x47, 0x1b, 0x3e, 0x6f, 0x6c, 0xfc, 0xdb, 0x0a, 0x60, 0x36, 0x55, 0x93, 0xe8, 0xc0, 0x2d, + 0x18, 0x96, 0xfa, 0x59, 0xc2, 0x5e, 0xac, 0xf7, 0xc0, 0x56, 0x48, 0xe4, 0x4d, 0x98, 0xf4, 0xe8, + 0x37, 0x51, 0x3d, 0xd5, 0x86, 0x71, 0x06, 0xde, 0x96, 0xed, 0xb0, 0x7e, 0x0d, 0x6d, 0x84, 0x35, + 0xcf, 0x7f, 0xf6, 0xb8, 0xe5, 0x3c, 0xa1, 0xa9, 0x8a, 0xbf, 0x0f, 0xc3, 0xb5, 0xee, 0x15, 0xf3, + 0xcf, 0x47, 0x56, 0x6e, 0x2b, 0x12, 0xab, 0x05, 0xf3, 0xac, 0x4b, 0xb5, 0xea, 0xc6, 0xfa, 0x5a, + 0x73, 0xfb, 0xdb, 0x16, 0xe0, 0x53, 0xb8, 0x98, 0x59, 0xdb, 0xb7, 0x2d, 0xc4, 0x7f, 0xda, 0x0f, + 0xb3, 0x7c, 0x33, 0x49, 0xcf, 0xe0, 0xd3, 0x2f, 0x35, 0xbf, 0x92, 0xeb, 0xb6, 0xdb, 0x19, 0xd7, + 0x6d, 0x48, 0xa2, 0x5f, 0xb7, 0x19, 0x97, 0x6c, 0x1f, 0x64, 0x5f, 0xb2, 0xa1, 0x11, 0xc4, 0xbc, + 0x64, 0x4b, 0x5e, 0xad, 0xad, 0xe4, 0x5f, 0xad, 0xe1, 0x1d, 0x42, 0xc6, 0xd5, 0x5a, 0xd6, 0x85, + 0x5a, 0xc2, 0xdf, 0x61, 0xf8, 0xd5, 0xfa, 0x3b, 0xbc, 0x09, 0x43, 0xd5, 0x76, 0x5b, 0xf3, 0x1f, + 0xc2, 0xe1, 0x71, 0xda, 0x6d, 0x2e, 0x3c, 0x59, 0x28, 0xd7, 0x79, 0xc8, 0x58, 0xe7, 0x3f, 0x04, + 0x58, 0x42, 0x1f, 0x67, 0x1c, 0xb8, 0x51, 0xc4, 0x40, 0x0d, 0x9f, 0x7b, 0x3e, 0xe3, 0xc0, 0xe9, + 0xc7, 0xfb, 0x18, 0x99, 0x2b, 0xf6, 0xd6, 0x1e, 0xcc, 0xa5, 0xa7, 0xcf, 0x2b, 0x58, 0xba, 0xfe, + 0xbc, 0x04, 0x97, 0x85, 0x92, 0x93, 0xf8, 0xc0, 0xcf, 0x3e, 0x3b, 0xdf, 0x83, 0x31, 0x41, 0xbb, + 0x13, 0x7f, 0x08, 0xfc, 0x7e, 0x53, 0x2e, 0xc6, 0x7c, 0x45, 0x37, 0xd0, 0xc8, 0x7b, 0x30, 0x8c, + 0x7f, 0xc4, 0x36, 0x7e, 0x26, 0x99, 0x11, 0x44, 0xad, 0x27, 0x2d, 0xfd, 0x0a, 0xd5, 0xfa, 0x1a, + 0xae, 0xe4, 0x35, 0xfc, 0x15, 0xc8, 0xe5, 0x9f, 0x95, 0xe0, 0xa2, 0x60, 0x6f, 0x2c, 0x15, 0x2f, + 0xb4, 0xeb, 0x9c, 0xc1, 0xeb, 0xf0, 0x01, 0x8c, 0xb2, 0x0a, 0x65, 0xbb, 0xfb, 0xc4, 0xd6, 0x2a, + 0x4e, 0x0e, 0x71, 0xc9, 0xb2, 0x13, 0x39, 0xc2, 0x5b, 0xc2, 0x39, 0x6a, 0xc9, 0x93, 0xb9, 0xad, + 0x13, 0x5b, 0x5f, 0xc1, 0xa5, 0xec, 0x2e, 0xbc, 0x02, 0xf9, 0x3c, 0x80, 0xf9, 0x8c, 0x4d, 0xe1, + 0xc5, 0xf6, 0xe4, 0x2f, 0xe1, 0x62, 0x26, 0xaf, 0x57, 0xd0, 0xcc, 0x55, 0xa6, 0x71, 0x44, 0xaf, + 0x60, 0x08, 0xad, 0x47, 0x70, 0x21, 0x83, 0xd3, 0x2b, 0x68, 0xe2, 0x7d, 0x98, 0x55, 0x9a, 0xf6, + 0x4b, 0xb5, 0x70, 0x03, 0x2e, 0x73, 0x46, 0xaf, 0x66, 0x54, 0x1e, 0xc2, 0x45, 0xc1, 0xee, 0x15, + 0x48, 0x6f, 0x15, 0x2e, 0xc5, 0x07, 0xea, 0x0c, 0x3d, 0xe9, 0xd4, 0x8b, 0x8c, 0xb5, 0x0e, 0x57, + 0x63, 0x4e, 0x39, 0x4a, 0xc3, 0xe9, 0xb9, 0x71, 0x75, 0x30, 0x1e, 0xa5, 0x57, 0x32, 0xa2, 0x8f, + 0xe0, 0xbc, 0xc1, 0xf4, 0x95, 0xa9, 0x4a, 0x6b, 0x30, 0xc5, 0x19, 0x9b, 0xaa, 0xf3, 0x82, 0xae, + 0x3a, 0x8f, 0x2e, 0x9c, 0x8b, 0x59, 0x22, 0x78, 0xef, 0x6e, 0x86, 0x36, 0xbd, 0x81, 0xda, 0xb4, + 0x44, 0x89, 0x5b, 0xf8, 0x1e, 0x0c, 0x72, 0x88, 0x68, 0x5f, 0x06, 0x33, 0x7e, 0x58, 0xe0, 0x64, + 0x02, 0xd9, 0xfa, 0x11, 0x5c, 0xe6, 0x27, 0xd1, 0xf8, 0xa2, 0xcc, 0x3c, 0x2d, 0x7e, 0x3f, 0x71, + 0x10, 0xbd, 0x20, 0xf8, 0x26, 0xf1, 0x73, 0xce, 0xa3, 0xfb, 0x72, 0x6e, 0xe7, 0xf1, 0x3f, 0xd5, + 0xfb, 0x13, 0x79, 0xc0, 0xec, 0xcd, 0x3c, 0x60, 0xbe, 0x06, 0xd7, 0xd4, 0x01, 0x33, 0x59, 0x8d, + 0x9c, 0x5a, 0xd6, 0x57, 0x70, 0x91, 0x77, 0x54, 0x7a, 0x80, 0x99, 0xcd, 0xf8, 0x38, 0xd1, 0xcd, + 0x59, 0xd1, 0x4d, 0x13, 0x3b, 0xa7, 0x93, 0xff, 0x7b, 0x49, 0x7e, 0x72, 0xd9, 0xcc, 0x7f, 0xd5, + 0x27, 0xee, 0x4d, 0xa8, 0x28, 0x81, 0x98, 0x2d, 0x7a, 0xb1, 0xe3, 0xf6, 0x06, 0xcc, 0xe8, 0x6c, + 0xdc, 0x06, 0xdd, 0xbb, 0x83, 0x37, 0x18, 0xef, 0xb2, 0xcf, 0x02, 0x01, 0x72, 0xda, 0xcd, 0x65, + 0xc8, 0x0d, 0xf1, 0x6d, 0x85, 0x69, 0xd5, 0xe1, 0x52, 0x7a, 0x28, 0xdc, 0x86, 0x74, 0x0b, 0x26, + 0x9f, 0xb1, 0x4f, 0x18, 0x21, 0x62, 0x30, 0x72, 0x99, 0xca, 0xef, 0x98, 0x93, 0x4b, 0x2a, 0xcb, + 0x92, 0x4b, 0x4d, 0xa2, 0xff, 0xac, 0x76, 0x39, 0x1f, 0x7e, 0x13, 0x88, 0x2c, 0x5a, 0xaa, 0xd9, + 0xb2, 0xea, 0x0b, 0xd0, 0xb7, 0x54, 0xb3, 0xc5, 0x6b, 0x04, 0xd4, 0x04, 0x1b, 0x61, 0x60, 0x33, + 0x58, 0x52, 0x23, 0xef, 0x3d, 0x85, 0x46, 0xfe, 0xa0, 0x7f, 0xb8, 0xaf, 0xdc, 0x6f, 0x93, 0x9a, + 0x7b, 0xe0, 0x3d, 0x72, 0xa3, 0x43, 0x55, 0x61, 0xd5, 0xfa, 0x21, 0x4c, 0x19, 0xd5, 0x8b, 0xaf, + 0xb8, 0xf0, 0x19, 0x05, 0xd3, 0x67, 0x97, 0xaa, 0xe8, 0x21, 0x81, 0x26, 0x8b, 0x31, 0xbe, 0xde, + 0x34, 0x9c, 0x3a, 0xbe, 0xd1, 0xb3, 0x65, 0xa1, 0xf5, 0xff, 0xf5, 0x6b, 0xdc, 0xb5, 0xc7, 0x29, + 0x05, 0xbd, 0xbb, 0x03, 0xc0, 0x67, 0x88, 0xd6, 0x39, 0xa6, 0x00, 0x8e, 0x0a, 0xc7, 0x03, 0xbe, + 0x24, 0xdb, 0x1a, 0xd2, 0x69, 0x1f, 0xaf, 0x08, 0x77, 0x51, 0x4e, 0x24, 0xdf, 0x6b, 0x29, 0x77, + 0x51, 0xc1, 0x3a, 0xb4, 0x75, 0x24, 0xf2, 0xa3, 0xa4, 0x8f, 0xf5, 0x00, 0x5e, 0x98, 0xbc, 0x2e, + 0x6f, 0x50, 0xd3, 0x7d, 0x3b, 0x9b, 0x9b, 0xf5, 0x33, 0x98, 0x61, 0xb4, 0xee, 0x63, 0x3c, 0x58, + 0xac, 0x7c, 0x13, 0x51, 0x8f, 0xaf, 0xed, 0x83, 0x58, 0xcf, 0x1b, 0x05, 0xf5, 0xc4, 0xc8, 0xc2, + 0xfe, 0x1e, 0xf3, 0xa9, 0x53, 0x55, 0x66, 0x67, 0xf3, 0xc7, 0x49, 0x64, 0xaf, 0xaf, 0x78, 0xcd, + 0xb6, 0xef, 0xaa, 0x03, 0x13, 0x9f, 0x44, 0x41, 0xab, 0x4e, 0x05, 0xdc, 0xd6, 0x91, 0xac, 0x37, + 0x0b, 0x9d, 0x90, 0x87, 0xa1, 0x7f, 0x67, 0x69, 0x67, 0xbd, 0x5c, 0xb2, 0x6e, 0x01, 0x68, 0x35, + 0x01, 0x0c, 0x6e, 0x6e, 0xd9, 0x1b, 0xd5, 0xf5, 0x72, 0x0f, 0x99, 0x81, 0x73, 0x8f, 0xd6, 0x36, + 0x97, 0xb7, 0x1e, 0xd5, 0xea, 0xb5, 0x8d, 0xaa, 0xbd, 0xb3, 0x54, 0xb5, 0x97, 0xcb, 0x25, 0xeb, + 0x6b, 0x98, 0x36, 0x7b, 0xf8, 0x4a, 0x27, 0x61, 0x04, 0x53, 0x4a, 0x9f, 0x79, 0xf0, 0x68, 0x47, + 0x73, 0x4e, 0x14, 0x87, 0xbf, 0xa4, 0x93, 0x8d, 0x38, 0x26, 0x8a, 0xcf, 0x48, 0x43, 0x22, 0x6f, + 0x73, 0xb5, 0x20, 0xf9, 0xfc, 0x90, 0xa9, 0x05, 0xf5, 0x58, 0x2f, 0xc0, 0xa5, 0xef, 0x7b, 0x30, + 0x6d, 0xd6, 0x7a, 0x5a, 0x2b, 0xd5, 0xeb, 0xe8, 0xb5, 0xa9, 0xbd, 0x4e, 0x20, 0x44, 0xbf, 0x36, + 0x10, 0x2b, 0xeb, 0xf7, 0xa0, 0x2c, 0xb0, 0xe2, 0x9d, 0xf7, 0x35, 0x69, 0x46, 0x2c, 0x65, 0xbc, + 0xa4, 0x92, 0x3e, 0xc4, 0x3e, 0x94, 0xd9, 0x8a, 0x29, 0x28, 0x79, 0x05, 0xd3, 0x30, 0xb0, 0x1e, + 0x5f, 0xe7, 0xd8, 0xfc, 0x07, 0x3a, 0xe9, 0x47, 0x4e, 0x10, 0x49, 0x97, 0xa6, 0x11, 0x5b, 0xfd, + 0x26, 0x6f, 0xc3, 0xe0, 0x3d, 0xb7, 0x15, 0x09, 0xd3, 0x48, 0xbc, 0xc9, 0x33, 0xb6, 0xbc, 0xc0, + 0x16, 0x08, 0x96, 0x0d, 0xe7, 0xb4, 0x0a, 0xcf, 0xd0, 0x54, 0x32, 0x07, 0x43, 0x9b, 0xf4, 0x1b, + 0xad, 0x7e, 0xf9, 0xd3, 0x7a, 0x1f, 0xce, 0x09, 0x77, 0x31, 0x4d, 0x4c, 0xd7, 0xc4, 0x83, 0xcf, + 0x92, 0xf1, 0xea, 0x4c, 0xb0, 0xc4, 0x22, 0x46, 0xb7, 0xdb, 0x6e, 0xbe, 0x20, 0x1d, 0xdb, 0x28, + 0xce, 0x48, 0xf7, 0x96, 0xbc, 0x05, 0xea, 0x36, 0x9c, 0x7f, 0x59, 0x82, 0xb9, 0x84, 0x95, 0x61, + 0xe9, 0xd0, 0x69, 0xb5, 0xa8, 0x77, 0x40, 0xc9, 0x75, 0xe8, 0xdf, 0xd9, 0xda, 0xd9, 0x16, 0x56, + 0x52, 0x79, 0xbb, 0xcd, 0x40, 0x0a, 0xc7, 0x46, 0x0c, 0xf2, 0x10, 0xce, 0x49, 0x87, 0x50, 0x55, + 0x24, 0x46, 0xe8, 0x72, 0xb1, 0x7b, 0x69, 0x9a, 0x8e, 0xbc, 0x2b, 0x4c, 0x22, 0x3f, 0xe9, 0xb8, + 0x01, 0x6d, 0xa2, 0xe5, 0x27, 0xbe, 0x2a, 0xd6, 0x4a, 0x6c, 0x1d, 0x8d, 0x3f, 0xcf, 0xb3, 0xfe, + 0xa0, 0x04, 0xb3, 0x39, 0x56, 0x13, 0xf2, 0xb6, 0xd1, 0x9d, 0x29, 0xad, 0x3b, 0x12, 0x65, 0xb5, + 0x47, 0xf4, 0x67, 0x49, 0xf3, 0x92, 0xed, 0x3b, 0x83, 0x97, 0xec, 0x6a, 0x4f, 0xec, 0x19, 0xbb, + 0x08, 0x30, 0x2c, 0xe1, 0xd6, 0x24, 0x8c, 0x1b, 0x72, 0xb3, 0x2c, 0x18, 0xd3, 0x6b, 0x66, 0x83, + 0xb3, 0xe4, 0x37, 0xd5, 0xe0, 0xb0, 0xbf, 0xad, 0xdf, 0x2f, 0xc1, 0x34, 0x76, 0xf1, 0xc0, 0x65, + 0x4b, 0x5f, 0x2c, 0xa1, 0x05, 0xa3, 0x27, 0x97, 0x8c, 0x9e, 0x24, 0x70, 0x55, 0x97, 0x3e, 0x4a, + 0x75, 0xe9, 0x52, 0x56, 0x97, 0x70, 0x7a, 0xbb, 0xbe, 0x67, 0xf4, 0x44, 0xbb, 0x8a, 0xfa, 0xc3, + 0x12, 0x4c, 0x69, 0x6d, 0x52, 0xed, 0xbf, 0x63, 0x34, 0xe9, 0x62, 0x46, 0x93, 0x52, 0x42, 0x5e, + 0x4c, 0xb5, 0xe8, 0xf5, 0xa2, 0x16, 0x75, 0x95, 0xf1, 0x7f, 0x28, 0xc1, 0x4c, 0xa6, 0x0c, 0xc8, + 0x79, 0xa6, 0xdb, 0x36, 0x02, 0x1a, 0x09, 0xf1, 0x8a, 0x5f, 0x0c, 0xbe, 0x16, 0x86, 0x1d, 0x1a, + 0x88, 0xef, 0x5c, 0xfc, 0x22, 0xaf, 0xc3, 0xf8, 0x36, 0x0d, 0x5c, 0xbf, 0xc9, 0xfd, 0xa7, 0xb9, + 0x63, 0xe2, 0xb8, 0x6d, 0x02, 0xc9, 0x25, 0x18, 0xa9, 0xb6, 0x0e, 0xfc, 0xc0, 0x8d, 0x0e, 0xf9, + 0x6d, 0xe0, 0x88, 0x1d, 0x03, 0x18, 0xef, 0x65, 0xf7, 0x80, 0x5f, 0x6a, 0x30, 0x62, 0xf1, 0x8b, + 0x2d, 0x2e, 0xd2, 0x5a, 0x38, 0xc8, 0x17, 0x17, 0x69, 0x0a, 0x3c, 0x0f, 0x83, 0x9f, 0xdb, 0x38, + 0x09, 0xf0, 0x51, 0xb4, 0x2d, 0x7e, 0x91, 0x09, 0xf4, 0x80, 0x45, 0x97, 0x7b, 0xf4, 0x7c, 0xfd, + 0x08, 0xa6, 0xb3, 0xe4, 0x9a, 0x35, 0x85, 0x04, 0x6d, 0xaf, 0xa2, 0xfd, 0x0a, 0xa6, 0xaa, 0xcd, + 0xe6, 0xc6, 0xbd, 0x2a, 0xf7, 0x39, 0x10, 0xa3, 0xca, 0x3f, 0x1e, 0x6e, 0xaf, 0x13, 0x2a, 0x5b, + 0xff, 0x9a, 0xe7, 0x46, 0xf6, 0xd4, 0xca, 0x37, 0x6e, 0x18, 0xb9, 0xde, 0x81, 0x66, 0x54, 0xb4, + 0xcf, 0x6f, 0xd2, 0x67, 0x19, 0x53, 0x80, 0xed, 0xa6, 0x26, 0x6f, 0x0e, 0xcf, 0x60, 0x3e, 0xad, + 0xb1, 0x8d, 0x97, 0x92, 0x59, 0x93, 0x6f, 0x5c, 0xd0, 0x57, 0x6d, 0x3c, 0xb1, 0xbe, 0x07, 0xe7, + 0xf9, 0x92, 0x56, 0xd4, 0x78, 0xd1, 0x6c, 0xdd, 0x06, 0x6a, 0x7d, 0x20, 0xad, 0x14, 0x85, 0x2d, + 0xb3, 0xc7, 0x8c, 0xb6, 0x60, 0x95, 0xff, 0xb1, 0x04, 0xf3, 0x09, 0xd2, 0xda, 0x73, 0xaf, 0x21, + 0xd7, 0xd3, 0x37, 0x93, 0x1e, 0xc6, 0xa8, 0x07, 0x70, 0xe3, 0x9f, 0xdb, 0x54, 0x4e, 0xc6, 0xe4, + 0x16, 0x00, 0x27, 0xd6, 0xb6, 0x6f, 0x34, 0x7d, 0x0b, 0x0f, 0x12, 0xdc, 0xc0, 0x35, 0x14, 0xd2, + 0x81, 0x2c, 0xb9, 0x8b, 0x6f, 0xa4, 0x9b, 0x6d, 0x18, 0x03, 0x01, 0x50, 0x41, 0x5e, 0xcf, 0x31, + 0x12, 0x67, 0xf1, 0xb7, 0xfe, 0x8f, 0x3e, 0x98, 0xd5, 0x07, 0xf0, 0x45, 0xfa, 0xba, 0x0d, 0xa3, + 0x4b, 0xbe, 0x17, 0xd1, 0x6f, 0x22, 0xed, 0x21, 0x36, 0x51, 0x37, 0xed, 0xaa, 0x44, 0xa8, 0x8e, + 0x1c, 0x50, 0x67, 0x7a, 0x8c, 0xe1, 0x09, 0x17, 0x23, 0x92, 0x25, 0x18, 0xdf, 0xa4, 0xcf, 0x52, + 0x02, 0x44, 0x6f, 0x3c, 0x8f, 0x3e, 0xab, 0x6b, 0x42, 0xd4, 0x5d, 0xa4, 0x0c, 0x1a, 0xb2, 0x0f, + 0x13, 0x72, 0x72, 0x19, 0xc2, 0x9c, 0xd7, 0x77, 0x15, 0x73, 0x3a, 0xf3, 0xa7, 0xca, 0xac, 0x86, + 0x1c, 0x19, 0x26, 0x38, 0xb2, 0xae, 0xf3, 0x1a, 0xf9, 0xeb, 0x5b, 0x73, 0xdb, 0xd2, 0x4a, 0x0c, + 0x5f, 0xc7, 0xe4, 0xab, 0x5b, 0x9d, 0x85, 0xb5, 0x0d, 0x73, 0xe9, 0xf1, 0x10, 0xb5, 0xbd, 0x0b, + 0x83, 0x1c, 0x2a, 0xd4, 0x00, 0x19, 0x63, 0x43, 0x61, 0xf3, 0x73, 0x3a, 0xaf, 0xc6, 0x16, 0xb8, + 0xd6, 0x2a, 0xda, 0x4e, 0x14, 0x8e, 0x52, 0xc4, 0x6e, 0x27, 0x87, 0x17, 0xdd, 0x48, 0xe5, 0xf0, + 0xea, 0x7e, 0x26, 0xd2, 0x73, 0x7e, 0x09, 0xcd, 0x4f, 0x3a, 0x27, 0xd1, 0xb0, 0x1b, 0x30, 0x24, + 0x40, 0x89, 0xe8, 0x1f, 0xf1, 0xe7, 0x27, 0x11, 0xac, 0x8f, 0xe0, 0x02, 0xda, 0xc2, 0x5c, 0xef, + 0xa0, 0x45, 0x77, 0x43, 0xc3, 0xf7, 0xbd, 0xdb, 0x67, 0xfd, 0x09, 0xcc, 0x67, 0xd1, 0x76, 0xfd, + 0xb2, 0xf9, 0x7b, 0xfc, 0xbf, 0xe9, 0x85, 0xe9, 0xb5, 0x50, 0x57, 0x26, 0x84, 0x24, 0x6e, 0x66, + 0xbd, 0x14, 0x47, 0x99, 0xac, 0xf6, 0x64, 0xbd, 0x04, 0x7f, 0x57, 0x7b, 0x79, 0xd7, 0x5b, 0xf4, + 0x04, 0x9c, 0x6d, 0x5b, 0xea, 0xed, 0xdd, 0x9b, 0xd0, 0xbf, 0xc9, 0x96, 0xea, 0x3e, 0x31, 0x76, + 0x9c, 0x82, 0x81, 0xf0, 0xe5, 0x1b, 0xdb, 0x22, 0xd9, 0x0f, 0x72, 0x2f, 0xf5, 0xbe, 0xae, 0xbf, + 0xfb, 0x13, 0xe7, 0xd5, 0x9e, 0xd4, 0x53, 0xbb, 0xf7, 0x61, 0xb4, 0xda, 0x3c, 0xe2, 0xee, 0x6e, + 0xbe, 0x97, 0xf8, 0x2c, 0xb5, 0x92, 0xd5, 0x1e, 0x5b, 0x47, 0x64, 0x27, 0xdc, 0x6a, 0xbb, 0x8d, + 0x1b, 0x55, 0xd6, 0xb3, 0xef, 0xd5, 0x1e, 0xf4, 0x1e, 0x5f, 0x1c, 0x86, 0xc1, 0x1d, 0x27, 0x38, + 0xa0, 0x91, 0xf5, 0x15, 0xcc, 0x0b, 0x27, 0x15, 0x6e, 0xf9, 0x43, 0x57, 0x96, 0x30, 0xf6, 0x43, + 0x2a, 0x72, 0x2c, 0xb9, 0x02, 0x80, 0x7a, 0xfe, 0x9a, 0xd7, 0xa4, 0xdf, 0x70, 0x5f, 0x2a, 0x5b, + 0x83, 0x58, 0xef, 0xc1, 0x88, 0x92, 0x10, 0x2a, 0xb3, 0xda, 0x66, 0x87, 0xd2, 0x9a, 0x36, 0x1e, + 0x14, 0xca, 0x57, 0x84, 0x17, 0x8c, 0xbe, 0x8b, 0x30, 0x0e, 0x5c, 0xfb, 0x75, 0x61, 0x26, 0x31, + 0x09, 0xe2, 0x77, 0xc2, 0x4a, 0xff, 0x44, 0xbf, 0x2b, 0x5b, 0xfd, 0x4e, 0xaa, 0xa7, 0xbd, 0xa7, + 0x52, 0x4f, 0xad, 0x7f, 0xd4, 0x8b, 0x07, 0xa7, 0x94, 0x3c, 0x12, 0x36, 0x28, 0xdd, 0x0e, 0xb6, + 0x08, 0x23, 0xd8, 0xfb, 0x65, 0xf9, 0xae, 0xa9, 0xd8, 0xc7, 0x62, 0xf8, 0xe7, 0xc7, 0x95, 0x1e, + 0x74, 0xac, 0x88, 0xc9, 0xc8, 0xa7, 0x30, 0xb4, 0xe2, 0x35, 0x91, 0x43, 0xdf, 0x19, 0x38, 0x48, + 0x22, 0x36, 0x26, 0xd8, 0xe4, 0x1d, 0xf6, 0x09, 0x73, 0xd3, 0x85, 0xad, 0x41, 0xe2, 0x13, 0xdc, + 0x40, 0xde, 0x09, 0x6e, 0x30, 0x71, 0x82, 0xb3, 0x60, 0x60, 0x2b, 0x68, 0x8a, 0xf0, 0x0b, 0x13, + 0x0b, 0x63, 0x42, 0x70, 0x08, 0xb3, 0x79, 0x91, 0xf5, 0x9f, 0x4b, 0x30, 0x7b, 0x9f, 0x46, 0x99, + 0x73, 0xc8, 0x90, 0x4a, 0xe9, 0xa5, 0xa5, 0xd2, 0xfb, 0x22, 0x52, 0x51, 0xbd, 0xee, 0xcb, 0xeb, + 0x75, 0x7f, 0x5e, 0xaf, 0x07, 0xf2, 0x7b, 0x7d, 0x1f, 0x06, 0x79, 0x57, 0xd9, 0x29, 0x75, 0x2d, + 0xa2, 0x47, 0xf1, 0x29, 0x55, 0xf7, 0x10, 0xb3, 0x79, 0x19, 0x53, 0x24, 0xd7, 0x9d, 0x50, 0x3f, + 0xa5, 0x8a, 0x9f, 0xd6, 0x8f, 0xf1, 0x45, 0xe4, 0xba, 0xdf, 0x78, 0xa2, 0x59, 0x3b, 0x87, 0xf8, + 0x17, 0x9a, 0xb4, 0x8e, 0x33, 0x2c, 0x5e, 0x62, 0x4b, 0x0c, 0x72, 0x15, 0x46, 0xd7, 0xbc, 0x7b, + 0x7e, 0xd0, 0xa0, 0x5b, 0x5e, 0x8b, 0x73, 0x1f, 0xb6, 0x75, 0x90, 0xb0, 0x02, 0x88, 0x1a, 0xe2, + 0xa3, 0x35, 0x02, 0x12, 0x47, 0x6b, 0x06, 0xdb, 0x5b, 0xb0, 0x79, 0x99, 0x30, 0x32, 0xb0, 0xbf, + 0x8b, 0x4e, 0xa5, 0xea, 0xf8, 0xda, 0x0d, 0x71, 0x1f, 0x2e, 0xd8, 0xb4, 0xdd, 0x72, 0x98, 0x4e, + 0x77, 0xe4, 0x73, 0x7c, 0xd5, 0xe7, 0xab, 0x19, 0xaf, 0x99, 0x4c, 0x7f, 0x01, 0xd5, 0xe4, 0xde, + 0x82, 0x26, 0x1f, 0xc1, 0xb5, 0xfb, 0x34, 0x32, 0x17, 0xd4, 0xd8, 0x96, 0x2a, 0x3a, 0xbf, 0x0a, + 0xc3, 0xa1, 0x69, 0x07, 0xbe, 0x22, 0xaf, 0x1f, 0xb2, 0x08, 0xf7, 0xee, 0xca, 0x9b, 0x12, 0xc1, + 0x47, 0xfd, 0x65, 0x7d, 0x06, 0x95, 0xbc, 0xea, 0x4e, 0xe7, 0xce, 0xe9, 0xc2, 0xd5, 0x7c, 0x06, + 0xa2, 0xb9, 0x2b, 0x20, 0x6d, 0xc6, 0xe2, 0x13, 0xea, 0xd6, 0x5a, 0xd3, 0xcc, 0x2c, 0xfe, 0xb0, + 0x16, 0xa5, 0x63, 0xdb, 0x4b, 0x34, 0xb7, 0x8e, 0xd7, 0xb1, 0x26, 0x83, 0x58, 0xae, 0x55, 0x18, + 0x96, 0x30, 0x21, 0xd7, 0xd9, 0xcc, 0x96, 0x4a, 0x81, 0x36, 0x25, 0x03, 0x45, 0x66, 0xfd, 0x58, + 0x5e, 0x4d, 0x98, 0x14, 0xa7, 0x7b, 0xde, 0x77, 0x9a, 0xbb, 0x08, 0xcb, 0x87, 0x0b, 0x26, 0x6f, + 0xdd, 0xe4, 0x5c, 0xd6, 0x4c, 0xce, 0xdc, 0xd2, 0x7c, 0xd5, 0x34, 0x81, 0xf6, 0x8a, 0x79, 0x19, + 0x83, 0xc8, 0x15, 0xdd, 0xb0, 0x3c, 0x96, 0x7e, 0x2f, 0x78, 0x1b, 0xe6, 0xb3, 0x2a, 0xd4, 0xce, + 0x81, 0xca, 0x7a, 0x29, 0xf4, 0x9d, 0x65, 0xb8, 0x22, 0x03, 0xa0, 0xf8, 0x7e, 0x14, 0x46, 0x81, + 0xd3, 0xae, 0x35, 0x02, 0xb7, 0x1d, 0x53, 0x59, 0x30, 0xc8, 0x21, 0x42, 0x12, 0xfc, 0x9a, 0x87, + 0xe3, 0x88, 0x12, 0xeb, 0xb7, 0x4b, 0x60, 0x19, 0x3e, 0x48, 0x38, 0xce, 0xdb, 0x81, 0xff, 0xd4, + 0x6d, 0x6a, 0x57, 0x2b, 0x6f, 0x1b, 0x66, 0x3d, 0xfe, 0xde, 0x2b, 0xe9, 0xfe, 0x2c, 0xd6, 0xcc, + 0xdb, 0x09, 0x53, 0x1b, 0x57, 0x3c, 0xd1, 0x2f, 0xe9, 0x09, 0xd5, 0xdf, 0x4b, 0x28, 0x13, 0xdc, + 0x7f, 0x2d, 0xc1, 0x6b, 0x85, 0x6d, 0x10, 0xfd, 0xd9, 0x87, 0x72, 0xb2, 0x4c, 0xcc, 0xa0, 0x8a, + 0xe6, 0x93, 0x90, 0xe6, 0xb0, 0x77, 0x87, 0xfb, 0x58, 0x4b, 0xdf, 0x9d, 0xb6, 0xe2, 0x9c, 0xe2, + 0x77, 0xf6, 0xd6, 0x93, 0x0f, 0x01, 0x76, 0xfc, 0xc8, 0x69, 0x2d, 0xa1, 0x01, 0xa0, 0x2f, 0xf6, + 0x97, 0x8f, 0x18, 0xb4, 0x9e, 0x7c, 0x81, 0xaf, 0x21, 0x5b, 0x3f, 0xc0, 0xef, 0x3a, 0xbb, 0xd1, + 0xa7, 0xfb, 0xd4, 0x96, 0xe0, 0xb5, 0xc4, 0xbd, 0xf8, 0x0b, 0x30, 0x89, 0x60, 0x86, 0x89, 0x9f, + 0xe9, 0xde, 0xf7, 0x03, 0xbf, 0xd3, 0xfe, 0xd5, 0x8c, 0xfa, 0x5f, 0x94, 0xb8, 0xa3, 0xa2, 0x5e, + 0xad, 0x18, 0xe8, 0x25, 0x80, 0x18, 0x9a, 0x70, 0x58, 0x57, 0x05, 0x7b, 0x77, 0xf8, 0x91, 0x1b, + 0x2d, 0xe6, 0x07, 0x9c, 0x81, 0x46, 0xf6, 0xab, 0x1d, 0xc9, 0xbb, 0x78, 0x19, 0xae, 0x6a, 0x3f, + 0x9d, 0xdc, 0xdf, 0x97, 0xf6, 0x8f, 0x33, 0xd2, 0x1d, 0xc2, 0x34, 0x5b, 0x01, 0xaa, 0x9d, 0xe8, + 0xd0, 0x0f, 0xdc, 0x48, 0x3e, 0xbd, 0x20, 0xdb, 0xe2, 0xe1, 0x32, 0xa7, 0xfa, 0xe4, 0x97, 0xc7, + 0x95, 0x0f, 0xce, 0x12, 0x98, 0x4e, 0xf2, 0xdc, 0x51, 0x8f, 0x9d, 0xad, 0x59, 0xe8, 0x5b, 0xb2, + 0xd7, 0x71, 0xc1, 0xb3, 0xd7, 0xd5, 0x82, 0x67, 0xaf, 0x5b, 0x7f, 0xd7, 0x0b, 0x15, 0x1e, 0x5a, + 0x01, 0x7d, 0x28, 0x62, 0xab, 0x85, 0xe6, 0x94, 0x71, 0x5a, 0x03, 0x43, 0x22, 0x74, 0x42, 0xef, + 0x69, 0x42, 0x27, 0xfc, 0x06, 0xe4, 0x98, 0xac, 0x4e, 0x61, 0x05, 0x78, 0xeb, 0xe4, 0xb8, 0xf2, + 0x5a, 0x6c, 0x05, 0xe0, 0xa5, 0x59, 0xe6, 0x80, 0x9c, 0x2a, 0xd2, 0xf6, 0x8b, 0xfe, 0x17, 0xb0, + 0x5f, 0xdc, 0x86, 0x21, 0x3c, 0xcc, 0xac, 0x6d, 0x0b, 0xaf, 0x46, 0x9c, 0x9e, 0x18, 0x2c, 0xa5, + 0xee, 0xea, 0x11, 0xab, 0x24, 0x9a, 0xf5, 0x7f, 0xf7, 0xc2, 0xd5, 0x7c, 0x99, 0x8b, 0xb6, 0x2d, + 0x03, 0xc4, 0xde, 0x1b, 0x45, 0xde, 0x22, 0xf8, 0xed, 0x3c, 0xa3, 0xfb, 0xca, 0x5b, 0x4b, 0xa3, + 0x63, 0xba, 0x8f, 0x7c, 0xc5, 0x9a, 0xb8, 0x2a, 0x30, 0x1e, 0xb7, 0x8a, 0x70, 0x8b, 0x02, 0x64, + 0x84, 0x5b, 0x14, 0x30, 0xb2, 0x0f, 0xb3, 0xdb, 0x81, 0xfb, 0xd4, 0x89, 0xe8, 0x43, 0xfa, 0x9c, + 0x3f, 0x84, 0x59, 0x11, 0xaf, 0x5f, 0xf8, 0xd3, 0xe4, 0xeb, 0x27, 0xc7, 0x95, 0xd7, 0xdb, 0x1c, + 0x85, 0x7d, 0x98, 0x75, 0xfe, 0xae, 0xae, 0x9e, 0x7e, 0x10, 0x93, 0xc7, 0xc8, 0xfa, 0x17, 0x25, + 0xb8, 0x88, 0x6a, 0xb9, 0x30, 0xbb, 0xca, 0xca, 0x5f, 0xc8, 0x69, 0x50, 0xef, 0xa0, 0x98, 0x8b, + 0xe8, 0x34, 0x68, 0xbc, 0xf2, 0xb5, 0x0d, 0x34, 0xb2, 0x06, 0xa3, 0xe2, 0x37, 0x7e, 0x7f, 0x7d, + 0x78, 0x20, 0x98, 0xd1, 0x16, 0x2c, 0x9c, 0xea, 0xdc, 0x54, 0x84, 0x13, 0x5b, 0x30, 0xc3, 0xc7, + 0x70, 0xb6, 0x4e, 0x6b, 0xfd, 0xa2, 0x17, 0x2e, 0xed, 0xd1, 0xc0, 0x7d, 0xfc, 0x3c, 0xa7, 0x33, + 0x5b, 0x30, 0x2d, 0x41, 0x3c, 0xbc, 0x82, 0xf1, 0x89, 0xf1, 0x90, 0x6b, 0xb2, 0xa9, 0x22, 0x3e, + 0x83, 0xfc, 0xe2, 0x32, 0x09, 0xcf, 0xe0, 0x0e, 0xf8, 0x2e, 0x0c, 0x27, 0x02, 0x9c, 0xe0, 0xf8, + 0xcb, 0x2f, 0x34, 0x1e, 0xaa, 0xd5, 0x1e, 0x5b, 0x61, 0x92, 0xdf, 0xc9, 0xbf, 0xbf, 0x11, 0xa6, + 0x8f, 0x6e, 0xf6, 0x4f, 0xfc, 0x60, 0xd9, 0xc7, 0xea, 0x68, 0xa5, 0x19, 0x1f, 0xec, 0x6a, 0x8f, + 0x9d, 0x57, 0xd3, 0xe2, 0x28, 0x8c, 0x54, 0xf1, 0x4e, 0x8a, 0x9d, 0xdc, 0xff, 0x4b, 0x2f, 0x5c, + 0x91, 0x8f, 0x5a, 0x72, 0xc4, 0xfc, 0x05, 0xcc, 0x4a, 0x50, 0xb5, 0xcd, 0x14, 0x06, 0xda, 0x34, + 0x25, 0xcd, 0xc3, 0x1e, 0x4a, 0x49, 0x3b, 0x02, 0x27, 0x16, 0x76, 0x1e, 0xf9, 0xab, 0xb1, 0x7e, + 0x7e, 0x9a, 0x15, 0x6e, 0x06, 0xad, 0x90, 0xfa, 0x9a, 0x69, 0x88, 0xc6, 0x58, 0x3f, 0x9b, 0x29, + 0xeb, 0x69, 0xff, 0xcb, 0x5a, 0x4f, 0x57, 0x7b, 0x92, 0xf6, 0xd3, 0xc5, 0x09, 0x18, 0xdb, 0xa4, + 0xcf, 0x62, 0xb9, 0xff, 0xaf, 0xa5, 0xc4, 0x33, 0x7a, 0xa6, 0x61, 0xf0, 0xf7, 0xf4, 0xa5, 0x38, + 0x62, 0x09, 0x3e, 0xa3, 0xd7, 0x35, 0x0c, 0x8e, 0xba, 0x06, 0x43, 0xfc, 0xa2, 0xb6, 0x79, 0x8a, + 0x13, 0xbe, 0x7a, 0x9d, 0xc2, 0x9f, 0x0c, 0x36, 0xf9, 0x61, 0x5f, 0xd0, 0x5b, 0x0f, 0xe1, 0x9a, + 0xf0, 0x5f, 0x36, 0x07, 0x1f, 0x2b, 0x3a, 0xe3, 0xf6, 0x65, 0x39, 0x70, 0xe5, 0x3e, 0x4d, 0x2e, + 0x3d, 0xc6, 0xeb, 0x9d, 0xcf, 0x60, 0xd2, 0x80, 0x2b, 0x8e, 0xa8, 0x95, 0xaa, 0x39, 0xa4, 0x58, + 0x27, 0xb1, 0xad, 0xab, 0x59, 0x55, 0xe8, 0x8d, 0xb5, 0x28, 0xc6, 0x2f, 0x0c, 0xe2, 0x2b, 0xb6, + 0xf0, 0x0c, 0xab, 0xde, 0x75, 0xed, 0xbb, 0xe6, 0x2b, 0x1e, 0x0f, 0x64, 0x26, 0x77, 0x5e, 0x55, + 0x6a, 0x8d, 0x1b, 0x77, 0x01, 0xd6, 0x04, 0x8c, 0xc9, 0xa2, 0x16, 0x0d, 0x43, 0xeb, 0x67, 0x03, + 0x60, 0x09, 0xc1, 0x66, 0xdd, 0x3e, 0x4b, 0x79, 0xec, 0xa7, 0x1a, 0x2b, 0x36, 0xaa, 0xf3, 0x7a, + 0xe8, 0xbc, 0xb8, 0x94, 0xcf, 0x3c, 0xd4, 0xf3, 0x1a, 0x31, 0xd4, 0x98, 0x79, 0xa9, 0xde, 0xff, + 0x30, 0x67, 0x99, 0xe4, 0x1f, 0xdb, 0x1b, 0x27, 0xc7, 0x95, 0x6b, 0x39, 0xcb, 0xa4, 0xc1, 0x37, + 0x7b, 0xc9, 0xb4, 0xcd, 0x2b, 0x91, 0xbe, 0x17, 0xb9, 0x12, 0x61, 0x5f, 0xa4, 0x7e, 0x29, 0xb2, + 0x6b, 0xca, 0x52, 0x7c, 0x8f, 0xf2, 0x4a, 0x5b, 0x2f, 0x12, 0xaf, 0xd9, 0x35, 0x88, 0xc1, 0xd5, + 0x60, 0x43, 0x5c, 0x28, 0x6b, 0x36, 0xcb, 0xa5, 0x43, 0xda, 0x78, 0x22, 0x6c, 0xc5, 0xf2, 0x42, + 0x37, 0xcb, 0x66, 0xce, 0x43, 0xa8, 0xf2, 0xef, 0x9c, 0x17, 0xd4, 0x1b, 0x8c, 0x54, 0x7f, 0x8d, + 0x9f, 0x64, 0x4b, 0x7e, 0x0a, 0x53, 0x6a, 0xa8, 0x13, 0xee, 0x47, 0xa3, 0x0b, 0xaf, 0xc7, 0xb1, + 0x16, 0x8f, 0x1e, 0x3b, 0x37, 0x9f, 0xde, 0xb9, 0x99, 0x81, 0xcb, 0x1f, 0x79, 0x37, 0x64, 0x81, + 0xe6, 0x7b, 0xa4, 0x5f, 0x74, 0x65, 0x11, 0x6a, 0xd7, 0xd9, 0xff, 0x97, 0x72, 0x96, 0x67, 0xfa, + 0x82, 0xdb, 0xa2, 0xe2, 0xd5, 0x8b, 0x9c, 0x7d, 0x39, 0x57, 0x71, 0xa5, 0x6f, 0xf9, 0x2a, 0xee, + 0x4f, 0x7b, 0xe5, 0x13, 0x81, 0xf4, 0x6d, 0xe8, 0x99, 0x6f, 0xe4, 0x32, 0x7b, 0x70, 0xaa, 0xcd, + 0x34, 0xb3, 0x71, 0x64, 0x51, 0xde, 0x67, 0xaa, 0xc0, 0x47, 0x13, 0xea, 0x6e, 0x20, 0x2e, 0x30, + 0xae, 0x38, 0x51, 0x75, 0xd1, 0xa8, 0x92, 0x97, 0x65, 0x7d, 0x2f, 0x7f, 0x59, 0xf6, 0x4f, 0x46, + 0xe0, 0xdc, 0xb6, 0x73, 0xe0, 0x7a, 0x6c, 0xd1, 0xb6, 0x69, 0xe8, 0x77, 0x82, 0x06, 0x25, 0x55, + 0x98, 0x30, 0xfd, 0x3f, 0xbb, 0x78, 0xb7, 0xb2, 0x7d, 0xc9, 0x84, 0x91, 0x05, 0x18, 0x51, 0x6f, + 0x4e, 0xc5, 0x66, 0x92, 0xf1, 0x16, 0x75, 0xb5, 0xc7, 0x8e, 0xd1, 0xc8, 0x87, 0xc6, 0xfd, 0xce, + 0xa4, 0x7a, 0x3e, 0x8d, 0xb8, 0x0b, 0xdc, 0x41, 0xcf, 0xf3, 0x9b, 0xe6, 0x86, 0xc8, 0x2f, 0x31, + 0x7e, 0x9c, 0xba, 0xf2, 0x19, 0x30, 0x5a, 0x9c, 0xb2, 0x7b, 0xa1, 0x2e, 0x90, 0x1b, 0xc3, 0x36, + 0xe3, 0x32, 0xe8, 0x2b, 0x18, 0x7d, 0xd8, 0xd9, 0xa7, 0xf2, 0x72, 0x6b, 0x50, 0xec, 0x8f, 0x49, + 0xaf, 0x66, 0x51, 0xbe, 0x77, 0x97, 0x8f, 0xc1, 0x93, 0xce, 0x3e, 0x4d, 0x07, 0x47, 0x66, 0x0b, + 0x93, 0xc6, 0x8c, 0x1c, 0x42, 0x39, 0xe9, 0x80, 0x2c, 0x42, 0x85, 0x15, 0xb8, 0x4d, 0x63, 0x9c, + 0x0a, 0x2d, 0x04, 0x33, 0x77, 0x8b, 0x34, 0x2a, 0x49, 0x71, 0x25, 0xbf, 0x09, 0x33, 0x99, 0x56, + 0x47, 0xf5, 0x84, 0xaa, 0xd8, 0xa0, 0x89, 0x8b, 0x7a, 0x42, 0x6a, 0xf2, 0xbd, 0x96, 0x51, 0x73, + 0x76, 0x2d, 0xa4, 0x09, 0x93, 0x09, 0xc7, 0x5a, 0x11, 0x65, 0x3e, 0xdf, 0x55, 0x17, 0x37, 0x26, + 0x19, 0x92, 0x33, 0xb3, 0xae, 0x24, 0x4b, 0xb2, 0x0e, 0x23, 0xea, 0xb8, 0x8f, 0xaf, 0xb3, 0xb2, + 0x4d, 0x1b, 0x73, 0x27, 0xc7, 0x95, 0xe9, 0xd8, 0xb4, 0x61, 0xf0, 0x8c, 0x19, 0x90, 0xdf, 0x82, + 0x6b, 0x6a, 0x8a, 0x6e, 0x05, 0xd9, 0x46, 0x20, 0x11, 0xe2, 0xf9, 0x46, 0x72, 0x86, 0xe7, 0xe1, + 0xef, 0xdd, 0x59, 0xec, 0x9d, 0x2b, 0xad, 0xf6, 0xd8, 0xdd, 0x59, 0x93, 0x9f, 0x95, 0xe0, 0x7c, + 0x4e, 0xad, 0x63, 0x58, 0x6b, 0x57, 0xcb, 0x1c, 0x2a, 0xf7, 0xf8, 0x6c, 0xc8, 0x6d, 0xc6, 0xcf, + 0xeb, 0xa4, 0x89, 0xce, 0xe8, 0x77, 0x4e, 0x4d, 0xe4, 0x1d, 0x18, 0xc4, 0x33, 0x72, 0x38, 0x37, + 0x8e, 0x5a, 0x24, 0x86, 0x67, 0xc1, 0x93, 0xb4, 0xbe, 0x6f, 0x08, 0x1c, 0xb2, 0xca, 0xb4, 0x31, + 0xdc, 0xb7, 0xa4, 0xf6, 0x24, 0x82, 0x39, 0x09, 0x8d, 0x9e, 0x17, 0xc9, 0x28, 0x17, 0x46, 0x2c, + 0x6f, 0x93, 0x6c, 0x11, 0x60, 0x38, 0x10, 0xab, 0xd2, 0x83, 0xfe, 0xe1, 0xfe, 0xf2, 0x00, 0xff, + 0x70, 0xa4, 0xc7, 0xf6, 0xef, 0x0e, 0xf3, 0xe7, 0x9d, 0xbb, 0x9e, 0xfb, 0xd8, 0x8d, 0x17, 0x30, + 0xdd, 0xba, 0x16, 0xa7, 0xd4, 0x10, 0xba, 0x6f, 0x4e, 0xf2, 0x0c, 0x65, 0x88, 0xeb, 0xed, 0x6a, + 0x88, 0xbb, 0xab, 0x5d, 0x59, 0x69, 0xf1, 0x0f, 0xb9, 0x8e, 0x63, 0x1a, 0xbe, 0xe2, 0xbb, 0xac, + 0xaf, 0x61, 0x10, 0x43, 0x16, 0xf2, 0xfb, 0xc0, 0xd1, 0x85, 0x9b, 0x62, 0xd9, 0x2e, 0x68, 0x3e, + 0x8f, 0x71, 0x28, 0x9e, 0x6c, 0x73, 0x89, 0x23, 0xc0, 0x90, 0x38, 0x42, 0xc8, 0x0e, 0x4c, 0x6d, + 0x07, 0xb4, 0x29, 0xfc, 0x86, 0xdb, 0x81, 0x30, 0x4e, 0x70, 0xb3, 0x07, 0x6e, 0xf9, 0x6d, 0x59, + 0x5c, 0xa7, 0xaa, 0x5c, 0xdf, 0x50, 0x33, 0xc8, 0xc9, 0x0a, 0x4c, 0xd4, 0xa8, 0x13, 0x34, 0x0e, + 0x1f, 0xd2, 0xe7, 0x4c, 0xdd, 0x31, 0xe2, 0xc8, 0x87, 0x58, 0xc2, 0xfa, 0x8b, 0x45, 0xba, 0x8f, + 0x87, 0x49, 0x44, 0x7e, 0x00, 0x83, 0x35, 0x3f, 0x88, 0x16, 0x9f, 0x8b, 0x45, 0x4d, 0xde, 0x18, + 0x71, 0xe0, 0xe2, 0x05, 0x19, 0x4b, 0x3f, 0xf4, 0x83, 0xa8, 0xbe, 0x6f, 0xc4, 0xfb, 0xe1, 0x28, + 0xe4, 0x39, 0x4c, 0x9b, 0x0b, 0x8a, 0x70, 0x67, 0x1d, 0x16, 0x6a, 0x56, 0xd6, 0xaa, 0xc5, 0x51, + 0x16, 0xaf, 0x0b, 0xee, 0x57, 0x93, 0xcb, 0xd6, 0x63, 0x2c, 0xd7, 0x43, 0xf0, 0x64, 0xd1, 0x93, + 0x0d, 0x4c, 0x41, 0xc0, 0x7b, 0x54, 0x0d, 0xb9, 0x1b, 0xec, 0x48, 0x1c, 0x51, 0xaa, 0x83, 0x8b, + 0x12, 0x4a, 0xc2, 0x09, 0x93, 0x79, 0x2b, 0xec, 0x14, 0x29, 0xd9, 0x86, 0x73, 0xbb, 0x21, 0xdd, + 0x0e, 0xe8, 0x53, 0x97, 0x3e, 0x93, 0xfc, 0x20, 0x0e, 0xbf, 0xc3, 0xf8, 0xb5, 0x79, 0x69, 0x16, + 0xc3, 0x34, 0x31, 0xf9, 0x10, 0x60, 0xdb, 0xf5, 0x3c, 0xda, 0xc4, 0x6b, 0xc7, 0x51, 0x64, 0x85, + 0x26, 0xd5, 0x36, 0x42, 0xeb, 0xbe, 0xd7, 0xd2, 0x45, 0xaa, 0x21, 0x93, 0x45, 0x18, 0x5f, 0xf3, + 0x1a, 0xad, 0x8e, 0x70, 0x0f, 0x08, 0x71, 0x41, 0x11, 0x61, 0xc1, 0x5c, 0x5e, 0x50, 0x4f, 0x7d, + 0xe4, 0x26, 0x09, 0x79, 0x08, 0x44, 0x00, 0xc4, 0xac, 0x75, 0xf6, 0x5b, 0x54, 0x7c, 0xee, 0x68, + 0x2a, 0x91, 0x8c, 0x70, 0xba, 0x1b, 0xd1, 0xb6, 0x52, 0x64, 0xf3, 0x1f, 0xc2, 0xa8, 0x36, 0xe7, + 0x33, 0x62, 0x10, 0x4c, 0xeb, 0x31, 0x08, 0x46, 0xf4, 0x58, 0x03, 0xff, 0x6f, 0x09, 0x2e, 0x65, + 0x7f, 0x4b, 0x42, 0x01, 0xdb, 0x82, 0x11, 0x05, 0x54, 0xaf, 0x4e, 0xa4, 0xea, 0x9f, 0xd0, 0x80, + 0xf8, 0x07, 0x2d, 0x57, 0x1e, 0xbd, 0xf7, 0x31, 0x8f, 0x17, 0xb0, 0xc7, 0xff, 0x6f, 0xc3, 0x30, + 0x8d, 0xde, 0xd5, 0xc9, 0x75, 0xea, 0x33, 0x8c, 0x25, 0x82, 0x30, 0xcd, 0xbc, 0x2c, 0x2c, 0x4d, + 0x1c, 0x9e, 0x8c, 0xea, 0x64, 0x10, 0x90, 0xf7, 0x74, 0x9f, 0x88, 0x5e, 0x2d, 0xe9, 0x81, 0x04, + 0xea, 0x5d, 0x88, 0x9d, 0x25, 0xde, 0x36, 0xae, 0xe4, 0x4f, 0xbd, 0xe8, 0xf5, 0x9f, 0x76, 0xd1, + 0xdb, 0x55, 0x8b, 0x1e, 0x8f, 0x51, 0xf1, 0x96, 0xb6, 0xe8, 0xbd, 0xfa, 0xd5, 0x6e, 0xf0, 0x55, + 0xaf, 0x76, 0x43, 0x2f, 0xb7, 0xda, 0x0d, 0xbf, 0xe0, 0x6a, 0x77, 0x0f, 0x26, 0x36, 0x29, 0x6d, + 0x6a, 0x17, 0x25, 0x23, 0xf1, 0xee, 0xe9, 0x51, 0x34, 0x81, 0x65, 0xdd, 0x96, 0x24, 0xa8, 0x72, + 0x57, 0x4d, 0xf8, 0x87, 0x59, 0x35, 0x47, 0x5f, 0xf1, 0xaa, 0x39, 0xf6, 0x32, 0xab, 0x66, 0x6a, + 0xe9, 0x1b, 0x3f, 0xf3, 0xd2, 0xf7, 0x32, 0xab, 0xd5, 0xa7, 0xe8, 0x52, 0x58, 0xab, 0xad, 0x0a, + 0xef, 0x11, 0xcd, 0x5d, 0x63, 0xd5, 0x0f, 0xa5, 0xc7, 0x35, 0xfe, 0xcd, 0x60, 0xdb, 0x7e, 0x20, + 0xaf, 0xbc, 0xf1, 0x6f, 0x6b, 0x11, 0x1d, 0x09, 0x75, 0x7a, 0xe5, 0xae, 0x3f, 0x24, 0x9e, 0xec, + 0x89, 0x35, 0x2e, 0x79, 0x8c, 0xb2, 0x65, 0xb9, 0xf5, 0x37, 0x25, 0x7e, 0x29, 0xf9, 0x3f, 0xe2, + 0x52, 0xf9, 0x32, 0x17, 0x85, 0xbf, 0x13, 0x3f, 0xe5, 0x17, 0x61, 0x07, 0x02, 0xa7, 0xf1, 0x24, + 0xbe, 0xa9, 0xfd, 0x11, 0xfb, 0xce, 0xf5, 0x02, 0x8c, 0x1a, 0x1a, 0x9f, 0x15, 0xcd, 0xc2, 0xbd, + 0x3b, 0x72, 0x01, 0x10, 0x11, 0x0d, 0x38, 0xd8, 0x5c, 0x00, 0x74, 0x02, 0xf4, 0x95, 0x9b, 0xb4, + 0x6c, 0xfe, 0x12, 0x3d, 0xb3, 0x05, 0xef, 0xa7, 0xdf, 0x52, 0xe3, 0x61, 0x24, 0x7e, 0x4b, 0xad, + 0x8b, 0x31, 0x7e, 0x55, 0xbd, 0x0b, 0x17, 0x6d, 0x7a, 0xe4, 0x3f, 0xa5, 0xaf, 0x96, 0xed, 0x0f, + 0xe1, 0x82, 0xc9, 0x90, 0xbf, 0xba, 0xe1, 0xd1, 0xbe, 0x3f, 0xcd, 0x8e, 0x11, 0x2e, 0x08, 0x78, + 0x8c, 0x70, 0x1e, 0x6a, 0x98, 0xfd, 0xa9, 0xef, 0x1b, 0x58, 0x66, 0xf9, 0x70, 0xc9, 0x64, 0x5e, + 0x6d, 0x36, 0x31, 0xc1, 0x5c, 0xc3, 0x6d, 0x3b, 0x5e, 0x44, 0xb6, 0x60, 0x54, 0xfb, 0x99, 0x30, + 0x15, 0x68, 0x25, 0x42, 0xa7, 0x89, 0x01, 0x46, 0x7c, 0xc9, 0x18, 0x6c, 0x51, 0xa8, 0x24, 0xc5, + 0xc3, 0x44, 0xa6, 0xd7, 0xb9, 0x08, 0xe3, 0xda, 0x4f, 0x65, 0xb2, 0xc4, 0x8f, 0x5f, 0xab, 0xc1, + 0x14, 0x98, 0x49, 0x62, 0x35, 0x60, 0x3e, 0x4b, 0x68, 0x18, 0x9d, 0xe9, 0x39, 0x59, 0x89, 0xe3, + 0x3c, 0x75, 0xf7, 0xb6, 0x9b, 0xcc, 0x8b, 0xf1, 0x64, 0xfd, 0x9f, 0xfd, 0x70, 0x51, 0x0c, 0xc6, + 0xab, 0x1c, 0x71, 0xf2, 0x63, 0x18, 0xd5, 0xc6, 0x58, 0x08, 0xfd, 0xaa, 0x8c, 0x2b, 0x99, 0x37, + 0x17, 0xb8, 0x49, 0xa3, 0x83, 0x80, 0x7a, 0x62, 0xb8, 0x57, 0x7b, 0x6c, 0x9d, 0x25, 0x69, 0xc1, + 0x84, 0x39, 0xd0, 0xc2, 0xaa, 0xf3, 0x5a, 0x66, 0x25, 0x26, 0xaa, 0x8c, 0x52, 0xdc, 0xac, 0x67, + 0x0e, 0xf7, 0x6a, 0x8f, 0x9d, 0xe0, 0x4d, 0xbe, 0x81, 0x73, 0xa9, 0x51, 0x16, 0xc6, 0xba, 0x37, + 0x33, 0x2b, 0x4c, 0x61, 0x73, 0x73, 0x6c, 0x80, 0xe0, 0xdc, 0x6a, 0xd3, 0x95, 0x90, 0x26, 0x8c, + 0xe9, 0x03, 0x2f, 0xcc, 0x4e, 0xd7, 0x0a, 0x44, 0xc9, 0x11, 0xb9, 0x72, 0x27, 0x64, 0x89, 0x63, + 0xff, 0xdc, 0x34, 0x31, 0x1b, 0xc8, 0xc3, 0x30, 0xc8, 0x7f, 0xb3, 0x25, 0x60, 0x3b, 0xa0, 0x21, + 0xf5, 0x1a, 0xd4, 0x70, 0xd0, 0x7e, 0xc9, 0x25, 0xe0, 0x9f, 0x97, 0x60, 0x2e, 0x8b, 0x6f, 0x8d, + 0x7a, 0x4d, 0xb2, 0x0d, 0xe5, 0x64, 0x45, 0x62, 0x56, 0x5b, 0x2a, 0x10, 0x6c, 0x6e, 0x93, 0x56, + 0x7b, 0xec, 0x14, 0x35, 0xd9, 0x84, 0x73, 0x1a, 0x4c, 0x18, 0x57, 0x7b, 0x4f, 0x63, 0x5c, 0x65, + 0xa3, 0x90, 0x22, 0xd5, 0x6d, 0xd3, 0xab, 0xb8, 0x33, 0x2e, 0xfb, 0x47, 0x8e, 0xeb, 0x31, 0x45, + 0x57, 0x0b, 0xf5, 0x04, 0x31, 0x54, 0xc8, 0x86, 0x5b, 0x5b, 0x11, 0x2a, 0x1f, 0x94, 0x28, 0x14, + 0xeb, 0x13, 0x5c, 0xc1, 0x85, 0x8d, 0x8e, 0x3f, 0x4f, 0x55, 0xcc, 0xae, 0xc2, 0xc0, 0xce, 0x7a, + 0x6d, 0xa9, 0x2a, 0x1e, 0xbb, 0xf2, 0x10, 0x09, 0xad, 0xb0, 0xde, 0x70, 0x6c, 0x5e, 0x60, 0x7d, + 0x0c, 0xe4, 0x3e, 0x8d, 0x44, 0x24, 0x72, 0x45, 0xf7, 0x06, 0x0c, 0x09, 0x90, 0xa0, 0x44, 0xd7, + 0xb8, 0x96, 0xc0, 0x92, 0x65, 0xd6, 0xb6, 0x3c, 0x27, 0xb4, 0xa8, 0x13, 0x6a, 0x1b, 0xf3, 0x07, + 0x30, 0x1c, 0x08, 0x98, 0xd8, 0x97, 0x27, 0x54, 0xce, 0x06, 0x04, 0x73, 0x7b, 0xb6, 0xc4, 0xb1, + 0xd5, 0x5f, 0xd6, 0x3a, 0x86, 0x33, 0xd9, 0x5a, 0x5b, 0x5e, 0x62, 0x52, 0x15, 0xc2, 0x92, 0xc3, + 0x71, 0x0b, 0x7d, 0xc8, 0x23, 0xaa, 0x3f, 0x75, 0x45, 0xd1, 0xe0, 0x47, 0x2e, 0x82, 0xf8, 0x68, + 0x28, 0xd6, 0x5d, 0x15, 0x1c, 0x25, 0x83, 0x5b, 0x5e, 0xee, 0x81, 0x4d, 0x0c, 0xfb, 0x72, 0x1f, + 0xdd, 0x65, 0x5e, 0x45, 0x23, 0x1c, 0x98, 0xe7, 0xdb, 0x3c, 0xeb, 0x95, 0xc8, 0xba, 0xe5, 0xab, + 0xa5, 0x71, 0x09, 0x46, 0x14, 0x4c, 0xdd, 0x7d, 0x71, 0x59, 0x19, 0xf8, 0x7b, 0x77, 0xf9, 0xab, + 0xe0, 0x86, 0x62, 0x10, 0xd3, 0xb1, 0x2a, 0xf8, 0x77, 0xf7, 0x2d, 0x57, 0x11, 0xd2, 0x20, 0xfa, + 0x56, 0xab, 0x88, 0xe3, 0x02, 0x9d, 0xa5, 0x0a, 0x03, 0x7f, 0x6f, 0xe1, 0x34, 0x82, 0xfa, 0x96, + 0xab, 0x60, 0x82, 0xfa, 0xf6, 0xaa, 0xa0, 0x32, 0x80, 0x12, 0x9f, 0xa4, 0xa9, 0x4a, 0x56, 0xd2, + 0x95, 0x48, 0xc3, 0x75, 0x82, 0xa2, 0x70, 0x3c, 0x28, 0x5c, 0xe2, 0xc2, 0xfa, 0x15, 0x54, 0xc3, + 0x04, 0xf6, 0xed, 0x56, 0xf3, 0xff, 0x94, 0x78, 0x38, 0xa7, 0xda, 0x96, 0x96, 0xef, 0xce, 0x7b, + 0xec, 0x6b, 0x57, 0xf3, 0xda, 0xd7, 0xfe, 0xd0, 0xf5, 0x9a, 0xfa, 0xd5, 0xbc, 0xd3, 0x89, 0x0e, + 0x55, 0xb8, 0xe3, 0x27, 0xae, 0xd7, 0xb4, 0x93, 0xd8, 0xe4, 0x43, 0x18, 0xd7, 0x40, 0x4a, 0x5b, + 0xe3, 0x09, 0x11, 0x74, 0x72, 0xb7, 0x69, 0x9b, 0x98, 0xd6, 0xdf, 0x97, 0x60, 0x2a, 0x23, 0x0f, + 0x2b, 0x1a, 0x33, 0xf0, 0x14, 0xa4, 0x16, 0x2a, 0x91, 0x0d, 0x08, 0x23, 0x4b, 0x18, 0x9b, 0xa4, + 0x42, 0xc4, 0x50, 0xf0, 0x5a, 0xce, 0xd8, 0x5e, 0x2d, 0x2f, 0x55, 0x76, 0x9e, 0x58, 0x1d, 0x9d, + 0x84, 0x00, 0x71, 0x4b, 0x84, 0xd9, 0xb8, 0xc6, 0x54, 0x5a, 0x2d, 0xe1, 0xec, 0x2b, 0xc9, 0x78, + 0xab, 0x55, 0x63, 0xfd, 0x4e, 0x2f, 0x9c, 0xcf, 0xe8, 0x7f, 0x8d, 0x46, 0xff, 0x10, 0x22, 0x48, + 0xa4, 0xfd, 0xed, 0xfb, 0x15, 0xa5, 0xfd, 0xb5, 0xfe, 0x4d, 0x2f, 0x9c, 0xdf, 0x6d, 0x87, 0xf8, + 0xc2, 0x6a, 0xcd, 0x7b, 0x4a, 0xbd, 0xc8, 0x0f, 0x9e, 0xe3, 0xab, 0x10, 0xf2, 0x1e, 0x0c, 0xac, + 0xd2, 0x56, 0xcb, 0x17, 0xf3, 0xff, 0xb2, 0xf4, 0x8e, 0x48, 0x62, 0x23, 0xd2, 0x6a, 0x8f, 0xcd, + 0xb1, 0xc9, 0x87, 0x30, 0xb2, 0x4a, 0x9d, 0x20, 0xda, 0xa7, 0x8e, 0x3c, 0xb2, 0xc8, 0x34, 0x0d, + 0x1a, 0x89, 0x40, 0x58, 0xed, 0xb1, 0x63, 0x6c, 0xb2, 0xc0, 0x4e, 0xf3, 0xde, 0x81, 0x7a, 0x4d, + 0x9e, 0x53, 0x21, 0xc3, 0x59, 0xed, 0xb1, 0x11, 0x97, 0x6c, 0xc0, 0x78, 0xf5, 0x80, 0x7a, 0xd1, + 0x06, 0x8d, 0x9c, 0xa6, 0x13, 0x39, 0x42, 0xb5, 0x7d, 0x23, 0x8f, 0xd8, 0x40, 0x5e, 0xed, 0xb1, + 0x4d, 0x6a, 0xf2, 0x31, 0x0c, 0xdd, 0xf7, 0xfd, 0xe6, 0xfe, 0x73, 0x2a, 0xd4, 0xd5, 0x4a, 0x1e, + 0x23, 0x81, 0xb6, 0xda, 0x63, 0x4b, 0x8a, 0xc5, 0x01, 0xe8, 0xdb, 0x08, 0x0f, 0xac, 0xe3, 0x12, + 0xcc, 0x2d, 0xfb, 0xcf, 0xbc, 0x4c, 0xa9, 0x7e, 0xcf, 0x94, 0xaa, 0x64, 0x9f, 0x81, 0x9f, 0x90, + 0xeb, 0xbb, 0xd0, 0xbf, 0xed, 0x7a, 0x07, 0x09, 0x55, 0x30, 0x83, 0x8e, 0x61, 0xa1, 0x78, 0x5c, + 0xef, 0x80, 0xac, 0x4b, 0x1d, 0x5c, 0xd8, 0x1a, 0xfb, 0x0c, 0xc5, 0x3f, 0x83, 0x5a, 0xc7, 0x8e, + 0x75, 0x6d, 0xfe, 0x5b, 0x76, 0xf0, 0x6d, 0x98, 0xcd, 0xa9, 0x57, 0x3c, 0x0f, 0x67, 0x7d, 0xeb, + 0x47, 0xc5, 0xe6, 0x2d, 0x98, 0xc9, 0x1c, 0xbf, 0x14, 0xe2, 0xff, 0x9f, 0x35, 0x11, 0x79, 0xcf, + 0xe7, 0x60, 0x48, 0xa6, 0x02, 0xe2, 0xb6, 0x1f, 0xf9, 0x13, 0x1f, 0x48, 0xc9, 0x0f, 0x55, 0x06, + 0xf6, 0x90, 0xdf, 0xe3, 0x9e, 0x16, 0x48, 0x89, 0x7f, 0x4e, 0x1f, 0xbd, 0xc4, 0x47, 0xa3, 0x78, + 0xb1, 0x3a, 0x57, 0xfd, 0x30, 0xf2, 0x94, 0xe7, 0xad, 0xad, 0x7e, 0x93, 0x1b, 0x50, 0x96, 0xb9, + 0x0a, 0x44, 0x52, 0x14, 0x91, 0xa6, 0xd8, 0x4e, 0xc1, 0xc9, 0x07, 0x30, 0x9b, 0x84, 0xc9, 0x5e, + 0xf2, 0x17, 0x6e, 0x79, 0xc5, 0xd6, 0x5f, 0xf7, 0x62, 0xac, 0xeb, 0x82, 0x79, 0xcd, 0xa4, 0xbb, + 0x55, 0x13, 0xd2, 0xea, 0xdd, 0xaa, 0x91, 0x4b, 0x30, 0xb2, 0x55, 0x33, 0xf2, 0x29, 0xd9, 0x31, + 0x80, 0x35, 0x9b, 0x75, 0xa1, 0x1a, 0x34, 0x0e, 0xdd, 0x88, 0x36, 0xa2, 0x4e, 0x20, 0x56, 0x61, + 0x3b, 0x05, 0x27, 0x16, 0x8c, 0xdd, 0x6f, 0xb9, 0xfb, 0x0d, 0xc9, 0x8c, 0x8b, 0xc0, 0x80, 0x91, + 0x37, 0x61, 0x62, 0xcd, 0x0b, 0x23, 0xa7, 0xd5, 0xda, 0xa0, 0xd1, 0xa1, 0xdf, 0x14, 0x19, 0x21, + 0xed, 0x04, 0x94, 0xd5, 0xbb, 0xe4, 0x7b, 0x91, 0xe3, 0x7a, 0x34, 0xb0, 0x3b, 0x5e, 0xe4, 0x1e, + 0x51, 0xd1, 0xf7, 0x14, 0x9c, 0xbc, 0x0b, 0x33, 0x0a, 0xb6, 0x15, 0x34, 0x0e, 0x69, 0x18, 0x05, + 0x98, 0x65, 0x0d, 0x03, 0xfe, 0xd8, 0xd9, 0x85, 0x58, 0x43, 0xcb, 0xef, 0x34, 0x57, 0xbc, 0xa7, + 0x6e, 0xe0, 0x7b, 0x98, 0x78, 0x61, 0x58, 0xd4, 0x90, 0x80, 0x5b, 0x7f, 0x3c, 0x9c, 0xf9, 0xd9, + 0xbe, 0xcc, 0x1c, 0xfc, 0x12, 0xc6, 0x96, 0x9c, 0xb6, 0xb3, 0xef, 0xb6, 0xdc, 0xc8, 0x55, 0xe9, + 0xa8, 0xde, 0xeb, 0xf2, 0xcd, 0xcb, 0xec, 0x15, 0xb4, 0xa9, 0x13, 0xdb, 0x06, 0xab, 0xf9, 0xbf, + 0x1b, 0x84, 0x99, 0x4c, 0x3c, 0x72, 0x5d, 0xe4, 0xad, 0x52, 0xeb, 0xaa, 0xc8, 0xe4, 0x64, 0x27, + 0xc1, 0x6c, 0x2c, 0x11, 0xb4, 0xd4, 0xa2, 0x8e, 0xd7, 0x11, 0x79, 0x9c, 0x6c, 0x03, 0xc6, 0xc6, + 0x92, 0xe9, 0x0d, 0x1a, 0x33, 0x74, 0x9c, 0xb6, 0x13, 0x50, 0x72, 0x15, 0x46, 0x19, 0x44, 0xb2, + 0xea, 0xe7, 0x4f, 0xfc, 0x34, 0x10, 0xe3, 0xb4, 0xe9, 0x37, 0xa9, 0xc6, 0x69, 0x80, 0x73, 0x32, + 0xa1, 0x8c, 0x13, 0x83, 0x48, 0x4e, 0x83, 0x9c, 0x93, 0x06, 0x22, 0xaf, 0xc3, 0x78, 0xb5, 0xdd, + 0xd6, 0x18, 0x61, 0x02, 0x27, 0xdb, 0x04, 0x92, 0x2b, 0x00, 0xd5, 0x76, 0x5b, 0xb2, 0xc1, 0xe4, + 0x4c, 0xb6, 0x06, 0x21, 0x37, 0xe3, 0x70, 0x65, 0x1a, 0x2b, 0xbc, 0x4e, 0xb0, 0x33, 0x4a, 0x98, + 0x5c, 0x55, 0x6c, 0x27, 0xc1, 0x14, 0xb8, 0x5c, 0x13, 0x60, 0xf2, 0x09, 0x5c, 0x48, 0xf8, 0x5d, + 0x68, 0x15, 0xa0, 0xa9, 0xdf, 0xce, 0x47, 0x20, 0xef, 0xc3, 0xf9, 0x44, 0xa1, 0xac, 0x0e, 0xad, + 0xfa, 0x76, 0x4e, 0x29, 0xf9, 0x08, 0xe6, 0x12, 0xcf, 0xb6, 0xe3, 0x4a, 0xd1, 0x82, 0x6f, 0xe7, + 0x96, 0xb3, 0xaf, 0x2b, 0xf1, 0xfe, 0x4b, 0x54, 0x89, 0x97, 0x95, 0x76, 0x76, 0x21, 0x59, 0x85, + 0x4a, 0xa6, 0x2f, 0x8b, 0x56, 0x31, 0x26, 0x9d, 0xb2, 0xbb, 0xa1, 0x91, 0x45, 0xb8, 0x94, 0x89, + 0x22, 0x9b, 0x81, 0xa9, 0xa8, 0xec, 0x42, 0x1c, 0xb2, 0x00, 0xd3, 0xb1, 0x4f, 0x8f, 0xd6, 0x04, + 0xcc, 0x42, 0x65, 0x67, 0x96, 0x91, 0x77, 0xcc, 0xc7, 0xf9, 0xbc, 0x32, 0x4c, 0x42, 0x65, 0xa7, + 0x0b, 0xac, 0x93, 0x12, 0x5c, 0xca, 0xdc, 0x28, 0xa5, 0x3e, 0x3f, 0x9f, 0x54, 0x1c, 0xb5, 0xb5, + 0xe0, 0x06, 0xf4, 0xa3, 0x82, 0xcf, 0x6d, 0xc5, 0xd2, 0xd7, 0x14, 0xe9, 0x39, 0x2b, 0x56, 0x6a, + 0x23, 0x0e, 0xb9, 0xaf, 0xee, 0x06, 0xfb, 0xd0, 0x92, 0x71, 0x2b, 0xa9, 0x40, 0x65, 0x54, 0xae, + 0xdf, 0x11, 0xca, 0xdb, 0xc0, 0x97, 0xb9, 0x86, 0xf9, 0xeb, 0x12, 0x54, 0xba, 0xe8, 0x07, 0xaa, + 0x4f, 0xa5, 0x53, 0xf4, 0xe9, 0x81, 0xea, 0x13, 0x7f, 0x1b, 0xbb, 0x70, 0x3a, 0x1d, 0xe4, 0x55, + 0x77, 0xab, 0x03, 0x24, 0xad, 0x86, 0x92, 0xef, 0xc2, 0x48, 0xad, 0xb6, 0x6a, 0x38, 0xf4, 0xa5, + 0x2e, 0x87, 0x62, 0x0c, 0x72, 0xfb, 0x54, 0x1e, 0x7c, 0x9a, 0xff, 0x9e, 0xb5, 0x0c, 0x73, 0x79, + 0x1a, 0x24, 0x2e, 0x2c, 0x3c, 0xb6, 0x96, 0x76, 0xb1, 0xc4, 0x17, 0x16, 0x13, 0x6c, 0xbd, 0x0f, + 0xe7, 0x15, 0x35, 0x4f, 0xda, 0xa1, 0x3d, 0xfc, 0x17, 0xc7, 0x4e, 0x15, 0x60, 0x20, 0x06, 0x58, + 0x7f, 0xd5, 0x9f, 0x22, 0xac, 0x75, 0x8e, 0x8e, 0x9c, 0xe0, 0x39, 0xa9, 0x9a, 0x84, 0x7d, 0x5d, + 0x35, 0xfd, 0xc5, 0xfe, 0x9f, 0x1f, 0x57, 0x7a, 0x34, 0xee, 0x6c, 0x39, 0xc6, 0x8d, 0xdd, 0x6b, + 0x50, 0x7e, 0x25, 0xd5, 0xcb, 0x83, 0x1b, 0x19, 0x40, 0xb2, 0x07, 0xe3, 0x62, 0xcb, 0xc4, 0xdf, + 0x72, 0x6a, 0xdf, 0x4e, 0x4e, 0x6d, 0xa3, 0x79, 0x37, 0x0d, 0x12, 0x3e, 0x09, 0x4c, 0x36, 0xe4, + 0x4b, 0x98, 0x90, 0x0a, 0x92, 0x60, 0xcc, 0x9d, 0x88, 0xee, 0x14, 0x33, 0x36, 0x69, 0x38, 0xe7, + 0x04, 0x23, 0xd6, 0x64, 0xb9, 0xc6, 0x70, 0xce, 0x03, 0xa7, 0x69, 0xb2, 0x41, 0x22, 0x9a, 0x6c, + 0xc0, 0xe6, 0x7f, 0x00, 0x24, 0xdd, 0xaf, 0x6e, 0xb3, 0x78, 0x5c, 0x9b, 0xc5, 0xf3, 0x55, 0x98, + 0xca, 0xe8, 0xc0, 0x99, 0x58, 0xfc, 0x00, 0x48, 0xba, 0xa5, 0x67, 0xe1, 0x60, 0x5d, 0x87, 0x37, + 0x95, 0x08, 0xd4, 0x6c, 0x30, 0x78, 0x4a, 0xc3, 0xf3, 0x6f, 0xf7, 0x42, 0xa5, 0x0b, 0x2a, 0xf9, + 0xa3, 0x52, 0x52, 0xda, 0x7c, 0x36, 0x7e, 0x98, 0x94, 0x76, 0x36, 0x7d, 0x86, 0xd8, 0x17, 0x3f, + 0xfa, 0xd9, 0xdf, 0xbe, 0xb0, 0xc2, 0x9f, 0x1e, 0xb2, 0xb3, 0x4b, 0xab, 0x5f, 0x97, 0x96, 0x0d, + 0xd3, 0xc6, 0x51, 0xe9, 0x34, 0x7b, 0xc6, 0x15, 0x00, 0x91, 0xbf, 0x72, 0xdd, 0x3f, 0x10, 0xea, + 0x99, 0x06, 0xb1, 0xee, 0xc1, 0x4c, 0x82, 0xa7, 0x30, 0x86, 0x7f, 0x17, 0xd4, 0x03, 0x6f, 0x64, + 0xda, 0xb7, 0x78, 0xee, 0x97, 0xc7, 0x95, 0x71, 0xa6, 0x49, 0xdf, 0x8c, 0xe3, 0xc7, 0xcb, 0xbf, + 0xac, 0x0d, 0xdd, 0x9c, 0x5f, 0x6d, 0xe9, 0x81, 0x6f, 0xc8, 0x1d, 0x18, 0xe4, 0x90, 0x44, 0x94, + 0x66, 0x1d, 0x5b, 0xac, 0x09, 0x02, 0xd1, 0x9a, 0xc1, 0xe7, 0xa8, 0xf8, 0xa3, 0x1a, 0x87, 0x4f, + 0xb0, 0x76, 0x79, 0xd6, 0x92, 0x18, 0xac, 0x22, 0x41, 0xf7, 0x57, 0xe3, 0x30, 0x0f, 0xd2, 0xf7, + 0x42, 0xe2, 0x79, 0xfe, 0xb3, 0x16, 0x6d, 0xf2, 0x74, 0x67, 0x8b, 0x63, 0xc2, 0xf7, 0xa2, 0xdf, + 0x61, 0x0c, 0x90, 0xcc, 0xfa, 0x0c, 0x66, 0xd8, 0x06, 0x1d, 0x24, 0xeb, 0xc3, 0x5c, 0x05, 0x0c, + 0x66, 0x3a, 0xb4, 0x3b, 0x0c, 0x84, 0x0e, 0xed, 0xa2, 0xd0, 0x5a, 0x87, 0x0b, 0xdc, 0x18, 0xa8, + 0x77, 0x29, 0x36, 0xbd, 0x0f, 0xe0, 0xef, 0xc4, 0x63, 0xc6, 0x8c, 0xde, 0x73, 0x3c, 0xeb, 0x53, + 0x7c, 0x2d, 0x23, 0x26, 0xa9, 0xeb, 0x7b, 0xb1, 0xe5, 0xef, 0x74, 0xcf, 0x6b, 0xff, 0x67, 0xb8, + 0x54, 0x6d, 0xb7, 0xa9, 0xd7, 0x8c, 0x09, 0x77, 0x02, 0xe7, 0x94, 0xc1, 0x0f, 0x48, 0x15, 0x06, + 0x10, 0x5b, 0xdd, 0x5b, 0x8a, 0xe6, 0x66, 0x34, 0x07, 0xf1, 0x44, 0xd8, 0x4e, 0xac, 0x80, 0x53, + 0x5a, 0x4d, 0x98, 0xad, 0x75, 0xf6, 0x8f, 0xdc, 0x08, 0xdd, 0xe0, 0x31, 0x80, 0x88, 0xac, 0x7b, + 0x4d, 0x26, 0x9a, 0xe2, 0xc2, 0xb8, 0x1e, 0xbf, 0xaa, 0x40, 0x4f, 0x7a, 0x11, 0x54, 0xe4, 0xe9, + 0x9d, 0x9b, 0x31, 0x29, 0x5a, 0x3d, 0x78, 0x2d, 0x58, 0x2c, 0x92, 0x51, 0x59, 0x53, 0x70, 0x4e, + 0xbf, 0x03, 0xe2, 0x33, 0x64, 0x06, 0xa6, 0xcc, 0xbb, 0x1d, 0x0e, 0xfe, 0x1a, 0xa6, 0xb9, 0xed, + 0x99, 0x87, 0xdd, 0x5e, 0x88, 0x23, 0x4c, 0xf7, 0xee, 0x2d, 0x24, 0xfc, 0xef, 0xd1, 0x2d, 0x57, + 0x25, 0x54, 0xd8, 0x5b, 0xe0, 0x2f, 0x1e, 0x9f, 0x2e, 0x18, 0x37, 0x88, 0xbd, 0x7b, 0x0b, 0x8b, + 0x43, 0x22, 0x7c, 0x29, 0xe3, 0xce, 0x87, 0xff, 0x5b, 0xe1, 0xbe, 0x80, 0x8f, 0xec, 0x57, 0xa9, + 0x83, 0x0f, 0x62, 0xb2, 0x9f, 0x2a, 0x4f, 0x40, 0xaf, 0xdb, 0x94, 0xa7, 0x75, 0xb7, 0x69, 0xfd, + 0x79, 0x09, 0xae, 0x73, 0x1d, 0x28, 0x9b, 0x0e, 0x2f, 0x7a, 0x72, 0x88, 0xc9, 0x07, 0xc0, 0x53, + 0x92, 0x0b, 0x45, 0xd3, 0x12, 0x2d, 0x2f, 0xe2, 0xc4, 0x09, 0x48, 0x15, 0xc6, 0xf4, 0x27, 0x25, + 0xa7, 0x0b, 0x0f, 0x67, 0x8f, 0x1e, 0x3d, 0x76, 0xd4, 0x33, 0x93, 0x27, 0x70, 0x71, 0xe5, 0x1b, + 0x36, 0x21, 0xc4, 0xee, 0x24, 0x14, 0xf6, 0xf8, 0x29, 0xec, 0xe4, 0x8e, 0x98, 0x31, 0xe6, 0x69, + 0x3a, 0x09, 0x66, 0x47, 0x53, 0xb9, 0xc1, 0x29, 0xad, 0x79, 0xc4, 0x36, 0x60, 0xd6, 0x5f, 0x95, + 0xe0, 0x52, 0x76, 0x6d, 0x62, 0x61, 0x59, 0x83, 0x73, 0x4b, 0x8e, 0xe7, 0x7b, 0x6e, 0xc3, 0x69, + 0xd5, 0x1a, 0x87, 0xb4, 0xd9, 0x51, 0x41, 0x4e, 0xd5, 0x2a, 0x73, 0x40, 0x3d, 0x49, 0x2e, 0x51, + 0xec, 0x34, 0x15, 0x3b, 0x94, 0xe1, 0xab, 0x04, 0xbe, 0xf6, 0xb6, 0x68, 0xa0, 0xf8, 0xf1, 0x96, + 0xe5, 0x94, 0x92, 0xdb, 0xd2, 0xc8, 0xde, 0xdc, 0xf5, 0xdc, 0x48, 0x11, 0x71, 0xeb, 0x4a, 0x56, + 0x91, 0xf5, 0xaf, 0x4a, 0x70, 0x01, 0xf3, 0x1a, 0x19, 0x99, 0x12, 0xe3, 0x58, 0xbf, 0x32, 0x5c, + 0x6d, 0xc9, 0x78, 0x65, 0x61, 0x60, 0x9b, 0x71, 0x6b, 0xc9, 0x3b, 0xd0, 0x5f, 0x93, 0x4e, 0x52, + 0x13, 0x89, 0x1c, 0xab, 0x32, 0x9f, 0xbd, 0x1f, 0x44, 0x36, 0x62, 0xb1, 0x3d, 0x67, 0x99, 0x86, + 0x0d, 0xea, 0x61, 0x32, 0x5c, 0x7e, 0xd8, 0xd7, 0x20, 0x71, 0xa8, 0xa2, 0xfe, 0xbc, 0x50, 0x45, + 0x03, 0x66, 0xa8, 0x22, 0xeb, 0x29, 0xcf, 0x6a, 0x94, 0xec, 0x90, 0x18, 0xa4, 0x4f, 0x53, 0xb9, + 0x73, 0xf9, 0x3e, 0x70, 0x3e, 0xab, 0x67, 0x7b, 0x77, 0x53, 0x69, 0x71, 0xf3, 0x63, 0xeb, 0x6e, + 0xc3, 0xeb, 0x06, 0x6e, 0xb5, 0xd5, 0xf2, 0x9f, 0xd1, 0xe6, 0x76, 0xe0, 0x1f, 0xf9, 0x91, 0x91, + 0xd5, 0x45, 0x24, 0x8f, 0x8e, 0xaf, 0x51, 0xc4, 0xac, 0x4c, 0x80, 0xad, 0xff, 0x09, 0xde, 0xe8, + 0xc2, 0x51, 0x74, 0xaa, 0x06, 0xe7, 0x9c, 0x44, 0x99, 0xf4, 0x76, 0x79, 0x23, 0xab, 0x5f, 0x49, + 0x46, 0xa1, 0x9d, 0xa6, 0xbf, 0xb1, 0x63, 0xe4, 0x9b, 0x25, 0x73, 0x30, 0xbd, 0x6d, 0x6f, 0x2d, + 0xef, 0x2e, 0xed, 0xd4, 0x77, 0xbe, 0xdc, 0x5e, 0xa9, 0xef, 0x6e, 0x3e, 0xdc, 0xdc, 0x7a, 0xb4, + 0xc9, 0x83, 0x53, 0x1b, 0x25, 0x3b, 0x2b, 0xd5, 0x8d, 0x72, 0x89, 0x4c, 0x43, 0xd9, 0x00, 0xaf, + 0xec, 0x2e, 0x96, 0x7b, 0x6f, 0x7c, 0x6d, 0xe4, 0x51, 0x25, 0x97, 0x60, 0xae, 0xb6, 0xbb, 0xbd, + 0xbd, 0x65, 0x2b, 0xae, 0x7a, 0x68, 0xec, 0x19, 0x38, 0x67, 0x94, 0xde, 0xb3, 0x57, 0x56, 0xca, + 0x25, 0xd6, 0x14, 0x03, 0xbc, 0x6d, 0xaf, 0x6c, 0xac, 0xed, 0x6e, 0x94, 0x7b, 0x6f, 0xd4, 0xf5, + 0xa7, 0x5d, 0xe4, 0x22, 0xcc, 0x2e, 0xaf, 0xec, 0xad, 0x2d, 0xad, 0x64, 0xf1, 0x9e, 0x86, 0xb2, + 0x5e, 0xb8, 0xb3, 0xb5, 0xb3, 0xcd, 0x59, 0xeb, 0xd0, 0x47, 0x2b, 0x8b, 0xd5, 0xdd, 0x9d, 0xd5, + 0xcd, 0x72, 0x9f, 0xd5, 0x3f, 0xdc, 0x5b, 0xee, 0xbd, 0xf1, 0x63, 0xe3, 0xdd, 0x17, 0x6b, 0xbe, + 0x40, 0xdf, 0xad, 0x55, 0xef, 0xe7, 0x57, 0xc1, 0x4b, 0x37, 0xee, 0x55, 0xcb, 0x25, 0x72, 0x19, + 0x2e, 0x18, 0xd0, 0xed, 0x6a, 0xad, 0xf6, 0x68, 0xcb, 0x5e, 0x5e, 0x5f, 0xa9, 0xd5, 0xca, 0xbd, + 0x37, 0xf6, 0x8c, 0xf0, 0x6c, 0xac, 0x86, 0x8d, 0x7b, 0xd5, 0xba, 0xbd, 0xf2, 0xf9, 0xee, 0x9a, + 0xbd, 0xb2, 0x9c, 0xae, 0xc1, 0x28, 0xfd, 0x72, 0xa5, 0x56, 0x2e, 0x91, 0x29, 0x98, 0x34, 0xa0, + 0x9b, 0x5b, 0xe5, 0xde, 0x1b, 0x6f, 0x8a, 0x08, 0x5e, 0x64, 0x02, 0x60, 0x79, 0xa5, 0xb6, 0xb4, + 0xb2, 0xb9, 0xbc, 0xb6, 0x79, 0xbf, 0xdc, 0x43, 0xc6, 0x61, 0xa4, 0xaa, 0x7e, 0x96, 0x6e, 0x7c, + 0x04, 0x93, 0x89, 0x13, 0x35, 0xc3, 0x50, 0x87, 0xd1, 0x72, 0x0f, 0x8a, 0x5f, 0xfe, 0x44, 0xb3, + 0x26, 0x3f, 0x1c, 0x97, 0x4b, 0x37, 0x16, 0x65, 0xea, 0x53, 0xed, 0x3b, 0x27, 0xa3, 0x30, 0xb4, + 0xbc, 0x72, 0xaf, 0xba, 0xbb, 0xbe, 0x53, 0xee, 0x61, 0x3f, 0x96, 0xec, 0x95, 0xea, 0xce, 0xca, + 0x72, 0xb9, 0x44, 0x46, 0x60, 0xa0, 0xb6, 0x53, 0xdd, 0x59, 0x29, 0xf7, 0x92, 0x61, 0xe8, 0xdf, + 0xad, 0xad, 0xd8, 0xe5, 0xbe, 0x85, 0x3f, 0xf9, 0xa3, 0x12, 0xb7, 0xed, 0xc9, 0x37, 0x44, 0x5f, + 0x6b, 0x87, 0x49, 0xb1, 0xe4, 0x89, 0x3c, 0x8f, 0xb9, 0x27, 0x47, 0xd4, 0x02, 0xe6, 0x0b, 0x2e, + 0x3b, 0x10, 0xe1, 0x7a, 0xe9, 0x76, 0x89, 0xd8, 0xe8, 0x1c, 0x92, 0x38, 0x5b, 0x29, 0xce, 0xd9, + 0xc7, 0xdf, 0xf9, 0xcb, 0x85, 0x47, 0x32, 0xf2, 0x1b, 0x60, 0xe9, 0x3c, 0x73, 0x4e, 0x20, 0xdf, + 0x3d, 0xdd, 0x49, 0x43, 0xd6, 0xf9, 0xe6, 0xe9, 0xd0, 0xc9, 0x03, 0x18, 0x67, 0xba, 0xb9, 0x42, + 0x23, 0x17, 0x93, 0x84, 0xda, 0x71, 0x60, 0xfe, 0x52, 0x76, 0xa1, 0x4a, 0xc5, 0x32, 0x86, 0x1d, + 0xe1, 0x07, 0xeb, 0x90, 0xc8, 0x28, 0x0f, 0x12, 0xc2, 0x57, 0xfc, 0xf9, 0x73, 0x09, 0xf0, 0xde, + 0x9d, 0xdb, 0x25, 0x52, 0xc3, 0x10, 0x6b, 0x86, 0x92, 0x4f, 0xe4, 0xa3, 0xb6, 0xb4, 0xf6, 0xcf, + 0x5b, 0x53, 0x51, 0x89, 0x13, 0x73, 0x4e, 0x07, 0x9b, 0x40, 0xd2, 0xba, 0x33, 0xb9, 0x1a, 0xcf, + 0x83, 0x6c, 0xb5, 0x7a, 0xfe, 0x7c, 0xca, 0xe7, 0x6f, 0x85, 0x69, 0x4f, 0x64, 0x05, 0x26, 0xc4, + 0x13, 0x6e, 0xa1, 0xcd, 0x93, 0xa2, 0xf3, 0x40, 0x2e, 0x9b, 0xfb, 0x28, 0x27, 0x75, 0x22, 0x20, + 0xf3, 0x71, 0x3f, 0x92, 0xc7, 0x84, 0xf9, 0x8b, 0x99, 0x65, 0xa2, 0x7f, 0xf7, 0x60, 0xc2, 0x3c, + 0x5c, 0x10, 0x39, 0x40, 0x99, 0x67, 0x8e, 0xdc, 0x06, 0xd5, 0x61, 0x76, 0xc3, 0x71, 0xf1, 0x8a, + 0x42, 0x78, 0x96, 0x49, 0xbf, 0x30, 0x52, 0x29, 0x70, 0x14, 0xab, 0x51, 0xaf, 0xa9, 0x06, 0x21, + 0x2f, 0xac, 0x3a, 0x7e, 0x36, 0x35, 0xa9, 0x23, 0x9b, 0x7e, 0x75, 0xc4, 0x32, 0x93, 0xe1, 0x66, + 0xb9, 0x4a, 0xce, 0xe7, 0x79, 0xf7, 0x92, 0x0d, 0x54, 0xd2, 0x13, 0x1c, 0xb5, 0x39, 0x71, 0x66, + 0x76, 0x73, 0x18, 0x48, 0x40, 0xcb, 0x90, 0x2d, 0x0a, 0x43, 0x92, 0x23, 0xb8, 0x5c, 0x66, 0xb7, + 0x4b, 0xe4, 0x6b, 0xfc, 0xaa, 0x33, 0xd9, 0x3d, 0x72, 0xa3, 0x43, 0xa1, 0xfd, 0x5c, 0xcc, 0x64, + 0x20, 0x3e, 0x94, 0x02, 0xee, 0x36, 0x4c, 0x67, 0x39, 0x14, 0x2b, 0x81, 0x16, 0x78, 0x1b, 0xe7, + 0xce, 0x02, 0x9b, 0x1d, 0x35, 0x9a, 0xf9, 0x83, 0x54, 0xe0, 0xcf, 0x9a, 0xcb, 0xf3, 0x13, 0x98, + 0x60, 0xb3, 0xe4, 0x21, 0xa5, 0xed, 0x6a, 0xcb, 0x7d, 0x4a, 0x43, 0x22, 0xe3, 0xe3, 0x2a, 0x50, + 0x1e, 0xed, 0xf5, 0x12, 0xf9, 0x0e, 0x8c, 0x3e, 0x72, 0xa2, 0xc6, 0xa1, 0x88, 0x13, 0x29, 0xc3, + 0x48, 0x22, 0x6c, 0x5e, 0xfe, 0xc2, 0xc2, 0xdb, 0x25, 0xf2, 0x7d, 0x18, 0xba, 0x4f, 0x23, 0x7c, + 0x54, 0x7c, 0x4d, 0xf9, 0xd6, 0x71, 0xdb, 0xe4, 0x9a, 0xa7, 0x5e, 0xce, 0xc8, 0x06, 0x27, 0x0d, + 0xa8, 0xe4, 0x16, 0x00, 0x5f, 0x10, 0x90, 0x43, 0xb2, 0x78, 0x3e, 0xd5, 0x6c, 0x72, 0x9f, 0x29, + 0x0f, 0x2d, 0x1a, 0xd1, 0xd3, 0x56, 0x99, 0x27, 0xa3, 0x75, 0x98, 0x50, 0xd9, 0x6b, 0x36, 0x31, + 0x9c, 0x87, 0x95, 0x60, 0x16, 0x9e, 0x81, 0xdb, 0x47, 0xec, 0xab, 0xe0, 0xa9, 0x5b, 0x31, 0xee, + 0x03, 0xae, 0xa4, 0xb3, 0x7a, 0xf0, 0x08, 0x7d, 0x09, 0x95, 0x42, 0xe4, 0x68, 0x1a, 0xed, 0xaa, + 0x1f, 0x46, 0x26, 0xad, 0x82, 0x64, 0xd3, 0xfe, 0x3a, 0xcc, 0xeb, 0xf5, 0x9a, 0x81, 0x8a, 0xe3, + 0x35, 0x37, 0x2f, 0xfe, 0xf1, 0xfc, 0xb5, 0x02, 0x0c, 0x71, 0x7e, 0xeb, 0xfb, 0xdd, 0xde, 0x12, + 0x2e, 0x27, 0xcb, 0x30, 0x25, 0xeb, 0xda, 0x6a, 0x53, 0xaf, 0x56, 0x5b, 0xc5, 0x4c, 0x25, 0xd2, + 0x93, 0x43, 0x83, 0x49, 0xee, 0x24, 0x5d, 0xc4, 0xb6, 0x3e, 0x23, 0xbe, 0x03, 0x29, 0x8a, 0xfa, + 0x10, 0x6f, 0x7d, 0x99, 0x11, 0x74, 0x1f, 0x72, 0xa3, 0x92, 0xa1, 0xfc, 0xef, 0x2d, 0x90, 0x82, + 0x03, 0xd0, 0x7c, 0xce, 0x11, 0xe2, 0x76, 0x89, 0x7c, 0x09, 0x24, 0x7d, 0x24, 0x51, 0x22, 0xcc, + 0x3d, 0x7e, 0x29, 0x11, 0x16, 0x9c, 0x67, 0x56, 0x60, 0x4a, 0x45, 0x77, 0x89, 0xcb, 0x49, 0x4e, + 0x5b, 0x0a, 0x76, 0xb0, 0x99, 0x0c, 0x36, 0x7b, 0x0b, 0x05, 0x8c, 0x32, 0xe1, 0xe4, 0x33, 0x98, + 0x12, 0x73, 0xdf, 0x68, 0x4f, 0x59, 0x2d, 0x63, 0xe2, 0x70, 0x93, 0xdb, 0x92, 0x07, 0x30, 0x53, + 0x4b, 0x08, 0x9e, 0xfb, 0xb1, 0x5f, 0x30, 0x59, 0x20, 0xb0, 0x46, 0x23, 0x2e, 0xf9, 0x6c, 0x5e, + 0x0f, 0x81, 0x70, 0xdb, 0x92, 0x64, 0xf7, 0xd4, 0xa5, 0xcf, 0xc8, 0xe5, 0x44, 0xd3, 0x19, 0x10, + 0xd1, 0x70, 0x1d, 0xcc, 0xed, 0xd9, 0x0e, 0xcf, 0x5f, 0x8c, 0x50, 0xe3, 0x06, 0xfc, 0xaa, 0x41, + 0x60, 0x5c, 0xa2, 0x8b, 0x71, 0xbc, 0x90, 0x8b, 0x41, 0x7e, 0x0b, 0xa3, 0xb3, 0x16, 0x9f, 0xce, + 0xc8, 0x77, 0xb2, 0x0e, 0xd1, 0x39, 0xe7, 0xcb, 0xf9, 0x77, 0x4e, 0x87, 0xac, 0xce, 0xc3, 0xe3, + 0xf7, 0x69, 0xb4, 0xdd, 0xea, 0x1c, 0xb8, 0x98, 0xd9, 0x92, 0x28, 0xdb, 0x93, 0x02, 0x89, 0xe9, + 0x2d, 0x83, 0xa2, 0xc5, 0x05, 0x35, 0xfa, 0x13, 0xb2, 0x06, 0x65, 0xbe, 0x8d, 0x68, 0x2c, 0x2e, + 0xa7, 0x58, 0x08, 0x14, 0x27, 0x70, 0x8e, 0xc2, 0xdc, 0xd1, 0xba, 0xc5, 0x5d, 0x8e, 0x88, 0xfc, + 0xb4, 0x75, 0x3d, 0x75, 0xca, 0x80, 0xa9, 0x88, 0xf5, 0x6c, 0x44, 0x6c, 0x1a, 0xd2, 0x48, 0x86, + 0x81, 0xe1, 0x79, 0x4d, 0x5f, 0x8b, 0x75, 0x86, 0x74, 0x69, 0xbc, 0x82, 0x24, 0x42, 0x96, 0xed, + 0xdd, 0x25, 0x2a, 0xd7, 0x6b, 0x06, 0xd3, 0x37, 0x0d, 0xd5, 0xe6, 0x6c, 0x7c, 0xdf, 0xc5, 0xad, + 0x0c, 0x43, 0xdf, 0xcc, 0xc4, 0x6d, 0x63, 0xbf, 0x25, 0xd5, 0xb8, 0x46, 0xb5, 0xb7, 0x80, 0x2b, + 0x23, 0xdb, 0x6b, 0x99, 0x26, 0xdc, 0x09, 0x02, 0xea, 0x71, 0xe2, 0x3c, 0xb5, 0x25, 0x8b, 0xfa, + 0x53, 0x5c, 0xc1, 0x34, 0x6a, 0xfe, 0xdc, 0xae, 0x1b, 0x0b, 0x9e, 0x87, 0xe7, 0x76, 0x89, 0x7c, + 0x00, 0xc3, 0xa2, 0x8d, 0x8c, 0xc8, 0x68, 0x74, 0x58, 0xd0, 0x6a, 0xa4, 0x04, 0x2e, 0x24, 0x6c, + 0xb3, 0x89, 0x93, 0x37, 0xfa, 0xbc, 0xcd, 0x1f, 0xb0, 0x3d, 0xbb, 0xf9, 0x22, 0x94, 0x4b, 0x72, + 0xf3, 0x46, 0xca, 0x39, 0x15, 0x89, 0x45, 0x82, 0xba, 0xec, 0xb2, 0x9c, 0x09, 0x53, 0xbf, 0x31, + 0xe6, 0xa0, 0x0a, 0x1d, 0xa6, 0xd4, 0x6f, 0x03, 0xdc, 0x6d, 0xcb, 0x5e, 0x83, 0x72, 0xb5, 0x81, + 0x1b, 0x4a, 0x8d, 0x1e, 0x39, 0xed, 0x43, 0x3f, 0xa0, 0xea, 0xec, 0x93, 0x2c, 0x90, 0xbc, 0x66, + 0x94, 0x82, 0x22, 0x0a, 0xd6, 0xa9, 0x83, 0x81, 0x99, 0x67, 0x95, 0x86, 0x92, 0x28, 0xca, 0xa6, + 0x28, 0x38, 0xeb, 0x4c, 0x2f, 0xb1, 0xd3, 0x59, 0xeb, 0xe5, 0xd8, 0x7c, 0x84, 0x0b, 0x86, 0x42, + 0x0e, 0xd5, 0x0e, 0xa1, 0x40, 0xea, 0x54, 0x28, 0x5f, 0xde, 0x28, 0xd4, 0xaa, 0xbc, 0x7a, 0x8e, + 0xc5, 0x92, 0x47, 0x9d, 0x57, 0xfd, 0xf7, 0x60, 0x62, 0x85, 0x2d, 0xe8, 0x9d, 0xa6, 0xcb, 0x83, + 0xd1, 0x13, 0x33, 0xba, 0x78, 0x2e, 0xe1, 0xaa, 0x4c, 0x7d, 0x85, 0xa4, 0xc2, 0x82, 0x20, 0xf7, + 0x14, 0x0d, 0x26, 0xc7, 0x63, 0x5a, 0xb2, 0x15, 0xf9, 0x00, 0xf0, 0x84, 0x2f, 0x4c, 0x06, 0xb3, + 0x5c, 0xb1, 0xac, 0xb6, 0xdb, 0x2d, 0x69, 0xd9, 0xe6, 0x37, 0xf5, 0x6f, 0x18, 0x27, 0xd1, 0x54, + 0xb9, 0xe4, 0x9d, 0xd6, 0x3d, 0xbf, 0xd0, 0x52, 0xd1, 0xe6, 0xf0, 0xcc, 0x29, 0xef, 0x36, 0x17, + 0x55, 0xf8, 0xe8, 0x6a, 0xab, 0x95, 0x22, 0x0e, 0xc9, 0xdb, 0x26, 0xf7, 0x2c, 0x9c, 0x6e, 0x35, + 0xe0, 0x49, 0x9f, 0x2b, 0x6f, 0xd5, 0x76, 0x9b, 0x2f, 0x96, 0x57, 0xd4, 0x82, 0x61, 0x16, 0xa4, + 0x4f, 0xfa, 0xc9, 0x72, 0xb1, 0xb6, 0x3f, 0xc0, 0x69, 0x16, 0xe7, 0xab, 0x25, 0xfa, 0xb9, 0x39, + 0x99, 0xae, 0x57, 0xe9, 0x72, 0x89, 0x42, 0xb5, 0x4f, 0x4c, 0x26, 0x52, 0xf7, 0x2b, 0x03, 0x4f, + 0x2a, 0xa5, 0x3f, 0xe7, 0x77, 0x25, 0xaf, 0x58, 0x19, 0x5c, 0xcb, 0xc9, 0x9c, 0xe0, 0xaa, 0xcb, + 0x39, 0xb9, 0xe6, 0x55, 0x97, 0x73, 0x93, 0x89, 0x3f, 0x80, 0x72, 0x32, 0x1d, 0xb1, 0x62, 0x9a, + 0x93, 0xa7, 0x38, 0x77, 0x4c, 0xee, 0xc1, 0xb4, 0x3e, 0xa2, 0xaa, 0xdf, 0x79, 0xab, 0x7f, 0x1e, + 0x9f, 0x1d, 0x98, 0xc9, 0xcc, 0x1e, 0xac, 0xb6, 0xd8, 0xa2, 0xdc, 0xc2, 0xb9, 0x5c, 0x29, 0x9c, + 0xcf, 0x4e, 0x20, 0x4e, 0x5e, 0x37, 0xed, 0x07, 0xd9, 0xe9, 0x94, 0xe7, 0xdf, 0xe8, 0x82, 0x25, + 0x04, 0xfa, 0x35, 0xee, 0x80, 0xa9, 0x3a, 0xae, 0x69, 0x16, 0x85, 0x9c, 0x0a, 0xac, 0x22, 0x14, + 0x35, 0x07, 0xa6, 0x33, 0x8a, 0xf3, 0x45, 0xfc, 0x5a, 0x3e, 0xcf, 0x78, 0x62, 0xed, 0xc9, 0x28, + 0xc9, 0xb9, 0x92, 0x29, 0x4c, 0x34, 0x5d, 0x70, 0x24, 0x9d, 0x57, 0xf3, 0xe1, 0xf4, 0x4d, 0xce, + 0x37, 0x2f, 0x4d, 0x67, 0xa5, 0x37, 0x4f, 0x5a, 0x7f, 0xb2, 0xb2, 0x57, 0x2b, 0x31, 0x14, 0xe6, + 0x47, 0xdf, 0xe3, 0x96, 0x20, 0x93, 0xbb, 0x6e, 0x09, 0xca, 0x64, 0x7d, 0x35, 0x1f, 0x21, 0x9e, + 0x11, 0x46, 0xec, 0x75, 0xd1, 0x7f, 0xfd, 0x9c, 0x95, 0x9d, 0xd8, 0x5a, 0xcd, 0x88, 0x4c, 0x14, + 0xc1, 0xdd, 0x96, 0x1f, 0x5d, 0x8e, 0x58, 0x0a, 0x92, 0x7a, 0x17, 0x1c, 0x87, 0xe6, 0xe2, 0x81, + 0x4b, 0x34, 0xfb, 0xac, 0xc3, 0xf6, 0x35, 0x5c, 0xc8, 0x4d, 0xe0, 0x4d, 0xde, 0x4a, 0x7d, 0xd0, + 0x39, 0x92, 0xc8, 0x6f, 0xe9, 0xb8, 0x91, 0x7b, 0x5b, 0x99, 0xc2, 0x12, 0x69, 0xbe, 0x53, 0x2b, + 0x76, 0x46, 0x0e, 0xf0, 0xfb, 0xa8, 0xf9, 0x6a, 0x79, 0xbc, 0x73, 0xfb, 0x7a, 0x39, 0x8b, 0x4f, + 0x98, 0x5e, 0x53, 0xb5, 0x76, 0x49, 0x4d, 0x2c, 0x59, 0x70, 0x96, 0x35, 0xf5, 0x34, 0x4d, 0xcb, + 0xe3, 0xb3, 0x0c, 0xa3, 0x5a, 0x02, 0x70, 0x72, 0xc1, 0x10, 0x93, 0xb1, 0x4b, 0xce, 0x1b, 0x9d, + 0x33, 0x37, 0xc8, 0x25, 0xb4, 0x39, 0xab, 0x34, 0xe2, 0xb9, 0xad, 0xb8, 0x98, 0xe6, 0x61, 0xd8, + 0x9b, 0x95, 0x14, 0x78, 0x6b, 0x2e, 0x25, 0x85, 0x63, 0x34, 0x28, 0xbf, 0x4b, 0x44, 0x17, 0x4d, + 0x97, 0x26, 0xe5, 0x6b, 0xa8, 0x53, 0x22, 0xcb, 0x28, 0x26, 0x43, 0x91, 0x31, 0xf9, 0xce, 0x2b, + 0xe3, 0x99, 0x06, 0x2d, 0xb0, 0x65, 0x6c, 0xe3, 0xd3, 0x8e, 0x8c, 0x8c, 0xe8, 0x6a, 0x0d, 0x2d, + 0x4c, 0x98, 0x9e, 0xa1, 0x9d, 0xa9, 0x55, 0x39, 0x97, 0x63, 0x61, 0x8a, 0xf4, 0xdc, 0x96, 0xfe, + 0x48, 0x5b, 0x95, 0x53, 0x79, 0xcf, 0xc9, 0xf5, 0xa4, 0x6a, 0x96, 0x97, 0x1a, 0xbd, 0x60, 0xd5, + 0x9f, 0xce, 0x4a, 0x99, 0xae, 0x19, 0x80, 0x73, 0xf3, 0xa9, 0x67, 0x48, 0x41, 0x2d, 0x6f, 0x39, + 0xdc, 0x0a, 0x12, 0xa8, 0xe7, 0xb6, 0xf0, 0x2b, 0x6d, 0x79, 0x4b, 0x24, 0x3a, 0x57, 0x07, 0xee, + 0x2e, 0x99, 0xd0, 0x73, 0x79, 0x6f, 0xe2, 0x63, 0xa0, 0x74, 0x96, 0x72, 0xa5, 0xbb, 0x14, 0xe5, + 0x30, 0xcf, 0xb4, 0x0f, 0xcf, 0xa4, 0xbb, 0xc8, 0xf8, 0x9d, 0x4f, 0x58, 0x77, 0xbb, 0x35, 0x4c, + 0xad, 0xc3, 0x19, 0xd9, 0xcd, 0x13, 0xeb, 0x70, 0x7e, 0xfe, 0xf3, 0x82, 0x83, 0xce, 0x64, 0xcd, + 0x3d, 0xf0, 0xb4, 0xe4, 0xe4, 0xea, 0x98, 0x93, 0xce, 0x97, 0xae, 0x96, 0x98, 0xac, 0x5c, 0xe6, + 0x5b, 0x4c, 0xc3, 0xe1, 0xfa, 0xb9, 0x9e, 0x66, 0x9a, 0xcc, 0xe7, 0x67, 0xd7, 0x56, 0xcb, 0x4d, + 0x66, 0x5e, 0x6a, 0x8d, 0xa1, 0x9e, 0xe3, 0x59, 0x31, 0xcc, 0x48, 0x37, 0xad, 0x18, 0x66, 0x26, + 0x85, 0xbe, 0x85, 0x76, 0x15, 0xdb, 0x6f, 0x51, 0xdd, 0xae, 0xa2, 0x25, 0x0d, 0x4e, 0x98, 0x35, + 0xc8, 0xc7, 0x68, 0xd4, 0x28, 0xb6, 0x84, 0xcc, 0x9a, 0x9c, 0x74, 0xdf, 0x91, 0x11, 0x95, 0x91, + 0x59, 0x59, 0xd1, 0x93, 0x49, 0xa1, 0xe7, 0xe7, 0xd2, 0x05, 0x82, 0xfe, 0x3d, 0x69, 0x17, 0xc1, + 0x06, 0xcf, 0x99, 0xf6, 0xa4, 0xfc, 0x36, 0xbf, 0x27, 0x8d, 0x22, 0x06, 0x59, 0x2a, 0x1f, 0x73, + 0x92, 0xec, 0x7b, 0x30, 0x16, 0xe7, 0x5e, 0xde, 0x5b, 0xd0, 0x08, 0x13, 0x09, 0x99, 0x93, 0x84, + 0x1f, 0xc8, 0x8b, 0x13, 0xac, 0xcf, 0x2c, 0x2c, 0xb6, 0x9f, 0x7c, 0x2a, 0x8d, 0x30, 0x46, 0x4b, + 0x53, 0x99, 0x9c, 0x0b, 0x56, 0xee, 0x31, 0x3d, 0x61, 0xa4, 0x9a, 0x17, 0x19, 0x29, 0x5f, 0xd5, + 0xbc, 0xc8, 0x4a, 0xd9, 0x1a, 0x5f, 0x2c, 0x7c, 0x29, 0x2d, 0x0e, 0x31, 0xd3, 0xcb, 0x46, 0xb3, + 0x52, 0x7c, 0xaf, 0xe4, 0x15, 0x27, 0x59, 0xd7, 0xa0, 0x9c, 0xcc, 0x6e, 0xa9, 0x8e, 0x6b, 0x39, + 0x69, 0x48, 0xd5, 0x19, 0x30, 0x37, 0x2d, 0xe6, 0xb6, 0x34, 0x9f, 0x9b, 0x7c, 0xaf, 0x65, 0x37, + 0x4a, 0x67, 0x5d, 0xac, 0x96, 0xc5, 0x89, 0x2e, 0xf5, 0x83, 0x74, 0x2a, 0x91, 0xa6, 0xae, 0x96, + 0x65, 0xe4, 0xc6, 0x74, 0x65, 0x38, 0xa7, 0xec, 0x7c, 0xdb, 0x6f, 0x9b, 0x27, 0xdc, 0x82, 0xa8, + 0xe8, 0x5d, 0x2f, 0x99, 0xc9, 0xaf, 0xc1, 0x6c, 0x4e, 0x00, 0x69, 0xf2, 0x46, 0xc2, 0x10, 0x9b, + 0x1d, 0x60, 0x5a, 0x4d, 0x90, 0xcc, 0x0c, 0xd4, 0x1b, 0xe8, 0x9d, 0x60, 0x04, 0x6e, 0x48, 0xdd, + 0xf8, 0x3d, 0x72, 0xa3, 0x43, 0x9e, 0x68, 0x59, 0x5b, 0x73, 0x33, 0x23, 0x3e, 0x90, 0x1a, 0x9e, + 0x57, 0x0c, 0x68, 0xc6, 0xa5, 0x5f, 0x06, 0xc3, 0xf9, 0x6c, 0x86, 0x6c, 0xed, 0x60, 0x73, 0x21, + 0x23, 0xaa, 0x86, 0x9a, 0x0b, 0xf9, 0x11, 0x37, 0x72, 0x9b, 0xb9, 0x2d, 0x15, 0xac, 0x6c, 0x8e, + 0xf9, 0x01, 0x36, 0x72, 0x39, 0x3e, 0x60, 0x1c, 0x53, 0x31, 0x33, 0x48, 0x0e, 0x7a, 0xf1, 0xea, + 0x61, 0xcb, 0xfd, 0xda, 0xa4, 0x5a, 0xd0, 0xda, 0x97, 0x17, 0x9d, 0x23, 0xb7, 0x7d, 0x2b, 0xf2, + 0x7b, 0xca, 0x6e, 0xdf, 0x69, 0x77, 0x6c, 0x75, 0x3d, 0x96, 0x08, 0xdb, 0x62, 0x74, 0x54, 0x83, + 0xcf, 0xe7, 0xc0, 0xc9, 0x26, 0xba, 0x1b, 0x25, 0xa1, 0xda, 0xc1, 0x35, 0x3b, 0x2e, 0x4c, 0x2e, + 0x3f, 0x3e, 0x8f, 0x8d, 0xb8, 0x1a, 0x67, 0x99, 0xc7, 0x89, 0x80, 0x1c, 0x62, 0x1e, 0x1b, 0xd0, + 0xb3, 0xcd, 0xe3, 0x04, 0x43, 0x73, 0x1e, 0x27, 0x9b, 0x99, 0x34, 0x04, 0xe4, 0x8e, 0x6a, 0xb2, + 0x99, 0x6a, 0x1e, 0x67, 0x73, 0xcc, 0x8f, 0x7f, 0x92, 0xcb, 0x51, 0xcd, 0x63, 0x93, 0x63, 0x0e, + 0xfa, 0x29, 0xe7, 0x71, 0xb2, 0x12, 0x73, 0x1e, 0x9f, 0xa9, 0x7d, 0x6a, 0x1e, 0x67, 0xb7, 0xef, + 0xcc, 0xf3, 0x38, 0x11, 0x30, 0xc8, 0xe8, 0x68, 0xd6, 0x3c, 0x4e, 0xe2, 0xf3, 0x79, 0x9c, 0x84, + 0x26, 0x0c, 0x30, 0x05, 0xf3, 0x38, 0x49, 0xf9, 0x39, 0xf2, 0x4b, 0x04, 0x3b, 0x39, 0xcd, 0x4c, + 0xce, 0x8d, 0x93, 0x42, 0x1e, 0xa1, 0xf5, 0x2f, 0x01, 0x3f, 0xdd, 0x6c, 0xbe, 0x94, 0xc7, 0x14, + 0xe7, 0xf3, 0x9e, 0x14, 0x62, 0xb2, 0xb9, 0xa6, 0x69, 0x2b, 0x3b, 0xd6, 0x4b, 0x41, 0x83, 0xf7, + 0xd8, 0xbc, 0x69, 0x16, 0xf0, 0x2d, 0x0a, 0x55, 0x53, 0xc0, 0x57, 0x9d, 0x83, 0x92, 0x7c, 0x73, + 0x49, 0x8a, 0xe7, 0xf7, 0x17, 0xf2, 0xfe, 0x23, 0x49, 0xb7, 0x90, 0x38, 0x59, 0x9d, 0xb9, 0xa5, + 0xea, 0x84, 0x95, 0x6c, 0xe9, 0x59, 0xe7, 0xf9, 0x86, 0xd4, 0x1e, 0x52, 0x31, 0xae, 0x12, 0x9d, + 0xd6, 0xe7, 0x7a, 0x6e, 0x09, 0xd9, 0x41, 0x53, 0x6f, 0x1a, 0xae, 0x99, 0x89, 0xf3, 0x82, 0x69, + 0x75, 0xe5, 0x9a, 0x8a, 0xd6, 0xa3, 0x73, 0xcd, 0x0b, 0xe5, 0xa3, 0xb8, 0xa6, 0xa9, 0x3f, 0x43, + 0xd3, 0x99, 0x78, 0xd3, 0xe5, 0x3d, 0xf6, 0xf3, 0xcf, 0x39, 0x53, 0x86, 0x4b, 0x14, 0xc3, 0x45, + 0x4f, 0xb4, 0x4f, 0xc4, 0x05, 0x9f, 0x04, 0xe6, 0x0a, 0x3f, 0x8b, 0x9e, 0x7c, 0x06, 0x65, 0xb1, + 0xbc, 0xc5, 0x0c, 0xb2, 0x10, 0x73, 0x87, 0x6e, 0x51, 0x5a, 0xec, 0x4e, 0xd1, 0x82, 0xd3, 0x58, + 0xea, 0x4e, 0x23, 0x89, 0x7c, 0xb3, 0x16, 0xdb, 0x0e, 0x77, 0x82, 0x4e, 0x18, 0xd1, 0x66, 0xda, + 0x1c, 0x65, 0x36, 0x46, 0x3a, 0x4e, 0x98, 0xe8, 0x7b, 0x0b, 0x64, 0x0d, 0xd7, 0x36, 0x13, 0x5c, + 0x64, 0xaf, 0xcb, 0x66, 0x83, 0x4b, 0xcf, 0xaa, 0x7a, 0x3c, 0x64, 0xb6, 0x29, 0xaf, 0xee, 0xfc, + 0x46, 0x29, 0x11, 0x9d, 0xb2, 0x77, 0x79, 0x22, 0xe2, 0x07, 0x6a, 0x6e, 0x3b, 0xec, 0x26, 0x99, + 0xe4, 0x73, 0x26, 0xf2, 0x03, 0x18, 0x91, 0xc4, 0xdd, 0x05, 0x92, 0xa4, 0x46, 0x81, 0x2c, 0xc3, + 0xb8, 0xf1, 0x56, 0x4b, 0x9d, 0x6e, 0xb2, 0x5e, 0x70, 0x15, 0x8c, 0xf3, 0xb8, 0xf1, 0x26, 0x4b, + 0x71, 0xc9, 0x7a, 0xa9, 0x95, 0xcb, 0xe5, 0xfb, 0x30, 0x2a, 0x44, 0x5a, 0x28, 0x8d, 0x7c, 0x63, + 0xdd, 0x8c, 0xe6, 0xf7, 0xdc, 0x69, 0xba, 0xd1, 0x92, 0xef, 0x3d, 0x76, 0x0f, 0xba, 0x0a, 0x26, + 0x4d, 0xb2, 0xb7, 0x40, 0x7e, 0x88, 0x69, 0x89, 0x65, 0xb2, 0x68, 0x1a, 0x3d, 0xf3, 0x83, 0x27, + 0xae, 0x77, 0xd0, 0x85, 0xe5, 0x55, 0x93, 0x65, 0x92, 0x4e, 0xba, 0x96, 0xfc, 0x10, 0xe6, 0x6b, + 0xf9, 0xcc, 0xbb, 0x32, 0x29, 0xde, 0x5e, 0x6a, 0x70, 0x09, 0x9d, 0x6b, 0xce, 0xda, 0xf6, 0x42, + 0xa6, 0x5f, 0xf2, 0x30, 0x89, 0xd2, 0xd0, 0xdf, 0xf0, 0x83, 0x66, 0x77, 0x8e, 0x15, 0xd3, 0x5d, + 0x37, 0x41, 0x26, 0x85, 0xf1, 0x25, 0x5c, 0xa8, 0xe5, 0xb2, 0xee, 0xc6, 0xa2, 0x9b, 0x26, 0x79, + 0x11, 0x45, 0x71, 0xc6, 0x76, 0x17, 0xf2, 0x5c, 0xc3, 0x35, 0x8d, 0xed, 0x43, 0xdb, 0x01, 0x7d, + 0x4c, 0x03, 0x74, 0x0a, 0xef, 0xe6, 0x0e, 0x6d, 0xa2, 0xcb, 0x9e, 0xaf, 0xc1, 0xb9, 0x5a, 0x8a, + 0x55, 0x1e, 0x49, 0x71, 0xab, 0x1e, 0xc0, 0x14, 0xf6, 0xf4, 0x94, 0xed, 0xea, 0xe2, 0x44, 0x34, + 0x7a, 0x9f, 0x46, 0xbb, 0x6b, 0x5d, 0xa4, 0x24, 0x5f, 0x2d, 0x48, 0xc4, 0xbd, 0x3b, 0x8c, 0xb2, + 0xa6, 0x51, 0xa6, 0x31, 0x72, 0x3f, 0xde, 0x1f, 0xc8, 0x8b, 0x94, 0xae, 0xd5, 0xe6, 0x71, 0xb8, + 0x8b, 0x6b, 0xa1, 0x70, 0x8c, 0xd6, 0x4c, 0x90, 0x1c, 0x12, 0x9b, 0xea, 0x34, 0x1f, 0xe9, 0x90, + 0x54, 0xf9, 0xf1, 0x8f, 0x4f, 0x0f, 0x01, 0xbb, 0x92, 0x72, 0x98, 0x2f, 0x64, 0xc1, 0x4d, 0xa8, + 0xeb, 0x7e, 0xe3, 0x89, 0x6e, 0x42, 0xd5, 0x12, 0xd7, 0xcf, 0x9b, 0x69, 0xe5, 0xc5, 0x8a, 0x8f, + 0xb9, 0xe5, 0x75, 0xbf, 0x30, 0x3d, 0x75, 0xbd, 0x6e, 0x42, 0x35, 0x93, 0xec, 0xdf, 0x95, 0xb6, + 0x45, 0xac, 0xd0, 0xe4, 0x9c, 0x2b, 0x1a, 0x65, 0x56, 0x44, 0x22, 0xd3, 0xac, 0xa8, 0x37, 0x34, + 0xff, 0x22, 0x80, 0xa4, 0xb3, 0xec, 0xab, 0xc3, 0x4a, 0x6e, 0x02, 0xfe, 0x02, 0xf7, 0xae, 0x29, + 0xe1, 0x14, 0x64, 0x08, 0x5e, 0x85, 0x1a, 0x4e, 0x97, 0xc5, 0xa2, 0xd4, 0x7d, 0x95, 0x6e, 0x97, + 0xc8, 0x26, 0x9c, 0xbf, 0x4f, 0x23, 0xb1, 0xc6, 0xd9, 0x34, 0x8c, 0x02, 0xb7, 0x11, 0x15, 0xde, + 0x2a, 0xca, 0xb3, 0x49, 0x06, 0xcd, 0xde, 0xbb, 0x8c, 0x5f, 0x2d, 0x9b, 0x5f, 0x21, 0x5d, 0x81, + 0x07, 0xad, 0xb8, 0xaa, 0x38, 0x4b, 0x13, 0xf3, 0xa7, 0xf8, 0x10, 0x77, 0xd0, 0xc9, 0x27, 0x2d, + 0xc7, 0x71, 0x4d, 0xc4, 0x69, 0xeb, 0x26, 0x0c, 0x72, 0xa2, 0xdc, 0x0d, 0x75, 0x4c, 0xa7, 0x21, + 0x77, 0x60, 0x44, 0x79, 0xd8, 0x10, 0xa3, 0x28, 0xb7, 0x5d, 0x77, 0x60, 0x84, 0x1f, 0xad, 0x4e, + 0x4f, 0xf2, 0x31, 0x8c, 0x28, 0x97, 0x9c, 0x33, 0xef, 0xf4, 0x9f, 0xc1, 0xb8, 0xee, 0x9c, 0x73, + 0x76, 0x41, 0x7e, 0x1f, 0xef, 0x7e, 0xe5, 0x15, 0x4b, 0x3e, 0xfd, 0x4c, 0x22, 0x97, 0x97, 0x10, + 0x29, 0x5f, 0x20, 0x25, 0x30, 0xb7, 0xf9, 0xe7, 0x52, 0xd4, 0xe4, 0x63, 0xf9, 0x5e, 0x4a, 0x11, + 0xa7, 0x91, 0x0a, 0x64, 0x36, 0xc1, 0xc5, 0xfc, 0x22, 0xc4, 0x6a, 0x81, 0xed, 0xda, 0xec, 0xd3, + 0xdc, 0x51, 0x77, 0x17, 0x5d, 0x1e, 0x97, 0x2d, 0xd4, 0xd2, 0x52, 0x59, 0xe6, 0xf2, 0x19, 0x5d, + 0xc9, 0x4f, 0x4c, 0x87, 0x83, 0xf1, 0x00, 0x4f, 0x81, 0xa9, 0xd2, 0xdc, 0xee, 0x15, 0x24, 0xba, + 0x8b, 0x8f, 0xbd, 0x69, 0x76, 0x05, 0x64, 0x45, 0xa7, 0x68, 0xf1, 0x0a, 0xf4, 0x95, 0xb0, 0x5b, + 0x93, 0x3e, 0x8e, 0xa7, 0xef, 0x6c, 0x7e, 0xcb, 0x2e, 0x66, 0xdc, 0x8a, 0x77, 0x1d, 0x8b, 0x3c, + 0x76, 0xbf, 0x86, 0xda, 0x61, 0x66, 0xb8, 0xaf, 0x7c, 0x66, 0xd7, 0x35, 0xc7, 0x8a, 0x4c, 0x4a, + 0xb5, 0xe9, 0x3d, 0xc1, 0x87, 0x68, 0xd9, 0x79, 0xf8, 0xde, 0xec, 0xc2, 0x45, 0x4a, 0xe2, 0xad, + 0xae, 0x78, 0xea, 0x8e, 0xf5, 0x22, 0xdf, 0x61, 0xb3, 0xeb, 0xeb, 0x92, 0x57, 0x30, 0xe3, 0xda, + 0x5b, 0x39, 0x90, 0x66, 0x33, 0x34, 0x1d, 0x48, 0x0b, 0xfb, 0x90, 0x27, 0xfe, 0xcf, 0xa1, 0x12, + 0x7b, 0x8f, 0x9c, 0x6d, 0x10, 0xf2, 0xfd, 0x16, 0x49, 0x4a, 0x52, 0x21, 0x29, 0x4a, 0xb4, 0x33, + 0x7f, 0x2d, 0x4f, 0xc2, 0xa1, 0xe6, 0x96, 0x24, 0xfc, 0xde, 0x12, 0x19, 0x29, 0xf3, 0x72, 0x5b, + 0x16, 0xd8, 0x61, 0xc5, 0xcb, 0xbc, 0x57, 0xc2, 0x28, 0x3d, 0xda, 0x67, 0x67, 0xa4, 0x9c, 0x3b, + 0x12, 0x8c, 0xac, 0x82, 0xe1, 0x3d, 0x8b, 0xef, 0x5a, 0x72, 0x28, 0xce, 0x3a, 0xa0, 0x4e, 0xfc, + 0x1a, 0x2d, 0x11, 0x1d, 0x50, 0x7f, 0x01, 0x9c, 0x2e, 0x4a, 0x3e, 0xa5, 0xca, 0xc2, 0x50, 0x1e, + 0x55, 0x73, 0xb2, 0x0a, 0x06, 0x67, 0x47, 0x11, 0x3f, 0x70, 0xa3, 0xe7, 0x4b, 0xf6, 0x7a, 0x6c, + 0x56, 0xd0, 0x0b, 0x24, 0x6f, 0x90, 0x85, 0xf6, 0x3a, 0xf9, 0x0a, 0x97, 0x12, 0xc1, 0x7e, 0xd1, + 0xf7, 0xa3, 0x30, 0x0a, 0x9c, 0x76, 0xad, 0x11, 0xb8, 0xed, 0x28, 0xb7, 0xd3, 0xb1, 0x8b, 0x77, + 0x16, 0x99, 0xe6, 0x71, 0x2a, 0xa2, 0xc7, 0x67, 0xc5, 0xd7, 0x51, 0xaf, 0x6e, 0xb2, 0x0a, 0x0b, + 0x4e, 0x2e, 0x35, 0x19, 0x2f, 0xfe, 0x55, 0x32, 0xad, 0xc3, 0x6c, 0x4e, 0x54, 0x22, 0x75, 0x7b, + 0x5b, 0x1c, 0xb5, 0x68, 0xbe, 0xb8, 0x62, 0xf2, 0x43, 0x98, 0xc9, 0x0c, 0x5b, 0xa4, 0x2c, 0xd0, + 0x45, 0x41, 0x8d, 0xba, 0x31, 0x7f, 0x02, 0x73, 0xfc, 0xbd, 0x07, 0xba, 0x35, 0x1b, 0x11, 0x6c, + 0xe2, 0x57, 0x40, 0x39, 0x08, 0xc9, 0xf5, 0x3a, 0x1f, 0x4f, 0x3d, 0x69, 0x9f, 0xc6, 0xd0, 0x25, + 0x89, 0x84, 0xe7, 0xea, 0xc3, 0xcb, 0x2a, 0x2c, 0x7a, 0x6a, 0xb4, 0x0d, 0x33, 0x7b, 0x34, 0x70, + 0x1f, 0x3f, 0x4f, 0x32, 0x94, 0x92, 0xc9, 0x2c, 0x2d, 0xe2, 0xf8, 0x05, 0xcc, 0x2e, 0xf9, 0x47, + 0x6d, 0xf1, 0xa8, 0xcf, 0xe0, 0xa9, 0xae, 0xe2, 0xb3, 0xcb, 0xbb, 0x3b, 0x42, 0xcd, 0xe7, 0xa7, + 0xa6, 0x57, 0xfe, 0x6f, 0x5d, 0xb3, 0xd7, 0xab, 0xa7, 0x69, 0x26, 0xfd, 0x0e, 0x4e, 0xc2, 0xac, + 0x5c, 0xf5, 0xfa, 0x24, 0x2c, 0xc8, 0x65, 0x9f, 0xf3, 0x44, 0x6c, 0x36, 0x27, 0x3d, 0x7d, 0x01, + 0xd7, 0x53, 0xb4, 0x76, 0x53, 0xee, 0x2d, 0x66, 0x22, 0xef, 0x84, 0x4f, 0x75, 0x66, 0x96, 0xef, + 0xcc, 0x76, 0x6a, 0xb1, 0x1b, 0x5a, 0xad, 0x02, 0x15, 0x8b, 0xe8, 0xc1, 0x1b, 0x18, 0x26, 0x1a, + 0xf1, 0xc7, 0x75, 0xda, 0xa2, 0xd5, 0x3a, 0x45, 0x8c, 0x4a, 0xed, 0x47, 0x30, 0x56, 0xd3, 0x2b, + 0xcf, 0xa8, 0x24, 0x77, 0x52, 0xa8, 0x47, 0x42, 0xdd, 0xdb, 0x5e, 0xe0, 0x48, 0xaa, 0x36, 0x9e, + 0x53, 0xf5, 0x22, 0xd7, 0x75, 0xc6, 0xc8, 0xca, 0xa6, 0x76, 0x81, 0xac, 0xa4, 0x89, 0xca, 0x75, + 0x26, 0x3b, 0x91, 0x5b, 0x9d, 0xe7, 0x91, 0x49, 0xe6, 0xc4, 0x24, 0x56, 0xf7, 0xe4, 0xb3, 0xca, + 0x65, 0xbe, 0x30, 0xa9, 0x26, 0xf7, 0xf3, 0x89, 0xf3, 0xd0, 0xe9, 0x7e, 0x3e, 0xa9, 0xec, 0x76, + 0xba, 0x9f, 0x4f, 0x46, 0xea, 0xba, 0x15, 0xe4, 0x15, 0x27, 0xe0, 0x29, 0x30, 0x46, 0x28, 0x36, + 0x19, 0x79, 0x7e, 0x1e, 0xea, 0x21, 0x40, 0x78, 0xda, 0x9e, 0x02, 0x5b, 0x6b, 0x32, 0xf4, 0x47, + 0x22, 0xcf, 0xcf, 0x3d, 0x28, 0xf3, 0x0c, 0x06, 0x71, 0xd4, 0xc4, 0xd8, 0x6f, 0x30, 0x9d, 0x58, + 0xa1, 0x60, 0x50, 0xcb, 0xc9, 0x78, 0x73, 0xca, 0x64, 0x96, 0x13, 0x88, 0xae, 0x60, 0xaa, 0x42, + 0x1c, 0x55, 0x4e, 0x19, 0xa6, 0x52, 0x81, 0xe6, 0xe6, 0x2f, 0x64, 0x94, 0x28, 0x95, 0x72, 0x4c, + 0x8f, 0x41, 0xa7, 0xba, 0x94, 0x11, 0x98, 0x6e, 0xfe, 0x62, 0x66, 0x99, 0x60, 0x14, 0xf1, 0xfc, + 0xcb, 0xd9, 0x59, 0xa3, 0xe3, 0x77, 0x5e, 0x05, 0x38, 0xb2, 0x9a, 0x1b, 0xa7, 0x41, 0x15, 0xb5, + 0x52, 0x95, 0x7e, 0x28, 0x23, 0x55, 0xf5, 0x5b, 0x19, 0xef, 0x31, 0x0c, 0x8c, 0xd8, 0x1b, 0xac, + 0x38, 0x6f, 0x36, 0x79, 0x24, 0xd3, 0xc1, 0xe4, 0xd4, 0xd4, 0x8d, 0x41, 0xee, 0x08, 0x3e, 0x92, + 0x09, 0x60, 0x5e, 0x35, 0xe3, 0x7d, 0xb8, 0x94, 0x78, 0xee, 0x61, 0x32, 0xbe, 0x91, 0xfd, 0x26, + 0x24, 0x53, 0x3c, 0xf9, 0x3a, 0xfb, 0xd5, 0xf4, 0xdb, 0x90, 0xc4, 0xb8, 0x9f, 0x75, 0xcd, 0xdb, + 0x80, 0x09, 0x5c, 0x66, 0x64, 0xd2, 0xf5, 0x38, 0x02, 0x8d, 0x09, 0x4e, 0x86, 0x42, 0x4a, 0x96, + 0x2a, 0x97, 0xd9, 0x31, 0xf1, 0x66, 0x98, 0xa7, 0x70, 0x9f, 0x37, 0x1f, 0x12, 0x23, 0x30, 0x6b, + 0x17, 0x13, 0x99, 0xe1, 0xc9, 0xf7, 0x61, 0x32, 0x7e, 0x4a, 0xcc, 0x59, 0x64, 0xa0, 0x15, 0x18, + 0xca, 0x26, 0xe3, 0xf7, 0xc4, 0x67, 0x27, 0x5f, 0x95, 0x5b, 0x51, 0x4c, 0x7e, 0x39, 0xf5, 0x4c, + 0xc6, 0xe8, 0xc3, 0x69, 0x76, 0x24, 0x4d, 0xb6, 0x67, 0x1d, 0x9d, 0x06, 0x7e, 0x6e, 0xd9, 0xc1, + 0x15, 0xf5, 0xcf, 0xad, 0x30, 0x00, 0xa4, 0x52, 0x7f, 0x73, 0xf8, 0x6c, 0xc0, 0x6b, 0x18, 0x90, + 0x65, 0x9b, 0x87, 0xe0, 0xcb, 0xc6, 0xca, 0x6f, 0x7b, 0x32, 0x8c, 0x4b, 0x0b, 0xae, 0x75, 0x8d, + 0x2e, 0x49, 0x6e, 0x19, 0x2e, 0x2e, 0xdd, 0xe3, 0x50, 0x16, 0x3d, 0x4d, 0xcb, 0x0a, 0xd2, 0xa8, + 0xf6, 0xd9, 0x82, 0x78, 0x91, 0x6a, 0x9f, 0x2d, 0x8c, 0xf2, 0xf8, 0x05, 0xe6, 0x58, 0x12, 0x7b, + 0x14, 0x06, 0x59, 0xa2, 0x1e, 0x0f, 0x3b, 0x5d, 0x78, 0xed, 0x73, 0xcd, 0xbc, 0x14, 0x4d, 0x11, + 0xe2, 0x99, 0xe6, 0x8a, 0x38, 0x89, 0xe5, 0x31, 0xef, 0xce, 0xa4, 0xc0, 0xb5, 0xfa, 0x0a, 0x9f, + 0x80, 0x67, 0x6e, 0x79, 0x0e, 0x7c, 0x71, 0xf9, 0xe7, 0xff, 0xfe, 0x4a, 0xe9, 0xe7, 0xbf, 0xb8, + 0x52, 0xfa, 0xd7, 0xbf, 0xb8, 0x52, 0xfa, 0x77, 0xbf, 0xb8, 0x52, 0xfa, 0x6a, 0xe1, 0x74, 0xc1, + 0x8f, 0x1b, 0x2d, 0x97, 0x7a, 0xd1, 0x2d, 0xce, 0x6e, 0x10, 0xff, 0xbb, 0xfb, 0xdf, 0x03, 0x00, + 0x00, 0xff, 0xff, 0xd9, 0x2d, 0x39, 0x25, 0x79, 0xe5, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -27605,6 +27645,13 @@ func (m *RouteToApp) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.URI) > 0 { + i -= len(m.URI) + copy(dAtA[i:], m.URI) + i = encodeVarintAuthservice(dAtA, i, uint64(len(m.URI))) + i-- + dAtA[i] = 0x42 + } if len(m.GCPServiceAccount) > 0 { i -= len(m.GCPServiceAccount) copy(dAtA[i:], m.GCPServiceAccount) @@ -29698,6 +29745,27 @@ func (m *CreateAppSessionRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.ClientAddr) > 0 { + i -= len(m.ClientAddr) + copy(dAtA[i:], m.ClientAddr) + i = encodeVarintAuthservice(dAtA, i, uint64(len(m.ClientAddr))) + i-- + dAtA[i] = 0x5a + } + if len(m.URI) > 0 { + i -= len(m.URI) + copy(dAtA[i:], m.URI) + i = encodeVarintAuthservice(dAtA, i, uint64(len(m.URI))) + i-- + dAtA[i] = 0x52 + } + if len(m.AppName) > 0 { + i -= len(m.AppName) + copy(dAtA[i:], m.AppName) + i = encodeVarintAuthservice(dAtA, i, uint64(len(m.AppName))) + i-- + dAtA[i] = 0x4a + } if m.MFAResponse != nil { { size, err := m.MFAResponse.MarshalToSizedBuffer(dAtA[:i]) @@ -38847,6 +38915,10 @@ func (m *RouteToApp) Size() (n int) { if l > 0 { n += 1 + l + sovAuthservice(uint64(l)) } + l = len(m.URI) + if l > 0 { + n += 1 + l + sovAuthservice(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -39765,6 +39837,18 @@ func (m *CreateAppSessionRequest) Size() (n int) { l = m.MFAResponse.Size() n += 1 + l + sovAuthservice(uint64(l)) } + l = len(m.AppName) + if l > 0 { + n += 1 + l + sovAuthservice(uint64(l)) + } + l = len(m.URI) + if l > 0 { + n += 1 + l + sovAuthservice(uint64(l)) + } + l = len(m.ClientAddr) + if l > 0 { + n += 1 + l + sovAuthservice(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -45920,6 +46004,38 @@ func (m *RouteToApp) Unmarshal(dAtA []byte) error { } m.GCPServiceAccount = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field URI", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAuthservice + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthAuthservice + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthAuthservice + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.URI = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipAuthservice(dAtA[iNdEx:]) @@ -51062,6 +51178,102 @@ func (m *CreateAppSessionRequest) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AppName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAuthservice + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthAuthservice + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthAuthservice + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AppName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field URI", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAuthservice + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthAuthservice + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthAuthservice + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.URI = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 11: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClientAddr", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAuthservice + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthAuthservice + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthAuthservice + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ClientAddr = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipAuthservice(dAtA[iNdEx:]) diff --git a/api/proto/teleport/legacy/client/proto/authservice.proto b/api/proto/teleport/legacy/client/proto/authservice.proto index 9f5eeed357ed8..f17d14bf4014c 100644 --- a/api/proto/teleport/legacy/client/proto/authservice.proto +++ b/api/proto/teleport/legacy/client/proto/authservice.proto @@ -314,6 +314,8 @@ message RouteToApp { string AzureIdentity = 6 [(gogoproto.jsontag) = "azure_identity,omitempty"]; // GCPServiceAccount is the GCP service account to assume when accessing GCP API. string GCPServiceAccount = 7 [(gogoproto.jsontag) = "gcp_service_account,omitempty"]; + // URI is the URI of the app. This is the internal endpoint where the application is running and isn't user-facing. + string URI = 8 [(gogoproto.jsontag) = "uri,omitempty"]; } // GetUserRequest specifies parameters for the GetUser method. @@ -788,6 +790,12 @@ message CreateAppSessionRequest { // An optional field, that when provided, the response will be validated and // the ID of the validated MFA device will be stored in session's certificate. MFAAuthenticateResponse MFAResponse = 8 [(gogoproto.jsontag) = "mfa_response,omitempty"]; + // AppName is the name of the application. + string AppName = 9 [(gogoproto.jsontag) = "app_name"]; + // URI is the URI of the app. This is the internal endpoint where the application is running and isn't user-facing. + string URI = 10 [(gogoproto.jsontag) = "uri"]; + // ClientAddr is a client (user's) address. + string ClientAddr = 11 [(gogoproto.jsontag) = "client_addr,omitempty"]; } // CreateAppSessionResponse contains the requested application web session. diff --git a/api/proto/teleport/legacy/types/events/events.proto b/api/proto/teleport/legacy/types/events/events.proto index 5313e22e2d85b..706c85d1def4a 100644 --- a/api/proto/teleport/legacy/types/events/events.proto +++ b/api/proto/teleport/legacy/types/events/events.proto @@ -4592,6 +4592,8 @@ message RouteToApp { string AzureIdentity = 6 [(gogoproto.jsontag) = "azure_identity,omitempty"]; // GCPServiceAccount is the GCP service account to assume when accessing GCP API. string GCPServiceAccount = 7 [(gogoproto.jsontag) = "gcp_service_account,omitempty"]; + // URI is the application URI. + string URI = 8 [(gogoproto.jsontag) = "uri,omitempty"]; } // RouteToDatabase combines parameters for database service routing information. diff --git a/api/types/events/events.pb.go b/api/types/events/events.pb.go index c4118770f1efb..4b48b17da317a 100644 --- a/api/types/events/events.pb.go +++ b/api/types/events/events.pb.go @@ -9768,7 +9768,9 @@ type RouteToApp struct { // AzureIdentity is the Azure identity ot assume when accessing Azure API. AzureIdentity string `protobuf:"bytes,6,opt,name=AzureIdentity,proto3" json:"azure_identity,omitempty"` // GCPServiceAccount is the GCP service account to assume when accessing GCP API. - GCPServiceAccount string `protobuf:"bytes,7,opt,name=GCPServiceAccount,proto3" json:"gcp_service_account,omitempty"` + GCPServiceAccount string `protobuf:"bytes,7,opt,name=GCPServiceAccount,proto3" json:"gcp_service_account,omitempty"` + // URI is the application URI. + URI string `protobuf:"bytes,8,opt,name=URI,proto3" json:"uri,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -13552,980 +13554,980 @@ func init() { } var fileDescriptor_007ba1c3d6266d56 = []byte{ - // 15553 bytes of a gzipped FileDescriptorProto + // 15565 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x6b, 0x74, 0x1c, 0xc9, 0x75, 0x18, 0x8c, 0x79, 0x60, 0x00, 0x5c, 0x3c, 0x08, 0x14, 0x5f, 0xbd, 0x5c, 0x92, 0xb3, 0xdb, 0xab, 0xa5, 0xc8, 0xd5, 0x2e, 0xa9, 0xe5, 0x72, 0x77, 0xb5, 0x2f, 0xed, 0x0e, 0x30, 0x00, 0x31, 0x24, 0x5e, 0xdb, 0x03, 0x92, 0x5a, 0xbd, 0xc6, 0x8d, 0xe9, 0x02, 0xd0, 0xcb, 0x99, 0xee, 0x51, - 0x77, 0x0f, 0x41, 0xec, 0xf7, 0x25, 0xb1, 0x1c, 0x3f, 0x24, 0x47, 0x52, 0x14, 0x39, 0xb6, 0xec, - 0xd8, 0x89, 0x65, 0xfb, 0x38, 0x71, 0x7c, 0x1c, 0x3b, 0x4e, 0x72, 0x6c, 0x2b, 0x8e, 0x4e, 0xec, - 0x28, 0x8f, 0x75, 0x74, 0x9c, 0x63, 0x3b, 0x89, 0x8f, 0x4f, 0xe2, 0x40, 0x8e, 0x12, 0xe7, 0x07, - 0x4e, 0x72, 0xe2, 0x24, 0x3a, 0xb1, 0xe3, 0x38, 0x39, 0x39, 0x75, 0xab, 0xba, 0xbb, 0xfa, 0x31, - 0x83, 0xe7, 0x1a, 0x0b, 0x11, 0x7f, 0x48, 0xcc, 0xbd, 0xb7, 0x6e, 0x55, 0xdf, 0xba, 0x55, 0x75, - 0xab, 0xea, 0xd6, 0xbd, 0x70, 0xc9, 0xa3, 0x0d, 0xda, 0xb2, 0x1d, 0xef, 0x4a, 0x83, 0xae, 0xe8, - 0xf5, 0xf5, 0x2b, 0xde, 0x7a, 0x8b, 0xba, 0x57, 0xe8, 0x3d, 0x6a, 0x79, 0xfe, 0x7f, 0x97, 0x5b, - 0x8e, 0xed, 0xd9, 0xa4, 0xc0, 0x7f, 0x9d, 0x39, 0xb1, 0x62, 0xaf, 0xd8, 0x08, 0xba, 0xc2, 0xfe, - 0xe2, 0xd8, 0x33, 0x67, 0x57, 0x6c, 0x7b, 0xa5, 0x41, 0xaf, 0xe0, 0xaf, 0xa5, 0xf6, 0xf2, 0x15, - 0xd7, 0x73, 0xda, 0x75, 0x4f, 0x60, 0x8b, 0x71, 0xac, 0x67, 0x36, 0xa9, 0xeb, 0xe9, 0xcd, 0x96, - 0x20, 0x38, 0x1f, 0x27, 0x58, 0x73, 0xf4, 0x56, 0x8b, 0x3a, 0xa2, 0xf2, 0x33, 0x8f, 0xa6, 0xb7, - 0x13, 0xff, 0x15, 0x24, 0x4f, 0xa5, 0x93, 0xf8, 0x8c, 0x62, 0x1c, 0xd5, 0x2f, 0x64, 0xa1, 0x7f, - 0x96, 0x7a, 0xba, 0xa1, 0x7b, 0x3a, 0x39, 0x0b, 0xbd, 0x15, 0xcb, 0xa0, 0xf7, 0x95, 0xcc, 0x23, - 0x99, 0x8b, 0xb9, 0xf1, 0xc2, 0xe6, 0x46, 0x31, 0x4b, 0x4d, 0x8d, 0x03, 0xc9, 0x39, 0xc8, 0x2f, - 0xae, 0xb7, 0xa8, 0x92, 0x7d, 0x24, 0x73, 0x71, 0x60, 0x7c, 0x60, 0x73, 0xa3, 0xd8, 0x8b, 0xb2, - 0xd0, 0x10, 0x4c, 0x1e, 0x85, 0x6c, 0xa5, 0xac, 0xe4, 0x10, 0x39, 0xb6, 0xb9, 0x51, 0x1c, 0x6e, - 0x9b, 0xc6, 0x93, 0x76, 0xd3, 0xf4, 0x68, 0xb3, 0xe5, 0xad, 0x6b, 0xd9, 0x4a, 0x99, 0x5c, 0x80, - 0xfc, 0x84, 0x6d, 0x50, 0x25, 0x8f, 0x44, 0x64, 0x73, 0xa3, 0x38, 0x52, 0xb7, 0x0d, 0x2a, 0x51, - 0x21, 0x9e, 0xbc, 0x06, 0xf9, 0x45, 0xb3, 0x49, 0x95, 0xde, 0x47, 0x32, 0x17, 0x07, 0xaf, 0x9e, - 0xb9, 0xcc, 0xa5, 0x72, 0xd9, 0x97, 0xca, 0xe5, 0x45, 0x5f, 0x6c, 0xe3, 0xa3, 0x6f, 0x6f, 0x14, - 0x7b, 0x36, 0x37, 0x8a, 0x79, 0x26, 0xc9, 0xcf, 0x7f, 0xbd, 0x98, 0xd1, 0xb0, 0x24, 0x79, 0x19, - 0x06, 0x27, 0x1a, 0x6d, 0xd7, 0xa3, 0xce, 0x9c, 0xde, 0xa4, 0x4a, 0x01, 0x2b, 0x3c, 0xb3, 0xb9, - 0x51, 0x3c, 0x55, 0xe7, 0xe0, 0x9a, 0xa5, 0x37, 0xe5, 0x8a, 0x65, 0x72, 0xf5, 0x97, 0x32, 0x70, - 0xac, 0x4a, 0x5d, 0xd7, 0xb4, 0xad, 0x40, 0x36, 0x8f, 0xc3, 0x80, 0x00, 0x55, 0xca, 0x28, 0x9f, - 0x81, 0xf1, 0xbe, 0xcd, 0x8d, 0x62, 0xce, 0x35, 0x0d, 0x2d, 0xc4, 0x90, 0xf7, 0x43, 0xdf, 0x1d, - 0xd3, 0x5b, 0x9d, 0x9d, 0x2a, 0x09, 0x39, 0x9d, 0xda, 0xdc, 0x28, 0x92, 0x35, 0xd3, 0x5b, 0xad, - 0x35, 0x97, 0x75, 0xa9, 0x42, 0x9f, 0x8c, 0xcc, 0xc0, 0xe8, 0x82, 0x63, 0xde, 0xd3, 0x3d, 0x7a, - 0x93, 0xae, 0x2f, 0xd8, 0x0d, 0xb3, 0xbe, 0x2e, 0xa4, 0xf8, 0xc8, 0xe6, 0x46, 0xf1, 0x6c, 0x8b, - 0xe3, 0x6a, 0x77, 0xe9, 0x7a, 0xad, 0x85, 0x58, 0x89, 0x49, 0xa2, 0xa4, 0xfa, 0xd5, 0x5e, 0x18, - 0xba, 0xe5, 0x52, 0x27, 0x68, 0xf7, 0x05, 0xc8, 0xb3, 0xdf, 0xa2, 0xc9, 0x28, 0xf3, 0xb6, 0x4b, - 0x1d, 0x59, 0xe6, 0x0c, 0x4f, 0x2e, 0x41, 0xef, 0x8c, 0xbd, 0x62, 0x5a, 0xa2, 0xd9, 0xc7, 0x37, - 0x37, 0x8a, 0xc7, 0x1a, 0x0c, 0x20, 0x51, 0x72, 0x0a, 0xf2, 0x41, 0x18, 0xaa, 0x34, 0x99, 0x0e, - 0xd9, 0x96, 0xee, 0xd9, 0x8e, 0x68, 0x2d, 0x4a, 0xd7, 0x94, 0xe0, 0x52, 0xc1, 0x08, 0x3d, 0x79, - 0x11, 0xa0, 0x74, 0xa7, 0xaa, 0xd9, 0x0d, 0x5a, 0xd2, 0xe6, 0x84, 0x32, 0x60, 0x69, 0x7d, 0xcd, - 0xad, 0x39, 0x76, 0x83, 0xd6, 0x74, 0x47, 0xae, 0x56, 0xa2, 0x26, 0x93, 0x30, 0x52, 0xaa, 0xd7, - 0xa9, 0xeb, 0x6a, 0xf4, 0x13, 0x6d, 0xea, 0x7a, 0xae, 0xd2, 0xfb, 0x48, 0xee, 0xe2, 0xc0, 0xf8, - 0xb9, 0xcd, 0x8d, 0xe2, 0x43, 0x3a, 0x62, 0x6a, 0x8e, 0x40, 0x49, 0x2c, 0x62, 0x85, 0xc8, 0x38, - 0x0c, 0x97, 0xde, 0x6a, 0x3b, 0xb4, 0x62, 0x50, 0xcb, 0x33, 0xbd, 0x75, 0xa1, 0x21, 0x67, 0x37, - 0x37, 0x8a, 0x8a, 0xce, 0x10, 0x35, 0x53, 0x60, 0x24, 0x26, 0xd1, 0x22, 0x64, 0x1e, 0xc6, 0xae, - 0x4f, 0x2c, 0x54, 0xa9, 0x73, 0xcf, 0xac, 0xd3, 0x52, 0xbd, 0x6e, 0xb7, 0x2d, 0x4f, 0xe9, 0x43, - 0x3e, 0x8f, 0x6e, 0x6e, 0x14, 0xcf, 0xad, 0xd4, 0x5b, 0x35, 0x97, 0x63, 0x6b, 0x3a, 0x47, 0x4b, - 0xcc, 0x92, 0x65, 0xc9, 0x87, 0x61, 0x78, 0xd1, 0x61, 0x5a, 0x68, 0x94, 0x29, 0x83, 0x2b, 0xfd, - 0xa8, 0xff, 0xa7, 0x2e, 0x8b, 0x09, 0x88, 0x43, 0xfd, 0x9e, 0xe5, 0x8d, 0xf5, 0x78, 0x81, 0x9a, - 0x81, 0x38, 0xb9, 0xb1, 0x11, 0x56, 0x84, 0x82, 0xc2, 0x3e, 0xde, 0x74, 0xa8, 0x91, 0xd0, 0xb6, - 0x01, 0x6c, 0xf3, 0xa5, 0xcd, 0x8d, 0xe2, 0xe3, 0x8e, 0xa0, 0xa9, 0x75, 0x55, 0xbb, 0x8e, 0xac, - 0xc8, 0x24, 0xf4, 0x33, 0x6d, 0xba, 0x69, 0x5a, 0x86, 0x02, 0x8f, 0x64, 0x2e, 0x8e, 0x5c, 0x1d, - 0xf5, 0x5b, 0xef, 0xc3, 0xc7, 0x4f, 0x6f, 0x6e, 0x14, 0x8f, 0x33, 0x1d, 0xac, 0xdd, 0x35, 0x2d, - 0x79, 0x8a, 0x08, 0x8a, 0xaa, 0x7f, 0x98, 0x87, 0x11, 0x26, 0x1c, 0x49, 0x8f, 0x4b, 0x6c, 0x48, - 0x32, 0x08, 0x1b, 0xa1, 0x6e, 0x4b, 0xaf, 0x53, 0xa1, 0xd2, 0xc8, 0xce, 0xf2, 0x81, 0x12, 0xbb, - 0x38, 0x3d, 0xb9, 0x04, 0xfd, 0x1c, 0x54, 0x29, 0x0b, 0x2d, 0x1f, 0xde, 0xdc, 0x28, 0x0e, 0xb8, - 0x08, 0xab, 0x99, 0x86, 0x16, 0xa0, 0x99, 0x9a, 0xf1, 0xbf, 0xa7, 0x6d, 0xd7, 0x63, 0xcc, 0x85, - 0x92, 0xa3, 0x9a, 0x89, 0x02, 0xab, 0x02, 0x25, 0xab, 0x59, 0xb4, 0x10, 0x79, 0x01, 0x80, 0x43, - 0x4a, 0x86, 0xe1, 0x08, 0x4d, 0x7f, 0x68, 0x73, 0xa3, 0x78, 0x52, 0xb0, 0xd0, 0x0d, 0x43, 0x1e, - 0x26, 0x12, 0x31, 0x69, 0xc2, 0x10, 0xff, 0x35, 0xa3, 0x2f, 0xd1, 0x06, 0x57, 0xf3, 0xc1, 0xab, - 0x17, 0x7d, 0x69, 0x46, 0xa5, 0x73, 0x59, 0x26, 0x9d, 0xb4, 0x3c, 0x67, 0x7d, 0xbc, 0x28, 0x66, - 0xc6, 0xd3, 0xa2, 0xaa, 0x06, 0xe2, 0xe4, 0x31, 0x29, 0x97, 0x61, 0x13, 0xe6, 0x94, 0xed, 0xac, - 0xe9, 0x8e, 0x41, 0x8d, 0xf1, 0x75, 0x79, 0xc2, 0x5c, 0xf6, 0xc1, 0xb5, 0x25, 0x59, 0x07, 0x64, - 0x72, 0x32, 0x01, 0xc3, 0x9c, 0x5b, 0xb5, 0xbd, 0x84, 0x7d, 0xdf, 0x97, 0x90, 0x96, 0xdb, 0x5e, - 0x8a, 0xf7, 0x77, 0xb4, 0x0c, 0x1b, 0x93, 0x1c, 0x70, 0x9b, 0x3a, 0x6c, 0x36, 0x45, 0xf5, 0x17, - 0x63, 0x52, 0x30, 0xb9, 0xc7, 0x31, 0x49, 0x1e, 0xa2, 0xc8, 0x99, 0x57, 0x61, 0x2c, 0x21, 0x0a, - 0x32, 0x0a, 0xb9, 0xbb, 0x74, 0x9d, 0xab, 0x8b, 0xc6, 0xfe, 0x24, 0x27, 0xa0, 0xf7, 0x9e, 0xde, - 0x68, 0x8b, 0xb5, 0x4c, 0xe3, 0x3f, 0x5e, 0xcc, 0x7e, 0x20, 0xc3, 0xa6, 0x7e, 0x32, 0x61, 0x5b, - 0x16, 0xad, 0x7b, 0xf2, 0xec, 0xff, 0x1c, 0x0c, 0xcc, 0xd8, 0x75, 0xbd, 0x81, 0xfd, 0xc8, 0xf5, - 0x4e, 0xd9, 0xdc, 0x28, 0x9e, 0x60, 0x1d, 0x78, 0xb9, 0xc1, 0x30, 0x52, 0x9b, 0x42, 0x52, 0xa6, - 0x00, 0x1a, 0x6d, 0xda, 0x1e, 0xc5, 0x82, 0xd9, 0x50, 0x01, 0xb0, 0xa0, 0x83, 0x28, 0x59, 0x01, - 0x42, 0x62, 0x72, 0x05, 0xfa, 0x17, 0xd8, 0x82, 0x57, 0xb7, 0x1b, 0x42, 0xf9, 0x70, 0x4e, 0xc6, - 0x45, 0x50, 0x1e, 0x34, 0x3e, 0x91, 0x3a, 0x0d, 0x23, 0x13, 0x0d, 0x93, 0x5a, 0x9e, 0xdc, 0x6a, - 0x36, 0xa4, 0x4a, 0x2b, 0xd4, 0xf2, 0xe4, 0x56, 0xe3, 0xe0, 0xd3, 0x19, 0x54, 0x6e, 0x75, 0x40, - 0xaa, 0xfe, 0x8b, 0x1c, 0x3c, 0x74, 0xb3, 0xbd, 0x44, 0x1d, 0x8b, 0x7a, 0xd4, 0x15, 0x2b, 0x63, - 0xc0, 0x75, 0x0e, 0xc6, 0x12, 0x48, 0xc1, 0x1d, 0x57, 0xac, 0xbb, 0x01, 0xb2, 0x26, 0x16, 0x5b, - 0x79, 0xda, 0x4b, 0x14, 0x25, 0xd3, 0x70, 0x2c, 0x04, 0xb2, 0x46, 0xb8, 0x4a, 0x16, 0xe7, 0xf4, - 0xf3, 0x9b, 0x1b, 0xc5, 0x33, 0x12, 0x37, 0xd6, 0x6c, 0x59, 0x83, 0xe3, 0xc5, 0xc8, 0x4d, 0x18, - 0x0d, 0x41, 0xd7, 0x1d, 0xbb, 0xdd, 0x72, 0x95, 0x1c, 0xb2, 0x2a, 0x6e, 0x6e, 0x14, 0x1f, 0x96, - 0x58, 0xad, 0x20, 0x52, 0x5e, 0x49, 0xe3, 0x05, 0xc9, 0x77, 0x66, 0x64, 0x6e, 0x62, 0x14, 0xe6, - 0x71, 0x14, 0x3e, 0xef, 0x8f, 0xc2, 0x8e, 0x42, 0xba, 0x1c, 0x2f, 0x29, 0x06, 0x65, 0xac, 0x19, - 0x89, 0x41, 0x99, 0xa8, 0xf1, 0xcc, 0x04, 0x9c, 0x4c, 0xe5, 0xb5, 0x23, 0xad, 0xfe, 0xfd, 0x9c, - 0xcc, 0x65, 0xc1, 0x36, 0x82, 0xce, 0x9c, 0x97, 0x3b, 0x73, 0xc1, 0x36, 0xd0, 0x5c, 0xca, 0x84, - 0x8b, 0x98, 0xd4, 0xd8, 0x96, 0x6d, 0xc4, 0xad, 0xa6, 0x64, 0x59, 0xf2, 0x71, 0x38, 0x95, 0x00, - 0xf2, 0xe9, 0x9a, 0x6b, 0xff, 0x85, 0xcd, 0x8d, 0xa2, 0x9a, 0xc2, 0x35, 0x3e, 0x7b, 0x77, 0xe0, - 0x42, 0x74, 0x38, 0x2d, 0x49, 0xdd, 0xb6, 0x3c, 0xdd, 0xb4, 0x84, 0x95, 0xc7, 0x47, 0xc9, 0x7b, - 0x37, 0x37, 0x8a, 0x8f, 0xc9, 0x3a, 0xe8, 0xd3, 0xc4, 0x1b, 0xdf, 0x89, 0x0f, 0x31, 0x40, 0x49, - 0x41, 0x55, 0x9a, 0xfa, 0x8a, 0x6f, 0xba, 0x5e, 0xdc, 0xdc, 0x28, 0xbe, 0x27, 0xb5, 0x0e, 0x93, - 0x51, 0xc9, 0x4b, 0x65, 0x27, 0x4e, 0x44, 0x03, 0x12, 0xe2, 0xe6, 0x6c, 0x83, 0xe2, 0x37, 0xf4, - 0x22, 0x7f, 0x75, 0x73, 0xa3, 0x78, 0x5e, 0xe2, 0x6f, 0xd9, 0x06, 0x8d, 0x37, 0x3f, 0xa5, 0xb4, - 0xfa, 0x4b, 0x39, 0x38, 0x5f, 0x2d, 0xcd, 0xce, 0x54, 0x0c, 0xdf, 0xb6, 0x58, 0x70, 0xec, 0x7b, - 0xa6, 0x21, 0x8d, 0xde, 0x25, 0x38, 0x1d, 0x43, 0x4d, 0xa2, 0x39, 0x13, 0x58, 0xb5, 0xf8, 0x6d, - 0xbe, 0xdd, 0xd2, 0x12, 0x34, 0x35, 0x6e, 0xf3, 0xd4, 0x22, 0x26, 0x7d, 0x27, 0x46, 0xac, 0x8f, - 0x62, 0xa8, 0xea, 0xaa, 0xed, 0x78, 0xf5, 0xb6, 0x27, 0x94, 0x00, 0xfb, 0x28, 0x51, 0x87, 0x2b, - 0x88, 0xba, 0x54, 0xe1, 0xf3, 0x21, 0x9f, 0xce, 0xc0, 0x68, 0xc9, 0xf3, 0x1c, 0x73, 0xa9, 0xed, - 0xd1, 0x59, 0xbd, 0xd5, 0x32, 0xad, 0x15, 0x1c, 0xeb, 0x83, 0x57, 0x5f, 0x0e, 0xd6, 0xc8, 0xae, - 0x92, 0xb8, 0x1c, 0x2f, 0x2e, 0x0d, 0x51, 0xdd, 0x47, 0xd5, 0x9a, 0x1c, 0x27, 0x0f, 0xd1, 0x78, - 0x39, 0x36, 0x44, 0x53, 0x79, 0xed, 0x68, 0x88, 0x7e, 0x21, 0x07, 0x67, 0xe7, 0xef, 0x7a, 0xba, - 0x46, 0x5d, 0xbb, 0xed, 0xd4, 0xa9, 0x7b, 0xab, 0x65, 0xe8, 0x1e, 0x0d, 0x47, 0x6a, 0x11, 0x7a, - 0x4b, 0x86, 0x41, 0x0d, 0x64, 0xd7, 0xcb, 0xf7, 0x5f, 0x3a, 0x03, 0x68, 0x1c, 0x4e, 0x1e, 0x87, - 0x3e, 0x51, 0x06, 0xb9, 0xf7, 0x8e, 0x0f, 0x6e, 0x6e, 0x14, 0xfb, 0xda, 0x1c, 0xa4, 0xf9, 0x38, - 0x46, 0x56, 0xa6, 0x0d, 0xca, 0xc8, 0x72, 0x21, 0x99, 0xc1, 0x41, 0x9a, 0x8f, 0x23, 0xaf, 0xc3, - 0x08, 0xb2, 0x0d, 0xda, 0x23, 0xe6, 0xbe, 0x13, 0xbe, 0x74, 0xe5, 0xc6, 0xf2, 0xa5, 0x09, 0x5b, - 0x53, 0x73, 0xfc, 0x02, 0x5a, 0x8c, 0x01, 0xb9, 0x03, 0xa3, 0xa2, 0x11, 0x21, 0xd3, 0xde, 0x2e, - 0x4c, 0x4f, 0x6e, 0x6e, 0x14, 0xc7, 0x44, 0xfb, 0x25, 0xb6, 0x09, 0x26, 0x8c, 0xb1, 0x68, 0x76, - 0xc8, 0xb8, 0xb0, 0x15, 0x63, 0xf1, 0xc5, 0x32, 0xe3, 0x38, 0x13, 0xf5, 0x0d, 0x18, 0x92, 0x0b, - 0x92, 0x53, 0xb8, 0xc7, 0xe5, 0xe3, 0x04, 0x77, 0xc7, 0xa6, 0x81, 0x1b, 0xdb, 0xa7, 0x61, 0xb0, - 0x4c, 0xdd, 0xba, 0x63, 0xb6, 0x98, 0xd5, 0x20, 0x94, 0xfc, 0xd8, 0xe6, 0x46, 0x71, 0xd0, 0x08, - 0xc1, 0x9a, 0x4c, 0xa3, 0xfe, 0xcf, 0x0c, 0x9c, 0x62, 0xbc, 0x4b, 0xae, 0x6b, 0xae, 0x58, 0x4d, - 0x79, 0xd9, 0x7e, 0x12, 0x0a, 0x55, 0xac, 0x4f, 0xd4, 0x74, 0x62, 0x73, 0xa3, 0x38, 0xca, 0x5b, - 0x20, 0xe9, 0xa1, 0xa0, 0x09, 0x36, 0x78, 0xd9, 0x2d, 0x36, 0x78, 0xcc, 0xa4, 0xf5, 0x74, 0xc7, - 0x33, 0xad, 0x95, 0xaa, 0xa7, 0x7b, 0x6d, 0x37, 0x62, 0xd2, 0x0a, 0x4c, 0xcd, 0x45, 0x54, 0xc4, - 0xa4, 0x8d, 0x14, 0x22, 0xaf, 0xc2, 0xd0, 0xa4, 0x65, 0x84, 0x4c, 0xf8, 0x84, 0xf8, 0x30, 0xb3, - 0x34, 0x29, 0xc2, 0x93, 0x2c, 0x22, 0x05, 0xd4, 0xbf, 0x95, 0x01, 0x85, 0xef, 0xc6, 0x66, 0x4c, - 0xd7, 0x9b, 0xa5, 0xcd, 0x25, 0x69, 0x76, 0x9a, 0xf2, 0xb7, 0x77, 0x0c, 0x27, 0xad, 0x45, 0x68, - 0x0a, 0x88, 0xed, 0x5d, 0xc3, 0x74, 0xbd, 0xf8, 0x64, 0x18, 0x2b, 0x45, 0x2a, 0xd0, 0xc7, 0x39, - 0x73, 0x5b, 0x62, 0xf0, 0xaa, 0xe2, 0x2b, 0x42, 0xbc, 0x6a, 0xae, 0x0c, 0x4d, 0x4e, 0x2c, 0xef, - 0xcf, 0x45, 0x79, 0xf5, 0x6f, 0x67, 0x61, 0x34, 0x5e, 0x88, 0xdc, 0x81, 0xfe, 0x1b, 0xb6, 0x69, - 0x51, 0x63, 0xde, 0xc2, 0x16, 0x76, 0x3f, 0xa5, 0xf0, 0x6d, 0xf1, 0xe3, 0x6f, 0x62, 0x99, 0x9a, - 0x6c, 0xc1, 0xe2, 0xa1, 0x45, 0xc0, 0x8c, 0x7c, 0x18, 0x06, 0x98, 0x0d, 0x78, 0x0f, 0x39, 0x67, - 0xb7, 0xe4, 0xfc, 0x88, 0xe0, 0x7c, 0xc2, 0xe1, 0x85, 0x92, 0xac, 0x43, 0x76, 0x4c, 0xaf, 0x34, - 0xaa, 0xbb, 0xb6, 0x25, 0x7a, 0x1e, 0xf5, 0xca, 0x41, 0x88, 0xac, 0x57, 0x9c, 0x86, 0x99, 0xae, - 0xfc, 0x63, 0xb1, 0x1b, 0xa4, 0xbd, 0x0b, 0x97, 0x55, 0xbc, 0x07, 0x24, 0x62, 0xf5, 0xbb, 0xb3, - 0xf0, 0x54, 0x28, 0x32, 0x8d, 0xde, 0x33, 0xe9, 0x9a, 0x10, 0xe7, 0xaa, 0xd9, 0x12, 0x9b, 0x47, - 0xa6, 0xf2, 0xee, 0xc4, 0xaa, 0x6e, 0xad, 0x50, 0x83, 0x5c, 0x82, 0x5e, 0xb6, 0xc3, 0x77, 0x95, - 0x0c, 0x9a, 0x6b, 0x38, 0x9d, 0x38, 0x0c, 0x20, 0x9f, 0x3e, 0x20, 0x05, 0xb1, 0xa1, 0xb0, 0xe8, - 0xe8, 0xa6, 0xe7, 0xf7, 0x6c, 0x29, 0xd9, 0xb3, 0xdb, 0xa8, 0xf1, 0x32, 0xe7, 0xc1, 0xe7, 0x7c, - 0x14, 0x84, 0x87, 0x00, 0x59, 0x10, 0x9c, 0xe4, 0xcc, 0x0b, 0x30, 0x28, 0x11, 0xef, 0x68, 0x52, - 0xff, 0x72, 0x5e, 0xd6, 0x75, 0xbf, 0x59, 0x42, 0xd7, 0xaf, 0x30, 0x1d, 0x75, 0x5d, 0x66, 0x55, - 0x70, 0x25, 0x17, 0x9a, 0x88, 0xa0, 0xa8, 0x26, 0x22, 0x88, 0x3c, 0x03, 0xfd, 0x9c, 0x45, 0xb0, - 0x7f, 0xc5, 0xbd, 0xaf, 0x83, 0xb0, 0xe8, 0xd2, 0x1c, 0x10, 0x92, 0x9f, 0xce, 0xc0, 0xb9, 0xae, - 0x92, 0x40, 0x65, 0x18, 0xbc, 0xfa, 0xec, 0xae, 0xc4, 0x38, 0xfe, 0xd4, 0xe6, 0x46, 0xf1, 0x52, - 0x33, 0x20, 0xa9, 0x39, 0x12, 0x4d, 0xad, 0xce, 0x89, 0xa4, 0x76, 0x75, 0x6f, 0x0a, 0x33, 0x1e, - 0x79, 0xa5, 0x53, 0x78, 0x86, 0x63, 0xd5, 0xd7, 0xfd, 0x46, 0xe6, 0x43, 0xe3, 0x51, 0x7c, 0xef, - 0xb2, 0x4f, 0x92, 0x52, 0x4d, 0x07, 0x2e, 0xa4, 0x0e, 0xa7, 0x39, 0xa6, 0xac, 0xaf, 0xcf, 0x2f, - 0xcf, 0xda, 0x96, 0xb7, 0xea, 0x57, 0xd0, 0x2b, 0x1f, 0x82, 0x60, 0x05, 0x86, 0xbe, 0x5e, 0xb3, - 0x97, 0x6b, 0x4d, 0x46, 0x95, 0x52, 0x47, 0x27, 0x4e, 0x6c, 0xa2, 0x15, 0x63, 0xce, 0x9f, 0x82, - 0x0a, 0xe1, 0x11, 0x95, 0x3f, 0x4e, 0x93, 0x13, 0x4e, 0xac, 0x90, 0x5a, 0x81, 0xa1, 0x19, 0xbb, - 0x7e, 0x37, 0x50, 0x97, 0x17, 0xa0, 0xb0, 0xa8, 0x3b, 0x2b, 0xd4, 0x43, 0x59, 0x0c, 0x5e, 0x1d, - 0xbb, 0xcc, 0x8f, 0x7d, 0x19, 0x11, 0x47, 0x8c, 0x8f, 0x88, 0xd9, 0xa0, 0xe0, 0xe1, 0x6f, 0x4d, - 0x14, 0x50, 0xbf, 0xde, 0x0b, 0x43, 0xe2, 0x88, 0x12, 0x67, 0x73, 0xf2, 0x62, 0x78, 0xe8, 0x2b, - 0xa6, 0xaf, 0xe0, 0x98, 0x26, 0x38, 0x5e, 0x1a, 0x62, 0xcc, 0x7e, 0x63, 0xa3, 0x98, 0xd9, 0xdc, - 0x28, 0xf6, 0x68, 0xfd, 0xd2, 0xa6, 0x32, 0x5c, 0x6f, 0xa4, 0x05, 0x56, 0x3e, 0x74, 0x8c, 0x95, - 0xe5, 0xeb, 0xcf, 0xab, 0xd0, 0x27, 0xda, 0x20, 0x34, 0xee, 0x74, 0x78, 0x96, 0x11, 0x39, 0x6a, - 0x8d, 0x95, 0xf6, 0x4b, 0x91, 0x97, 0xa1, 0xc0, 0xf7, 0xf6, 0x42, 0x00, 0xa7, 0xd2, 0xcf, 0x42, - 0x62, 0xc5, 0x45, 0x19, 0x32, 0x0d, 0x10, 0xee, 0xeb, 0x83, 0x93, 0x65, 0xc1, 0x21, 0xb9, 0xe3, - 0x8f, 0x71, 0x91, 0xca, 0x92, 0xe7, 0x60, 0x68, 0x91, 0x3a, 0x4d, 0xd3, 0xd2, 0x1b, 0x55, 0xf3, - 0x2d, 0xff, 0x70, 0x19, 0x17, 0x5e, 0xd7, 0x7c, 0x4b, 0x1e, 0xb9, 0x11, 0x3a, 0xf2, 0xb1, 0xb4, - 0x7d, 0x73, 0x1f, 0x36, 0xe4, 0xd1, 0x2d, 0x37, 0x94, 0xb1, 0xf6, 0xa4, 0x6c, 0xa3, 0x5f, 0x87, - 0xe1, 0xc8, 0x96, 0x49, 0x9c, 0x1e, 0x9e, 0x4b, 0xb2, 0x96, 0xf6, 0x7f, 0x31, 0xb6, 0x51, 0x0e, - 0x4c, 0x93, 0x2b, 0x96, 0xe9, 0x99, 0x7a, 0x63, 0xc2, 0x6e, 0x36, 0x75, 0xcb, 0x50, 0x06, 0x42, - 0x4d, 0x36, 0x39, 0xa6, 0x56, 0xe7, 0x28, 0x59, 0x93, 0xa3, 0x85, 0xd8, 0xb6, 0x5c, 0xf4, 0xa1, - 0x46, 0xeb, 0xb6, 0xc3, 0x6c, 0x01, 0x3c, 0x1c, 0x14, 0xdb, 0x72, 0x97, 0xe3, 0x6a, 0x8e, 0x8f, - 0x94, 0x8d, 0xed, 0x78, 0xc1, 0x1b, 0xf9, 0xfe, 0xc1, 0xd1, 0xa1, 0xf8, 0x79, 0xae, 0xfa, 0x37, - 0x73, 0x30, 0x28, 0x48, 0xd9, 0x52, 0x7a, 0xa4, 0xe0, 0x7b, 0x51, 0xf0, 0x54, 0x45, 0x2d, 0xec, - 0x97, 0xa2, 0xaa, 0x9f, 0xc9, 0x06, 0xb3, 0xd1, 0x82, 0x63, 0x5a, 0x7b, 0x9b, 0x8d, 0x2e, 0x00, - 0x4c, 0xac, 0xb6, 0xad, 0xbb, 0xfc, 0xde, 0x2a, 0x1b, 0xde, 0x5b, 0xd5, 0x4d, 0x4d, 0xc2, 0x90, - 0x73, 0x90, 0x2f, 0x33, 0xfe, 0xac, 0x67, 0x86, 0xc6, 0x07, 0xde, 0xe6, 0x9c, 0x32, 0x4f, 0x69, - 0x08, 0x66, 0x9b, 0xab, 0xf1, 0x75, 0x8f, 0x72, 0x73, 0x36, 0xc7, 0x37, 0x57, 0x4b, 0x0c, 0xa0, - 0x71, 0x38, 0xb9, 0x06, 0x63, 0x65, 0xda, 0xd0, 0xd7, 0x67, 0xcd, 0x46, 0xc3, 0x74, 0x69, 0xdd, - 0xb6, 0x0c, 0x17, 0x85, 0x2c, 0xaa, 0x6b, 0xba, 0x5a, 0x92, 0x80, 0xa8, 0x50, 0x98, 0x5f, 0x5e, - 0x76, 0xa9, 0x87, 0xe2, 0xcb, 0x8d, 0x03, 0x9b, 0x9c, 0x6d, 0x84, 0x68, 0x02, 0xa3, 0xfe, 0x5c, - 0x86, 0xed, 0x5e, 0xdc, 0xbb, 0x9e, 0xdd, 0x0a, 0xb4, 0x7c, 0x4f, 0x22, 0xb9, 0x14, 0xda, 0x15, - 0x59, 0xfc, 0xda, 0x63, 0xe2, 0x6b, 0xfb, 0x84, 0x6d, 0x11, 0x5a, 0x14, 0xa9, 0x5f, 0x95, 0xdb, - 0xe2, 0xab, 0xd4, 0x3f, 0xc8, 0xc2, 0x69, 0xd1, 0xe2, 0x89, 0x86, 0xd9, 0x5a, 0xb2, 0x75, 0xc7, - 0xd0, 0x68, 0x9d, 0x9a, 0xf7, 0xe8, 0xe1, 0x1c, 0x78, 0xd1, 0xa1, 0x93, 0xdf, 0xc3, 0xd0, 0xb9, - 0x8a, 0x1b, 0x41, 0x26, 0x19, 0x3c, 0xf0, 0xe5, 0x46, 0xc5, 0xe8, 0xe6, 0x46, 0x71, 0xc8, 0xe0, - 0x60, 0x3c, 0xf2, 0xd7, 0x64, 0x22, 0xa6, 0x24, 0x33, 0xd4, 0x5a, 0xf1, 0x56, 0x51, 0x49, 0x7a, - 0xb9, 0x92, 0x34, 0x10, 0xa2, 0x09, 0x8c, 0xfa, 0x5f, 0xb2, 0x70, 0x22, 0x2e, 0xf2, 0x2a, 0xb5, - 0x8c, 0x23, 0x79, 0xbf, 0x33, 0xf2, 0xfe, 0x66, 0x0e, 0x1e, 0x16, 0x65, 0xaa, 0xab, 0xba, 0x43, - 0x8d, 0xb2, 0xe9, 0xd0, 0xba, 0x67, 0x3b, 0xeb, 0x87, 0xd8, 0x80, 0xda, 0x3f, 0xb1, 0x5f, 0x83, - 0x82, 0xd8, 0xfe, 0xf3, 0x75, 0x66, 0x24, 0x68, 0x09, 0x42, 0x13, 0x2b, 0x14, 0x3f, 0x3a, 0x88, - 0x75, 0x56, 0x61, 0x3b, 0x9d, 0xf5, 0x01, 0x18, 0x0e, 0x44, 0x8f, 0x1b, 0xd1, 0xbe, 0xd0, 0xda, - 0x32, 0x7c, 0x04, 0xee, 0x45, 0xb5, 0x28, 0x21, 0xd6, 0xe6, 0x03, 0x2a, 0x65, 0xb4, 0x86, 0x86, - 0x45, 0x6d, 0x41, 0x39, 0xd3, 0xd0, 0x64, 0x22, 0x75, 0x23, 0x0f, 0x67, 0xd2, 0xbb, 0x5d, 0xa3, - 0xba, 0x71, 0xd4, 0xeb, 0xdf, 0x92, 0xbd, 0x4e, 0x1e, 0x85, 0xfc, 0x82, 0xee, 0xad, 0x8a, 0x7b, - 0x70, 0xbc, 0x13, 0x5e, 0x36, 0x1b, 0xb4, 0xd6, 0xd2, 0xbd, 0x55, 0x0d, 0x51, 0xd2, 0x9c, 0x01, - 0xc8, 0x31, 0x65, 0xce, 0x90, 0x16, 0xfb, 0xc1, 0x47, 0x32, 0x17, 0xf3, 0xa9, 0x8b, 0xfd, 0xd7, - 0xf3, 0x9d, 0xe6, 0x95, 0x3b, 0x8e, 0xe9, 0xd1, 0x23, 0x0d, 0x3b, 0xd2, 0xb0, 0x3d, 0x6a, 0xd8, - 0x6f, 0x65, 0x61, 0x38, 0xd8, 0x34, 0xbd, 0x49, 0xeb, 0x07, 0xb3, 0x56, 0x85, 0x5b, 0x99, 0xdc, - 0x9e, 0xb7, 0x32, 0x7b, 0x51, 0x28, 0x35, 0x38, 0xf2, 0xe4, 0xa6, 0x01, 0x4a, 0x8c, 0x1f, 0x79, - 0x06, 0x07, 0x9d, 0x8f, 0x42, 0xdf, 0xac, 0x7e, 0xdf, 0x6c, 0xb6, 0x9b, 0xc2, 0x4a, 0x47, 0xbf, - 0xae, 0xa6, 0x7e, 0x5f, 0xf3, 0xe1, 0xea, 0xbf, 0xca, 0xc0, 0x88, 0x10, 0xaa, 0x60, 0xbe, 0x27, - 0xa9, 0x86, 0xd2, 0xc9, 0xee, 0x59, 0x3a, 0xb9, 0xdd, 0x4b, 0x47, 0xfd, 0x91, 0x1c, 0x28, 0x53, - 0x66, 0x83, 0x2e, 0x3a, 0xba, 0xe5, 0x2e, 0x53, 0x47, 0x6c, 0xa7, 0x27, 0x19, 0xab, 0x3d, 0x7d, - 0xa0, 0x34, 0xa5, 0x64, 0x77, 0x35, 0xa5, 0xbc, 0x0f, 0x06, 0x44, 0x63, 0x02, 0x9f, 0x42, 0x1c, - 0x35, 0x8e, 0x0f, 0xd4, 0x42, 0x3c, 0x23, 0x2e, 0xb5, 0x5a, 0x8e, 0x7d, 0x8f, 0x3a, 0xfc, 0x96, - 0x4a, 0x10, 0xeb, 0x3e, 0x50, 0x0b, 0xf1, 0x12, 0x67, 0xea, 0xdb, 0x8b, 0x32, 0x67, 0xea, 0x68, - 0x21, 0x9e, 0x5c, 0x84, 0xfe, 0x19, 0xbb, 0xae, 0xa3, 0xa0, 0xf9, 0xb4, 0x32, 0xb4, 0xb9, 0x51, - 0xec, 0x6f, 0x08, 0x98, 0x16, 0x60, 0x19, 0x65, 0xd9, 0x5e, 0xb3, 0x1a, 0xb6, 0xce, 0x9d, 0x5f, - 0xfa, 0x39, 0xa5, 0x21, 0x60, 0x5a, 0x80, 0x65, 0x94, 0x4c, 0xe6, 0xe8, 0x54, 0xd4, 0x1f, 0xf2, - 0x5c, 0x16, 0x30, 0x2d, 0xc0, 0xaa, 0x3f, 0x97, 0x67, 0xda, 0xeb, 0x9a, 0x6f, 0x3d, 0xf0, 0xeb, - 0x42, 0x38, 0x60, 0x7a, 0x77, 0x31, 0x60, 0x1e, 0x98, 0x03, 0x3b, 0xf5, 0x0f, 0xfb, 0x00, 0x84, - 0xf4, 0x27, 0x8f, 0x36, 0x87, 0x7b, 0xd3, 0x9a, 0x32, 0x8c, 0x4d, 0x5a, 0xab, 0xba, 0x55, 0xa7, - 0x46, 0x78, 0x6c, 0x59, 0xc0, 0xa1, 0x8d, 0x3e, 0xbd, 0x54, 0x20, 0xc3, 0x73, 0x4b, 0x2d, 0x59, - 0x80, 0x3c, 0x0d, 0x83, 0x15, 0xcb, 0xa3, 0x8e, 0x5e, 0xf7, 0xcc, 0x7b, 0x54, 0x4c, 0x0d, 0x78, - 0x33, 0x6c, 0x86, 0x60, 0x4d, 0xa6, 0x21, 0xd7, 0x60, 0x68, 0x41, 0x77, 0x3c, 0xb3, 0x6e, 0xb6, - 0x74, 0xcb, 0x73, 0x95, 0x7e, 0x9c, 0xd1, 0xd0, 0xc2, 0x68, 0x49, 0x70, 0x2d, 0x42, 0x45, 0x3e, - 0x06, 0x03, 0xb8, 0x35, 0x45, 0xc7, 0xe9, 0x81, 0x2d, 0x2f, 0x0e, 0x1f, 0x0b, 0xdd, 0x03, 0xf9, - 0xe9, 0x2b, 0xde, 0x00, 0xc7, 0xef, 0x0e, 0x03, 0x8e, 0xe4, 0x43, 0xd0, 0x37, 0x69, 0x19, 0xc8, - 0x1c, 0xb6, 0x64, 0xae, 0x0a, 0xe6, 0xa7, 0x42, 0xe6, 0x76, 0x2b, 0xc6, 0xdb, 0x67, 0x97, 0x3e, - 0xca, 0x06, 0xdf, 0xb9, 0x51, 0x36, 0xf4, 0x0e, 0x1c, 0x8b, 0x0f, 0xef, 0xd7, 0xb1, 0xf8, 0xc8, - 0x2e, 0x8f, 0xc5, 0xd5, 0xb7, 0x60, 0x70, 0x7c, 0x61, 0x2a, 0x18, 0xbd, 0x0f, 0x41, 0x6e, 0x41, - 0x78, 0x2a, 0xe4, 0xb9, 0x3d, 0xd3, 0x32, 0x0d, 0x8d, 0xc1, 0xc8, 0x25, 0xe8, 0x9f, 0x40, 0xf7, - 0x37, 0x71, 0x8b, 0x98, 0xe7, 0xeb, 0x5f, 0x1d, 0x61, 0xe8, 0x05, 0xeb, 0xa3, 0xc9, 0xe3, 0xd0, - 0xb7, 0xe0, 0xd8, 0x2b, 0x8e, 0xde, 0x14, 0x6b, 0x30, 0xba, 0x8a, 0xb4, 0x38, 0x48, 0xf3, 0x71, - 0xea, 0xf7, 0x65, 0x7c, 0xb3, 0x9d, 0x95, 0xa8, 0xb6, 0xf1, 0x68, 0x1e, 0xeb, 0xee, 0xe7, 0x25, - 0x5c, 0x0e, 0xd2, 0x7c, 0x1c, 0xb9, 0x04, 0xbd, 0x93, 0x8e, 0x63, 0x3b, 0xb2, 0xb3, 0x39, 0x65, - 0x00, 0xf9, 0xba, 0x17, 0x29, 0xc8, 0xf3, 0x30, 0xc8, 0xe7, 0x1c, 0x7e, 0xa2, 0x99, 0xeb, 0x76, - 0x53, 0x2a, 0x53, 0xaa, 0x5f, 0xcd, 0x49, 0x36, 0x1b, 0x97, 0xf8, 0x03, 0x78, 0x2b, 0xf0, 0x0c, - 0xe4, 0xc6, 0x17, 0xa6, 0xc4, 0x04, 0x78, 0xdc, 0x2f, 0x2a, 0xa9, 0x4a, 0xac, 0x1c, 0xa3, 0x26, - 0x67, 0x21, 0xbf, 0xc0, 0xd4, 0xa7, 0x80, 0xea, 0xd1, 0xbf, 0xb9, 0x51, 0xcc, 0xb7, 0x98, 0xfe, - 0x20, 0x14, 0xb1, 0x6c, 0x33, 0xc3, 0x77, 0x4c, 0x1c, 0x1b, 0xee, 0x63, 0xce, 0x42, 0xbe, 0xe4, - 0xac, 0xdc, 0x13, 0xb3, 0x16, 0x62, 0x75, 0x67, 0xe5, 0x9e, 0x86, 0x50, 0x72, 0x05, 0x40, 0xa3, - 0x5e, 0xdb, 0xb1, 0xf0, 0x1d, 0xc8, 0x00, 0x9e, 0xbf, 0xe1, 0x6c, 0xe8, 0x20, 0xb4, 0x56, 0xb7, - 0x0d, 0xaa, 0x49, 0x24, 0xea, 0x4f, 0x86, 0x17, 0x3b, 0x65, 0xd3, 0xbd, 0x7b, 0xd4, 0x85, 0x3b, - 0xe8, 0x42, 0x5d, 0x1c, 0x71, 0x26, 0x3b, 0xa9, 0x08, 0xbd, 0x53, 0x0d, 0x7d, 0xc5, 0xc5, 0x3e, - 0x14, 0xbe, 0x64, 0xcb, 0x0c, 0xa0, 0x71, 0x78, 0xac, 0x9f, 0xfa, 0xb7, 0xee, 0xa7, 0x2f, 0xf6, - 0x06, 0xa3, 0x6d, 0x8e, 0x7a, 0x6b, 0xb6, 0x73, 0xd4, 0x55, 0xdb, 0xed, 0xaa, 0x0b, 0xd0, 0x57, - 0x75, 0xea, 0xd2, 0xd1, 0x05, 0xee, 0x07, 0x5c, 0xa7, 0xce, 0x8f, 0x2d, 0x7c, 0x24, 0xa3, 0x2b, - 0xbb, 0x1e, 0xd2, 0xf5, 0x85, 0x74, 0x86, 0xeb, 0x09, 0x3a, 0x81, 0x14, 0x74, 0x0b, 0xb6, 0xe3, - 0x89, 0x8e, 0x0b, 0xe8, 0x5a, 0xb6, 0xe3, 0x69, 0x3e, 0x92, 0xbc, 0x0f, 0x60, 0x71, 0x62, 0xc1, - 0x77, 0xb6, 0x1f, 0x08, 0x7d, 0x01, 0x85, 0x97, 0xbd, 0x26, 0xa1, 0xc9, 0x22, 0x0c, 0xcc, 0xb7, - 0xa8, 0xc3, 0xb7, 0x42, 0xfc, 0x65, 0xc7, 0x7b, 0x63, 0xa2, 0x15, 0xfd, 0x7e, 0x59, 0xfc, 0x1f, - 0x90, 0xf3, 0xf5, 0xc5, 0xf6, 0x7f, 0x6a, 0x21, 0x23, 0xf2, 0x3c, 0x14, 0x4a, 0xdc, 0xce, 0x1b, - 0x44, 0x96, 0x81, 0xc8, 0x70, 0x0b, 0xca, 0x51, 0x7c, 0xcf, 0xae, 0xe3, 0xdf, 0x9a, 0x20, 0x57, - 0x2f, 0xc1, 0x68, 0xbc, 0x1a, 0x32, 0x08, 0x7d, 0x13, 0xf3, 0x73, 0x73, 0x93, 0x13, 0x8b, 0xa3, - 0x3d, 0xa4, 0x1f, 0xf2, 0xd5, 0xc9, 0xb9, 0xf2, 0x68, 0x46, 0xfd, 0x19, 0x69, 0x06, 0x61, 0xaa, - 0x75, 0x74, 0x35, 0xbc, 0xa7, 0xfb, 0x96, 0x51, 0xbc, 0x0f, 0xc5, 0x13, 0x83, 0xa6, 0xe9, 0x79, - 0xd4, 0x10, 0xab, 0x04, 0xde, 0x17, 0x7a, 0xf7, 0xb5, 0x04, 0x9e, 0x3c, 0x09, 0xc3, 0x08, 0x13, - 0x57, 0x84, 0x7c, 0x7f, 0x2c, 0x0a, 0x38, 0xf7, 0xb5, 0x28, 0x52, 0xfd, 0x5a, 0x78, 0x3b, 0x3c, - 0x43, 0xf5, 0xc3, 0x7a, 0xa3, 0xf8, 0x2e, 0xe9, 0x2f, 0xf5, 0x4f, 0xf2, 0xfc, 0x09, 0x08, 0x7f, - 0xb8, 0x77, 0x10, 0xa2, 0x0c, 0x8f, 0x74, 0x73, 0x3b, 0x38, 0xd2, 0x7d, 0x12, 0x0a, 0xb3, 0xd4, - 0x5b, 0xb5, 0x7d, 0xc7, 0x2f, 0xf4, 0xd0, 0x6b, 0x22, 0x44, 0xf6, 0xd0, 0xe3, 0x34, 0xe4, 0x2e, - 0x10, 0xff, 0x55, 0x5e, 0xe0, 0x88, 0xed, 0x1f, 0x21, 0x9f, 0x4e, 0xec, 0x53, 0xaa, 0xf8, 0x24, - 0x17, 0x7d, 0xec, 0x4f, 0x04, 0x8e, 0xde, 0x92, 0x27, 0xd6, 0x1f, 0x6f, 0x14, 0x0b, 0x9c, 0x46, - 0x4b, 0x61, 0x4b, 0x5e, 0x87, 0x81, 0xd9, 0xa9, 0x92, 0x78, 0xa1, 0xc7, 0xbd, 0x22, 0x1e, 0x0a, - 0xa4, 0xe8, 0x23, 0x02, 0x91, 0xe0, 0x7b, 0x9b, 0xe6, 0xb2, 0x9e, 0x7c, 0xa0, 0x17, 0x72, 0x61, - 0xda, 0xc2, 0x5f, 0xee, 0x88, 0xd3, 0x85, 0x40, 0x5b, 0xa2, 0xef, 0x79, 0xe2, 0xb2, 0xe2, 0xd8, - 0x98, 0xb6, 0xf4, 0xef, 0x61, 0x74, 0xcf, 0xc3, 0x58, 0xa9, 0xd5, 0x6a, 0x98, 0xd4, 0x40, 0x7d, - 0xd1, 0xda, 0x0d, 0xea, 0x0a, 0x97, 0x1f, 0x7c, 0x0c, 0xa2, 0x73, 0x64, 0x0d, 0xdf, 0x85, 0xd6, - 0x9c, 0x76, 0xd4, 0x3f, 0x33, 0x59, 0x56, 0xfd, 0x81, 0x2c, 0x9c, 0x9a, 0x70, 0xa8, 0xee, 0xd1, - 0xd9, 0xa9, 0x52, 0xa9, 0x8d, 0x3e, 0x72, 0x8d, 0x06, 0xb5, 0x56, 0x0e, 0x66, 0x58, 0xbf, 0x04, - 0x23, 0x41, 0x03, 0xaa, 0x75, 0xbb, 0x45, 0xe5, 0x87, 0x55, 0x75, 0x1f, 0x53, 0x73, 0x19, 0x4a, - 0x8b, 0x91, 0x92, 0x9b, 0x70, 0x3c, 0x80, 0x94, 0x1a, 0x0d, 0x7b, 0x4d, 0xa3, 0x6d, 0x97, 0x3b, - 0xc6, 0xf6, 0x73, 0xc7, 0xd8, 0x90, 0x83, 0xce, 0xf0, 0x35, 0x87, 0x11, 0x68, 0x69, 0xa5, 0xd4, - 0x2f, 0xe5, 0xe0, 0xf4, 0x6d, 0xbd, 0x61, 0x1a, 0xa1, 0x68, 0x34, 0xea, 0xb6, 0x6c, 0xcb, 0xa5, - 0x87, 0x68, 0x94, 0x46, 0x86, 0x42, 0x7e, 0x5f, 0x86, 0x42, 0xb2, 0x8b, 0x7a, 0xf7, 0xdc, 0x45, - 0x85, 0x5d, 0x75, 0xd1, 0x7f, 0xce, 0xc0, 0xa8, 0xef, 0xf8, 0x2f, 0xbf, 0xa6, 0x96, 0xbc, 0xd2, - 0xf1, 0x08, 0x31, 0xe6, 0x07, 0x8d, 0x78, 0x52, 0x85, 0xbe, 0xc9, 0xfb, 0x2d, 0xd3, 0xa1, 0xee, - 0x36, 0x9c, 0xb8, 0xcf, 0x89, 0xe3, 0x92, 0x31, 0xca, 0x8b, 0x24, 0x4e, 0x4a, 0x38, 0x18, 0x9f, - 0xf3, 0xf1, 0xa7, 0x0f, 0xe3, 0xfe, 0x13, 0x71, 0xfe, 0x9c, 0x4f, 0x3c, 0x91, 0x88, 0xbc, 0xcf, - 0x0c, 0x49, 0xc9, 0x63, 0x90, 0x5b, 0x5c, 0x9c, 0x11, 0x33, 0x29, 0x3e, 0xcd, 0xf7, 0x3c, 0xf9, - 0xbd, 0x22, 0xc3, 0xaa, 0xbf, 0x9b, 0x05, 0x60, 0xaa, 0xc0, 0x87, 0xeb, 0x81, 0x28, 0xe1, 0x38, - 0xf4, 0xfb, 0x02, 0x17, 0x6a, 0x18, 0x78, 0xed, 0xc7, 0x3b, 0x22, 0x5e, 0x77, 0xf0, 0x42, 0xa3, - 0xe8, 0x3b, 0x92, 0xf3, 0x7b, 0x00, 0xdc, 0xd9, 0xa0, 0x23, 0xb9, 0xef, 0x3e, 0xfe, 0x3e, 0x18, - 0x10, 0x33, 0x9e, 0x1d, 0x39, 0xff, 0xaf, 0xfb, 0x40, 0x2d, 0xc4, 0xc7, 0xa6, 0xd6, 0xc2, 0x1e, - 0x16, 0x62, 0x5f, 0xbc, 0xbc, 0x57, 0x8e, 0xc4, 0xbb, 0xcf, 0xe2, 0xfd, 0x9c, 0x10, 0x2f, 0x7f, - 0xc1, 0x73, 0x68, 0xc5, 0xbb, 0x6f, 0x67, 0xdf, 0xea, 0x6f, 0x65, 0x80, 0xb0, 0x66, 0x2d, 0xe8, - 0xae, 0xbb, 0x66, 0x3b, 0x06, 0x77, 0x4e, 0x3f, 0x10, 0xc1, 0xec, 0xdf, 0x7d, 0xe5, 0x57, 0xfb, - 0xe1, 0x78, 0xc4, 0xf1, 0xf7, 0x90, 0x4f, 0x56, 0x97, 0xa2, 0xa3, 0xa9, 0xdb, 0xab, 0x97, 0xf7, - 0xc8, 0x17, 0xa2, 0xbd, 0x91, 0x07, 0x68, 0xd2, 0x4d, 0xe8, 0x53, 0x30, 0x24, 0x7e, 0xb0, 0x15, - 0xda, 0xbf, 0xe9, 0xc2, 0x51, 0xea, 0x32, 0x80, 0x16, 0x41, 0x93, 0x67, 0x61, 0x80, 0x0d, 0x98, - 0x15, 0x8c, 0xe2, 0xd1, 0x17, 0xbe, 0x28, 0x31, 0x7c, 0xa0, 0xbc, 0x9e, 0x04, 0x94, 0xd2, 0x3b, - 0xa2, 0xfe, 0x6d, 0xbc, 0x23, 0xfa, 0x38, 0x0c, 0x96, 0x2c, 0xcb, 0xf6, 0x70, 0x93, 0xee, 0x8a, - 0xab, 0x89, 0x8e, 0x56, 0xf9, 0x63, 0xf8, 0x38, 0x3e, 0xa4, 0x4f, 0x35, 0xcb, 0x65, 0x86, 0xe4, - 0xaa, 0xff, 0x2a, 0x86, 0x3a, 0xc2, 0xab, 0x1c, 0xaf, 0x67, 0x1c, 0x01, 0x4b, 0x3e, 0x8a, 0xc1, - 0xce, 0x1b, 0x5e, 0x70, 0xec, 0x96, 0xed, 0x52, 0x83, 0x0b, 0x6a, 0x30, 0x0c, 0x35, 0xd0, 0x12, - 0x08, 0x7c, 0xc7, 0x16, 0x89, 0xa8, 0x11, 0x29, 0x42, 0x96, 0xe1, 0x84, 0x7f, 0x51, 0x1c, 0xbc, - 0x18, 0xac, 0x94, 0x5d, 0x65, 0x08, 0x5f, 0x25, 0x91, 0xb8, 0x32, 0x54, 0xca, 0xe3, 0xe7, 0xfd, - 0x6b, 0x11, 0xff, 0xc9, 0x61, 0xcd, 0x34, 0xe4, 0xae, 0x4e, 0xe5, 0x47, 0xbe, 0x0d, 0x06, 0x67, - 0xf5, 0xfb, 0xe5, 0xb6, 0x38, 0x7b, 0x19, 0xde, 0xfe, 0xed, 0x4b, 0x53, 0xbf, 0x5f, 0x33, 0x44, - 0xb9, 0x98, 0x4d, 0x21, 0xb3, 0x24, 0x35, 0x38, 0xb5, 0xe0, 0xd8, 0x4d, 0xdb, 0xa3, 0x46, 0xec, - 0xf1, 0xdd, 0xb1, 0xf0, 0xb5, 0x6e, 0x4b, 0x50, 0xd4, 0xba, 0xbc, 0xc2, 0xeb, 0xc0, 0x86, 0x34, - 0xe1, 0x58, 0xc9, 0x75, 0xdb, 0x4d, 0x1a, 0xde, 0x50, 0x8d, 0x6e, 0xf9, 0x19, 0xef, 0x15, 0x5e, - 0xcb, 0x0f, 0xeb, 0x58, 0x94, 0x5f, 0x50, 0xd5, 0x3c, 0x53, 0xae, 0x11, 0xbf, 0x25, 0xce, 0xfb, - 0x46, 0xbe, 0x7f, 0x64, 0xf4, 0x98, 0x76, 0x3a, 0xd9, 0x98, 0x45, 0xd3, 0x6b, 0x50, 0xf5, 0x2b, - 0x19, 0x80, 0x50, 0xc0, 0xe4, 0xa9, 0x68, 0xa8, 0xa0, 0x4c, 0x78, 0xd1, 0x21, 0xa2, 0x17, 0x44, - 0x62, 0x03, 0x91, 0xb3, 0x90, 0xc7, 0x08, 0x17, 0xd9, 0xf0, 0x60, 0xf5, 0xae, 0x69, 0x19, 0x1a, - 0x42, 0x19, 0x56, 0x7a, 0x8a, 0x8e, 0x58, 0xbc, 0xd4, 0xe7, 0x56, 0x61, 0x19, 0x8e, 0x55, 0xdb, - 0x4b, 0x7e, 0xdd, 0xd2, 0xbb, 0x3a, 0x0c, 0xb4, 0xe1, 0xb6, 0x97, 0x82, 0xc7, 0xa8, 0x91, 0x30, - 0x26, 0xd1, 0x22, 0xea, 0xcf, 0x65, 0x62, 0xb3, 0xe0, 0x01, 0x2e, 0x7a, 0xef, 0x49, 0xfa, 0x69, - 0x24, 0xa7, 0x25, 0xf5, 0x47, 0xb3, 0x30, 0xb8, 0x60, 0x3b, 0x9e, 0x08, 0x19, 0x72, 0xb8, 0x57, - 0x21, 0x69, 0xaf, 0x94, 0xdf, 0xc1, 0x5e, 0xe9, 0x2c, 0xe4, 0x25, 0x17, 0x65, 0x7e, 0x2f, 0x62, - 0x18, 0x8e, 0x86, 0x50, 0xf5, 0xdb, 0xb3, 0x00, 0x1f, 0x7a, 0xfa, 0xe9, 0x07, 0x58, 0x40, 0xea, - 0x0f, 0x67, 0xe0, 0x98, 0xb8, 0xa8, 0x93, 0x82, 0x6e, 0xf5, 0xf9, 0x57, 0xac, 0xf2, 0xb8, 0xe4, - 0x20, 0xcd, 0xc7, 0xb1, 0x25, 0x60, 0xf2, 0xbe, 0xe9, 0xe1, 0x5d, 0x85, 0x14, 0x75, 0x8b, 0x0a, - 0x98, 0xbc, 0x04, 0xf8, 0x74, 0xe4, 0x29, 0xff, 0x0a, 0x32, 0x17, 0xae, 0x7b, 0xac, 0xc0, 0x64, - 0xea, 0x35, 0xa4, 0xfa, 0x0b, 0x79, 0xc8, 0x4f, 0xde, 0xa7, 0xf5, 0x43, 0xde, 0x35, 0xd2, 0xc1, - 0x66, 0x7e, 0x8f, 0x07, 0x9b, 0xbb, 0xf1, 0xa9, 0x78, 0x35, 0xec, 0xcf, 0x42, 0xb4, 0xfa, 0x58, - 0xcf, 0xc7, 0xab, 0xf7, 0x7b, 0xfa, 0xf0, 0xb9, 0xe4, 0xfc, 0x93, 0x1c, 0xe4, 0xaa, 0x13, 0x0b, - 0x47, 0x7a, 0x73, 0xa0, 0x7a, 0xd3, 0xfd, 0xce, 0x5a, 0x0d, 0xae, 0xa1, 0xfa, 0x43, 0x2f, 0xd1, - 0xd8, 0x8d, 0xd3, 0x37, 0x73, 0x30, 0x52, 0x9d, 0x5a, 0x5c, 0x90, 0x4e, 0x82, 0x6f, 0x72, 0x4f, - 0x3e, 0xf4, 0x29, 0xe3, 0x5d, 0x7a, 0x36, 0x61, 0xcf, 0xdc, 0xaa, 0x58, 0xde, 0x73, 0xd7, 0x6e, - 0xeb, 0x8d, 0x36, 0xc5, 0xa3, 0x17, 0xee, 0xf7, 0xeb, 0x9a, 0x6f, 0xd1, 0x2f, 0xe1, 0xc3, 0x7f, - 0x9f, 0x01, 0x79, 0x09, 0x72, 0xb7, 0x84, 0x47, 0x46, 0x27, 0x3e, 0xcf, 0x5c, 0xe5, 0x7c, 0xd8, - 0x24, 0x98, 0x6b, 0x9b, 0x06, 0x72, 0x60, 0xa5, 0x58, 0xe1, 0xeb, 0x62, 0x01, 0xde, 0x56, 0xe1, - 0x15, 0xbf, 0xf0, 0xf5, 0x4a, 0x99, 0x54, 0x61, 0x70, 0x81, 0x3a, 0x4d, 0x13, 0x3b, 0xca, 0x9f, - 0xb3, 0xbb, 0x33, 0x61, 0x3b, 0x95, 0xc1, 0x56, 0x58, 0x08, 0x99, 0xc9, 0x5c, 0xc8, 0x1b, 0x00, - 0xdc, 0x46, 0xd9, 0x66, 0x20, 0xc7, 0x73, 0x68, 0xf7, 0x73, 0xd3, 0x32, 0xc5, 0xc6, 0x93, 0x98, - 0x91, 0xbb, 0x30, 0x3a, 0x6b, 0x1b, 0xe6, 0xb2, 0xc9, 0x5d, 0x2f, 0xb1, 0x82, 0xc2, 0xd6, 0x0e, - 0x4f, 0xcc, 0x94, 0x6c, 0x4a, 0xe5, 0xd2, 0xaa, 0x49, 0x30, 0x56, 0xff, 0x61, 0x2f, 0xe4, 0x59, - 0xb7, 0x1f, 0x8d, 0xdf, 0xbd, 0x8c, 0xdf, 0x12, 0x8c, 0xde, 0xb1, 0x9d, 0xbb, 0xa6, 0xb5, 0x12, - 0x78, 0xc5, 0x8b, 0xbd, 0x29, 0x7a, 0xf2, 0xac, 0x71, 0x5c, 0x2d, 0x70, 0xa0, 0xd7, 0x12, 0xe4, - 0x5b, 0x8c, 0xe0, 0x17, 0x00, 0xf8, 0x5b, 0x77, 0xa4, 0xe9, 0x0f, 0x83, 0x55, 0xf0, 0x97, 0xf0, - 0xe8, 0x68, 0x2f, 0x07, 0xab, 0x08, 0x89, 0xd9, 0x26, 0x9c, 0xfb, 0x42, 0x0c, 0xa0, 0xdf, 0x3d, - 0x6e, 0xc2, 0xd1, 0x17, 0x42, 0x36, 0x02, 0xb8, 0x57, 0xc4, 0x02, 0x80, 0x74, 0xbf, 0x04, 0x31, - 0x41, 0x44, 0x26, 0x07, 0x11, 0x1e, 0x2e, 0xe5, 0x7a, 0x49, 0x93, 0x78, 0x90, 0xe7, 0x62, 0x17, - 0xe0, 0x24, 0xc2, 0xad, 0xe3, 0xfd, 0x77, 0xe8, 0x40, 0x35, 0xb4, 0x95, 0x03, 0x95, 0xfa, 0x99, - 0x2c, 0x0c, 0x54, 0xdb, 0x4b, 0xee, 0xba, 0xeb, 0xd1, 0xe6, 0x21, 0x57, 0x63, 0x7f, 0x7b, 0x95, - 0x4f, 0xdd, 0x5e, 0x3d, 0xe6, 0x0b, 0x45, 0x3a, 0x77, 0x0c, 0x4c, 0x3a, 0x5f, 0x1c, 0x7f, 0x27, - 0x0b, 0xa3, 0xfc, 0xe2, 0xac, 0x6c, 0xba, 0xf5, 0x7d, 0x70, 0xe6, 0x3f, 0x78, 0xa9, 0xec, 0xed, - 0xb2, 0x79, 0x1b, 0x4f, 0x24, 0xd4, 0x4f, 0x66, 0x61, 0xb0, 0xd4, 0xf6, 0x56, 0x4b, 0x1e, 0xea, - 0xd6, 0x03, 0xb9, 0x3f, 0xf9, 0xb5, 0x0c, 0x1c, 0x63, 0x0d, 0x59, 0xb4, 0xef, 0x52, 0x6b, 0x1f, - 0x0e, 0x1e, 0xe5, 0x03, 0xc4, 0xec, 0x2e, 0x0f, 0x10, 0x7d, 0x59, 0xe6, 0x76, 0x26, 0x4b, 0x3c, - 0x2e, 0xd7, 0xec, 0x06, 0x3d, 0xdc, 0x9f, 0xb1, 0x8f, 0xc7, 0xe5, 0xbe, 0x40, 0xf6, 0xe1, 0x7a, - 0xe6, 0x5b, 0x4b, 0x20, 0xfb, 0x70, 0xb6, 0xf4, 0xad, 0x21, 0x90, 0xaf, 0x66, 0x60, 0x60, 0xdc, - 0xf6, 0x0e, 0xf9, 0xc0, 0x17, 0x5f, 0x71, 0xb8, 0xd5, 0xdc, 0xff, 0x8a, 0xc3, 0xad, 0x9b, 0xea, - 0x0f, 0x66, 0xe1, 0x84, 0x08, 0xd2, 0x2d, 0xce, 0x1f, 0x8e, 0xa6, 0x63, 0x31, 0xd8, 0x92, 0xa2, - 0x39, 0x9a, 0x87, 0x84, 0x68, 0x7e, 0x2a, 0x07, 0x27, 0x30, 0x94, 0x29, 0xdb, 0x96, 0x7d, 0x0b, - 0xd8, 0x22, 0xa4, 0x1e, 0xbd, 0x04, 0x9d, 0x4d, 0xb9, 0x04, 0xfd, 0xe3, 0x8d, 0xe2, 0x73, 0x2b, - 0xa6, 0xb7, 0xda, 0x5e, 0xba, 0x5c, 0xb7, 0x9b, 0x57, 0x56, 0x1c, 0xfd, 0x9e, 0xc9, 0xaf, 0xff, - 0xf4, 0xc6, 0x95, 0x20, 0xdf, 0x85, 0xde, 0x32, 0x45, 0x26, 0x8c, 0x2a, 0xee, 0x75, 0x18, 0x57, - 0xff, 0xfa, 0xd4, 0x05, 0xb8, 0x61, 0x9b, 0x96, 0xf0, 0x29, 0xe4, 0x86, 0x6e, 0x95, 0xed, 0x0f, - 0xdf, 0xb4, 0x4d, 0xab, 0x16, 0x77, 0x2c, 0xdc, 0x69, 0x7d, 0x21, 0x6b, 0x4d, 0xaa, 0x46, 0xfd, - 0x97, 0x19, 0x78, 0x28, 0xaa, 0xc5, 0xdf, 0x0a, 0xb6, 0xe3, 0x0f, 0x65, 0xe1, 0xe4, 0x75, 0x14, - 0x4e, 0xe0, 0xc8, 0x71, 0x34, 0x6f, 0x89, 0xc1, 0x99, 0x22, 0x9b, 0x23, 0x8b, 0xb2, 0xb3, 0x6c, - 0x8e, 0x26, 0x75, 0x21, 0x9b, 0x5f, 0xcf, 0xc0, 0xf1, 0xf9, 0x4a, 0x79, 0xe2, 0x5b, 0x64, 0x44, - 0x25, 0xbf, 0xe7, 0x90, 0x1b, 0x9c, 0x89, 0xef, 0x39, 0xe4, 0xa6, 0xe7, 0x17, 0xb2, 0x70, 0xbc, - 0x5a, 0x9a, 0x9d, 0xf9, 0x56, 0x99, 0xc1, 0x27, 0x64, 0xaf, 0x43, 0xff, 0x10, 0x4c, 0xd8, 0x02, - 0xf2, 0x67, 0xde, 0xbe, 0xda, 0xd9, 0x1b, 0x31, 0x29, 0x94, 0x43, 0x3e, 0x75, 0xef, 0x8b, 0x50, - 0x98, 0xe6, 0x47, 0xa8, 0x0f, 0xb9, 0xe6, 0xff, 0xe3, 0x02, 0x0c, 0xde, 0x6c, 0x2f, 0x51, 0xe1, - 0x9c, 0xf2, 0x40, 0x9f, 0xfc, 0x5e, 0x85, 0x41, 0x21, 0x06, 0xbc, 0x35, 0x91, 0x82, 0xe7, 0x89, - 0x60, 0x28, 0x3c, 0x3e, 0x91, 0x4c, 0x44, 0xce, 0x42, 0xfe, 0x36, 0x75, 0x96, 0xe4, 0x77, 0xa5, - 0xf7, 0xa8, 0xb3, 0xa4, 0x21, 0x94, 0xcc, 0x84, 0x2e, 0xf3, 0xa5, 0x85, 0x0a, 0x26, 0x52, 0x11, - 0x17, 0x36, 0x98, 0x19, 0x26, 0xf0, 0x7b, 0xd3, 0x5b, 0x26, 0x4f, 0xc1, 0x22, 0xbf, 0x69, 0x8f, - 0x97, 0x24, 0x73, 0x30, 0x26, 0x3b, 0x3e, 0xf1, 0x2c, 0x22, 0xfd, 0x29, 0xec, 0xd2, 0xf2, 0x87, - 0x24, 0x8b, 0x92, 0x57, 0x61, 0xc8, 0x07, 0xa2, 0x0b, 0xd7, 0x40, 0x18, 0xba, 0x3e, 0x60, 0x15, - 0x4b, 0x51, 0x14, 0x29, 0x20, 0x33, 0xc0, 0x6b, 0x08, 0x48, 0x61, 0x10, 0x73, 0x89, 0x8b, 0x14, - 0x20, 0xcf, 0x22, 0x03, 0x7c, 0xe6, 0x81, 0xce, 0x2a, 0x83, 0xf8, 0xe8, 0x12, 0x5d, 0xf2, 0x1d, - 0x01, 0xe7, 0x4f, 0x6b, 0x23, 0x64, 0x64, 0x1e, 0x20, 0x74, 0x2a, 0x10, 0x01, 0x0c, 0x76, 0xec, - 0xee, 0x20, 0xb1, 0x90, 0xaf, 0x03, 0x87, 0x77, 0x73, 0x1d, 0xa8, 0xfe, 0x66, 0x16, 0x06, 0x4b, - 0xad, 0x56, 0x30, 0x14, 0x9e, 0x82, 0x42, 0xa9, 0xd5, 0xba, 0xa5, 0x55, 0xe4, 0x50, 0xe6, 0x7a, - 0xab, 0x55, 0x6b, 0x3b, 0xa6, 0xec, 0x13, 0xca, 0x89, 0xc8, 0x04, 0x0c, 0x97, 0x5a, 0xad, 0x85, - 0xf6, 0x52, 0xc3, 0xac, 0x4b, 0x99, 0x91, 0x78, 0x12, 0xb7, 0x56, 0xab, 0xd6, 0x42, 0x4c, 0x3c, - 0x3d, 0x56, 0xb4, 0x0c, 0xf9, 0x38, 0x86, 0xfd, 0x11, 0x89, 0x79, 0x78, 0xea, 0x0f, 0x35, 0x08, - 0x62, 0x1e, 0xb6, 0xed, 0x72, 0x40, 0xc4, 0x83, 0xbd, 0x9f, 0xf5, 0x43, 0xe6, 0xb3, 0x8a, 0x12, - 0x09, 0x78, 0x42, 0x96, 0xe4, 0xfd, 0xd0, 0x57, 0x6a, 0xb5, 0xa4, 0xfb, 0x26, 0x74, 0x2a, 0x62, - 0xa5, 0x62, 0x7d, 0xec, 0x93, 0x9d, 0x79, 0x19, 0x46, 0xa2, 0x95, 0xed, 0x28, 0x58, 0xfc, 0x1f, - 0x65, 0xf0, 0x83, 0x0e, 0xb9, 0x4f, 0xf3, 0x33, 0x90, 0x2b, 0xb5, 0x5a, 0x62, 0x3e, 0x3a, 0x9e, - 0xd2, 0x1f, 0xf1, 0x27, 0xd0, 0xa5, 0x56, 0xcb, 0xff, 0xf4, 0x43, 0xfe, 0x38, 0x62, 0x57, 0x9f, - 0xfe, 0x55, 0xfe, 0xe9, 0x87, 0xfb, 0xe1, 0x82, 0xfa, 0x0b, 0x39, 0x38, 0x56, 0x6a, 0xb5, 0x8e, - 0x82, 0xcc, 0xef, 0xd7, 0x43, 0xeb, 0xa7, 0x01, 0xa4, 0xe9, 0xb1, 0x2f, 0x78, 0xba, 0x35, 0x28, - 0x4d, 0x8d, 0x4a, 0x46, 0x93, 0x88, 0x7c, 0xf5, 0xeb, 0xdf, 0x91, 0xfa, 0x7d, 0x32, 0x87, 0x53, - 0xf1, 0x61, 0x0f, 0x1a, 0xf5, 0x6e, 0xe9, 0x36, 0xd1, 0x07, 0x85, 0x1d, 0xf5, 0xc1, 0xaf, 0x46, - 0x06, 0x0f, 0x06, 0x2d, 0x3f, 0xea, 0x85, 0xde, 0x3d, 0x99, 0xc5, 0x23, 0xb2, 0x30, 0x45, 0x24, - 0x1b, 0x3f, 0x91, 0x92, 0x88, 0xab, 0x54, 0x67, 0xa8, 0x9a, 0x69, 0x68, 0x31, 0x5a, 0xbf, 0x0f, - 0xfb, 0x76, 0xd4, 0x87, 0x1b, 0x59, 0x7c, 0x3b, 0x1d, 0xc4, 0x65, 0xda, 0xfb, 0xee, 0xe2, 0x0a, - 0x00, 0xf7, 0x3c, 0x08, 0xdc, 0x9a, 0x87, 0x79, 0x08, 0x16, 0x9e, 0x5f, 0x49, 0x84, 0x60, 0x09, - 0x49, 0x02, 0x0f, 0xa9, 0x5c, 0xaa, 0x87, 0xd4, 0x25, 0xe8, 0xd7, 0xf4, 0xb5, 0xd7, 0xdb, 0xd4, - 0x59, 0x17, 0xe6, 0x0c, 0x0f, 0x7b, 0xa8, 0xaf, 0xd5, 0x3e, 0xc1, 0x80, 0x5a, 0x80, 0x26, 0x6a, - 0xf0, 0xf8, 0x5e, 0xf2, 0x08, 0xe1, 0x67, 0xe4, 0xc1, 0x93, 0xfb, 0xdd, 0x28, 0x3a, 0x79, 0x11, - 0x72, 0xa5, 0x3b, 0x55, 0x21, 0xd9, 0xa0, 0x6b, 0x4b, 0x77, 0xaa, 0x42, 0x5e, 0x1d, 0xcb, 0xde, - 0xa9, 0xaa, 0x9f, 0xcc, 0x02, 0x49, 0x52, 0x92, 0xe7, 0x60, 0x00, 0xa1, 0x2b, 0x4c, 0x67, 0xe4, - 0xc4, 0x9c, 0x6b, 0x6e, 0xcd, 0x41, 0x68, 0xc4, 0xb8, 0xf3, 0x49, 0xc9, 0x0b, 0x98, 0x83, 0x58, - 0xa4, 0x86, 0x8b, 0x24, 0xe6, 0x5c, 0x73, 0xfd, 0xac, 0xbd, 0xb1, 0x14, 0xc4, 0x82, 0x18, 0xed, - 0xc2, 0x3b, 0xd5, 0x69, 0xdb, 0xf5, 0x84, 0xa8, 0xb9, 0x5d, 0xb8, 0xe6, 0x62, 0x46, 0xd8, 0x88, - 0x5d, 0xc8, 0xc9, 0x30, 0xab, 0xd5, 0x9d, 0x2a, 0x7f, 0xa6, 0x62, 0x68, 0x76, 0xc3, 0x37, 0x28, - 0x79, 0x56, 0xab, 0x35, 0xb7, 0xc6, 0x9f, 0xb8, 0x18, 0x98, 0xfc, 0x38, 0x92, 0xd5, 0x2a, 0x52, - 0x4a, 0xfd, 0x6c, 0x3f, 0x8c, 0x96, 0x75, 0x4f, 0x5f, 0xd2, 0x5d, 0x2a, 0xed, 0xa6, 0x8f, 0xf9, - 0x30, 0xff, 0x73, 0x24, 0x39, 0x18, 0x4b, 0x29, 0x5f, 0x13, 0x2f, 0x40, 0x5e, 0x0a, 0xf9, 0x06, - 0x39, 0x47, 0xe5, 0x24, 0x66, 0x4b, 0xb5, 0x96, 0x00, 0x6b, 0x09, 0x42, 0xf2, 0x24, 0x0c, 0xfa, - 0x30, 0xb6, 0x01, 0xc8, 0x85, 0x3a, 0x63, 0x2c, 0x31, 0xfb, 0x5f, 0x93, 0xd1, 0xe4, 0x05, 0x18, - 0xf2, 0x7f, 0x4a, 0xa6, 0x35, 0xcf, 0xc8, 0xb6, 0x94, 0xd8, 0x3d, 0xc9, 0xa4, 0x72, 0x51, 0x9c, - 0xdf, 0x7a, 0x23, 0x45, 0x63, 0x49, 0xcf, 0x22, 0xa4, 0xe4, 0x13, 0x30, 0xe2, 0xff, 0x16, 0x1b, - 0x06, 0x9e, 0x1f, 0xee, 0xc9, 0x20, 0xb7, 0x72, 0x4c, 0xac, 0x97, 0xa3, 0xe4, 0x7c, 0xeb, 0xf0, - 0xb0, 0x9f, 0xc7, 0xcb, 0x58, 0x4a, 0xee, 0x1c, 0x62, 0x15, 0x90, 0x0a, 0x8c, 0xf9, 0x90, 0x50, - 0x43, 0xfb, 0xc2, 0x1d, 0xa3, 0xb1, 0x54, 0x4b, 0x55, 0xd2, 0x64, 0x29, 0xd2, 0x80, 0xb3, 0x11, - 0xa0, 0xe1, 0xae, 0x9a, 0xcb, 0x9e, 0xd8, 0xee, 0x89, 0x18, 0xc4, 0x22, 0x71, 0x63, 0xc0, 0x95, - 0xd3, 0xf8, 0x19, 0x58, 0xa3, 0xd9, 0xa1, 0xba, 0x72, 0x23, 0x55, 0x38, 0xe1, 0xe3, 0xaf, 0x4f, - 0x2c, 0x2c, 0x38, 0xf6, 0x9b, 0xb4, 0xee, 0x55, 0xca, 0x62, 0xbb, 0x8c, 0xb1, 0xe9, 0x8c, 0xa5, - 0xda, 0x4a, 0xbd, 0xc5, 0x94, 0x82, 0xe1, 0xa2, 0xcc, 0x53, 0x0b, 0x93, 0xdb, 0x70, 0x52, 0x82, - 0x57, 0x2c, 0xd7, 0xd3, 0xad, 0x3a, 0xad, 0x94, 0xc5, 0x1e, 0x1a, 0xf7, 0xf3, 0x82, 0xab, 0x29, - 0x90, 0x51, 0xb6, 0xe9, 0xc5, 0xc9, 0xcb, 0x30, 0xec, 0x23, 0xf8, 0x2d, 0xe2, 0x20, 0xde, 0x22, - 0xe2, 0x90, 0x34, 0x96, 0x6a, 0xf1, 0xd7, 0x94, 0x51, 0x62, 0x59, 0xa3, 0x30, 0xb5, 0xfd, 0x50, - 0x44, 0xa3, 0xbc, 0xf5, 0x56, 0xaa, 0x32, 0x62, 0xba, 0xfb, 0x57, 0x43, 0x8d, 0x9a, 0x77, 0xcc, - 0x15, 0x93, 0xef, 0xa4, 0xfd, 0x07, 0x94, 0x4b, 0x35, 0x1b, 0x81, 0x69, 0xfa, 0xc1, 0xc9, 0xcf, - 0x94, 0xe0, 0x78, 0x8a, 0x8e, 0xed, 0x68, 0xc7, 0xf8, 0x99, 0x6c, 0xd8, 0x88, 0x43, 0xbe, 0x6d, - 0x1c, 0x87, 0x7e, 0xff, 0x4b, 0x84, 0xf1, 0xa0, 0x74, 0x1a, 0x9a, 0x71, 0x1e, 0x3e, 0x3e, 0x22, - 0x8e, 0x43, 0xbe, 0x95, 0xdc, 0x0f, 0x71, 0xbc, 0x9d, 0x09, 0xc5, 0x71, 0xc8, 0xb7, 0x97, 0xbf, - 0x9e, 0x0b, 0xe7, 0xa4, 0xa3, 0x3d, 0xe6, 0x7e, 0x99, 0xc9, 0xa1, 0x1f, 0x6c, 0x61, 0x07, 0x0f, - 0x19, 0x65, 0xd5, 0xec, 0xdb, 0xa5, 0x6a, 0xfe, 0x76, 0xb2, 0x3f, 0xb9, 0xe9, 0x79, 0x28, 0xfb, - 0x73, 0x1f, 0x06, 0x2b, 0xb9, 0x1a, 0xae, 0x63, 0xdc, 0x46, 0xef, 0x95, 0x42, 0xfc, 0x2d, 0x09, - 0x13, 0x3d, 0x4a, 0x42, 0x3e, 0x02, 0xa7, 0x23, 0x80, 0x05, 0xdd, 0xd1, 0x9b, 0xd4, 0x0b, 0x33, - 0x0e, 0x62, 0xd0, 0x26, 0xbf, 0x74, 0xad, 0x15, 0xa0, 0xe5, 0x2c, 0x86, 0x1d, 0x38, 0x48, 0xca, - 0xd1, 0xb7, 0x03, 0x27, 0xe9, 0x2f, 0xe6, 0x42, 0x53, 0x25, 0x1a, 0x7c, 0x55, 0xa3, 0x6e, 0xbb, - 0xe1, 0x3d, 0xb8, 0x1d, 0xbc, 0xbb, 0xd4, 0x16, 0xd3, 0x70, 0xac, 0xb4, 0xbc, 0x4c, 0xeb, 0x9e, - 0x1f, 0x53, 0xda, 0x15, 0xe1, 0xf6, 0xf8, 0xd6, 0x41, 0xa0, 0x44, 0x8c, 0xe0, 0x48, 0x6e, 0xfc, - 0x58, 0x31, 0xf5, 0x77, 0xf2, 0xa0, 0x04, 0xa6, 0x7b, 0xf0, 0x50, 0xeb, 0x00, 0x97, 0xc9, 0x77, - 0x45, 0xaf, 0x98, 0x30, 0x16, 0x0a, 0xa3, 0xda, 0x6e, 0x36, 0x75, 0x1c, 0x7a, 0x6c, 0x6b, 0x50, - 0x8c, 0x33, 0x0b, 0x09, 0xf9, 0x6e, 0xe0, 0x8c, 0xd8, 0x0d, 0x90, 0xf0, 0x21, 0x5c, 0xcd, 0xe5, - 0x2c, 0xb4, 0x24, 0x57, 0xf2, 0xb9, 0x0c, 0x9c, 0xf0, 0x3b, 0x65, 0x7e, 0x89, 0x99, 0xc5, 0x13, - 0x76, 0xdb, 0xf2, 0xfc, 0x9d, 0xc8, 0x8b, 0x9d, 0xab, 0xe3, 0x9d, 0x74, 0x39, 0xad, 0x30, 0x6f, - 0x49, 0x10, 0x58, 0x22, 0x50, 0x08, 0x1b, 0x69, 0x6a, 0x75, 0x24, 0xd2, 0x52, 0xeb, 0x3d, 0x73, - 0x1d, 0x1e, 0xea, 0xc8, 0x72, 0x2b, 0x33, 0xb4, 0x57, 0x36, 0x43, 0xff, 0x75, 0x26, 0x9c, 0x88, - 0x62, 0x42, 0x22, 0x97, 0x01, 0x42, 0x90, 0xd8, 0x98, 0x8e, 0x6c, 0x6e, 0x14, 0x21, 0x14, 0x9a, - 0x26, 0x51, 0x90, 0x79, 0x28, 0x08, 0xb1, 0xf0, 0xec, 0xbe, 0xef, 0xdb, 0xa2, 0x17, 0x2e, 0xcb, - 0x72, 0xc0, 0x4d, 0xa7, 0xf8, 0x66, 0xc1, 0xe6, 0xcc, 0x0b, 0x30, 0xb8, 0xdb, 0xef, 0xfa, 0x5c, - 0x0e, 0x88, 0xbc, 0x8b, 0x3c, 0x40, 0x13, 0xfb, 0x10, 0x4f, 0x61, 0x17, 0xa1, 0x9f, 0x7d, 0x02, - 0xe6, 0xbb, 0x90, 0xe2, 0xdb, 0xb6, 0x05, 0x4c, 0x0b, 0xb0, 0x61, 0x70, 0xa9, 0xbe, 0xf4, 0xe0, - 0x52, 0xea, 0xf7, 0xe7, 0xe0, 0x94, 0xdc, 0x21, 0x65, 0x8a, 0x21, 0xf3, 0x8f, 0x3a, 0xe5, 0x1d, - 0xec, 0x14, 0x15, 0x0a, 0x7c, 0xf3, 0x20, 0x72, 0x17, 0xf0, 0x83, 0x1d, 0x84, 0x68, 0x02, 0xa3, - 0xfe, 0x87, 0x2c, 0x0c, 0x2f, 0xd8, 0xae, 0xb7, 0xe2, 0x50, 0x77, 0x41, 0x77, 0xdc, 0x07, 0xb8, - 0x3b, 0x3e, 0x00, 0xc3, 0x18, 0x1e, 0xa8, 0x49, 0x2d, 0x1e, 0x42, 0xa7, 0x57, 0x4a, 0x36, 0xe2, - 0x23, 0x44, 0x5e, 0xa9, 0x08, 0x21, 0xd3, 0x7e, 0x6e, 0xf9, 0x49, 0x41, 0x9b, 0xb8, 0xd9, 0xc7, - 0xe1, 0xea, 0x8f, 0xe7, 0x60, 0xc8, 0x97, 0xf2, 0xb8, 0x79, 0x58, 0x6f, 0x6a, 0x0e, 0x56, 0xc8, - 0x57, 0x00, 0x16, 0x6c, 0xc7, 0xd3, 0x1b, 0x73, 0xa1, 0xe6, 0xe3, 0x11, 0x67, 0x0b, 0xa1, 0xbc, - 0x8c, 0x44, 0x82, 0xeb, 0x57, 0x68, 0x56, 0xf3, 0x89, 0x89, 0xaf, 0x5f, 0x01, 0x54, 0x93, 0x28, - 0xd4, 0x5f, 0xce, 0xc2, 0x31, 0xbf, 0x93, 0x26, 0xef, 0xd3, 0x7a, 0xfb, 0x41, 0x9e, 0x9b, 0xa2, - 0xd2, 0xee, 0xdd, 0x52, 0xda, 0xea, 0xff, 0x90, 0x26, 0x92, 0x89, 0x86, 0x7d, 0x34, 0x91, 0xfc, - 0x69, 0xe8, 0xb8, 0xfa, 0x9d, 0x39, 0x38, 0xe1, 0x4b, 0x7d, 0xaa, 0x6d, 0xe1, 0xe1, 0xc0, 0x84, - 0xde, 0x68, 0x3c, 0xc8, 0xbb, 0xf1, 0x41, 0x5f, 0x10, 0xf3, 0x22, 0xde, 0x9e, 0xc8, 0xf1, 0xb7, - 0x2c, 0xc0, 0x35, 0xdb, 0x34, 0x34, 0x99, 0x88, 0xbc, 0x0a, 0x43, 0xfe, 0xcf, 0x92, 0xb3, 0xe2, - 0x6f, 0xc1, 0xf1, 0xa8, 0x3f, 0x28, 0xa4, 0x3b, 0x91, 0xb0, 0x02, 0x91, 0x02, 0xea, 0x7f, 0x2a, - 0xc0, 0x99, 0x3b, 0xa6, 0x65, 0xd8, 0x6b, 0xae, 0x9f, 0x22, 0xf2, 0xd0, 0x1f, 0x75, 0x1d, 0x74, - 0x6a, 0xc8, 0xd7, 0xe1, 0x64, 0x5c, 0xa4, 0x4e, 0x10, 0xb8, 0x5b, 0xf4, 0xce, 0x1a, 0x27, 0xa8, - 0xf9, 0xc9, 0x22, 0xc5, 0x7d, 0x99, 0x96, 0x5e, 0x32, 0x9e, 0x6d, 0xb2, 0x6f, 0x3b, 0xd9, 0x26, - 0x9f, 0x80, 0x42, 0xd9, 0x6e, 0xea, 0xa6, 0x1f, 0x60, 0x06, 0x47, 0x71, 0x50, 0x2f, 0x62, 0x34, - 0x41, 0xc1, 0xf8, 0x8b, 0x8a, 0xb1, 0xcb, 0x06, 0x42, 0xfe, 0x7e, 0x01, 0x66, 0xa5, 0x69, 0x32, - 0x11, 0xb1, 0x61, 0x58, 0x54, 0x27, 0x6e, 0xb7, 0x00, 0x37, 0x4f, 0xcf, 0xfa, 0x32, 0xea, 0xac, - 0x56, 0x97, 0x23, 0xe5, 0xf8, 0x36, 0x8a, 0x27, 0xc1, 0x14, 0x1f, 0xc3, 0xef, 0xb9, 0xb4, 0x28, - 0x7f, 0x49, 0x08, 0x38, 0xc9, 0x0c, 0x26, 0x85, 0x80, 0xb3, 0x8c, 0x4c, 0x44, 0x26, 0x61, 0x0c, - 0xc3, 0x2b, 0x07, 0x5b, 0x29, 0xa6, 0x12, 0x43, 0x68, 0x54, 0xe2, 0xa5, 0x09, 0x8f, 0xc8, 0xcc, - 0x3e, 0xae, 0x56, 0x17, 0x68, 0x2d, 0x59, 0xe2, 0xcc, 0x6b, 0x40, 0x92, 0x6d, 0xde, 0xd1, 0xb5, - 0xc9, 0x3f, 0x95, 0xf6, 0x75, 0x87, 0xdd, 0xf1, 0x65, 0x3f, 0x66, 0xbb, 0x48, 0xea, 0xb0, 0xde, - 0x77, 0x32, 0x75, 0x58, 0x61, 0x5f, 0x53, 0x87, 0xa9, 0x3f, 0x9b, 0x81, 0xb1, 0x44, 0x9c, 0x71, - 0xf2, 0x0c, 0x00, 0x87, 0x48, 0xf1, 0x1c, 0x31, 0x40, 0x4a, 0x18, 0x7b, 0x5c, 0xac, 0x81, 0x21, - 0x19, 0xb9, 0x02, 0xfd, 0xfc, 0x97, 0x88, 0xc1, 0x94, 0x2c, 0xd2, 0x6e, 0x9b, 0x86, 0x16, 0x10, - 0x85, 0xb5, 0xe0, 0xc5, 0x61, 0x2e, 0xb5, 0x88, 0xb7, 0xde, 0x0a, 0x6a, 0x61, 0x64, 0xea, 0x67, - 0xb3, 0x30, 0x14, 0x34, 0xb8, 0x64, 0x1c, 0x94, 0xce, 0x15, 0x44, 0xc8, 0xf6, 0xdc, 0x56, 0x21, - 0xdb, 0x63, 0x93, 0xaa, 0x88, 0xd1, 0xbe, 0x7f, 0xef, 0x9e, 0x3e, 0x9f, 0x85, 0x63, 0x41, 0xad, - 0x07, 0x78, 0x47, 0xf5, 0x2e, 0x12, 0xc9, 0xe7, 0x32, 0xa0, 0x8c, 0x9b, 0x8d, 0x86, 0x69, 0xad, - 0x54, 0xac, 0x65, 0xdb, 0x69, 0xe2, 0xac, 0x77, 0x70, 0xe7, 0xb4, 0xea, 0xf7, 0x64, 0x60, 0x4c, - 0x34, 0x68, 0x42, 0x77, 0x8c, 0x83, 0x3b, 0x04, 0x8b, 0xb7, 0xe4, 0xe0, 0xf4, 0x45, 0xfd, 0x72, - 0x16, 0x60, 0xc6, 0xae, 0xdf, 0x3d, 0xe4, 0xcf, 0xa6, 0x5e, 0x82, 0x02, 0x0f, 0x84, 0x25, 0x34, - 0x76, 0x4c, 0x3c, 0x0f, 0x62, 0x9f, 0xc6, 0x11, 0xe3, 0xa3, 0x62, 0x3e, 0x2e, 0xf0, 0x40, 0x5a, - 0x4a, 0x46, 0x13, 0x45, 0x58, 0xa5, 0x8c, 0x4e, 0x2c, 0x18, 0x41, 0xa5, 0x0c, 0x16, 0xad, 0x74, - 0x73, 0xa3, 0x98, 0x6f, 0xd8, 0xf5, 0xbb, 0x1a, 0xd2, 0xab, 0x7f, 0x92, 0xe1, 0xb2, 0x3b, 0xe4, - 0x8f, 0x3f, 0xfd, 0xcf, 0xcf, 0xef, 0xf0, 0xf3, 0xbf, 0x37, 0x03, 0x27, 0x34, 0x5a, 0xb7, 0xef, - 0x51, 0x67, 0x7d, 0xc2, 0x36, 0xe8, 0x75, 0x6a, 0x51, 0xe7, 0xa0, 0x46, 0xd4, 0x3f, 0xc0, 0x1c, - 0x17, 0x61, 0x63, 0x6e, 0xb9, 0xd4, 0x38, 0x3c, 0xf9, 0x47, 0xd4, 0xbf, 0xd7, 0x07, 0x4a, 0xaa, - 0x69, 0x7b, 0x68, 0xcd, 0xb9, 0x8e, 0xfb, 0x95, 0xfc, 0x7e, 0xed, 0x57, 0x7a, 0x77, 0xb6, 0x5f, - 0x29, 0xec, 0x74, 0xbf, 0xd2, 0xb7, 0x9d, 0xfd, 0x4a, 0x33, 0xbe, 0x5f, 0xe9, 0xc7, 0xfd, 0xca, - 0x33, 0x5d, 0xf7, 0x2b, 0x93, 0x96, 0xb1, 0xcb, 0xdd, 0xca, 0xa1, 0xcd, 0x8d, 0xbb, 0x9b, 0x6d, - 0xd6, 0x45, 0x36, 0x29, 0xd6, 0x6d, 0xc7, 0xa0, 0x86, 0xd8, 0x5d, 0xe1, 0xd1, 0xbe, 0x23, 0x60, - 0x5a, 0x80, 0x4d, 0x24, 0x1a, 0x1e, 0xde, 0x4e, 0xa2, 0xe1, 0x7d, 0xd8, 0x7f, 0x7d, 0x26, 0x0b, - 0x63, 0x13, 0xd4, 0xf1, 0x78, 0xa4, 0xcd, 0xfd, 0xf0, 0x5c, 0x2b, 0xc1, 0x31, 0x89, 0x21, 0x5a, - 0xe4, 0xd9, 0xd0, 0x1b, 0xaf, 0x4e, 0x1d, 0x2f, 0xee, 0xcc, 0x17, 0xa7, 0x67, 0xd5, 0xfb, 0xc9, - 0xbe, 0xc4, 0xd8, 0x0d, 0xaa, 0xf7, 0xe1, 0x5c, 0x90, 0xa6, 0xf8, 0xa5, 0x05, 0xf4, 0x52, 0xfe, - 0xae, 0xfc, 0xce, 0xf3, 0x77, 0xa9, 0x3f, 0x93, 0x81, 0x0b, 0x1a, 0xb5, 0xe8, 0x9a, 0xbe, 0xd4, - 0xa0, 0x52, 0xb3, 0xc4, 0xca, 0xc0, 0x66, 0x0d, 0xd3, 0x6d, 0xea, 0x5e, 0x7d, 0x75, 0x4f, 0x32, - 0x9a, 0x82, 0x21, 0x79, 0xfe, 0xda, 0xc1, 0xdc, 0x16, 0x29, 0xa7, 0xfe, 0xd7, 0x1c, 0xf4, 0x8d, - 0xdb, 0xde, 0x0d, 0x7b, 0x8f, 0x09, 0xe5, 0xc2, 0x29, 0x3f, 0xbb, 0x83, 0x03, 0x9d, 0xf7, 0x63, - 0xe5, 0x52, 0x8c, 0x7d, 0xf4, 0xf4, 0x5c, 0xb2, 0x13, 0xb9, 0x08, 0x7c, 0xb2, 0x1d, 0xa6, 0x92, - 0x7b, 0x0e, 0x06, 0x30, 0x48, 0x8b, 0x74, 0xe4, 0x8a, 0x7e, 0xd4, 0x1e, 0x03, 0xc6, 0xeb, 0x08, - 0x49, 0xc9, 0x47, 0x22, 0xa1, 0x41, 0x0b, 0x7b, 0x4f, 0x3d, 0x27, 0x47, 0x09, 0x7d, 0x86, 0xdf, - 0xd6, 0x61, 0x9b, 0xa4, 0x34, 0x1d, 0x78, 0x54, 0x12, 0x6b, 0x52, 0x40, 0xb8, 0x7f, 0x69, 0xe1, - 0xd4, 0x6f, 0xe6, 0x61, 0xc8, 0x77, 0xb9, 0x3d, 0xa0, 0x6e, 0x7f, 0x0a, 0x0a, 0xd3, 0xb6, 0x94, - 0x64, 0x00, 0x5d, 0x74, 0x57, 0x6d, 0x37, 0xe6, 0x7b, 0x2c, 0x88, 0x98, 0xc0, 0xe6, 0x6c, 0x43, - 0x76, 0x30, 0x47, 0x81, 0x59, 0xb6, 0x91, 0x78, 0xa0, 0x1b, 0x10, 0x92, 0x0b, 0x90, 0x47, 0xdf, - 0x7c, 0xe9, 0xa0, 0x3d, 0xe6, 0x8f, 0x8f, 0x78, 0x49, 0xa1, 0x0a, 0x3b, 0x55, 0xa8, 0xbe, 0xdd, - 0x2a, 0x54, 0xff, 0xfe, 0x2a, 0xd4, 0x1b, 0x30, 0x84, 0x35, 0xf9, 0x39, 0xca, 0xb6, 0x5e, 0x13, - 0x1f, 0x12, 0xcb, 0xd6, 0x30, 0x6f, 0xb7, 0xc8, 0x54, 0x86, 0xab, 0x55, 0x84, 0x55, 0x4c, 0xed, - 0x60, 0x0f, 0x6a, 0xf7, 0xdb, 0x19, 0xe8, 0xbb, 0x65, 0xdd, 0xb5, 0xec, 0xb5, 0xbd, 0x69, 0xdc, - 0x33, 0x30, 0x28, 0xd8, 0x48, 0x0b, 0x03, 0xbe, 0xb9, 0x6e, 0x73, 0x70, 0x0d, 0x39, 0x69, 0x32, - 0x15, 0x79, 0x39, 0x28, 0x84, 0xcf, 0x6f, 0x72, 0x61, 0x9a, 0x0e, 0xbf, 0x50, 0x3d, 0x9a, 0x59, - 0x40, 0x26, 0x27, 0x67, 0x21, 0x5f, 0x66, 0x4d, 0x95, 0xe2, 0xd4, 0xb2, 0xa6, 0x68, 0x08, 0x55, - 0x3f, 0x93, 0x87, 0x91, 0xd8, 0x99, 0xd5, 0x13, 0x30, 0x20, 0xce, 0x8c, 0x4c, 0x3f, 0xd5, 0x01, - 0x3e, 0xcf, 0x09, 0x80, 0x5a, 0x3f, 0xff, 0xb3, 0x62, 0x90, 0x0f, 0x42, 0x9f, 0xed, 0xe2, 0x7a, - 0x86, 0xdf, 0x32, 0x12, 0x0e, 0xa1, 0xf9, 0x2a, 0x6b, 0x3b, 0x1f, 0x1c, 0x82, 0x44, 0xd6, 0x48, - 0xdb, 0xc5, 0x4f, 0xbb, 0x06, 0x03, 0xba, 0xeb, 0x52, 0xaf, 0xe6, 0xe9, 0x2b, 0x72, 0xf6, 0x83, - 0x00, 0x28, 0x8f, 0x0e, 0x04, 0x2e, 0xea, 0x2b, 0xe4, 0x35, 0x18, 0xae, 0x3b, 0x14, 0x57, 0x3c, - 0xbd, 0xc1, 0x5a, 0x29, 0x59, 0xa4, 0x11, 0x84, 0x7c, 0xbf, 0x11, 0x22, 0x2a, 0x06, 0xb9, 0x0d, - 0xc3, 0xe2, 0x73, 0xb8, 0x6f, 0x3c, 0x0e, 0xb4, 0x91, 0x70, 0x05, 0xe2, 0x22, 0xe1, 0xde, 0xf1, - 0xe2, 0x89, 0x84, 0x4c, 0x2e, 0xf3, 0x35, 0x24, 0x52, 0x32, 0x0f, 0x64, 0x8d, 0x2e, 0xd5, 0xf4, - 0xb6, 0xb7, 0xca, 0xea, 0xe2, 0xc1, 0xbb, 0x45, 0xd2, 0x3f, 0x7c, 0x57, 0x90, 0xc4, 0xca, 0xcf, - 0x2d, 0xd6, 0xe8, 0x52, 0x29, 0x82, 0x24, 0x77, 0xe0, 0x64, 0xb2, 0x08, 0xfb, 0x64, 0x7e, 0x78, - 0xff, 0xd8, 0xe6, 0x46, 0xb1, 0x98, 0x4a, 0x20, 0xb1, 0x3d, 0x9e, 0x60, 0x5b, 0x31, 0x6e, 0xe4, - 0xfb, 0xfb, 0x46, 0xfb, 0xb5, 0x11, 0x56, 0xd6, 0xb7, 0xfe, 0x4c, 0x43, 0xfd, 0x5a, 0x86, 0x59, - 0x79, 0xec, 0x83, 0x30, 0xeb, 0x31, 0xd3, 0xf5, 0xe6, 0x0e, 0x75, 0xbd, 0x19, 0xe6, 0x27, 0x2c, - 0xb8, 0x5d, 0x66, 0x57, 0x4d, 0x60, 0xc9, 0x65, 0x28, 0x18, 0xf2, 0x81, 0xd7, 0xa9, 0x68, 0x27, - 0xf8, 0xf5, 0x68, 0x82, 0x8a, 0x5c, 0x84, 0x3c, 0x5b, 0x6d, 0xe2, 0xbb, 0x5d, 0xd9, 0x30, 0xd0, - 0x90, 0x42, 0xfd, 0xf6, 0x2c, 0x0c, 0x49, 0x5f, 0x73, 0x75, 0x4f, 0x9f, 0xf3, 0xe2, 0xf6, 0x9a, - 0xe9, 0x3b, 0xa5, 0xe0, 0x36, 0xc8, 0x6f, 0xf2, 0xb5, 0x40, 0x14, 0xdb, 0xba, 0x30, 0x12, 0x82, - 0x79, 0x4e, 0x7c, 0x68, 0x61, 0xfb, 0x3b, 0x3f, 0x46, 0x7f, 0x23, 0xdf, 0x9f, 0x1d, 0xcd, 0xdd, - 0xc8, 0xf7, 0xe7, 0x47, 0x7b, 0x31, 0xd2, 0x15, 0x06, 0x97, 0xe6, 0xdb, 0x6a, 0x6b, 0xd9, 0x5c, - 0x39, 0xe4, 0xaf, 0x33, 0xf6, 0x37, 0x0a, 0x58, 0x4c, 0x36, 0x87, 0xfc, 0xa9, 0xc6, 0x3b, 0x2a, - 0x9b, 0xa3, 0x7c, 0x86, 0x42, 0x36, 0xbf, 0x93, 0x01, 0x25, 0x55, 0x36, 0xa5, 0x03, 0xf2, 0x53, - 0xd8, 0xbf, 0xac, 0x86, 0xdf, 0xc8, 0xc2, 0x58, 0xc5, 0xf2, 0xe8, 0x0a, 0xdf, 0xec, 0x1d, 0xf2, - 0xa9, 0xe2, 0x26, 0x0c, 0x4a, 0x1f, 0x23, 0xfa, 0xfc, 0xe1, 0x60, 0x2b, 0x1d, 0xa2, 0x3a, 0x70, - 0x92, 0x4b, 0xef, 0x63, 0x22, 0xf4, 0x98, 0x90, 0x0f, 0xf9, 0x9c, 0x73, 0x38, 0x84, 0x7c, 0xc8, - 0x27, 0xaf, 0x77, 0xa9, 0x90, 0xff, 0x5b, 0x06, 0x8e, 0xa7, 0x54, 0x4e, 0x2e, 0x40, 0x5f, 0xb5, - 0xbd, 0x84, 0x81, 0xad, 0x32, 0xa1, 0x47, 0xaf, 0xdb, 0x5e, 0xc2, 0x98, 0x56, 0x9a, 0x8f, 0x24, - 0x8b, 0xf8, 0x7c, 0x7d, 0xbe, 0x52, 0x9e, 0x10, 0x52, 0x55, 0xa5, 0x87, 0xf8, 0x0c, 0x9c, 0xf6, - 0x65, 0xc1, 0x13, 0x77, 0xdb, 0x34, 0xea, 0xb1, 0x27, 0xee, 0xac, 0x0c, 0xf9, 0x28, 0x0c, 0x94, - 0xde, 0x6a, 0x3b, 0x14, 0xf9, 0x72, 0x89, 0xbf, 0x27, 0xe0, 0xeb, 0x23, 0xd2, 0x38, 0xf3, 0xd7, - 0xfa, 0x8c, 0x22, 0xce, 0x3b, 0x64, 0xa8, 0x7e, 0x36, 0x03, 0x67, 0x3a, 0xb7, 0x8e, 0xbc, 0x1f, - 0xfa, 0xd8, 0xce, 0xbc, 0xa4, 0xcd, 0x89, 0x4f, 0xe7, 0x19, 0x40, 0xed, 0x06, 0xad, 0xe9, 0x8e, - 0x6c, 0xec, 0xfb, 0x64, 0xe4, 0x15, 0x18, 0xac, 0xb8, 0x6e, 0x9b, 0x3a, 0xd5, 0x67, 0x6e, 0x69, - 0x15, 0xb1, 0x27, 0xc4, 0x3d, 0x87, 0x89, 0xe0, 0x9a, 0xfb, 0x4c, 0x2c, 0x74, 0x95, 0x4c, 0xaf, - 0x7e, 0x2a, 0x03, 0x67, 0xbb, 0x7d, 0x15, 0x79, 0x06, 0xfa, 0x17, 0xa9, 0xa5, 0x5b, 0x5e, 0xa5, - 0x2c, 0x9a, 0x84, 0x5b, 0x2c, 0x0f, 0x61, 0xd1, 0x9d, 0x42, 0x40, 0xc8, 0x0a, 0xf1, 0x23, 0xc1, - 0xc0, 0x07, 0x81, 0x1f, 0x5f, 0x22, 0x2c, 0x56, 0xc8, 0x27, 0x54, 0x7f, 0x45, 0x87, 0xde, 0x79, - 0x8b, 0xce, 0x2f, 0x93, 0xa7, 0x61, 0x80, 0xe9, 0x3e, 0xa6, 0xdf, 0x17, 0x03, 0x6d, 0x4c, 0x1e, - 0x30, 0x88, 0x98, 0xee, 0xd1, 0x42, 0x2a, 0x72, 0x4d, 0xce, 0xf9, 0x2d, 0xd4, 0x81, 0xc8, 0x65, - 0x38, 0x66, 0xba, 0x47, 0x93, 0x73, 0x83, 0x5f, 0x93, 0x73, 0x2d, 0x8b, 0xce, 0x8e, 0x94, 0xe2, - 0x18, 0xbf, 0x94, 0x98, 0x06, 0x66, 0xd2, 0x12, 0x12, 0xc7, 0x6d, 0x82, 0x24, 0xc5, 0x74, 0x8f, - 0x96, 0x9e, 0xc8, 0x78, 0x48, 0x76, 0x63, 0x8a, 0xdf, 0x42, 0xca, 0xb8, 0xe9, 0x1e, 0x2d, 0x42, - 0x4b, 0x9e, 0x87, 0x41, 0xf1, 0xfb, 0x86, 0x6d, 0x5a, 0xf1, 0x18, 0x16, 0x12, 0x6a, 0xba, 0x47, - 0x93, 0x29, 0xa5, 0x4a, 0x17, 0x1c, 0xd3, 0xf2, 0xc4, 0xcb, 0xb8, 0x78, 0xa5, 0x88, 0x93, 0x2a, - 0xc5, 0xdf, 0xe4, 0x15, 0x18, 0x0e, 0x82, 0x83, 0xbc, 0x49, 0xeb, 0x9e, 0x38, 0xd2, 0x39, 0x19, - 0x2b, 0xcc, 0x91, 0xd3, 0x3d, 0x5a, 0x94, 0x9a, 0x5c, 0x84, 0x82, 0x46, 0x5d, 0xf3, 0x2d, 0xff, - 0xfe, 0x62, 0x44, 0x9a, 0xce, 0xcc, 0xb7, 0x98, 0x94, 0x04, 0x9e, 0xf5, 0x4e, 0x78, 0x61, 0x22, - 0x0e, 0x60, 0x48, 0xac, 0x96, 0x49, 0xcb, 0x60, 0xbd, 0x23, 0xdd, 0x96, 0xbd, 0x16, 0x86, 0x4c, - 0x11, 0x89, 0xd6, 0x06, 0xe3, 0x6f, 0x53, 0x65, 0xec, 0x74, 0x8f, 0x16, 0xa3, 0x97, 0xa4, 0x5a, - 0x36, 0xdd, 0xbb, 0x22, 0x4a, 0x5d, 0x5c, 0xaa, 0x0c, 0x25, 0x49, 0x95, 0xfd, 0x94, 0xaa, 0x9e, - 0xa3, 0xde, 0x9a, 0xed, 0xdc, 0x15, 0x31, 0xe9, 0xe2, 0x55, 0x0b, 0xac, 0x54, 0xb5, 0x80, 0xc8, - 0x55, 0xb3, 0x45, 0x66, 0x24, 0xbd, 0x6a, 0xdd, 0xd3, 0xe5, 0xaa, 0xf9, 0xfe, 0xd2, 0xef, 0xa4, - 0x19, 0xaa, 0xdf, 0xe3, 0xf9, 0x6e, 0x93, 0x1d, 0x8a, 0x38, 0xa9, 0x43, 0xf1, 0x37, 0xab, 0x54, - 0xca, 0x69, 0x2a, 0x12, 0xda, 0x06, 0x95, 0x4a, 0x28, 0x56, 0xa9, 0x9c, 0xfd, 0xf4, 0x9a, 0x9c, - 0xea, 0x53, 0x19, 0x8b, 0x76, 0x50, 0x88, 0x61, 0x1d, 0x24, 0xa5, 0x04, 0x2d, 0x62, 0x1a, 0x41, - 0x85, 0x20, 0xf9, 0x60, 0xd0, 0xc2, 0x89, 0x85, 0xe9, 0x1e, 0x0d, 0x13, 0x0c, 0xaa, 0x3c, 0x41, - 0xa5, 0x72, 0x1c, 0x29, 0x86, 0x7c, 0x0a, 0x06, 0x9b, 0xee, 0xd1, 0x78, 0xf2, 0xca, 0xa7, 0xa5, - 0x54, 0x50, 0xca, 0x89, 0xe8, 0x14, 0x11, 0x20, 0xd8, 0x14, 0x11, 0x26, 0x8c, 0x9a, 0x4a, 0xa6, - 0x4b, 0x52, 0x4e, 0x46, 0x57, 0xd4, 0x38, 0x7e, 0xba, 0x47, 0x4b, 0xa6, 0x58, 0x7a, 0x3e, 0x92, - 0x41, 0x48, 0x39, 0x15, 0x0b, 0x1c, 0x13, 0xa2, 0x98, 0xb8, 0xe4, 0x5c, 0x43, 0xf3, 0xa9, 0x39, - 0xbf, 0x95, 0xd3, 0xd1, 0xe5, 0x38, 0x85, 0x64, 0xba, 0x47, 0x4b, 0xcd, 0x16, 0x3e, 0x91, 0xc8, - 0xe3, 0xa3, 0x28, 0xd1, 0xcb, 0xda, 0x18, 0x7a, 0xba, 0x47, 0x4b, 0x64, 0xfe, 0xb9, 0x26, 0x27, - 0xd0, 0x51, 0x1e, 0x8a, 0x76, 0x62, 0x88, 0x61, 0x9d, 0x28, 0x25, 0xda, 0xb9, 0x26, 0x27, 0x55, - 0x51, 0xce, 0x24, 0x4b, 0x85, 0x33, 0xa7, 0x94, 0x7c, 0x45, 0x4b, 0xcf, 0x13, 0xa1, 0x3c, 0x2c, - 0x32, 0xf5, 0x89, 0xf2, 0x69, 0x34, 0xd3, 0x3d, 0x5a, 0x7a, 0x8e, 0x09, 0x2d, 0x3d, 0xc1, 0x82, - 0x72, 0xb6, 0x1b, 0xcf, 0xa0, 0x75, 0xe9, 0xc9, 0x19, 0xf4, 0x2e, 0xe1, 0xee, 0x95, 0x73, 0xd1, - 0xa8, 0x95, 0x1d, 0x09, 0xa7, 0x7b, 0xb4, 0x2e, 0x41, 0xf3, 0x6f, 0x75, 0x88, 0x3d, 0xaf, 0x9c, - 0x8f, 0x26, 0xea, 0x4c, 0x25, 0x9a, 0xee, 0xd1, 0x3a, 0x44, 0xae, 0xbf, 0xd5, 0x21, 0x34, 0xb9, - 0x52, 0xec, 0xca, 0x36, 0x90, 0x47, 0x87, 0xc0, 0xe6, 0xf3, 0xa9, 0x51, 0xbd, 0x95, 0x47, 0xa2, - 0xaa, 0x9b, 0x42, 0xc2, 0x54, 0x37, 0x2d, 0x1e, 0xf8, 0x7c, 0x6a, 0x18, 0x6a, 0xe5, 0xd1, 0x2e, - 0x0c, 0x83, 0x36, 0xa6, 0x06, 0xb0, 0x9e, 0x4f, 0x8d, 0x03, 0xad, 0xa8, 0x51, 0x86, 0x29, 0x24, - 0x8c, 0x61, 0x5a, 0x04, 0xe9, 0xf9, 0xd4, 0x70, 0xc1, 0xca, 0x63, 0x5d, 0x18, 0x86, 0x2d, 0x4c, - 0x0b, 0x34, 0xfc, 0x7c, 0x24, 0x5e, 0xaf, 0xf2, 0x9e, 0xe8, 0xbc, 0x21, 0xa1, 0xd8, 0xbc, 0x21, - 0x47, 0xf6, 0x9d, 0x48, 0x44, 0x24, 0x54, 0x1e, 0x8f, 0x0e, 0xf3, 0x18, 0x9a, 0x0d, 0xf3, 0x78, - 0x0c, 0xc3, 0x89, 0x44, 0x64, 0x36, 0xe5, 0x42, 0x27, 0x26, 0x88, 0x8e, 0x32, 0xe1, 0xb1, 0xdc, - 0x2a, 0x29, 0xa1, 0xc1, 0x94, 0xf7, 0x46, 0x1d, 0x0d, 0x13, 0x04, 0xd3, 0x3d, 0x5a, 0x4a, 0x40, - 0x31, 0x2d, 0x3d, 0x0e, 0x86, 0x72, 0x31, 0x3a, 0x6c, 0xd3, 0x68, 0xd8, 0xb0, 0x4d, 0x8d, 0xa1, - 0x31, 0x93, 0xe6, 0x0d, 0xad, 0x5c, 0x8a, 0x1a, 0x66, 0x49, 0x0a, 0x66, 0x98, 0xa5, 0x78, 0x51, - 0x6b, 0xe9, 0x91, 0x1d, 0x94, 0x27, 0xba, 0xb6, 0x10, 0x69, 0x52, 0x5a, 0xc8, 0x03, 0x1d, 0x84, - 0xb6, 0xd3, 0xad, 0x56, 0xc3, 0xd6, 0x0d, 0xe5, 0x7d, 0xa9, 0xb6, 0x13, 0x47, 0x4a, 0xb6, 0x13, - 0x07, 0xb0, 0x55, 0x5e, 0x76, 0xba, 0x55, 0x9e, 0x8c, 0xae, 0xf2, 0x32, 0x8e, 0xad, 0xf2, 0x11, - 0x07, 0xdd, 0x89, 0x84, 0x83, 0xaa, 0xf2, 0x54, 0x54, 0x01, 0x62, 0x68, 0xa6, 0x00, 0x71, 0x97, - 0xd6, 0x8f, 0x77, 0x76, 0xe9, 0x54, 0x2e, 0x23, 0xb7, 0x47, 0x7c, 0x6e, 0x9d, 0xe8, 0xa6, 0x7b, - 0xb4, 0xce, 0x6e, 0xa1, 0x95, 0x14, 0x0f, 0x4d, 0xe5, 0x4a, 0x54, 0xc1, 0x12, 0x04, 0x4c, 0xc1, - 0x92, 0x7e, 0x9d, 0x95, 0x14, 0x17, 0x4b, 0xe5, 0xfd, 0x1d, 0x59, 0x05, 0xdf, 0x9c, 0xe2, 0x98, - 0x79, 0x4d, 0xf6, 0x91, 0x54, 0x9e, 0x8e, 0x2e, 0x76, 0x21, 0x86, 0x2d, 0x76, 0x92, 0x2f, 0xe5, - 0x35, 0xd9, 0x3b, 0x50, 0xb9, 0x9a, 0x2c, 0x15, 0x2e, 0x91, 0x92, 0x17, 0xa1, 0x96, 0xee, 0x54, - 0xa7, 0x3c, 0x13, 0xd5, 0xba, 0x34, 0x1a, 0xa6, 0x75, 0xa9, 0x0e, 0x79, 0x53, 0x49, 0xdf, 0x38, - 0xe5, 0x5a, 0xfc, 0x2c, 0x21, 0x8a, 0x67, 0x96, 0x4f, 0xc2, 0x9f, 0xee, 0xb5, 0x78, 0x90, 0x26, - 0xe5, 0xd9, 0xd8, 0x65, 0x46, 0x04, 0xcb, 0xec, 0xdb, 0x58, 0x50, 0xa7, 0xd7, 0xe2, 0x71, 0x8d, - 0x94, 0xe7, 0xd2, 0x39, 0x04, 0xba, 0x12, 0x8f, 0x83, 0xf4, 0x5a, 0x3c, 0x14, 0x90, 0xf2, 0x7c, - 0x3a, 0x87, 0x40, 0xba, 0xf1, 0xd0, 0x41, 0x4f, 0x4b, 0xc1, 0x89, 0x95, 0x0f, 0x44, 0x4d, 0xc7, - 0x00, 0xc1, 0x4c, 0xc7, 0x30, 0x84, 0xf1, 0xd3, 0x52, 0x50, 0x5f, 0xe5, 0x85, 0x44, 0x91, 0xa0, - 0xb1, 0x52, 0xe8, 0xdf, 0xa7, 0xa5, 0x60, 0xb8, 0xca, 0x8b, 0x89, 0x22, 0x41, 0xeb, 0xa4, 0x90, - 0xb9, 0x46, 0xb7, 0x57, 0x53, 0xca, 0x4b, 0xd1, 0x23, 0x8e, 0xce, 0x94, 0xd3, 0x3d, 0x5a, 0xb7, - 0xd7, 0x57, 0x1f, 0xef, 0xec, 0x69, 0xa8, 0xbc, 0x1c, 0x1d, 0xc2, 0x9d, 0xe8, 0xd8, 0x10, 0xee, - 0xe8, 0xad, 0xf8, 0x4a, 0xec, 0x05, 0xb5, 0xf2, 0x4a, 0x74, 0x8a, 0x8b, 0x20, 0xd9, 0x14, 0x17, - 0x7f, 0x6f, 0x1d, 0x79, 0x1a, 0xac, 0x7c, 0x30, 0x3a, 0xc5, 0xc9, 0x38, 0x36, 0xc5, 0x45, 0x9e, - 0x11, 0x4f, 0x24, 0x5e, 0xac, 0x2a, 0xaf, 0x46, 0xa7, 0xb8, 0x18, 0x9a, 0x4d, 0x71, 0xf1, 0x37, - 0xae, 0xaf, 0xc4, 0x1e, 0x6e, 0x2a, 0xaf, 0xa5, 0xb7, 0x1f, 0x91, 0x72, 0xfb, 0xf9, 0x33, 0x4f, - 0x2d, 0xfd, 0x05, 0xa2, 0x52, 0x8a, 0x8e, 0xdf, 0x34, 0x1a, 0x36, 0x7e, 0x53, 0x5f, 0x2f, 0xc6, - 0x37, 0x0e, 0x42, 0xab, 0xc6, 0xbb, 0x6c, 0x1c, 0x42, 0x53, 0x24, 0x05, 0x1c, 0xd9, 0x23, 0xf3, - 0x8d, 0xd0, 0x44, 0x87, 0x3d, 0xb2, 0xbf, 0x0d, 0x8a, 0xd1, 0xb3, 0xd9, 0x35, 0xe1, 0xf8, 0xa6, - 0x94, 0xa3, 0xb3, 0x6b, 0x82, 0x80, 0xcd, 0xae, 0x49, 0x77, 0xb9, 0x29, 0x18, 0x15, 0x5a, 0xc4, - 0xfd, 0xf9, 0x4c, 0x6b, 0x45, 0x99, 0x8c, 0x3d, 0x00, 0x8a, 0xe1, 0xd9, 0xec, 0x14, 0x87, 0xe1, - 0x7a, 0xcd, 0x61, 0x13, 0x0d, 0xb3, 0xb5, 0x64, 0xeb, 0x8e, 0x51, 0xa5, 0x96, 0xa1, 0x4c, 0xc5, - 0xd6, 0xeb, 0x14, 0x1a, 0x5c, 0xaf, 0x53, 0xe0, 0x18, 0x98, 0x28, 0x06, 0xd7, 0x68, 0x9d, 0x9a, - 0xf7, 0xa8, 0x72, 0x1d, 0xd9, 0x16, 0x3b, 0xb1, 0x15, 0x64, 0xd3, 0x3d, 0x5a, 0x27, 0x0e, 0xcc, - 0x56, 0x9f, 0x5d, 0xaf, 0xbe, 0x3e, 0x13, 0x3c, 0x7a, 0x5d, 0x70, 0x68, 0x4b, 0x77, 0xa8, 0x32, - 0x1d, 0xb5, 0xd5, 0x53, 0x89, 0x98, 0xad, 0x9e, 0x8a, 0x48, 0xb2, 0xf5, 0xc7, 0x42, 0xa5, 0x1b, - 0xdb, 0x70, 0x44, 0xa4, 0x97, 0x66, 0xb3, 0x53, 0x14, 0xc1, 0x04, 0x34, 0x63, 0x5b, 0x2b, 0x78, - 0x52, 0x71, 0x23, 0x3a, 0x3b, 0x75, 0xa6, 0x64, 0xb3, 0x53, 0x67, 0x2c, 0x53, 0xf5, 0x28, 0x96, - 0x8f, 0xc1, 0x9b, 0x51, 0x55, 0x4f, 0x21, 0x61, 0xaa, 0x9e, 0x02, 0x4e, 0x32, 0xd4, 0xa8, 0x4b, - 0x3d, 0x65, 0xa6, 0x1b, 0x43, 0x24, 0x49, 0x32, 0x44, 0x70, 0x92, 0xe1, 0x14, 0xf5, 0xea, 0xab, - 0xca, 0x6c, 0x37, 0x86, 0x48, 0x92, 0x64, 0x88, 0x60, 0xb6, 0xd9, 0x8c, 0x82, 0xc7, 0xdb, 0x8d, - 0xbb, 0x7e, 0x9f, 0xcd, 0x45, 0x37, 0x9b, 0x1d, 0x09, 0xd9, 0x66, 0xb3, 0x23, 0x92, 0x7c, 0x6a, - 0xdb, 0x8e, 0x99, 0xca, 0x3c, 0x56, 0x78, 0x39, 0xb4, 0x0b, 0xb6, 0x53, 0x6a, 0xba, 0x47, 0xdb, - 0xae, 0xe3, 0xe7, 0xfb, 0x02, 0x57, 0x28, 0x65, 0x01, 0xab, 0x3a, 0x16, 0x9c, 0x55, 0x70, 0xf0, - 0x74, 0x8f, 0x16, 0x38, 0x4b, 0x3d, 0x0f, 0x83, 0xf8, 0x51, 0x15, 0xcb, 0xf4, 0xca, 0xe3, 0xca, - 0xeb, 0xd1, 0x2d, 0x93, 0x84, 0x62, 0x5b, 0x26, 0xe9, 0x27, 0x9b, 0xc4, 0xf1, 0x27, 0x9f, 0x62, - 0xca, 0xe3, 0x8a, 0x16, 0x9d, 0xc4, 0x23, 0x48, 0x36, 0x89, 0x47, 0x00, 0x41, 0xbd, 0x65, 0xc7, - 0x6e, 0x95, 0xc7, 0x95, 0x6a, 0x4a, 0xbd, 0x1c, 0x15, 0xd4, 0xcb, 0x7f, 0x06, 0xf5, 0x56, 0x57, - 0xdb, 0x5e, 0x99, 0x7d, 0xe3, 0x62, 0x4a, 0xbd, 0x3e, 0x32, 0xa8, 0xd7, 0x07, 0xb0, 0xa9, 0x10, - 0x01, 0x0b, 0x8e, 0xcd, 0x26, 0xed, 0x9b, 0x66, 0xa3, 0xa1, 0xdc, 0x8a, 0x4e, 0x85, 0x71, 0x3c, - 0x9b, 0x0a, 0xe3, 0x30, 0x66, 0x7a, 0xf2, 0x56, 0xd1, 0xa5, 0xf6, 0x8a, 0x72, 0x3b, 0x6a, 0x7a, - 0x86, 0x18, 0x66, 0x7a, 0x86, 0xbf, 0x70, 0x77, 0xc1, 0x7e, 0x69, 0x74, 0xd9, 0xa1, 0xee, 0xaa, - 0x72, 0x27, 0xb6, 0xbb, 0x90, 0x70, 0xb8, 0xbb, 0x90, 0x7e, 0x93, 0x15, 0x78, 0x38, 0xb2, 0xd0, - 0xf8, 0x77, 0x4f, 0x55, 0xaa, 0x3b, 0xf5, 0x55, 0xe5, 0x43, 0xc8, 0xea, 0xb1, 0xd4, 0xa5, 0x2a, - 0x4a, 0x3a, 0xdd, 0xa3, 0x75, 0xe3, 0x84, 0xdb, 0xf2, 0xd7, 0x67, 0x78, 0x04, 0x41, 0x6d, 0x61, - 0xc2, 0xdf, 0x84, 0xbe, 0x11, 0xdb, 0x96, 0x27, 0x49, 0x70, 0x5b, 0x9e, 0x04, 0x93, 0x16, 0x9c, - 0x8f, 0x6d, 0xd5, 0x66, 0xf5, 0x06, 0xdb, 0x97, 0x50, 0x63, 0x41, 0xaf, 0xdf, 0xa5, 0x9e, 0xf2, - 0x61, 0xe4, 0x7d, 0xa1, 0xc3, 0x86, 0x2f, 0x46, 0x3d, 0xdd, 0xa3, 0x6d, 0xc1, 0x8f, 0xa8, 0x90, - 0xaf, 0x4e, 0x2d, 0x2e, 0x28, 0x1f, 0x89, 0x9e, 0x6f, 0x32, 0xd8, 0x74, 0x8f, 0x86, 0x38, 0x66, - 0xa5, 0xdd, 0x6a, 0xad, 0x38, 0xba, 0x41, 0xb9, 0xa1, 0x85, 0xb6, 0x9b, 0x30, 0x40, 0x3f, 0x1a, - 0xb5, 0xd2, 0x3a, 0xd1, 0x31, 0x2b, 0xad, 0x13, 0x8e, 0x29, 0x6a, 0x24, 0x58, 0xbe, 0xf2, 0xb1, - 0xa8, 0xa2, 0x46, 0x90, 0x4c, 0x51, 0xa3, 0xa1, 0xf5, 0x3f, 0x04, 0xa7, 0x82, 0xfd, 0xbc, 0x58, - 0x7f, 0x79, 0xa7, 0x29, 0x1f, 0x47, 0x3e, 0xe7, 0x13, 0x97, 0x01, 0x11, 0xaa, 0xe9, 0x1e, 0xad, - 0x43, 0x79, 0xb6, 0xe2, 0x26, 0xf2, 0xc0, 0x08, 0xf3, 0xe2, 0xdb, 0xa2, 0x2b, 0x6e, 0x07, 0x32, - 0xb6, 0xe2, 0x76, 0x40, 0xa5, 0x32, 0x17, 0x42, 0xd5, 0xb7, 0x60, 0x1e, 0xc8, 0xb4, 0x13, 0x87, - 0x54, 0xe6, 0xc2, 0x52, 0x5b, 0xda, 0x82, 0x79, 0x60, 0xad, 0x75, 0xe2, 0x40, 0x2e, 0x42, 0xa1, - 0x5a, 0x9d, 0xd5, 0xda, 0x96, 0x52, 0x8f, 0xf9, 0x80, 0x21, 0x74, 0xba, 0x47, 0x13, 0x78, 0x66, - 0x06, 0x4d, 0x36, 0x74, 0xd7, 0x33, 0xeb, 0x2e, 0x8e, 0x18, 0x7f, 0x84, 0x18, 0x51, 0x33, 0x28, - 0x8d, 0x86, 0x99, 0x41, 0x69, 0x70, 0x66, 0x2f, 0x4e, 0xe8, 0xae, 0xab, 0x5b, 0x86, 0xa3, 0x8f, - 0xe3, 0x32, 0x41, 0x63, 0xcf, 0x03, 0x22, 0x58, 0x66, 0x2f, 0x46, 0x21, 0x78, 0xf8, 0xee, 0x43, - 0x7c, 0x33, 0x67, 0x39, 0x76, 0xf8, 0x1e, 0xc3, 0xe3, 0xe1, 0x7b, 0x0c, 0x86, 0x76, 0xa7, 0x0f, - 0xd3, 0xe8, 0x8a, 0xc9, 0x44, 0xa4, 0xac, 0xc4, 0xec, 0xce, 0x38, 0x01, 0xda, 0x9d, 0x71, 0x60, - 0xa4, 0x49, 0xfe, 0x72, 0xbb, 0xda, 0xa1, 0x49, 0xe1, 0x2a, 0x9b, 0x28, 0xc3, 0xd6, 0xef, 0x70, - 0x70, 0x94, 0xd7, 0x2d, 0xbd, 0x69, 0x97, 0xc7, 0x7d, 0xa9, 0x9b, 0xd1, 0xf5, 0xbb, 0x23, 0x21, - 0x5b, 0xbf, 0x3b, 0x22, 0xd9, 0xec, 0xea, 0x6f, 0xb4, 0x56, 0x75, 0x87, 0x1a, 0x65, 0xd3, 0xc1, - 0x93, 0xc5, 0x75, 0xbe, 0x35, 0x7c, 0x33, 0x3a, 0xbb, 0x76, 0x21, 0x65, 0xb3, 0x6b, 0x17, 0x34, - 0x33, 0xf2, 0xd2, 0xd1, 0x1a, 0xd5, 0x0d, 0xe5, 0x6e, 0xd4, 0xc8, 0xeb, 0x4c, 0xc9, 0x8c, 0xbc, - 0xce, 0xd8, 0xce, 0x9f, 0x73, 0xc7, 0x31, 0x3d, 0xaa, 0x34, 0xb6, 0xf3, 0x39, 0x48, 0xda, 0xf9, - 0x73, 0x10, 0xcd, 0x36, 0x84, 0xf1, 0x0e, 0x69, 0x46, 0x37, 0x84, 0xc9, 0x6e, 0x88, 0x97, 0x60, - 0x16, 0x8b, 0x78, 0x25, 0xa2, 0x58, 0x51, 0x8b, 0x45, 0x80, 0x99, 0xc5, 0x12, 0xbe, 0x23, 0x89, - 0x3c, 0x30, 0x50, 0xec, 0xe8, 0x1a, 0x2a, 0xe3, 0xd8, 0x1a, 0x1a, 0x79, 0x8c, 0xf0, 0x7c, 0xc4, - 0x7b, 0x56, 0x69, 0x45, 0xad, 0x0e, 0x09, 0xc5, 0xac, 0x0e, 0xd9, 0xcf, 0x76, 0x02, 0x8e, 0xe1, - 0x2d, 0xb8, 0xd6, 0x0e, 0xee, 0x71, 0x3e, 0x11, 0xfd, 0xcc, 0x18, 0x9a, 0x7d, 0x66, 0x0c, 0x14, - 0x61, 0x22, 0xa6, 0x2d, 0xa7, 0x03, 0x93, 0xf0, 0x7c, 0x30, 0x06, 0x22, 0x33, 0x40, 0xaa, 0xa5, - 0xd9, 0x99, 0x8a, 0xb1, 0x20, 0x5f, 0x91, 0xb9, 0xd1, 0x13, 0xd8, 0x24, 0xc5, 0x74, 0x8f, 0x96, - 0x52, 0x8e, 0xbc, 0x09, 0x67, 0x05, 0x54, 0x3c, 0x01, 0xc4, 0x74, 0xd1, 0x46, 0xb0, 0x20, 0x78, - 0x51, 0xef, 0x8c, 0x6e, 0xb4, 0xd3, 0x3d, 0x5a, 0x57, 0x5e, 0x9d, 0xeb, 0x12, 0xeb, 0x43, 0x7b, - 0x3b, 0x75, 0x05, 0x8b, 0x44, 0x57, 0x5e, 0x9d, 0xeb, 0x12, 0x72, 0xbf, 0xb7, 0x9d, 0xba, 0x82, - 0x4e, 0xe8, 0xca, 0x8b, 0xb8, 0x50, 0xec, 0x86, 0x2f, 0x35, 0x1a, 0xca, 0x1a, 0x56, 0xf7, 0xde, - 0xed, 0x54, 0x57, 0x42, 0x83, 0x73, 0x2b, 0x8e, 0x6c, 0x96, 0x9e, 0x6f, 0x51, 0xab, 0x1a, 0x59, - 0x80, 0xee, 0x47, 0x67, 0xe9, 0x04, 0x01, 0x9b, 0xa5, 0x13, 0x40, 0x36, 0xa0, 0x64, 0x27, 0x6c, - 0x65, 0x3d, 0x3a, 0xa0, 0x64, 0x1c, 0x1b, 0x50, 0x11, 0x87, 0xed, 0x79, 0x38, 0x3e, 0x7f, 0xd7, - 0xd3, 0x7d, 0x0b, 0xd2, 0x15, 0x5d, 0xf9, 0x56, 0xec, 0x92, 0x29, 0x49, 0x82, 0x97, 0x4c, 0x49, - 0x30, 0x1b, 0x23, 0x0c, 0x5c, 0x5d, 0xb7, 0xea, 0x53, 0xba, 0xd9, 0x68, 0x3b, 0x54, 0xf9, 0xff, - 0xa2, 0x63, 0x24, 0x86, 0x66, 0x63, 0x24, 0x06, 0x62, 0x0b, 0x34, 0x03, 0x95, 0x5c, 0xd7, 0x5c, - 0xb1, 0xc4, 0xbe, 0xb2, 0xdd, 0xf0, 0x94, 0xff, 0x3f, 0xba, 0x40, 0xa7, 0xd1, 0xb0, 0x05, 0x3a, - 0x0d, 0x8e, 0xa7, 0x4e, 0x29, 0xa9, 0xd4, 0x95, 0x3f, 0x13, 0x3b, 0x75, 0x4a, 0xa1, 0xc1, 0x53, - 0xa7, 0xb4, 0x34, 0xec, 0x53, 0x30, 0xca, 0x6d, 0xb2, 0x19, 0x33, 0xb8, 0xab, 0xfe, 0xb3, 0xd1, - 0xf5, 0x31, 0x8e, 0x67, 0xeb, 0x63, 0x1c, 0x16, 0xe5, 0x23, 0xba, 0xe0, 0xcf, 0x75, 0xe2, 0x13, - 0xc8, 0x3f, 0x51, 0x86, 0x5c, 0x97, 0xf9, 0x88, 0x91, 0xf2, 0xed, 0x99, 0x4e, 0x8c, 0x82, 0xe1, - 0x91, 0x28, 0x14, 0x65, 0xa4, 0xd1, 0x7b, 0x26, 0x5d, 0x53, 0x3e, 0xd9, 0x91, 0x11, 0x27, 0x88, - 0x32, 0xe2, 0x30, 0xf2, 0x06, 0x9c, 0x0a, 0x61, 0xb3, 0xb4, 0xb9, 0x14, 0xcc, 0x4c, 0xdf, 0x91, - 0x89, 0x9a, 0xc1, 0xe9, 0x64, 0xcc, 0x0c, 0x4e, 0xc7, 0xa4, 0xb1, 0x16, 0xa2, 0xfb, 0xf3, 0x5b, - 0xb0, 0x0e, 0x24, 0xd8, 0x81, 0x41, 0x1a, 0x6b, 0x21, 0xcd, 0xef, 0xdc, 0x82, 0x75, 0x20, 0xd3, - 0x0e, 0x0c, 0xc8, 0xa7, 0x33, 0x70, 0x21, 0x1d, 0x55, 0x6a, 0x34, 0xa6, 0x6c, 0x27, 0xc4, 0x29, - 0xdf, 0x95, 0x89, 0x1e, 0x34, 0x6c, 0xaf, 0xd8, 0x74, 0x8f, 0xb6, 0xcd, 0x0a, 0xc8, 0x07, 0x61, - 0xb8, 0xd4, 0x36, 0x4c, 0x0f, 0x2f, 0xde, 0x98, 0xe1, 0xfc, 0xdd, 0x99, 0xd8, 0x16, 0x47, 0xc6, - 0xe2, 0x16, 0x47, 0x06, 0x90, 0x1b, 0x30, 0x56, 0xa5, 0xf5, 0xb6, 0x63, 0x7a, 0xeb, 0x1a, 0xa6, - 0xc9, 0x67, 0x3c, 0xbe, 0x27, 0x13, 0x9d, 0xc4, 0x12, 0x14, 0x6c, 0x12, 0x4b, 0x00, 0xc9, 0xed, - 0x0e, 0xc9, 0xd4, 0x95, 0x4f, 0x65, 0xba, 0x5e, 0xcb, 0x07, 0x7d, 0xd9, 0x21, 0x17, 0xfb, 0x42, - 0x6a, 0x72, 0x6a, 0xe5, 0xd3, 0x99, 0x2e, 0xd7, 0xe8, 0xd2, 0x0c, 0x97, 0x92, 0xd7, 0x7a, 0x21, - 0x35, 0x73, 0xb0, 0xf2, 0xbd, 0x99, 0x2e, 0xd7, 0xde, 0x21, 0xc7, 0xb4, 0xa4, 0xc3, 0xcf, 0x72, - 0x4f, 0x11, 0xc1, 0xe8, 0x2f, 0x64, 0x92, 0xae, 0x22, 0x41, 0x79, 0x89, 0x90, 0x15, 0xbb, 0xe5, - 0x06, 0x4a, 0xff, 0x99, 0x4c, 0xd2, 0x37, 0x2f, 0x2c, 0x16, 0xfe, 0x22, 0x14, 0xce, 0x4c, 0xde, - 0xf7, 0xa8, 0x63, 0xe9, 0x0d, 0xec, 0xce, 0xaa, 0x67, 0x3b, 0xfa, 0x0a, 0x9d, 0xb4, 0xf4, 0xa5, - 0x06, 0x55, 0x3e, 0x9b, 0x89, 0x5a, 0xb0, 0x9d, 0x49, 0x99, 0x05, 0xdb, 0x19, 0x4b, 0x56, 0xe1, - 0xe1, 0x34, 0x6c, 0xd9, 0x74, 0xb1, 0x9e, 0xcf, 0x65, 0xa2, 0x26, 0x6c, 0x17, 0x5a, 0x66, 0xc2, - 0x76, 0x41, 0x93, 0xab, 0x30, 0x30, 0x6e, 0xfb, 0xd3, 0xef, 0x5f, 0x8c, 0x39, 0x43, 0x06, 0x98, - 0xe9, 0x1e, 0x2d, 0x24, 0x13, 0x65, 0xc4, 0xa0, 0xfe, 0x7c, 0xb2, 0x4c, 0x78, 0xf9, 0x14, 0xfc, - 0x10, 0x65, 0x84, 0xb8, 0xff, 0x52, 0xb2, 0x4c, 0x78, 0xc7, 0x15, 0xfc, 0x60, 0x33, 0x09, 0xaf, - 0x71, 0x76, 0xaa, 0xc4, 0xec, 0xb6, 0x89, 0x55, 0xbd, 0xd1, 0xa0, 0xd6, 0x0a, 0x55, 0xbe, 0x10, - 0x9b, 0x49, 0xd2, 0xc9, 0xd8, 0x4c, 0x92, 0x8e, 0x21, 0x1f, 0x85, 0xd3, 0xb7, 0xf5, 0x86, 0x69, - 0x84, 0x38, 0x3f, 0x8f, 0xac, 0xf2, 0x7d, 0x99, 0xe8, 0x6e, 0xba, 0x03, 0x1d, 0xdb, 0x4d, 0x77, - 0x40, 0x91, 0x59, 0x20, 0xb8, 0x8c, 0x06, 0xb3, 0x05, 0x5b, 0x9f, 0x95, 0xbf, 0x9c, 0x89, 0xda, - 0xa9, 0x49, 0x12, 0x66, 0xa7, 0x26, 0xa1, 0xa4, 0xd6, 0x39, 0x20, 0xbd, 0xf2, 0xfd, 0x99, 0xe8, - 0x69, 0x4d, 0x27, 0xc2, 0xe9, 0x1e, 0xad, 0x73, 0x54, 0xfb, 0xeb, 0x30, 0x5a, 0x5d, 0xa8, 0x4c, - 0x4d, 0x4d, 0x56, 0x6f, 0x57, 0xca, 0xe8, 0xbe, 0x6b, 0x28, 0x3f, 0x10, 0x5b, 0xb1, 0xe2, 0x04, - 0x6c, 0xc5, 0x8a, 0xc3, 0xc8, 0x4b, 0x30, 0xc4, 0xda, 0xcf, 0x06, 0x0c, 0x7e, 0xf2, 0x17, 0x33, - 0x51, 0x73, 0x4a, 0x46, 0x32, 0x73, 0x4a, 0xfe, 0x4d, 0xaa, 0x70, 0x82, 0x49, 0x71, 0xc1, 0xa1, - 0xcb, 0xd4, 0xa1, 0x56, 0xdd, 0x1f, 0xd3, 0x3f, 0x98, 0x89, 0x5a, 0x19, 0x69, 0x44, 0xcc, 0xca, - 0x48, 0x83, 0x93, 0xbb, 0x70, 0x36, 0x7e, 0x12, 0x24, 0x3f, 0xa6, 0x52, 0x7e, 0x28, 0x13, 0x33, - 0x86, 0xbb, 0x10, 0xa3, 0x31, 0xdc, 0x05, 0x4f, 0x2c, 0x38, 0x27, 0x8e, 0x55, 0x84, 0xc3, 0x65, - 0xbc, 0xb6, 0xbf, 0xc2, 0x6b, 0x7b, 0x3c, 0x74, 0x08, 0xec, 0x42, 0x3d, 0xdd, 0xa3, 0x75, 0x67, - 0xc7, 0xf4, 0x2c, 0x19, 0x76, 0x5d, 0xf9, 0xe1, 0x4c, 0xba, 0x47, 0x4a, 0xc4, 0x4d, 0x39, 0x2d, - 0x5e, 0xfb, 0x1b, 0x9d, 0x82, 0x86, 0x2b, 0x3f, 0x12, 0x1b, 0x6f, 0xe9, 0x64, 0x6c, 0xbc, 0x75, - 0x88, 0x3a, 0x7e, 0x03, 0xc6, 0xb8, 0x52, 0x2f, 0xe8, 0x38, 0x0c, 0xad, 0x15, 0x6a, 0x28, 0x7f, - 0x35, 0xb6, 0xda, 0x25, 0x28, 0xd0, 0xb5, 0x27, 0x0e, 0x64, 0x53, 0x77, 0xb5, 0xa5, 0x5b, 0x16, - 0x1e, 0xb3, 0x2a, 0x7f, 0x2d, 0x36, 0x75, 0x87, 0x28, 0x74, 0xdc, 0x0d, 0x7e, 0x31, 0x4d, 0xe8, - 0x96, 0x70, 0x43, 0xf9, 0xd1, 0x98, 0x26, 0x74, 0x23, 0x66, 0x9a, 0xd0, 0x35, 0x7b, 0xc7, 0xed, - 0x0e, 0x0f, 0x1b, 0x95, 0x2f, 0xc5, 0x56, 0xe4, 0x54, 0x2a, 0xb6, 0x22, 0xa7, 0xbf, 0x8b, 0xbc, - 0xdd, 0xe1, 0x51, 0xa0, 0xf2, 0x63, 0xdd, 0xf9, 0x86, 0x2b, 0x7d, 0xfa, 0x9b, 0xc2, 0xdb, 0x1d, - 0x1e, 0xd4, 0x29, 0x3f, 0xde, 0x9d, 0x6f, 0xe8, 0xd8, 0x97, 0xfe, 0x1e, 0xaf, 0xd6, 0xf9, 0x31, - 0x9a, 0xf2, 0x13, 0xf1, 0xa9, 0xab, 0x03, 0x21, 0x4e, 0x5d, 0x9d, 0x5e, 0xb4, 0xdd, 0x48, 0x79, - 0x12, 0xa6, 0xfc, 0x64, 0x4c, 0xb1, 0x12, 0x14, 0x4c, 0xb1, 0x92, 0x2f, 0xc9, 0x6e, 0xa4, 0xbc, - 0x7c, 0x52, 0xfe, 0x7a, 0x67, 0x5e, 0x81, 0x50, 0x53, 0x1e, 0x4c, 0xdd, 0x48, 0x79, 0xe0, 0xa3, - 0xfc, 0x8d, 0xce, 0xbc, 0x42, 0xff, 0xa0, 0x04, 0x70, 0xbc, 0x0f, 0x7a, 0x71, 0xc7, 0xa9, 0x7e, - 0x29, 0x03, 0x43, 0x55, 0xcf, 0xa1, 0x7a, 0x53, 0x44, 0x7b, 0x38, 0x03, 0xfd, 0xdc, 0x75, 0xcb, - 0x7f, 0x3d, 0xa1, 0x05, 0xbf, 0xc9, 0x05, 0x18, 0x99, 0xd1, 0x5d, 0x0f, 0x4b, 0x56, 0x2c, 0x83, - 0xde, 0xc7, 0x67, 0x0b, 0x39, 0x2d, 0x06, 0x25, 0x33, 0x9c, 0x8e, 0x97, 0xc3, 0xd8, 0x3c, 0xb9, - 0x2d, 0x83, 0x1c, 0xf4, 0xbf, 0xbd, 0x51, 0xec, 0xc1, 0x98, 0x06, 0xb1, 0xb2, 0xea, 0xd7, 0x32, - 0x90, 0x70, 0x2a, 0xdb, 0xfd, 0xab, 0xa6, 0x79, 0x38, 0x16, 0x8b, 0x07, 0x25, 0xde, 0x5e, 0x6c, - 0x33, 0x5c, 0x54, 0xbc, 0x34, 0x79, 0x6f, 0xe0, 0xf3, 0x7f, 0x4b, 0x9b, 0x11, 0x01, 0x2c, 0xfa, - 0x36, 0x37, 0x8a, 0xb9, 0xb6, 0xd3, 0xd0, 0x24, 0x94, 0x78, 0xa0, 0xfc, 0x77, 0x47, 0xc3, 0x60, - 0x37, 0xe4, 0x82, 0x78, 0x62, 0x95, 0x09, 0xc3, 0x5e, 0xc4, 0x52, 0x29, 0xf2, 0x27, 0x55, 0x1f, - 0x84, 0xa1, 0x4a, 0xb3, 0x45, 0x1d, 0xd7, 0xb6, 0x74, 0xcf, 0xf6, 0x53, 0xb6, 0x63, 0x48, 0x04, - 0x53, 0x82, 0xcb, 0xcf, 0xf4, 0x65, 0x7a, 0x72, 0xc9, 0xcf, 0xee, 0x90, 0xc3, 0x30, 0x43, 0x18, - 0x2b, 0x33, 0x9e, 0x9e, 0x8f, 0x53, 0x30, 0xd2, 0x5b, 0xae, 0x8e, 0xaf, 0x43, 0x02, 0xd2, 0x36, - 0x03, 0xc8, 0xa4, 0x48, 0x41, 0x9e, 0x84, 0x02, 0x9e, 0xa6, 0xb9, 0x98, 0xb5, 0x45, 0x04, 0xe3, - 0x68, 0x20, 0x44, 0x0e, 0x7d, 0xc0, 0x69, 0xc8, 0x4d, 0x18, 0x0d, 0xaf, 0x0a, 0xae, 0x3b, 0x76, - 0xbb, 0xe5, 0xc7, 0x69, 0xc6, 0xb4, 0x86, 0x77, 0x03, 0x5c, 0x6d, 0x05, 0x91, 0x12, 0x8b, 0x44, - 0x41, 0x32, 0x0d, 0xc7, 0x42, 0x18, 0x13, 0x91, 0x1f, 0x1f, 0x1e, 0x73, 0xf3, 0x48, 0xbc, 0x98, - 0x38, 0x23, 0xb9, 0x79, 0x62, 0xc5, 0x48, 0x05, 0xfa, 0xfc, 0x48, 0x1c, 0xfd, 0x5b, 0x2a, 0xe9, - 0x71, 0x11, 0x89, 0xa3, 0x4f, 0x8e, 0xc1, 0xe1, 0x97, 0x27, 0x53, 0x30, 0xa2, 0xd9, 0x6d, 0x8f, - 0x2e, 0xda, 0x62, 0x8d, 0x15, 0x01, 0x84, 0xb1, 0x4d, 0x0e, 0xc3, 0xd4, 0x3c, 0xdb, 0xcf, 0x0a, - 0x29, 0x67, 0x27, 0x8c, 0x96, 0x22, 0x73, 0x30, 0x96, 0xb8, 0x54, 0x91, 0x73, 0x35, 0x4a, 0x9f, - 0x97, 0x64, 0x96, 0x2c, 0x4a, 0xbe, 0x3b, 0x03, 0x85, 0x45, 0x47, 0x37, 0x3d, 0x57, 0x3c, 0x2c, - 0x39, 0x79, 0x79, 0xcd, 0xd1, 0x5b, 0x4c, 0x3f, 0x2e, 0x63, 0x1c, 0xa9, 0xdb, 0x7a, 0xa3, 0x4d, - 0xdd, 0xf1, 0x3b, 0xec, 0xeb, 0xfe, 0xcd, 0x46, 0xf1, 0xa5, 0x15, 0xdc, 0xba, 0x5d, 0xae, 0xdb, - 0xcd, 0x2b, 0x2b, 0x8e, 0x7e, 0xcf, 0xf4, 0x70, 0xea, 0xd0, 0x1b, 0x57, 0x3c, 0xda, 0xc0, 0x1d, - 0xe2, 0x15, 0xbd, 0x65, 0x5e, 0xc1, 0x78, 0x85, 0x57, 0x02, 0x4e, 0xbc, 0x06, 0xa6, 0x02, 0x1e, - 0xfe, 0x25, 0xab, 0x00, 0xc7, 0x91, 0x39, 0xb6, 0xb1, 0xc2, 0x4f, 0x2d, 0xb5, 0x5a, 0xe2, 0x95, - 0x8a, 0xb4, 0xaf, 0xf2, 0x31, 0x5c, 0xb1, 0x03, 0x81, 0xe9, 0xad, 0x96, 0x9c, 0x0d, 0x36, 0xa4, - 0x63, 0x5a, 0xb0, 0x28, 0x5a, 0xe4, 0x8b, 0x69, 0x38, 0x94, 0xb8, 0xdf, 0xd8, 0x14, 0x21, 0xc5, - 0x8b, 0x91, 0x25, 0x38, 0x26, 0xf8, 0x06, 0x11, 0x7d, 0x47, 0xa2, 0xb3, 0x42, 0x0c, 0xcd, 0x95, - 0x36, 0x68, 0xa3, 0x21, 0xc0, 0x72, 0x1d, 0xb1, 0x12, 0x64, 0x3c, 0x4c, 0x33, 0x36, 0xa7, 0x37, - 0xa9, 0xab, 0x1c, 0x43, 0x8d, 0x3d, 0xbb, 0xb9, 0x51, 0x54, 0xfc, 0xf2, 0x18, 0x94, 0x26, 0x35, - 0x69, 0x26, 0x16, 0x91, 0x79, 0x70, 0xad, 0x1f, 0x4d, 0xe1, 0x11, 0xd7, 0xf9, 0x68, 0x11, 0x32, - 0x01, 0xc3, 0x81, 0x93, 0xec, 0xad, 0x5b, 0x95, 0x32, 0x3e, 0x83, 0x19, 0x18, 0x3f, 0xb7, 0xb9, - 0x51, 0x7c, 0x28, 0x16, 0x73, 0x57, 0x66, 0x12, 0x29, 0x23, 0xbd, 0x97, 0xe3, 0xef, 0x62, 0x62, - 0xef, 0xe5, 0x5a, 0x29, 0xef, 0xe5, 0x16, 0xc8, 0x2b, 0x30, 0x58, 0xba, 0x53, 0x15, 0xef, 0x00, - 0x5d, 0xe5, 0x78, 0x18, 0xa5, 0x1d, 0xf3, 0xa6, 0x8a, 0x37, 0x83, 0x72, 0xd3, 0x65, 0x7a, 0x32, - 0x09, 0x23, 0x91, 0x7b, 0x76, 0x57, 0x39, 0x81, 0x1c, 0xb0, 0xe5, 0x3a, 0x62, 0x6a, 0x8e, 0x40, - 0x45, 0x32, 0xf9, 0x46, 0x0a, 0x31, 0xad, 0x61, 0x5b, 0xd5, 0x46, 0xc3, 0x5e, 0xd3, 0x28, 0x3e, - 0x39, 0xc4, 0x47, 0x35, 0xfd, 0x5c, 0x6b, 0x0c, 0x81, 0xaa, 0x39, 0x1c, 0x17, 0x49, 0xdd, 0x1b, - 0x2d, 0x46, 0xde, 0x04, 0x82, 0x31, 0xb2, 0xa9, 0xe1, 0x1f, 0xbb, 0x56, 0xca, 0xae, 0x72, 0x0a, - 0xe3, 0xe9, 0x91, 0xf8, 0x9b, 0xd7, 0x4a, 0x79, 0xfc, 0x82, 0x98, 0x3e, 0xce, 0xeb, 0xbc, 0x54, - 0xcd, 0x11, 0xb8, 0x9a, 0x19, 0x49, 0x20, 0x96, 0xc2, 0x95, 0xac, 0xc1, 0xe9, 0x05, 0x87, 0xde, - 0x33, 0xed, 0xb6, 0xeb, 0x2f, 0x1f, 0xfe, 0xbc, 0x75, 0x7a, 0xcb, 0x79, 0xeb, 0x51, 0x51, 0xf1, - 0xc9, 0x96, 0x43, 0xef, 0xd5, 0xfc, 0x28, 0x6a, 0x91, 0x48, 0x42, 0x9d, 0xb8, 0x63, 0x1a, 0xb4, - 0xb7, 0xda, 0x0e, 0x15, 0x70, 0x93, 0xba, 0x8a, 0x12, 0x4e, 0xb5, 0xfc, 0xf5, 0xa8, 0x19, 0xe0, - 0x22, 0x69, 0xd0, 0xa2, 0xc5, 0x88, 0x06, 0xe4, 0xfa, 0x84, 0x7f, 0x04, 0x5f, 0xaa, 0xf3, 0x64, - 0x51, 0xca, 0x43, 0xc8, 0x4c, 0x65, 0x62, 0x59, 0xa9, 0x07, 0x11, 0x15, 0x6b, 0xba, 0xc0, 0xcb, - 0x62, 0x49, 0x96, 0x26, 0x33, 0x30, 0xba, 0xe0, 0xe0, 0x86, 0xe0, 0x26, 0x5d, 0x5f, 0xb0, 0x1b, - 0x66, 0x7d, 0x1d, 0xdf, 0xf6, 0x88, 0xa9, 0xb2, 0xc5, 0x71, 0xb5, 0xbb, 0x74, 0xbd, 0xd6, 0x42, - 0xac, 0xbc, 0xac, 0xc4, 0x4b, 0xca, 0x11, 0xce, 0x1e, 0xde, 0x5e, 0x84, 0x33, 0x0a, 0xa3, 0xe2, - 0x00, 0xff, 0xbe, 0x47, 0x2d, 0xb6, 0xd4, 0xbb, 0xe2, 0x1d, 0x8f, 0x12, 0x3b, 0xf0, 0x0f, 0xf0, - 0x22, 0x8d, 0x2f, 0x1f, 0x65, 0x34, 0x00, 0xcb, 0x0d, 0x8b, 0x17, 0x51, 0x3f, 0x97, 0x93, 0xa7, - 0x4e, 0x72, 0x16, 0xf2, 0x52, 0x80, 0x6d, 0x8c, 0x71, 0x84, 0xc1, 0x08, 0xf3, 0x22, 0xea, 0xda, - 0x80, 0x30, 0x3b, 0x82, 0xc7, 0xac, 0x98, 0x36, 0x25, 0x8c, 0x7b, 0xa3, 0x85, 0x04, 0x98, 0xb2, - 0xa2, 0xbd, 0xd4, 0x30, 0xeb, 0x18, 0xa2, 0x32, 0x27, 0xa5, 0xac, 0x40, 0x28, 0x8f, 0x50, 0x29, - 0x91, 0x90, 0xab, 0x30, 0xe8, 0xef, 0x21, 0xc3, 0x18, 0x5f, 0x18, 0xb9, 0xd0, 0x4f, 0x78, 0xcc, - 0x03, 0x23, 0x4a, 0x44, 0xe4, 0x45, 0x4c, 0xf9, 0xed, 0x3f, 0x14, 0xee, 0x0d, 0xcd, 0x17, 0x79, - 0xe0, 0xc7, 0x72, 0x7e, 0xfb, 0xef, 0x85, 0xc7, 0x61, 0x58, 0xd6, 0x24, 0x3f, 0x49, 0x0f, 0xce, - 0x79, 0x11, 0xf5, 0x93, 0xfb, 0x36, 0x5a, 0x84, 0xcc, 0xc3, 0x58, 0x42, 0x79, 0x44, 0x44, 0x30, - 0x4c, 0xd4, 0x98, 0xa2, 0x79, 0xf2, 0x9a, 0x9a, 0x28, 0xab, 0x7e, 0x47, 0x36, 0xb1, 0x62, 0x30, - 0xc1, 0x08, 0x2a, 0xa9, 0x73, 0x50, 0x30, 0x3e, 0x6b, 0x2e, 0x18, 0x89, 0x88, 0x5c, 0x84, 0xfe, - 0x58, 0xd6, 0x6f, 0x7c, 0x3a, 0x1e, 0xa4, 0xfc, 0x0e, 0xb0, 0xe4, 0xaa, 0x94, 0x36, 0x4a, 0x0a, - 0xbf, 0xe7, 0xa7, 0x8d, 0x8a, 0xc7, 0xa1, 0xc3, 0x04, 0x52, 0x57, 0x63, 0x11, 0xea, 0xfd, 0xe4, - 0xcc, 0xc9, 0xd5, 0x2a, 0x8c, 0x48, 0x1f, 0xd8, 0x8a, 0xbd, 0x5b, 0xd9, 0x8a, 0xea, 0xaf, 0x64, - 0x92, 0xda, 0x4f, 0xae, 0x25, 0xc3, 0x69, 0xf1, 0xbc, 0xcc, 0x3e, 0x50, 0xae, 0x35, 0x08, 0xac, - 0x15, 0x09, 0x8c, 0x95, 0xdd, 0x75, 0x60, 0xac, 0xdc, 0x0e, 0x03, 0x63, 0xa9, 0xff, 0x3b, 0xdf, - 0xd5, 0x0d, 0xec, 0x40, 0x02, 0x28, 0xbc, 0xc0, 0xf6, 0x3b, 0xac, 0xf6, 0x92, 0x9b, 0xb0, 0xda, - 0xb9, 0x97, 0x4b, 0x4d, 0xe7, 0xa3, 0xc6, 0xd5, 0xa2, 0x94, 0xe4, 0x55, 0x18, 0xf2, 0x3f, 0x00, - 0x03, 0xae, 0x49, 0x81, 0xc2, 0x82, 0xb5, 0x26, 0x9e, 0x5a, 0x5b, 0x2e, 0x40, 0x9e, 0x85, 0x01, - 0xb4, 0x34, 0x5a, 0x7a, 0xdd, 0x8f, 0xc6, 0xc7, 0xc3, 0xf7, 0xf9, 0x40, 0x39, 0x48, 0x40, 0x40, - 0x49, 0x3e, 0x06, 0x85, 0x48, 0x6e, 0xf7, 0x2b, 0xdb, 0xf0, 0x9b, 0xbb, 0x2c, 0x47, 0x92, 0xe5, - 0x7b, 0x87, 0x78, 0x5e, 0x77, 0xc1, 0x94, 0x2c, 0xc2, 0xf1, 0x05, 0x87, 0x1a, 0xe8, 0xa1, 0x39, - 0x79, 0xbf, 0xe5, 0x88, 0x38, 0xbf, 0x7c, 0x00, 0xe3, 0xd2, 0xd1, 0xf2, 0xd1, 0x6c, 0x51, 0x13, - 0x78, 0x39, 0x24, 0x58, 0x4a, 0x71, 0x66, 0x4f, 0xf0, 0x96, 0xdc, 0xa4, 0xeb, 0x6b, 0x98, 0xdf, - 0xb3, 0x3f, 0xb4, 0x27, 0x84, 0xa0, 0xef, 0x0a, 0x94, 0x6c, 0x4f, 0x44, 0x0b, 0x9d, 0x79, 0x01, - 0x06, 0x77, 0x1b, 0x8d, 0xf5, 0xe7, 0xb3, 0x1d, 0x1c, 0xaa, 0x1f, 0xdc, 0x84, 0x18, 0x41, 0x2a, - 0xb6, 0xde, 0x0e, 0xa9, 0xd8, 0xbe, 0x99, 0xed, 0xe0, 0x2d, 0xfe, 0x40, 0xa7, 0x4c, 0x0a, 0x84, - 0x11, 0x4d, 0x99, 0x14, 0x66, 0xab, 0x32, 0x0d, 0x4d, 0x26, 0x8a, 0x25, 0x57, 0x2b, 0x6c, 0x99, - 0x5c, 0xed, 0xa7, 0x72, 0xdd, 0xbc, 0xe9, 0x8f, 0x64, 0xbf, 0x13, 0xd9, 0x5f, 0x85, 0xc1, 0x40, - 0xb2, 0x95, 0x32, 0xda, 0x33, 0xc3, 0x41, 0xec, 0x67, 0x0e, 0xc6, 0x32, 0x12, 0x11, 0xb9, 0xc4, - 0xdb, 0x5a, 0x35, 0xdf, 0xe2, 0xa1, 0x4c, 0x87, 0x45, 0x90, 0x4a, 0xdd, 0xd3, 0x6b, 0xae, 0xf9, - 0x16, 0xd5, 0x02, 0xb4, 0xfa, 0x8f, 0xb2, 0xa9, 0x4f, 0x12, 0x8e, 0xfa, 0x68, 0x07, 0x7d, 0x94, - 0x22, 0x44, 0xfe, 0x98, 0xe2, 0x48, 0x88, 0x3b, 0x10, 0xe2, 0x1f, 0x64, 0x53, 0x9f, 0x9e, 0x1c, - 0x09, 0x71, 0x27, 0xb3, 0xc5, 0x93, 0x30, 0xa0, 0xd9, 0x6b, 0x2e, 0x66, 0x52, 0x16, 0x73, 0x05, - 0x4e, 0xd4, 0x8e, 0xbd, 0xe6, 0xf2, 0x2c, 0xd3, 0x5a, 0x48, 0xa0, 0xfe, 0x51, 0xb6, 0xcb, 0xe3, - 0x9c, 0x23, 0xc1, 0xbf, 0x93, 0x4b, 0xe4, 0x2f, 0x66, 0x23, 0x8f, 0x7f, 0x1e, 0xe8, 0xdc, 0xa3, - 0xd5, 0xfa, 0x2a, 0x6d, 0xea, 0xf1, 0xdc, 0xa3, 0x2e, 0x42, 0x45, 0x06, 0xb0, 0x90, 0x44, 0xfd, - 0x72, 0x36, 0xf6, 0xfa, 0xe9, 0x48, 0x76, 0xdb, 0x96, 0x5d, 0xa0, 0x75, 0xe2, 0x41, 0xd7, 0x91, - 0xe4, 0xb6, 0x2b, 0xb9, 0x4f, 0x65, 0x63, 0x6f, 0xdf, 0x1e, 0x58, 0xd9, 0xb1, 0x01, 0x98, 0x7c, - 0x93, 0xf7, 0xc0, 0x6a, 0xd2, 0x93, 0x30, 0x20, 0xe4, 0x10, 0x2c, 0x15, 0x7c, 0xde, 0xe7, 0x40, - 0x3c, 0x40, 0x0d, 0x08, 0xd4, 0xef, 0xca, 0x42, 0xf4, 0x4d, 0xe2, 0x03, 0xaa, 0x43, 0xbf, 0x98, - 0x8d, 0xbe, 0xc6, 0x7c, 0x70, 0xf5, 0xe7, 0x32, 0x40, 0xb5, 0xbd, 0x54, 0x17, 0xc1, 0xfc, 0x7a, - 0xa5, 0x13, 0xf8, 0x00, 0xaa, 0x49, 0x14, 0xea, 0xff, 0xc9, 0xa6, 0x3e, 0x11, 0x7d, 0x70, 0x05, - 0xf8, 0x0c, 0x9e, 0x8a, 0xd7, 0xad, 0x70, 0x22, 0xc7, 0x43, 0x48, 0x36, 0xfe, 0x12, 0x39, 0x44, - 0x7c, 0x42, 0xf2, 0x81, 0x14, 0x73, 0x0d, 0x23, 0x9c, 0x86, 0xe6, 0x9a, 0x7c, 0xc3, 0x20, 0x19, - 0x6e, 0xff, 0x3c, 0xbb, 0xd5, 0x8b, 0xda, 0x07, 0x79, 0x55, 0xed, 0x5b, 0xd0, 0xd7, 0x31, 0xf2, - 0x13, 0xeb, 0x89, 0x21, 0x9e, 0xe1, 0xa2, 0xc5, 0x41, 0xf2, 0x8d, 0x98, 0xa0, 0x52, 0x7f, 0xbf, - 0x37, 0xfd, 0x39, 0xe7, 0x83, 0x2b, 0xc2, 0xb3, 0x90, 0x5f, 0xd0, 0xbd, 0x55, 0xa1, 0xc9, 0x78, - 0x5b, 0xd7, 0xd2, 0xbd, 0x55, 0x0d, 0xa1, 0xe4, 0x12, 0xf4, 0x6b, 0xfa, 0x1a, 0x3f, 0xf3, 0x2c, - 0x84, 0xd9, 0x47, 0x1c, 0x7d, 0xad, 0xc6, 0xcf, 0x3d, 0x03, 0x34, 0x51, 0x83, 0xec, 0x37, 0xfc, - 0xe4, 0x1b, 0x53, 0x2f, 0xf0, 0xec, 0x37, 0x41, 0xce, 0x9b, 0xb3, 0x90, 0x1f, 0xb7, 0x8d, 0x75, - 0x74, 0x66, 0x19, 0xe2, 0x95, 0x2d, 0xd9, 0xc6, 0xba, 0x86, 0x50, 0xf2, 0xe9, 0x0c, 0xf4, 0x4d, - 0x53, 0xdd, 0x60, 0x23, 0x64, 0xa0, 0x9b, 0x2f, 0xc8, 0x87, 0xf6, 0xc7, 0x17, 0x64, 0x6c, 0x95, + 0x77, 0x0f, 0x41, 0xec, 0xf7, 0x88, 0xe5, 0xf8, 0x21, 0x39, 0x92, 0xa2, 0xc8, 0xb1, 0x65, 0xc7, + 0x4e, 0x2c, 0xdb, 0xc7, 0x89, 0xe3, 0xe3, 0xd8, 0x71, 0x9c, 0x63, 0x5b, 0x71, 0x74, 0x62, 0x47, + 0x79, 0xac, 0xa3, 0xe3, 0x1c, 0xdb, 0x49, 0x7c, 0x7c, 0x12, 0x07, 0x72, 0x94, 0x38, 0x3f, 0x70, + 0x92, 0x13, 0x27, 0xd1, 0x89, 0x1d, 0xc7, 0xc9, 0xc9, 0xa9, 0x5b, 0xd5, 0xdd, 0xd5, 0x8f, 0x19, + 0x3c, 0xd7, 0x58, 0x88, 0xf8, 0x43, 0x62, 0xee, 0xbd, 0x75, 0xab, 0xfa, 0xd6, 0xad, 0xaa, 0x5b, + 0x55, 0xb7, 0xee, 0x85, 0x4b, 0x1e, 0x6d, 0xd0, 0x96, 0xed, 0x78, 0x57, 0x1a, 0x74, 0x45, 0xaf, + 0xaf, 0x5f, 0xf1, 0xd6, 0x5b, 0xd4, 0xbd, 0x42, 0xef, 0x51, 0xcb, 0xf3, 0xff, 0xbb, 0xdc, 0x72, + 0x6c, 0xcf, 0x26, 0x05, 0xfe, 0xeb, 0xcc, 0x89, 0x15, 0x7b, 0xc5, 0x46, 0xd0, 0x15, 0xf6, 0x17, + 0xc7, 0x9e, 0x39, 0xbb, 0x62, 0xdb, 0x2b, 0x0d, 0x7a, 0x05, 0x7f, 0x2d, 0xb5, 0x97, 0xaf, 0xb8, + 0x9e, 0xd3, 0xae, 0x7b, 0x02, 0x5b, 0x8c, 0x63, 0x3d, 0xb3, 0x49, 0x5d, 0x4f, 0x6f, 0xb6, 0x04, + 0xc1, 0xf9, 0x38, 0xc1, 0x9a, 0xa3, 0xb7, 0x5a, 0xd4, 0x11, 0x95, 0x9f, 0x79, 0x34, 0xbd, 0x9d, + 0xf8, 0xaf, 0x20, 0x79, 0x2a, 0x9d, 0xc4, 0x67, 0x14, 0xe3, 0xa8, 0x7e, 0x21, 0x0b, 0xfd, 0xb3, + 0xd4, 0xd3, 0x0d, 0xdd, 0xd3, 0xc9, 0x59, 0xe8, 0xad, 0x58, 0x06, 0xbd, 0xaf, 0x64, 0x1e, 0xc9, + 0x5c, 0xcc, 0x8d, 0x17, 0x36, 0x37, 0x8a, 0x59, 0x6a, 0x6a, 0x1c, 0x48, 0xce, 0x41, 0x7e, 0x71, + 0xbd, 0x45, 0x95, 0xec, 0x23, 0x99, 0x8b, 0x03, 0xe3, 0x03, 0x9b, 0x1b, 0xc5, 0x5e, 0x94, 0x85, + 0x86, 0x60, 0xf2, 0x28, 0x64, 0x2b, 0x65, 0x25, 0x87, 0xc8, 0xb1, 0xcd, 0x8d, 0xe2, 0x70, 0xdb, + 0x34, 0x9e, 0xb4, 0x9b, 0xa6, 0x47, 0x9b, 0x2d, 0x6f, 0x5d, 0xcb, 0x56, 0xca, 0xe4, 0x02, 0xe4, + 0x27, 0x6c, 0x83, 0x2a, 0x79, 0x24, 0x22, 0x9b, 0x1b, 0xc5, 0x91, 0xba, 0x6d, 0x50, 0x89, 0x0a, + 0xf1, 0xe4, 0x35, 0xc8, 0x2f, 0x9a, 0x4d, 0xaa, 0xf4, 0x3e, 0x92, 0xb9, 0x38, 0x78, 0xf5, 0xcc, + 0x65, 0x2e, 0x95, 0xcb, 0xbe, 0x54, 0x2e, 0x2f, 0xfa, 0x62, 0x1b, 0x1f, 0x7d, 0x7b, 0xa3, 0xd8, + 0xb3, 0xb9, 0x51, 0xcc, 0x33, 0x49, 0x7e, 0xfe, 0xeb, 0xc5, 0x8c, 0x86, 0x25, 0xc9, 0xcb, 0x30, + 0x38, 0xd1, 0x68, 0xbb, 0x1e, 0x75, 0xe6, 0xf4, 0x26, 0x55, 0x0a, 0x58, 0xe1, 0x99, 0xcd, 0x8d, + 0xe2, 0xa9, 0x3a, 0x07, 0xd7, 0x2c, 0xbd, 0x29, 0x57, 0x2c, 0x93, 0xab, 0xbf, 0x9c, 0x81, 0x63, + 0x55, 0xea, 0xba, 0xa6, 0x6d, 0x05, 0xb2, 0x79, 0x1c, 0x06, 0x04, 0xa8, 0x52, 0x46, 0xf9, 0x0c, + 0x8c, 0xf7, 0x6d, 0x6e, 0x14, 0x73, 0xae, 0x69, 0x68, 0x21, 0x86, 0xbc, 0x1f, 0xfa, 0xee, 0x98, + 0xde, 0xea, 0xec, 0x54, 0x49, 0xc8, 0xe9, 0xd4, 0xe6, 0x46, 0x91, 0xac, 0x99, 0xde, 0x6a, 0xad, + 0xb9, 0xac, 0x4b, 0x15, 0xfa, 0x64, 0x64, 0x06, 0x46, 0x17, 0x1c, 0xf3, 0x9e, 0xee, 0xd1, 0x9b, + 0x74, 0x7d, 0xc1, 0x6e, 0x98, 0xf5, 0x75, 0x21, 0xc5, 0x47, 0x36, 0x37, 0x8a, 0x67, 0x5b, 0x1c, + 0x57, 0xbb, 0x4b, 0xd7, 0x6b, 0x2d, 0xc4, 0x4a, 0x4c, 0x12, 0x25, 0xd5, 0xaf, 0xf6, 0xc2, 0xd0, + 0x2d, 0x97, 0x3a, 0x41, 0xbb, 0x2f, 0x40, 0x9e, 0xfd, 0x16, 0x4d, 0x46, 0x99, 0xb7, 0x5d, 0xea, + 0xc8, 0x32, 0x67, 0x78, 0x72, 0x09, 0x7a, 0x67, 0xec, 0x15, 0xd3, 0x12, 0xcd, 0x3e, 0xbe, 0xb9, + 0x51, 0x3c, 0xd6, 0x60, 0x00, 0x89, 0x92, 0x53, 0x90, 0x0f, 0xc2, 0x50, 0xa5, 0xc9, 0x74, 0xc8, + 0xb6, 0x74, 0xcf, 0x76, 0x44, 0x6b, 0x51, 0xba, 0xa6, 0x04, 0x97, 0x0a, 0x46, 0xe8, 0xc9, 0x8b, + 0x00, 0xa5, 0x3b, 0x55, 0xcd, 0x6e, 0xd0, 0x92, 0x36, 0x27, 0x94, 0x01, 0x4b, 0xeb, 0x6b, 0x6e, + 0xcd, 0xb1, 0x1b, 0xb4, 0xa6, 0x3b, 0x72, 0xb5, 0x12, 0x35, 0x99, 0x84, 0x91, 0x52, 0xbd, 0x4e, + 0x5d, 0x57, 0xa3, 0x9f, 0x68, 0x53, 0xd7, 0x73, 0x95, 0xde, 0x47, 0x72, 0x17, 0x07, 0xc6, 0xcf, + 0x6d, 0x6e, 0x14, 0x1f, 0xd2, 0x11, 0x53, 0x73, 0x04, 0x4a, 0x62, 0x11, 0x2b, 0x44, 0xc6, 0x61, + 0xb8, 0xf4, 0x56, 0xdb, 0xa1, 0x15, 0x83, 0x5a, 0x9e, 0xe9, 0xad, 0x0b, 0x0d, 0x39, 0xbb, 0xb9, + 0x51, 0x54, 0x74, 0x86, 0xa8, 0x99, 0x02, 0x23, 0x31, 0x89, 0x16, 0x21, 0xf3, 0x30, 0x76, 0x7d, + 0x62, 0xa1, 0x4a, 0x9d, 0x7b, 0x66, 0x9d, 0x96, 0xea, 0x75, 0xbb, 0x6d, 0x79, 0x4a, 0x1f, 0xf2, + 0x79, 0x74, 0x73, 0xa3, 0x78, 0x6e, 0xa5, 0xde, 0xaa, 0xb9, 0x1c, 0x5b, 0xd3, 0x39, 0x5a, 0x62, + 0x96, 0x2c, 0x4b, 0x3e, 0x0c, 0xc3, 0x8b, 0x0e, 0xd3, 0x42, 0xa3, 0x4c, 0x19, 0x5c, 0xe9, 0x47, + 0xfd, 0x3f, 0x75, 0x59, 0x4c, 0x40, 0x1c, 0xea, 0xf7, 0x2c, 0x6f, 0xac, 0xc7, 0x0b, 0xd4, 0x0c, + 0xc4, 0xc9, 0x8d, 0x8d, 0xb0, 0x22, 0x14, 0x14, 0xf6, 0xf1, 0xa6, 0x43, 0x8d, 0x84, 0xb6, 0x0d, + 0x60, 0x9b, 0x2f, 0x6d, 0x6e, 0x14, 0x1f, 0x77, 0x04, 0x4d, 0xad, 0xab, 0xda, 0x75, 0x64, 0x45, + 0x26, 0xa1, 0x9f, 0x69, 0xd3, 0x4d, 0xd3, 0x32, 0x14, 0x78, 0x24, 0x73, 0x71, 0xe4, 0xea, 0xa8, + 0xdf, 0x7a, 0x1f, 0x3e, 0x7e, 0x7a, 0x73, 0xa3, 0x78, 0x9c, 0xe9, 0x60, 0xed, 0xae, 0x69, 0xc9, + 0x53, 0x44, 0x50, 0x54, 0xfd, 0xa3, 0x3c, 0x8c, 0x30, 0xe1, 0x48, 0x7a, 0x5c, 0x62, 0x43, 0x92, + 0x41, 0xd8, 0x08, 0x75, 0x5b, 0x7a, 0x9d, 0x0a, 0x95, 0x46, 0x76, 0x96, 0x0f, 0x94, 0xd8, 0xc5, + 0xe9, 0xc9, 0x25, 0xe8, 0xe7, 0xa0, 0x4a, 0x59, 0x68, 0xf9, 0xf0, 0xe6, 0x46, 0x71, 0xc0, 0x45, + 0x58, 0xcd, 0x34, 0xb4, 0x00, 0xcd, 0xd4, 0x8c, 0xff, 0x3d, 0x6d, 0xbb, 0x1e, 0x63, 0x2e, 0x94, + 0x1c, 0xd5, 0x4c, 0x14, 0x58, 0x15, 0x28, 0x59, 0xcd, 0xa2, 0x85, 0xc8, 0x0b, 0x00, 0x1c, 0x52, + 0x32, 0x0c, 0x47, 0x68, 0xfa, 0x43, 0x9b, 0x1b, 0xc5, 0x93, 0x82, 0x85, 0x6e, 0x18, 0xf2, 0x30, + 0x91, 0x88, 0x49, 0x13, 0x86, 0xf8, 0xaf, 0x19, 0x7d, 0x89, 0x36, 0xb8, 0x9a, 0x0f, 0x5e, 0xbd, + 0xe8, 0x4b, 0x33, 0x2a, 0x9d, 0xcb, 0x32, 0xe9, 0xa4, 0xe5, 0x39, 0xeb, 0xe3, 0x45, 0x31, 0x33, + 0x9e, 0x16, 0x55, 0x35, 0x10, 0x27, 0x8f, 0x49, 0xb9, 0x0c, 0x9b, 0x30, 0xa7, 0x6c, 0x67, 0x4d, + 0x77, 0x0c, 0x6a, 0x8c, 0xaf, 0xcb, 0x13, 0xe6, 0xb2, 0x0f, 0xae, 0x2d, 0xc9, 0x3a, 0x20, 0x93, + 0x93, 0x09, 0x18, 0xe6, 0xdc, 0xaa, 0xed, 0x25, 0xec, 0xfb, 0xbe, 0x84, 0xb4, 0xdc, 0xf6, 0x52, + 0xbc, 0xbf, 0xa3, 0x65, 0xd8, 0x98, 0xe4, 0x80, 0xdb, 0xd4, 0x61, 0xb3, 0x29, 0xaa, 0xbf, 0x18, + 0x93, 0x82, 0xc9, 0x3d, 0x8e, 0x49, 0xf2, 0x10, 0x45, 0xce, 0xbc, 0x0a, 0x63, 0x09, 0x51, 0x90, + 0x51, 0xc8, 0xdd, 0xa5, 0xeb, 0x5c, 0x5d, 0x34, 0xf6, 0x27, 0x39, 0x01, 0xbd, 0xf7, 0xf4, 0x46, + 0x5b, 0xac, 0x65, 0x1a, 0xff, 0xf1, 0x62, 0xf6, 0x03, 0x19, 0x36, 0xf5, 0x93, 0x09, 0xdb, 0xb2, + 0x68, 0xdd, 0x93, 0x67, 0xff, 0xe7, 0x60, 0x60, 0xc6, 0xae, 0xeb, 0x0d, 0xec, 0x47, 0xae, 0x77, + 0xca, 0xe6, 0x46, 0xf1, 0x04, 0xeb, 0xc0, 0xcb, 0x0d, 0x86, 0x91, 0xda, 0x14, 0x92, 0x32, 0x05, + 0xd0, 0x68, 0xd3, 0xf6, 0x28, 0x16, 0xcc, 0x86, 0x0a, 0x80, 0x05, 0x1d, 0x44, 0xc9, 0x0a, 0x10, + 0x12, 0x93, 0x2b, 0xd0, 0xbf, 0xc0, 0x16, 0xbc, 0xba, 0xdd, 0x10, 0xca, 0x87, 0x73, 0x32, 0x2e, + 0x82, 0xf2, 0xa0, 0xf1, 0x89, 0xd4, 0x69, 0x18, 0x99, 0x68, 0x98, 0xd4, 0xf2, 0xe4, 0x56, 0xb3, + 0x21, 0x55, 0x5a, 0xa1, 0x96, 0x27, 0xb7, 0x1a, 0x07, 0x9f, 0xce, 0xa0, 0x72, 0xab, 0x03, 0x52, + 0xf5, 0x9f, 0xe7, 0xe0, 0xa1, 0x9b, 0xed, 0x25, 0xea, 0x58, 0xd4, 0xa3, 0xae, 0x58, 0x19, 0x03, + 0xae, 0x73, 0x30, 0x96, 0x40, 0x0a, 0xee, 0xb8, 0x62, 0xdd, 0x0d, 0x90, 0x35, 0xb1, 0xd8, 0xca, + 0xd3, 0x5e, 0xa2, 0x28, 0x99, 0x86, 0x63, 0x21, 0x90, 0x35, 0xc2, 0x55, 0xb2, 0x38, 0xa7, 0x9f, + 0xdf, 0xdc, 0x28, 0x9e, 0x91, 0xb8, 0xb1, 0x66, 0xcb, 0x1a, 0x1c, 0x2f, 0x46, 0x6e, 0xc2, 0x68, + 0x08, 0xba, 0xee, 0xd8, 0xed, 0x96, 0xab, 0xe4, 0x90, 0x55, 0x71, 0x73, 0xa3, 0xf8, 0xb0, 0xc4, + 0x6a, 0x05, 0x91, 0xf2, 0x4a, 0x1a, 0x2f, 0x48, 0xbe, 0x33, 0x23, 0x73, 0x13, 0xa3, 0x30, 0x8f, + 0xa3, 0xf0, 0x79, 0x7f, 0x14, 0x76, 0x14, 0xd2, 0xe5, 0x78, 0x49, 0x31, 0x28, 0x63, 0xcd, 0x48, + 0x0c, 0xca, 0x44, 0x8d, 0x67, 0x26, 0xe0, 0x64, 0x2a, 0xaf, 0x1d, 0x69, 0xf5, 0x1f, 0xe4, 0x64, + 0x2e, 0x0b, 0xb6, 0x11, 0x74, 0xe6, 0xbc, 0xdc, 0x99, 0x0b, 0xb6, 0x81, 0xe6, 0x52, 0x26, 0x5c, + 0xc4, 0xa4, 0xc6, 0xb6, 0x6c, 0x23, 0x6e, 0x35, 0x25, 0xcb, 0x92, 0x8f, 0xc3, 0xa9, 0x04, 0x90, + 0x4f, 0xd7, 0x5c, 0xfb, 0x2f, 0x6c, 0x6e, 0x14, 0xd5, 0x14, 0xae, 0xf1, 0xd9, 0xbb, 0x03, 0x17, + 0xa2, 0xc3, 0x69, 0x49, 0xea, 0xb6, 0xe5, 0xe9, 0xa6, 0x25, 0xac, 0x3c, 0x3e, 0x4a, 0xde, 0xbb, + 0xb9, 0x51, 0x7c, 0x4c, 0xd6, 0x41, 0x9f, 0x26, 0xde, 0xf8, 0x4e, 0x7c, 0x88, 0x01, 0x4a, 0x0a, + 0xaa, 0xd2, 0xd4, 0x57, 0x7c, 0xd3, 0xf5, 0xe2, 0xe6, 0x46, 0xf1, 0x3d, 0xa9, 0x75, 0x98, 0x8c, + 0x4a, 0x5e, 0x2a, 0x3b, 0x71, 0x22, 0x1a, 0x90, 0x10, 0x37, 0x67, 0x1b, 0x14, 0xbf, 0xa1, 0x17, + 0xf9, 0xab, 0x9b, 0x1b, 0xc5, 0xf3, 0x12, 0x7f, 0xcb, 0x36, 0x68, 0xbc, 0xf9, 0x29, 0xa5, 0xd5, + 0x5f, 0xce, 0xc1, 0xf9, 0x6a, 0x69, 0x76, 0xa6, 0x62, 0xf8, 0xb6, 0xc5, 0x82, 0x63, 0xdf, 0x33, + 0x0d, 0x69, 0xf4, 0x2e, 0xc1, 0xe9, 0x18, 0x6a, 0x12, 0xcd, 0x99, 0xc0, 0xaa, 0xc5, 0x6f, 0xf3, + 0xed, 0x96, 0x96, 0xa0, 0xa9, 0x71, 0x9b, 0xa7, 0x16, 0x31, 0xe9, 0x3b, 0x31, 0x62, 0x7d, 0x14, + 0x43, 0x55, 0x57, 0x6d, 0xc7, 0xab, 0xb7, 0x3d, 0xa1, 0x04, 0xd8, 0x47, 0x89, 0x3a, 0x5c, 0x41, + 0xd4, 0xa5, 0x0a, 0x9f, 0x0f, 0xf9, 0x74, 0x06, 0x46, 0x4b, 0x9e, 0xe7, 0x98, 0x4b, 0x6d, 0x8f, + 0xce, 0xea, 0xad, 0x96, 0x69, 0xad, 0xe0, 0x58, 0x1f, 0xbc, 0xfa, 0x72, 0xb0, 0x46, 0x76, 0x95, + 0xc4, 0xe5, 0x78, 0x71, 0x69, 0x88, 0xea, 0x3e, 0xaa, 0xd6, 0xe4, 0x38, 0x79, 0x88, 0xc6, 0xcb, + 0xb1, 0x21, 0x9a, 0xca, 0x6b, 0x47, 0x43, 0xf4, 0x0b, 0x39, 0x38, 0x3b, 0x7f, 0xd7, 0xd3, 0x35, + 0xea, 0xda, 0x6d, 0xa7, 0x4e, 0xdd, 0x5b, 0x2d, 0x43, 0xf7, 0x68, 0x38, 0x52, 0x8b, 0xd0, 0x5b, + 0x32, 0x0c, 0x6a, 0x20, 0xbb, 0x5e, 0xbe, 0xff, 0xd2, 0x19, 0x40, 0xe3, 0x70, 0xf2, 0x38, 0xf4, + 0x89, 0x32, 0xc8, 0xbd, 0x77, 0x7c, 0x70, 0x73, 0xa3, 0xd8, 0xd7, 0xe6, 0x20, 0xcd, 0xc7, 0x31, + 0xb2, 0x32, 0x6d, 0x50, 0x46, 0x96, 0x0b, 0xc9, 0x0c, 0x0e, 0xd2, 0x7c, 0x1c, 0x79, 0x1d, 0x46, + 0x90, 0x6d, 0xd0, 0x1e, 0x31, 0xf7, 0x9d, 0xf0, 0xa5, 0x2b, 0x37, 0x96, 0x2f, 0x4d, 0xd8, 0x9a, + 0x9a, 0xe3, 0x17, 0xd0, 0x62, 0x0c, 0xc8, 0x1d, 0x18, 0x15, 0x8d, 0x08, 0x99, 0xf6, 0x76, 0x61, + 0x7a, 0x72, 0x73, 0xa3, 0x38, 0x26, 0xda, 0x2f, 0xb1, 0x4d, 0x30, 0x61, 0x8c, 0x45, 0xb3, 0x43, + 0xc6, 0x85, 0xad, 0x18, 0x8b, 0x2f, 0x96, 0x19, 0xc7, 0x99, 0xa8, 0x6f, 0xc0, 0x90, 0x5c, 0x90, + 0x9c, 0xc2, 0x3d, 0x2e, 0x1f, 0x27, 0xb8, 0x3b, 0x36, 0x0d, 0xdc, 0xd8, 0x3e, 0x0d, 0x83, 0x65, + 0xea, 0xd6, 0x1d, 0xb3, 0xc5, 0xac, 0x06, 0xa1, 0xe4, 0xc7, 0x36, 0x37, 0x8a, 0x83, 0x46, 0x08, + 0xd6, 0x64, 0x1a, 0xf5, 0x7f, 0x64, 0xe0, 0x14, 0xe3, 0x5d, 0x72, 0x5d, 0x73, 0xc5, 0x6a, 0xca, + 0xcb, 0xf6, 0x93, 0x50, 0xa8, 0x62, 0x7d, 0xa2, 0xa6, 0x13, 0x9b, 0x1b, 0xc5, 0x51, 0xde, 0x02, + 0x49, 0x0f, 0x05, 0x4d, 0xb0, 0xc1, 0xcb, 0x6e, 0xb1, 0xc1, 0x63, 0x26, 0xad, 0xa7, 0x3b, 0x9e, + 0x69, 0xad, 0x54, 0x3d, 0xdd, 0x6b, 0xbb, 0x11, 0x93, 0x56, 0x60, 0x6a, 0x2e, 0xa2, 0x22, 0x26, + 0x6d, 0xa4, 0x10, 0x79, 0x15, 0x86, 0x26, 0x2d, 0x23, 0x64, 0xc2, 0x27, 0xc4, 0x87, 0x99, 0xa5, + 0x49, 0x11, 0x9e, 0x64, 0x11, 0x29, 0xa0, 0xfe, 0xad, 0x0c, 0x28, 0x7c, 0x37, 0x36, 0x63, 0xba, + 0xde, 0x2c, 0x6d, 0x2e, 0x49, 0xb3, 0xd3, 0x94, 0xbf, 0xbd, 0x63, 0x38, 0x69, 0x2d, 0x42, 0x53, + 0x40, 0x6c, 0xef, 0x1a, 0xa6, 0xeb, 0xc5, 0x27, 0xc3, 0x58, 0x29, 0x52, 0x81, 0x3e, 0xce, 0x99, + 0xdb, 0x12, 0x83, 0x57, 0x15, 0x5f, 0x11, 0xe2, 0x55, 0x73, 0x65, 0x68, 0x72, 0x62, 0x79, 0x7f, + 0x2e, 0xca, 0xab, 0x7f, 0x3b, 0x0b, 0xa3, 0xf1, 0x42, 0xe4, 0x0e, 0xf4, 0xdf, 0xb0, 0x4d, 0x8b, + 0x1a, 0xf3, 0x16, 0xb6, 0xb0, 0xfb, 0x29, 0x85, 0x6f, 0x8b, 0x1f, 0x7f, 0x13, 0xcb, 0xd4, 0x64, + 0x0b, 0x16, 0x0f, 0x2d, 0x02, 0x66, 0xe4, 0xc3, 0x30, 0xc0, 0x6c, 0xc0, 0x7b, 0xc8, 0x39, 0xbb, + 0x25, 0xe7, 0x47, 0x04, 0xe7, 0x13, 0x0e, 0x2f, 0x94, 0x64, 0x1d, 0xb2, 0x63, 0x7a, 0xa5, 0x51, + 0xdd, 0xb5, 0x2d, 0xd1, 0xf3, 0xa8, 0x57, 0x0e, 0x42, 0x64, 0xbd, 0xe2, 0x34, 0xcc, 0x74, 0xe5, + 0x1f, 0x8b, 0xdd, 0x20, 0xed, 0x5d, 0xb8, 0xac, 0xe2, 0x3d, 0x20, 0x11, 0xab, 0xdf, 0x9d, 0x85, + 0xa7, 0x42, 0x91, 0x69, 0xf4, 0x9e, 0x49, 0xd7, 0x84, 0x38, 0x57, 0xcd, 0x96, 0xd8, 0x3c, 0x32, + 0x95, 0x77, 0x27, 0x56, 0x75, 0x6b, 0x85, 0x1a, 0xe4, 0x12, 0xf4, 0xb2, 0x1d, 0xbe, 0xab, 0x64, + 0xd0, 0x5c, 0xc3, 0xe9, 0xc4, 0x61, 0x00, 0xf9, 0xf4, 0x01, 0x29, 0x88, 0x0d, 0x85, 0x45, 0x47, + 0x37, 0x3d, 0xbf, 0x67, 0x4b, 0xc9, 0x9e, 0xdd, 0x46, 0x8d, 0x97, 0x39, 0x0f, 0x3e, 0xe7, 0xa3, + 0x20, 0x3c, 0x04, 0xc8, 0x82, 0xe0, 0x24, 0x67, 0x5e, 0x80, 0x41, 0x89, 0x78, 0x47, 0x93, 0xfa, + 0x97, 0xf3, 0xb2, 0xae, 0xfb, 0xcd, 0x12, 0xba, 0x7e, 0x85, 0xe9, 0xa8, 0xeb, 0x32, 0xab, 0x82, + 0x2b, 0xb9, 0xd0, 0x44, 0x04, 0x45, 0x35, 0x11, 0x41, 0xe4, 0x19, 0xe8, 0xe7, 0x2c, 0x82, 0xfd, + 0x2b, 0xee, 0x7d, 0x1d, 0x84, 0x45, 0x97, 0xe6, 0x80, 0x90, 0xfc, 0x74, 0x06, 0xce, 0x75, 0x95, + 0x04, 0x2a, 0xc3, 0xe0, 0xd5, 0x67, 0x77, 0x25, 0xc6, 0xf1, 0xa7, 0x36, 0x37, 0x8a, 0x97, 0x9a, + 0x01, 0x49, 0xcd, 0x91, 0x68, 0x6a, 0x75, 0x4e, 0x24, 0xb5, 0xab, 0x7b, 0x53, 0x98, 0xf1, 0xc8, + 0x2b, 0x9d, 0xc2, 0x33, 0x1c, 0xab, 0xbe, 0xee, 0x37, 0x32, 0x1f, 0x1a, 0x8f, 0xe2, 0x7b, 0x97, + 0x7d, 0x92, 0x94, 0x6a, 0x3a, 0x70, 0x21, 0x75, 0x38, 0xcd, 0x31, 0x65, 0x7d, 0x7d, 0x7e, 0x79, + 0xd6, 0xb6, 0xbc, 0x55, 0xbf, 0x82, 0x5e, 0xf9, 0x10, 0x04, 0x2b, 0x30, 0xf4, 0xf5, 0x9a, 0xbd, + 0x5c, 0x6b, 0x32, 0xaa, 0x94, 0x3a, 0x3a, 0x71, 0x62, 0x13, 0xad, 0x18, 0x73, 0xfe, 0x14, 0x54, + 0x08, 0x8f, 0xa8, 0xfc, 0x71, 0x9a, 0x9c, 0x70, 0x62, 0x85, 0xd4, 0x0a, 0x0c, 0xcd, 0xd8, 0xf5, + 0xbb, 0x81, 0xba, 0xbc, 0x00, 0x85, 0x45, 0xdd, 0x59, 0xa1, 0x1e, 0xca, 0x62, 0xf0, 0xea, 0xd8, + 0x65, 0x7e, 0xec, 0xcb, 0x88, 0x38, 0x62, 0x7c, 0x44, 0xcc, 0x06, 0x05, 0x0f, 0x7f, 0x6b, 0xa2, + 0x80, 0xfa, 0xf5, 0x5e, 0x18, 0x12, 0x47, 0x94, 0x38, 0x9b, 0x93, 0x17, 0xc3, 0x43, 0x5f, 0x31, + 0x7d, 0x05, 0xc7, 0x34, 0xc1, 0xf1, 0xd2, 0x10, 0x63, 0xf6, 0x9b, 0x1b, 0xc5, 0xcc, 0xe6, 0x46, + 0xb1, 0x47, 0xeb, 0x97, 0x36, 0x95, 0xe1, 0x7a, 0x23, 0x2d, 0xb0, 0xf2, 0xa1, 0x63, 0xac, 0x2c, + 0x5f, 0x7f, 0x5e, 0x85, 0x3e, 0xd1, 0x06, 0xa1, 0x71, 0xa7, 0xc3, 0xb3, 0x8c, 0xc8, 0x51, 0x6b, + 0xac, 0xb4, 0x5f, 0x8a, 0xbc, 0x0c, 0x05, 0xbe, 0xb7, 0x17, 0x02, 0x38, 0x95, 0x7e, 0x16, 0x12, + 0x2b, 0x2e, 0xca, 0x90, 0x69, 0x80, 0x70, 0x5f, 0x1f, 0x9c, 0x2c, 0x0b, 0x0e, 0xc9, 0x1d, 0x7f, + 0x8c, 0x8b, 0x54, 0x96, 0x3c, 0x07, 0x43, 0x8b, 0xd4, 0x69, 0x9a, 0x96, 0xde, 0xa8, 0x9a, 0x6f, + 0xf9, 0x87, 0xcb, 0xb8, 0xf0, 0xba, 0xe6, 0x5b, 0xf2, 0xc8, 0x8d, 0xd0, 0x91, 0x8f, 0xa5, 0xed, + 0x9b, 0xfb, 0xb0, 0x21, 0x8f, 0x6e, 0xb9, 0xa1, 0x8c, 0xb5, 0x27, 0x65, 0x1b, 0xfd, 0x3a, 0x0c, + 0x47, 0xb6, 0x4c, 0xe2, 0xf4, 0xf0, 0x5c, 0x92, 0xb5, 0xb4, 0xff, 0x8b, 0xb1, 0x8d, 0x72, 0x60, + 0x9a, 0x5c, 0xb1, 0x4c, 0xcf, 0xd4, 0x1b, 0x13, 0x76, 0xb3, 0xa9, 0x5b, 0x86, 0x32, 0x10, 0x6a, + 0xb2, 0xc9, 0x31, 0xb5, 0x3a, 0x47, 0xc9, 0x9a, 0x1c, 0x2d, 0xc4, 0xb6, 0xe5, 0xa2, 0x0f, 0x35, + 0x5a, 0xb7, 0x1d, 0x66, 0x0b, 0xe0, 0xe1, 0xa0, 0xd8, 0x96, 0xbb, 0x1c, 0x57, 0x73, 0x7c, 0xa4, + 0x6c, 0x6c, 0xc7, 0x0b, 0xde, 0xc8, 0xf7, 0x0f, 0x8e, 0x0e, 0xc5, 0xcf, 0x73, 0xd5, 0xbf, 0x99, + 0x83, 0x41, 0x41, 0xca, 0x96, 0xd2, 0x23, 0x05, 0xdf, 0x8b, 0x82, 0xa7, 0x2a, 0x6a, 0x61, 0xbf, + 0x14, 0x55, 0xfd, 0x4c, 0x36, 0x98, 0x8d, 0x16, 0x1c, 0xd3, 0xda, 0xdb, 0x6c, 0x74, 0x01, 0x60, + 0x62, 0xb5, 0x6d, 0xdd, 0xe5, 0xf7, 0x56, 0xd9, 0xf0, 0xde, 0xaa, 0x6e, 0x6a, 0x12, 0x86, 0x9c, + 0x83, 0x7c, 0x99, 0xf1, 0x67, 0x3d, 0x33, 0x34, 0x3e, 0xf0, 0x36, 0xe7, 0x94, 0x79, 0x4a, 0x43, + 0x30, 0xdb, 0x5c, 0x8d, 0xaf, 0x7b, 0x94, 0x9b, 0xb3, 0x39, 0xbe, 0xb9, 0x5a, 0x62, 0x00, 0x8d, + 0xc3, 0xc9, 0x35, 0x18, 0x2b, 0xd3, 0x86, 0xbe, 0x3e, 0x6b, 0x36, 0x1a, 0xa6, 0x4b, 0xeb, 0xb6, + 0x65, 0xb8, 0x28, 0x64, 0x51, 0x5d, 0xd3, 0xd5, 0x92, 0x04, 0x44, 0x85, 0xc2, 0xfc, 0xf2, 0xb2, + 0x4b, 0x3d, 0x14, 0x5f, 0x6e, 0x1c, 0xd8, 0xe4, 0x6c, 0x23, 0x44, 0x13, 0x18, 0xf5, 0xe7, 0x32, + 0x6c, 0xf7, 0xe2, 0xde, 0xf5, 0xec, 0x56, 0xa0, 0xe5, 0x7b, 0x12, 0xc9, 0xa5, 0xd0, 0xae, 0xc8, + 0xe2, 0xd7, 0x1e, 0x13, 0x5f, 0xdb, 0x27, 0x6c, 0x8b, 0xd0, 0xa2, 0x48, 0xfd, 0xaa, 0xdc, 0x16, + 0x5f, 0xa5, 0xfe, 0x61, 0x16, 0x4e, 0x8b, 0x16, 0x4f, 0x34, 0xcc, 0xd6, 0x92, 0xad, 0x3b, 0x86, + 0x46, 0xeb, 0xd4, 0xbc, 0x47, 0x0f, 0xe7, 0xc0, 0x8b, 0x0e, 0x9d, 0xfc, 0x1e, 0x86, 0xce, 0x55, + 0xdc, 0x08, 0x32, 0xc9, 0xe0, 0x81, 0x2f, 0x37, 0x2a, 0x46, 0x37, 0x37, 0x8a, 0x43, 0x06, 0x07, + 0xe3, 0x91, 0xbf, 0x26, 0x13, 0x31, 0x25, 0x99, 0xa1, 0xd6, 0x8a, 0xb7, 0x8a, 0x4a, 0xd2, 0xcb, + 0x95, 0xa4, 0x81, 0x10, 0x4d, 0x60, 0xd4, 0xff, 0x9c, 0x85, 0x13, 0x71, 0x91, 0x57, 0xa9, 0x65, + 0x1c, 0xc9, 0xfb, 0x9d, 0x91, 0xf7, 0x37, 0x73, 0xf0, 0xb0, 0x28, 0x53, 0x5d, 0xd5, 0x1d, 0x6a, + 0x94, 0x4d, 0x87, 0xd6, 0x3d, 0xdb, 0x59, 0x3f, 0xc4, 0x06, 0xd4, 0xfe, 0x89, 0xfd, 0x1a, 0x14, + 0xc4, 0xf6, 0x9f, 0xaf, 0x33, 0x23, 0x41, 0x4b, 0x10, 0x9a, 0x58, 0xa1, 0xf8, 0xd1, 0x41, 0xac, + 0xb3, 0x0a, 0xdb, 0xe9, 0xac, 0x0f, 0xc0, 0x70, 0x20, 0x7a, 0xdc, 0x88, 0xf6, 0x85, 0xd6, 0x96, + 0xe1, 0x23, 0x70, 0x2f, 0xaa, 0x45, 0x09, 0xb1, 0x36, 0x1f, 0x50, 0x29, 0xa3, 0x35, 0x34, 0x2c, + 0x6a, 0x0b, 0xca, 0x99, 0x86, 0x26, 0x13, 0xa9, 0x1b, 0x79, 0x38, 0x93, 0xde, 0xed, 0x1a, 0xd5, + 0x8d, 0xa3, 0x5e, 0xff, 0x96, 0xec, 0x75, 0xf2, 0x28, 0xe4, 0x17, 0x74, 0x6f, 0x55, 0xdc, 0x83, + 0xe3, 0x9d, 0xf0, 0xb2, 0xd9, 0xa0, 0xb5, 0x96, 0xee, 0xad, 0x6a, 0x88, 0x92, 0xe6, 0x0c, 0x40, + 0x8e, 0x29, 0x73, 0x86, 0xb4, 0xd8, 0x0f, 0x3e, 0x92, 0xb9, 0x98, 0x4f, 0x5d, 0xec, 0xbf, 0x9e, + 0xef, 0x34, 0xaf, 0xdc, 0x71, 0x4c, 0x8f, 0x1e, 0x69, 0xd8, 0x91, 0x86, 0xed, 0x51, 0xc3, 0x7e, + 0x3b, 0x0b, 0xc3, 0xc1, 0xa6, 0xe9, 0x4d, 0x5a, 0x3f, 0x98, 0xb5, 0x2a, 0xdc, 0xca, 0xe4, 0xf6, + 0xbc, 0x95, 0xd9, 0x8b, 0x42, 0xa9, 0xc1, 0x91, 0x27, 0x37, 0x0d, 0x50, 0x62, 0xfc, 0xc8, 0x33, + 0x38, 0xe8, 0x7c, 0x14, 0xfa, 0x66, 0xf5, 0xfb, 0x66, 0xb3, 0xdd, 0x14, 0x56, 0x3a, 0xfa, 0x75, + 0x35, 0xf5, 0xfb, 0x9a, 0x0f, 0x57, 0xff, 0x65, 0x06, 0x46, 0x84, 0x50, 0x05, 0xf3, 0x3d, 0x49, + 0x35, 0x94, 0x4e, 0x76, 0xcf, 0xd2, 0xc9, 0xed, 0x5e, 0x3a, 0xea, 0x8f, 0xe4, 0x40, 0x99, 0x32, + 0x1b, 0x74, 0xd1, 0xd1, 0x2d, 0x77, 0x99, 0x3a, 0x62, 0x3b, 0x3d, 0xc9, 0x58, 0xed, 0xe9, 0x03, + 0xa5, 0x29, 0x25, 0xbb, 0xab, 0x29, 0xe5, 0x7d, 0x30, 0x20, 0x1a, 0x13, 0xf8, 0x14, 0xe2, 0xa8, + 0x71, 0x7c, 0xa0, 0x16, 0xe2, 0x19, 0x71, 0xa9, 0xd5, 0x72, 0xec, 0x7b, 0xd4, 0xe1, 0xb7, 0x54, + 0x82, 0x58, 0xf7, 0x81, 0x5a, 0x88, 0x97, 0x38, 0x53, 0xdf, 0x5e, 0x94, 0x39, 0x53, 0x47, 0x0b, + 0xf1, 0xe4, 0x22, 0xf4, 0xcf, 0xd8, 0x75, 0x1d, 0x05, 0xcd, 0xa7, 0x95, 0xa1, 0xcd, 0x8d, 0x62, + 0x7f, 0x43, 0xc0, 0xb4, 0x00, 0xcb, 0x28, 0xcb, 0xf6, 0x9a, 0xd5, 0xb0, 0x75, 0xee, 0xfc, 0xd2, + 0xcf, 0x29, 0x0d, 0x01, 0xd3, 0x02, 0x2c, 0xa3, 0x64, 0x32, 0x47, 0xa7, 0xa2, 0xfe, 0x90, 0xe7, + 0xb2, 0x80, 0x69, 0x01, 0x56, 0xfd, 0xb9, 0x3c, 0xd3, 0x5e, 0xd7, 0x7c, 0xeb, 0x81, 0x5f, 0x17, + 0xc2, 0x01, 0xd3, 0xbb, 0x8b, 0x01, 0xf3, 0xc0, 0x1c, 0xd8, 0xa9, 0x7f, 0xd4, 0x07, 0x20, 0xa4, + 0x3f, 0x79, 0xb4, 0x39, 0xdc, 0x9b, 0xd6, 0x94, 0x61, 0x6c, 0xd2, 0x5a, 0xd5, 0xad, 0x3a, 0x35, + 0xc2, 0x63, 0xcb, 0x02, 0x0e, 0x6d, 0xf4, 0xe9, 0xa5, 0x02, 0x19, 0x9e, 0x5b, 0x6a, 0xc9, 0x02, + 0xe4, 0x69, 0x18, 0xac, 0x58, 0x1e, 0x75, 0xf4, 0xba, 0x67, 0xde, 0xa3, 0x62, 0x6a, 0xc0, 0x9b, + 0x61, 0x33, 0x04, 0x6b, 0x32, 0x0d, 0xb9, 0x06, 0x43, 0x0b, 0xba, 0xe3, 0x99, 0x75, 0xb3, 0xa5, + 0x5b, 0x9e, 0xab, 0xf4, 0xe3, 0x8c, 0x86, 0x16, 0x46, 0x4b, 0x82, 0x6b, 0x11, 0x2a, 0xf2, 0x31, + 0x18, 0xc0, 0xad, 0x29, 0x3a, 0x4e, 0x0f, 0x6c, 0x79, 0x71, 0xf8, 0x58, 0xe8, 0x1e, 0xc8, 0x4f, + 0x5f, 0xf1, 0x06, 0x38, 0x7e, 0x77, 0x18, 0x70, 0x24, 0x1f, 0x82, 0xbe, 0x49, 0xcb, 0x40, 0xe6, + 0xb0, 0x25, 0x73, 0x55, 0x30, 0x3f, 0x15, 0x32, 0xb7, 0x5b, 0x31, 0xde, 0x3e, 0xbb, 0xf4, 0x51, + 0x36, 0xf8, 0xce, 0x8d, 0xb2, 0xa1, 0x77, 0xe0, 0x58, 0x7c, 0x78, 0xbf, 0x8e, 0xc5, 0x47, 0x76, + 0x79, 0x2c, 0xae, 0xbe, 0x05, 0x83, 0xe3, 0x0b, 0x53, 0xc1, 0xe8, 0x7d, 0x08, 0x72, 0x0b, 0xc2, + 0x53, 0x21, 0xcf, 0xed, 0x99, 0x96, 0x69, 0x68, 0x0c, 0x46, 0x2e, 0x41, 0xff, 0x04, 0xba, 0xbf, + 0x89, 0x5b, 0xc4, 0x3c, 0x5f, 0xff, 0xea, 0x08, 0x43, 0x2f, 0x58, 0x1f, 0x4d, 0x1e, 0x87, 0xbe, + 0x05, 0xc7, 0x5e, 0x71, 0xf4, 0xa6, 0x58, 0x83, 0xd1, 0x55, 0xa4, 0xc5, 0x41, 0x9a, 0x8f, 0x53, + 0xbf, 0x2f, 0xe3, 0x9b, 0xed, 0xac, 0x44, 0xb5, 0x8d, 0x47, 0xf3, 0x58, 0x77, 0x3f, 0x2f, 0xe1, + 0x72, 0x90, 0xe6, 0xe3, 0xc8, 0x25, 0xe8, 0x9d, 0x74, 0x1c, 0xdb, 0x91, 0x9d, 0xcd, 0x29, 0x03, + 0xc8, 0xd7, 0xbd, 0x48, 0x41, 0x9e, 0x87, 0x41, 0x3e, 0xe7, 0xf0, 0x13, 0xcd, 0x5c, 0xb7, 0x9b, + 0x52, 0x99, 0x52, 0xfd, 0x6a, 0x4e, 0xb2, 0xd9, 0xb8, 0xc4, 0x1f, 0xc0, 0x5b, 0x81, 0x67, 0x20, + 0x37, 0xbe, 0x30, 0x25, 0x26, 0xc0, 0xe3, 0x7e, 0x51, 0x49, 0x55, 0x62, 0xe5, 0x18, 0x35, 0x39, + 0x0b, 0xf9, 0x05, 0xa6, 0x3e, 0x05, 0x54, 0x8f, 0xfe, 0xcd, 0x8d, 0x62, 0xbe, 0xc5, 0xf4, 0x07, + 0xa1, 0x88, 0x65, 0x9b, 0x19, 0xbe, 0x63, 0xe2, 0xd8, 0x70, 0x1f, 0x73, 0x16, 0xf2, 0x25, 0x67, + 0xe5, 0x9e, 0x98, 0xb5, 0x10, 0xab, 0x3b, 0x2b, 0xf7, 0x34, 0x84, 0x92, 0x2b, 0x00, 0x1a, 0xf5, + 0xda, 0x8e, 0x85, 0xef, 0x40, 0x06, 0xf0, 0xfc, 0x0d, 0x67, 0x43, 0x07, 0xa1, 0xb5, 0xba, 0x6d, + 0x50, 0x4d, 0x22, 0x51, 0x7f, 0x32, 0xbc, 0xd8, 0x29, 0x9b, 0xee, 0xdd, 0xa3, 0x2e, 0xdc, 0x41, + 0x17, 0xea, 0xe2, 0x88, 0x33, 0xd9, 0x49, 0x45, 0xe8, 0x9d, 0x6a, 0xe8, 0x2b, 0x2e, 0xf6, 0xa1, + 0xf0, 0x25, 0x5b, 0x66, 0x00, 0x8d, 0xc3, 0x63, 0xfd, 0xd4, 0xbf, 0x75, 0x3f, 0x7d, 0xb1, 0x37, + 0x18, 0x6d, 0x73, 0xd4, 0x5b, 0xb3, 0x9d, 0xa3, 0xae, 0xda, 0x6e, 0x57, 0x5d, 0x80, 0xbe, 0xaa, + 0x53, 0x97, 0x8e, 0x2e, 0x70, 0x3f, 0xe0, 0x3a, 0x75, 0x7e, 0x6c, 0xe1, 0x23, 0x19, 0x5d, 0xd9, + 0xf5, 0x90, 0xae, 0x2f, 0xa4, 0x33, 0x5c, 0x4f, 0xd0, 0x09, 0xa4, 0xa0, 0x5b, 0xb0, 0x1d, 0x4f, + 0x74, 0x5c, 0x40, 0xd7, 0xb2, 0x1d, 0x4f, 0xf3, 0x91, 0xe4, 0x7d, 0x00, 0x8b, 0x13, 0x0b, 0xbe, + 0xb3, 0xfd, 0x40, 0xe8, 0x0b, 0x28, 0xbc, 0xec, 0x35, 0x09, 0x4d, 0x16, 0x61, 0x60, 0xbe, 0x45, + 0x1d, 0xbe, 0x15, 0xe2, 0x2f, 0x3b, 0xde, 0x1b, 0x13, 0xad, 0xe8, 0xf7, 0xcb, 0xe2, 0xff, 0x80, + 0x9c, 0xaf, 0x2f, 0xb6, 0xff, 0x53, 0x0b, 0x19, 0x91, 0xe7, 0xa1, 0x50, 0xe2, 0x76, 0xde, 0x20, + 0xb2, 0x0c, 0x44, 0x86, 0x5b, 0x50, 0x8e, 0xe2, 0x7b, 0x76, 0x1d, 0xff, 0xd6, 0x04, 0xb9, 0x7a, + 0x09, 0x46, 0xe3, 0xd5, 0x90, 0x41, 0xe8, 0x9b, 0x98, 0x9f, 0x9b, 0x9b, 0x9c, 0x58, 0x1c, 0xed, + 0x21, 0xfd, 0x90, 0xaf, 0x4e, 0xce, 0x95, 0x47, 0x33, 0xea, 0xcf, 0x48, 0x33, 0x08, 0x53, 0xad, + 0xa3, 0xab, 0xe1, 0x3d, 0xdd, 0xb7, 0x8c, 0xe2, 0x7d, 0x28, 0x9e, 0x18, 0x34, 0x4d, 0xcf, 0xa3, + 0x86, 0x58, 0x25, 0xf0, 0xbe, 0xd0, 0xbb, 0xaf, 0x25, 0xf0, 0xe4, 0x49, 0x18, 0x46, 0x98, 0xb8, + 0x22, 0xe4, 0xfb, 0x63, 0x51, 0xc0, 0xb9, 0xaf, 0x45, 0x91, 0xea, 0xd7, 0xc2, 0xdb, 0xe1, 0x19, + 0xaa, 0x1f, 0xd6, 0x1b, 0xc5, 0x77, 0x49, 0x7f, 0xa9, 0x7f, 0x9a, 0xe7, 0x4f, 0x40, 0xf8, 0xc3, + 0xbd, 0x83, 0x10, 0x65, 0x78, 0xa4, 0x9b, 0xdb, 0xc1, 0x91, 0xee, 0x93, 0x50, 0x98, 0xa5, 0xde, + 0xaa, 0xed, 0x3b, 0x7e, 0xa1, 0x87, 0x5e, 0x13, 0x21, 0xb2, 0x87, 0x1e, 0xa7, 0x21, 0x77, 0x81, + 0xf8, 0xaf, 0xf2, 0x02, 0x47, 0x6c, 0xff, 0x08, 0xf9, 0x74, 0x62, 0x9f, 0x52, 0xc5, 0x27, 0xb9, + 0xe8, 0x63, 0x7f, 0x22, 0x70, 0xf4, 0x96, 0x3c, 0xb1, 0xfe, 0x64, 0xa3, 0x58, 0xe0, 0x34, 0x5a, + 0x0a, 0x5b, 0xf2, 0x3a, 0x0c, 0xcc, 0x4e, 0x95, 0xc4, 0x0b, 0x3d, 0xee, 0x15, 0xf1, 0x50, 0x20, + 0x45, 0x1f, 0x11, 0x88, 0x04, 0xdf, 0xdb, 0x34, 0x97, 0xf5, 0xe4, 0x03, 0xbd, 0x90, 0x0b, 0xd3, + 0x16, 0xfe, 0x72, 0x47, 0x9c, 0x2e, 0x04, 0xda, 0x12, 0x7d, 0xcf, 0x13, 0x97, 0x15, 0xc7, 0xc6, + 0xb4, 0xa5, 0x7f, 0x0f, 0xa3, 0x7b, 0x1e, 0xc6, 0x4a, 0xad, 0x56, 0xc3, 0xa4, 0x06, 0xea, 0x8b, + 0xd6, 0x6e, 0x50, 0x57, 0xb8, 0xfc, 0xe0, 0x63, 0x10, 0x9d, 0x23, 0x6b, 0xf8, 0x2e, 0xb4, 0xe6, + 0xb4, 0xa3, 0xfe, 0x99, 0xc9, 0xb2, 0xea, 0x0f, 0x64, 0xe1, 0xd4, 0x84, 0x43, 0x75, 0x8f, 0xce, + 0x4e, 0x95, 0x4a, 0x6d, 0xf4, 0x91, 0x6b, 0x34, 0xa8, 0xb5, 0x72, 0x30, 0xc3, 0xfa, 0x25, 0x18, + 0x09, 0x1a, 0x50, 0xad, 0xdb, 0x2d, 0x2a, 0x3f, 0xac, 0xaa, 0xfb, 0x98, 0x9a, 0xcb, 0x50, 0x5a, + 0x8c, 0x94, 0xdc, 0x84, 0xe3, 0x01, 0xa4, 0xd4, 0x68, 0xd8, 0x6b, 0x1a, 0x6d, 0xbb, 0xdc, 0x31, + 0xb6, 0x9f, 0x3b, 0xc6, 0x86, 0x1c, 0x74, 0x86, 0xaf, 0x39, 0x8c, 0x40, 0x4b, 0x2b, 0xa5, 0x7e, + 0x29, 0x07, 0xa7, 0x6f, 0xeb, 0x0d, 0xd3, 0x08, 0x45, 0xa3, 0x51, 0xb7, 0x65, 0x5b, 0x2e, 0x3d, + 0x44, 0xa3, 0x34, 0x32, 0x14, 0xf2, 0xfb, 0x32, 0x14, 0x92, 0x5d, 0xd4, 0xbb, 0xe7, 0x2e, 0x2a, + 0xec, 0xaa, 0x8b, 0xfe, 0x53, 0x06, 0x46, 0x7d, 0xc7, 0x7f, 0xf9, 0x35, 0xb5, 0xe4, 0x95, 0x8e, + 0x47, 0x88, 0x31, 0x3f, 0x68, 0xc4, 0x93, 0x2a, 0xf4, 0x4d, 0xde, 0x6f, 0x99, 0x0e, 0x75, 0xb7, + 0xe1, 0xc4, 0x7d, 0x4e, 0x1c, 0x97, 0x8c, 0x51, 0x5e, 0x24, 0x71, 0x52, 0xc2, 0xc1, 0xf8, 0x9c, + 0x8f, 0x3f, 0x7d, 0x18, 0xf7, 0x9f, 0x88, 0xf3, 0xe7, 0x7c, 0xe2, 0x89, 0x44, 0xe4, 0x7d, 0x66, + 0x48, 0x4a, 0x1e, 0x83, 0xdc, 0xe2, 0xe2, 0x8c, 0x98, 0x49, 0xf1, 0x69, 0xbe, 0xe7, 0xc9, 0xef, + 0x15, 0x19, 0x56, 0xfd, 0xbd, 0x2c, 0x00, 0x53, 0x05, 0x3e, 0x5c, 0x0f, 0x44, 0x09, 0xc7, 0xa1, + 0xdf, 0x17, 0xb8, 0x50, 0xc3, 0xc0, 0x6b, 0x3f, 0xde, 0x11, 0xf1, 0xba, 0x83, 0x17, 0x1a, 0x45, + 0xdf, 0x91, 0x9c, 0xdf, 0x03, 0xe0, 0xce, 0x06, 0x1d, 0xc9, 0x7d, 0xf7, 0xf1, 0xf7, 0xc1, 0x80, + 0x98, 0xf1, 0xec, 0xc8, 0xf9, 0x7f, 0xdd, 0x07, 0x6a, 0x21, 0x3e, 0x36, 0xb5, 0x16, 0xf6, 0xb0, + 0x10, 0xfb, 0xe2, 0xe5, 0xbd, 0x72, 0x24, 0xde, 0x7d, 0x16, 0xef, 0xe7, 0x84, 0x78, 0xf9, 0x0b, + 0x9e, 0x43, 0x2b, 0xde, 0x7d, 0x3b, 0xfb, 0x56, 0x7f, 0x3b, 0x03, 0x84, 0x35, 0x6b, 0x41, 0x77, + 0xdd, 0x35, 0xdb, 0x31, 0xb8, 0x73, 0xfa, 0x81, 0x08, 0x66, 0xff, 0xee, 0x2b, 0xbf, 0xda, 0x0f, + 0xc7, 0x23, 0x8e, 0xbf, 0x87, 0x7c, 0xb2, 0xba, 0x14, 0x1d, 0x4d, 0xdd, 0x5e, 0xbd, 0xbc, 0x47, + 0xbe, 0x10, 0xed, 0x8d, 0x3c, 0x40, 0x93, 0x6e, 0x42, 0x9f, 0x82, 0x21, 0xf1, 0x83, 0xad, 0xd0, + 0xfe, 0x4d, 0x17, 0x8e, 0x52, 0x97, 0x01, 0xb4, 0x08, 0x9a, 0x3c, 0x0b, 0x03, 0x6c, 0xc0, 0xac, + 0x60, 0x14, 0x8f, 0xbe, 0xf0, 0x45, 0x89, 0xe1, 0x03, 0xe5, 0xf5, 0x24, 0xa0, 0x94, 0xde, 0x11, + 0xf5, 0x6f, 0xe3, 0x1d, 0xd1, 0xc7, 0x61, 0xb0, 0x64, 0x59, 0xb6, 0x87, 0x9b, 0x74, 0x57, 0x5c, + 0x4d, 0x74, 0xb4, 0xca, 0x1f, 0xc3, 0xc7, 0xf1, 0x21, 0x7d, 0xaa, 0x59, 0x2e, 0x33, 0x24, 0x57, + 0xfd, 0x57, 0x31, 0xd4, 0x11, 0x5e, 0xe5, 0x78, 0x3d, 0xe3, 0x08, 0x58, 0xf2, 0x51, 0x0c, 0x76, + 0xde, 0xf0, 0x82, 0x63, 0xb7, 0x6c, 0x97, 0x1a, 0x5c, 0x50, 0x83, 0x61, 0xa8, 0x81, 0x96, 0x40, + 0xe0, 0x3b, 0xb6, 0x48, 0x44, 0x8d, 0x48, 0x11, 0xb2, 0x0c, 0x27, 0xfc, 0x8b, 0xe2, 0xe0, 0xc5, + 0x60, 0xa5, 0xec, 0x2a, 0x43, 0xf8, 0x2a, 0x89, 0xc4, 0x95, 0xa1, 0x52, 0x1e, 0x3f, 0xef, 0x5f, + 0x8b, 0xf8, 0x4f, 0x0e, 0x6b, 0xa6, 0x21, 0x77, 0x75, 0x2a, 0x3f, 0xf2, 0x6d, 0x30, 0x38, 0xab, + 0xdf, 0x2f, 0xb7, 0xc5, 0xd9, 0xcb, 0xf0, 0xf6, 0x6f, 0x5f, 0x9a, 0xfa, 0xfd, 0x9a, 0x21, 0xca, + 0xc5, 0x6c, 0x0a, 0x99, 0x25, 0xa9, 0xc1, 0xa9, 0x05, 0xc7, 0x6e, 0xda, 0x1e, 0x35, 0x62, 0x8f, + 0xef, 0x8e, 0x85, 0xaf, 0x75, 0x5b, 0x82, 0xa2, 0xd6, 0xe5, 0x15, 0x5e, 0x07, 0x36, 0xa4, 0x09, + 0xc7, 0x4a, 0xae, 0xdb, 0x6e, 0xd2, 0xf0, 0x86, 0x6a, 0x74, 0xcb, 0xcf, 0x78, 0xaf, 0xf0, 0x5a, + 0x7e, 0x58, 0xc7, 0xa2, 0xfc, 0x82, 0xaa, 0xe6, 0x99, 0x72, 0x8d, 0xf8, 0x2d, 0x71, 0xde, 0x37, + 0xf2, 0xfd, 0x23, 0xa3, 0xc7, 0xb4, 0xd3, 0xc9, 0xc6, 0x2c, 0x9a, 0x5e, 0x83, 0xaa, 0x5f, 0xc9, + 0x00, 0x84, 0x02, 0x26, 0x4f, 0x45, 0x43, 0x05, 0x65, 0xc2, 0x8b, 0x0e, 0x11, 0xbd, 0x20, 0x12, + 0x1b, 0x88, 0x9c, 0x85, 0x3c, 0x46, 0xb8, 0xc8, 0x86, 0x07, 0xab, 0x77, 0x4d, 0xcb, 0xd0, 0x10, + 0xca, 0xb0, 0xd2, 0x53, 0x74, 0xc4, 0xe2, 0xa5, 0x3e, 0xb7, 0x0a, 0xcb, 0x70, 0xac, 0xda, 0x5e, + 0xf2, 0xeb, 0x96, 0xde, 0xd5, 0x61, 0xa0, 0x0d, 0xb7, 0xbd, 0x14, 0x3c, 0x46, 0x8d, 0x84, 0x31, + 0x89, 0x16, 0x51, 0x7f, 0x2e, 0x13, 0x9b, 0x05, 0x0f, 0x70, 0xd1, 0x7b, 0x4f, 0xd2, 0x4f, 0x23, + 0x39, 0x2d, 0xa9, 0x3f, 0x9a, 0x85, 0xc1, 0x05, 0xdb, 0xf1, 0x44, 0xc8, 0x90, 0xc3, 0xbd, 0x0a, + 0x49, 0x7b, 0xa5, 0xfc, 0x0e, 0xf6, 0x4a, 0x67, 0x21, 0x2f, 0xb9, 0x28, 0xf3, 0x7b, 0x11, 0xc3, + 0x70, 0x34, 0x84, 0xaa, 0xdf, 0x9e, 0x05, 0xf8, 0xd0, 0xd3, 0x4f, 0x3f, 0xc0, 0x02, 0x52, 0x7f, + 0x38, 0x03, 0xc7, 0xc4, 0x45, 0x9d, 0x14, 0x74, 0xab, 0xcf, 0xbf, 0x62, 0x95, 0xc7, 0x25, 0x07, + 0x69, 0x3e, 0x8e, 0x2d, 0x01, 0x93, 0xf7, 0x4d, 0x0f, 0xef, 0x2a, 0xa4, 0xa8, 0x5b, 0x54, 0xc0, + 0xe4, 0x25, 0xc0, 0xa7, 0x23, 0x4f, 0xf9, 0x57, 0x90, 0xb9, 0x70, 0xdd, 0x63, 0x05, 0x26, 0x53, + 0xaf, 0x21, 0xd5, 0x5f, 0xcc, 0x43, 0x7e, 0xf2, 0x3e, 0xad, 0x1f, 0xf2, 0xae, 0x91, 0x0e, 0x36, + 0xf3, 0x7b, 0x3c, 0xd8, 0xdc, 0x8d, 0x4f, 0xc5, 0xab, 0x61, 0x7f, 0x16, 0xa2, 0xd5, 0xc7, 0x7a, + 0x3e, 0x5e, 0xbd, 0xdf, 0xd3, 0x87, 0xcf, 0x25, 0xe7, 0x1f, 0xe7, 0x20, 0x57, 0x9d, 0x58, 0x38, + 0xd2, 0x9b, 0x03, 0xd5, 0x9b, 0xee, 0x77, 0xd6, 0x6a, 0x70, 0x0d, 0xd5, 0x1f, 0x7a, 0x89, 0xc6, + 0x6e, 0x9c, 0xbe, 0x99, 0x83, 0x91, 0xea, 0xd4, 0xe2, 0x82, 0x74, 0x12, 0x7c, 0x93, 0x7b, 0xf2, + 0xa1, 0x4f, 0x19, 0xef, 0xd2, 0xb3, 0x09, 0x7b, 0xe6, 0x56, 0xc5, 0xf2, 0x9e, 0xbb, 0x76, 0x5b, + 0x6f, 0xb4, 0x29, 0x1e, 0xbd, 0x70, 0xbf, 0x5f, 0xd7, 0x7c, 0x8b, 0x7e, 0x09, 0x1f, 0xfe, 0xfb, + 0x0c, 0xc8, 0x4b, 0x90, 0xbb, 0x25, 0x3c, 0x32, 0x3a, 0xf1, 0x79, 0xe6, 0x2a, 0xe7, 0xc3, 0x26, + 0xc1, 0x5c, 0xdb, 0x34, 0x90, 0x03, 0x2b, 0xc5, 0x0a, 0x5f, 0x17, 0x0b, 0xf0, 0xb6, 0x0a, 0xaf, + 0xf8, 0x85, 0xaf, 0x57, 0xca, 0xa4, 0x0a, 0x83, 0x0b, 0xd4, 0x69, 0x9a, 0xd8, 0x51, 0xfe, 0x9c, + 0xdd, 0x9d, 0x09, 0xdb, 0xa9, 0x0c, 0xb6, 0xc2, 0x42, 0xc8, 0x4c, 0xe6, 0x42, 0xde, 0x00, 0xe0, + 0x36, 0xca, 0x36, 0x03, 0x39, 0x9e, 0x43, 0xbb, 0x9f, 0x9b, 0x96, 0x29, 0x36, 0x9e, 0xc4, 0x8c, + 0xdc, 0x85, 0xd1, 0x59, 0xdb, 0x30, 0x97, 0x4d, 0xee, 0x7a, 0x89, 0x15, 0x14, 0xb6, 0x76, 0x78, + 0x62, 0xa6, 0x64, 0x53, 0x2a, 0x97, 0x56, 0x4d, 0x82, 0xb1, 0xfa, 0x0f, 0x7a, 0x21, 0xcf, 0xba, + 0xfd, 0x68, 0xfc, 0xee, 0x65, 0xfc, 0x96, 0x60, 0xf4, 0x8e, 0xed, 0xdc, 0x35, 0xad, 0x95, 0xc0, + 0x2b, 0x5e, 0xec, 0x4d, 0xd1, 0x93, 0x67, 0x8d, 0xe3, 0x6a, 0x81, 0x03, 0xbd, 0x96, 0x20, 0xdf, + 0x62, 0x04, 0xbf, 0x00, 0xc0, 0xdf, 0xba, 0x23, 0x4d, 0x7f, 0x18, 0xac, 0x82, 0xbf, 0x84, 0x47, + 0x47, 0x7b, 0x39, 0x58, 0x45, 0x48, 0xcc, 0x36, 0xe1, 0xdc, 0x17, 0x62, 0x00, 0xfd, 0xee, 0x71, + 0x13, 0x8e, 0xbe, 0x10, 0xb2, 0x11, 0xc0, 0xbd, 0x22, 0x16, 0x00, 0xa4, 0xfb, 0x25, 0x88, 0x09, + 0x22, 0x32, 0x39, 0x88, 0xf0, 0x70, 0x29, 0xd7, 0x4b, 0x9a, 0xc4, 0x83, 0x3c, 0x17, 0xbb, 0x00, + 0x27, 0x11, 0x6e, 0x1d, 0xef, 0xbf, 0x43, 0x07, 0xaa, 0xa1, 0xad, 0x1c, 0xa8, 0xd4, 0xcf, 0x64, + 0x61, 0xa0, 0xda, 0x5e, 0x72, 0xd7, 0x5d, 0x8f, 0x36, 0x0f, 0xb9, 0x1a, 0xfb, 0xdb, 0xab, 0x7c, + 0xea, 0xf6, 0xea, 0x31, 0x5f, 0x28, 0xd2, 0xb9, 0x63, 0x60, 0xd2, 0xf9, 0xe2, 0xf8, 0x3b, 0x59, + 0x18, 0xe5, 0x17, 0x67, 0x65, 0xd3, 0xad, 0xef, 0x83, 0x33, 0xff, 0xc1, 0x4b, 0x65, 0x6f, 0x97, + 0xcd, 0xdb, 0x78, 0x22, 0xa1, 0x7e, 0x32, 0x0b, 0x83, 0xa5, 0xb6, 0xb7, 0x5a, 0xf2, 0x50, 0xb7, + 0x1e, 0xc8, 0xfd, 0xc9, 0xaf, 0x67, 0xe0, 0x18, 0x6b, 0xc8, 0xa2, 0x7d, 0x97, 0x5a, 0xfb, 0x70, + 0xf0, 0x28, 0x1f, 0x20, 0x66, 0x77, 0x79, 0x80, 0xe8, 0xcb, 0x32, 0xb7, 0x33, 0x59, 0xe2, 0x71, + 0xb9, 0x66, 0x37, 0xe8, 0xe1, 0xfe, 0x8c, 0x7d, 0x3c, 0x2e, 0xf7, 0x05, 0xb2, 0x0f, 0xd7, 0x33, + 0xdf, 0x5a, 0x02, 0xd9, 0x87, 0xb3, 0xa5, 0x6f, 0x0d, 0x81, 0x7c, 0x35, 0x03, 0x03, 0xe3, 0xb6, + 0x77, 0xc8, 0x07, 0xbe, 0xf8, 0x8a, 0xc3, 0xad, 0xe6, 0xfe, 0x57, 0x1c, 0x6e, 0xdd, 0x54, 0x7f, + 0x30, 0x0b, 0x27, 0x44, 0x90, 0x6e, 0x71, 0xfe, 0x70, 0x34, 0x1d, 0x8b, 0xc1, 0x96, 0x14, 0xcd, + 0xd1, 0x3c, 0x24, 0x44, 0xf3, 0x53, 0x39, 0x38, 0x81, 0xa1, 0x4c, 0xd9, 0xb6, 0xec, 0x5b, 0xc0, + 0x16, 0x21, 0xf5, 0xe8, 0x25, 0xe8, 0x6c, 0xca, 0x25, 0xe8, 0x9f, 0x6c, 0x14, 0x9f, 0x5b, 0x31, + 0xbd, 0xd5, 0xf6, 0xd2, 0xe5, 0xba, 0xdd, 0xbc, 0xb2, 0xe2, 0xe8, 0xf7, 0x4c, 0x7e, 0xfd, 0xa7, + 0x37, 0xae, 0x04, 0xf9, 0x2e, 0xf4, 0x96, 0x29, 0x32, 0x61, 0x54, 0x71, 0xaf, 0xc3, 0xb8, 0xfa, + 0xd7, 0xa7, 0x2e, 0xc0, 0x0d, 0xdb, 0xb4, 0x84, 0x4f, 0x21, 0x37, 0x74, 0xab, 0x6c, 0x7f, 0xf8, + 0xa6, 0x6d, 0x5a, 0xb5, 0xb8, 0x63, 0xe1, 0x4e, 0xeb, 0x0b, 0x59, 0x6b, 0x52, 0x35, 0xea, 0xbf, + 0xc8, 0xc0, 0x43, 0x51, 0x2d, 0xfe, 0x56, 0xb0, 0x1d, 0x7f, 0x28, 0x0b, 0x27, 0xaf, 0xa3, 0x70, + 0x02, 0x47, 0x8e, 0xa3, 0x79, 0x4b, 0x0c, 0xce, 0x14, 0xd9, 0x1c, 0x59, 0x94, 0x9d, 0x65, 0x73, + 0x34, 0xa9, 0x0b, 0xd9, 0xfc, 0x46, 0x06, 0x8e, 0xcf, 0x57, 0xca, 0x13, 0xdf, 0x22, 0x23, 0x2a, + 0xf9, 0x3d, 0x87, 0xdc, 0xe0, 0x4c, 0x7c, 0xcf, 0x21, 0x37, 0x3d, 0xbf, 0x90, 0x85, 0xe3, 0xd5, + 0xd2, 0xec, 0xcc, 0xb7, 0xca, 0x0c, 0x3e, 0x21, 0x7b, 0x1d, 0xfa, 0x87, 0x60, 0xc2, 0x16, 0x90, + 0x3f, 0xf3, 0xf6, 0xd5, 0xce, 0xde, 0x88, 0x49, 0xa1, 0x1c, 0xf2, 0xa9, 0x7b, 0x5f, 0x84, 0xc2, + 0x34, 0x3f, 0x42, 0x7d, 0xc8, 0x35, 0xff, 0x1f, 0x15, 0x60, 0xf0, 0x66, 0x7b, 0x89, 0x0a, 0xe7, + 0x94, 0x07, 0xfa, 0xe4, 0xf7, 0x2a, 0x0c, 0x0a, 0x31, 0xe0, 0xad, 0x89, 0x14, 0x3c, 0x4f, 0x04, + 0x43, 0xe1, 0xf1, 0x89, 0x64, 0x22, 0x72, 0x16, 0xf2, 0xb7, 0xa9, 0xb3, 0x24, 0xbf, 0x2b, 0xbd, + 0x47, 0x9d, 0x25, 0x0d, 0xa1, 0x64, 0x26, 0x74, 0x99, 0x2f, 0x2d, 0x54, 0x30, 0x91, 0x8a, 0xb8, + 0xb0, 0xc1, 0xcc, 0x30, 0x81, 0xdf, 0x9b, 0xde, 0x32, 0x79, 0x0a, 0x16, 0xf9, 0x4d, 0x7b, 0xbc, + 0x24, 0x99, 0x83, 0x31, 0xd9, 0xf1, 0x89, 0x67, 0x11, 0xe9, 0x4f, 0x61, 0x97, 0x96, 0x3f, 0x24, + 0x59, 0x94, 0xbc, 0x0a, 0x43, 0x3e, 0x10, 0x5d, 0xb8, 0x06, 0xc2, 0xd0, 0xf5, 0x01, 0xab, 0x58, + 0x8a, 0xa2, 0x48, 0x01, 0x99, 0x01, 0x5e, 0x43, 0x40, 0x0a, 0x83, 0x98, 0x4b, 0x5c, 0xa4, 0x00, + 0x79, 0x16, 0x19, 0xe0, 0x33, 0x0f, 0x74, 0x56, 0x19, 0xc4, 0x47, 0x97, 0xe8, 0x92, 0xef, 0x08, + 0x38, 0x7f, 0x5a, 0x1b, 0x21, 0x23, 0xf3, 0x00, 0xa1, 0x53, 0x81, 0x08, 0x60, 0xb0, 0x63, 0x77, + 0x07, 0x89, 0x85, 0x7c, 0x1d, 0x38, 0xbc, 0x9b, 0xeb, 0x40, 0xf5, 0xb7, 0xb2, 0x30, 0x58, 0x6a, + 0xb5, 0x82, 0xa1, 0xf0, 0x14, 0x14, 0x4a, 0xad, 0xd6, 0x2d, 0xad, 0x22, 0x87, 0x32, 0xd7, 0x5b, + 0xad, 0x5a, 0xdb, 0x31, 0x65, 0x9f, 0x50, 0x4e, 0x44, 0x26, 0x60, 0xb8, 0xd4, 0x6a, 0x2d, 0xb4, + 0x97, 0x1a, 0x66, 0x5d, 0xca, 0x8c, 0xc4, 0x93, 0xb8, 0xb5, 0x5a, 0xb5, 0x16, 0x62, 0xe2, 0xe9, + 0xb1, 0xa2, 0x65, 0xc8, 0xc7, 0x31, 0xec, 0x8f, 0x48, 0xcc, 0xc3, 0x53, 0x7f, 0xa8, 0x41, 0x10, + 0xf3, 0xb0, 0x6d, 0x97, 0x03, 0x22, 0x1e, 0xec, 0xfd, 0xac, 0x1f, 0x32, 0x9f, 0x55, 0x94, 0x48, + 0xc0, 0x13, 0xb2, 0x24, 0xef, 0x87, 0xbe, 0x52, 0xab, 0x25, 0xdd, 0x37, 0xa1, 0x53, 0x11, 0x2b, + 0x15, 0xeb, 0x63, 0x9f, 0xec, 0xcc, 0xcb, 0x30, 0x12, 0xad, 0x6c, 0x47, 0xc1, 0xe2, 0xff, 0x38, + 0x83, 0x1f, 0x74, 0xc8, 0x7d, 0x9a, 0x9f, 0x81, 0x5c, 0xa9, 0xd5, 0x12, 0xf3, 0xd1, 0xf1, 0x94, + 0xfe, 0x88, 0x3f, 0x81, 0x2e, 0xb5, 0x5a, 0xfe, 0xa7, 0x1f, 0xf2, 0xc7, 0x11, 0xbb, 0xfa, 0xf4, + 0xaf, 0xf2, 0x4f, 0x3f, 0xdc, 0x0f, 0x17, 0xd4, 0x5f, 0xcc, 0xc1, 0xb1, 0x52, 0xab, 0x75, 0x14, + 0x64, 0x7e, 0xbf, 0x1e, 0x5a, 0x3f, 0x0d, 0x20, 0x4d, 0x8f, 0x7d, 0xc1, 0xd3, 0xad, 0x41, 0x69, + 0x6a, 0x54, 0x32, 0x9a, 0x44, 0xe4, 0xab, 0x5f, 0xff, 0x8e, 0xd4, 0xef, 0x93, 0x39, 0x9c, 0x8a, + 0x0f, 0x7b, 0xd0, 0xa8, 0x77, 0x4b, 0xb7, 0x89, 0x3e, 0x28, 0xec, 0xa8, 0x0f, 0x7e, 0x2d, 0x32, + 0x78, 0x30, 0x68, 0xf9, 0x51, 0x2f, 0xf4, 0xee, 0xc9, 0x2c, 0x1e, 0x91, 0x85, 0x29, 0x22, 0xd9, + 0xf8, 0x89, 0x94, 0x44, 0x5c, 0xa5, 0x3a, 0x43, 0xd5, 0x4c, 0x43, 0x8b, 0xd1, 0xfa, 0x7d, 0xd8, + 0xb7, 0xa3, 0x3e, 0xdc, 0xc8, 0xe2, 0xdb, 0xe9, 0x20, 0x2e, 0xd3, 0xde, 0x77, 0x17, 0x57, 0x00, + 0xb8, 0xe7, 0x41, 0xe0, 0xd6, 0x3c, 0xcc, 0x43, 0xb0, 0xf0, 0xfc, 0x4a, 0x22, 0x04, 0x4b, 0x48, + 0x12, 0x78, 0x48, 0xe5, 0x52, 0x3d, 0xa4, 0x2e, 0x41, 0xbf, 0xa6, 0xaf, 0xbd, 0xde, 0xa6, 0xce, + 0xba, 0x30, 0x67, 0x78, 0xd8, 0x43, 0x7d, 0xad, 0xf6, 0x09, 0x06, 0xd4, 0x02, 0x34, 0x51, 0x83, + 0xc7, 0xf7, 0x92, 0x47, 0x08, 0x3f, 0x23, 0x0f, 0x9e, 0xdc, 0xef, 0x46, 0xd1, 0xc9, 0x8b, 0x90, + 0x2b, 0xdd, 0xa9, 0x0a, 0xc9, 0x06, 0x5d, 0x5b, 0xba, 0x53, 0x15, 0xf2, 0xea, 0x58, 0xf6, 0x4e, + 0x55, 0xfd, 0x64, 0x16, 0x48, 0x92, 0x92, 0x3c, 0x07, 0x03, 0x08, 0x5d, 0x61, 0x3a, 0x23, 0x27, + 0xe6, 0x5c, 0x73, 0x6b, 0x0e, 0x42, 0x23, 0xc6, 0x9d, 0x4f, 0x4a, 0x5e, 0xc0, 0x1c, 0xc4, 0x22, + 0x35, 0x5c, 0x24, 0x31, 0xe7, 0x9a, 0xeb, 0x67, 0xed, 0x8d, 0xa5, 0x20, 0x16, 0xc4, 0x68, 0x17, + 0xde, 0xa9, 0x4e, 0xdb, 0xae, 0x27, 0x44, 0xcd, 0xed, 0xc2, 0x35, 0x17, 0x33, 0xc2, 0x46, 0xec, + 0x42, 0x4e, 0x86, 0x59, 0xad, 0xee, 0x54, 0xf9, 0x33, 0x15, 0x43, 0xb3, 0x1b, 0xbe, 0x41, 0xc9, + 0xb3, 0x5a, 0xad, 0xb9, 0x35, 0xfe, 0xc4, 0xc5, 0xc0, 0xe4, 0xc7, 0x91, 0xac, 0x56, 0x91, 0x52, + 0xea, 0x67, 0xfb, 0x61, 0xb4, 0xac, 0x7b, 0xfa, 0x92, 0xee, 0x52, 0x69, 0x37, 0x7d, 0xcc, 0x87, + 0xf9, 0x9f, 0x23, 0xc9, 0xc1, 0x58, 0x4a, 0xf9, 0x9a, 0x78, 0x01, 0xf2, 0x52, 0xc8, 0x37, 0xc8, + 0x39, 0x2a, 0x27, 0x31, 0x5b, 0xaa, 0xb5, 0x04, 0x58, 0x4b, 0x10, 0x92, 0x27, 0x61, 0xd0, 0x87, + 0xb1, 0x0d, 0x40, 0x2e, 0xd4, 0x19, 0x63, 0x89, 0xd9, 0xff, 0x9a, 0x8c, 0x26, 0x2f, 0xc0, 0x90, + 0xff, 0x53, 0x32, 0xad, 0x79, 0x46, 0xb6, 0xa5, 0xc4, 0xee, 0x49, 0x26, 0x95, 0x8b, 0xe2, 0xfc, + 0xd6, 0x1b, 0x29, 0x1a, 0x4b, 0x7a, 0x16, 0x21, 0x25, 0x9f, 0x80, 0x11, 0xff, 0xb7, 0xd8, 0x30, + 0xf0, 0xfc, 0x70, 0x4f, 0x06, 0xb9, 0x95, 0x63, 0x62, 0xbd, 0x1c, 0x25, 0xe7, 0x5b, 0x87, 0x87, + 0xfd, 0x3c, 0x5e, 0xc6, 0x52, 0x72, 0xe7, 0x10, 0xab, 0x80, 0x54, 0x60, 0xcc, 0x87, 0x84, 0x1a, + 0xda, 0x17, 0xee, 0x18, 0x8d, 0xa5, 0x5a, 0xaa, 0x92, 0x26, 0x4b, 0x91, 0x06, 0x9c, 0x8d, 0x00, + 0x0d, 0x77, 0xd5, 0x5c, 0xf6, 0xc4, 0x76, 0x4f, 0xc4, 0x20, 0x16, 0x89, 0x1b, 0x03, 0xae, 0x9c, + 0xc6, 0xcf, 0xc0, 0x1a, 0xcd, 0x0e, 0xd5, 0x95, 0x1b, 0xa9, 0xc2, 0x09, 0x1f, 0x7f, 0x7d, 0x62, + 0x61, 0xc1, 0xb1, 0xdf, 0xa4, 0x75, 0xaf, 0x52, 0x16, 0xdb, 0x65, 0x8c, 0x4d, 0x67, 0x2c, 0xd5, + 0x56, 0xea, 0x2d, 0xa6, 0x14, 0x0c, 0x17, 0x65, 0x9e, 0x5a, 0x98, 0xdc, 0x86, 0x93, 0x12, 0xbc, + 0x62, 0xb9, 0x9e, 0x6e, 0xd5, 0x69, 0xa5, 0x2c, 0xf6, 0xd0, 0xb8, 0x9f, 0x17, 0x5c, 0x4d, 0x81, + 0x8c, 0xb2, 0x4d, 0x2f, 0x4e, 0x5e, 0x86, 0x61, 0x1f, 0xc1, 0x6f, 0x11, 0x07, 0xf1, 0x16, 0x11, + 0x87, 0xa4, 0xb1, 0x54, 0x8b, 0xbf, 0xa6, 0x8c, 0x12, 0xcb, 0x1a, 0x85, 0xa9, 0xed, 0x87, 0x22, + 0x1a, 0xe5, 0xad, 0xb7, 0x52, 0x95, 0x11, 0xd3, 0xdd, 0xbf, 0x1a, 0x6a, 0xd4, 0xbc, 0x63, 0xae, + 0x98, 0x7c, 0x27, 0xed, 0x3f, 0xa0, 0x5c, 0xaa, 0xd9, 0x08, 0x4c, 0xd3, 0x0f, 0x4e, 0x7e, 0xa6, + 0x04, 0xc7, 0x53, 0x74, 0x6c, 0x47, 0x3b, 0xc6, 0xcf, 0x64, 0xc3, 0x46, 0x1c, 0xf2, 0x6d, 0xe3, + 0x38, 0xf4, 0xfb, 0x5f, 0x22, 0x8c, 0x07, 0xa5, 0xd3, 0xd0, 0x8c, 0xf3, 0xf0, 0xf1, 0x11, 0x71, + 0x1c, 0xf2, 0xad, 0xe4, 0x7e, 0x88, 0xe3, 0xed, 0x4c, 0x28, 0x8e, 0x43, 0xbe, 0xbd, 0xfc, 0x8d, + 0x5c, 0x38, 0x27, 0x1d, 0xed, 0x31, 0xf7, 0xcb, 0x4c, 0x0e, 0xfd, 0x60, 0x0b, 0x3b, 0x78, 0xc8, + 0x28, 0xab, 0x66, 0xdf, 0x2e, 0x55, 0xf3, 0x77, 0x92, 0xfd, 0xc9, 0x4d, 0xcf, 0x43, 0xd9, 0x9f, + 0xfb, 0x30, 0x58, 0xc9, 0xd5, 0x70, 0x1d, 0xe3, 0x36, 0x7a, 0xaf, 0x14, 0xe2, 0x6f, 0x49, 0x98, + 0xe8, 0x51, 0x12, 0xf2, 0x11, 0x38, 0x1d, 0x01, 0x2c, 0xe8, 0x8e, 0xde, 0xa4, 0x5e, 0x98, 0x71, + 0x10, 0x83, 0x36, 0xf9, 0xa5, 0x6b, 0xad, 0x00, 0x2d, 0x67, 0x31, 0xec, 0xc0, 0x41, 0x52, 0x8e, + 0xbe, 0x1d, 0x38, 0x49, 0x7f, 0x31, 0x17, 0x9a, 0x2a, 0xd1, 0xe0, 0xab, 0x1a, 0x75, 0xdb, 0x0d, + 0xef, 0xc1, 0xed, 0xe0, 0xdd, 0xa5, 0xb6, 0x98, 0x86, 0x63, 0xa5, 0xe5, 0x65, 0x5a, 0xf7, 0xfc, + 0x98, 0xd2, 0xae, 0x08, 0xb7, 0xc7, 0xb7, 0x0e, 0x02, 0x25, 0x62, 0x04, 0x47, 0x72, 0xe3, 0xc7, + 0x8a, 0xa9, 0xbf, 0x9b, 0x07, 0x25, 0x30, 0xdd, 0x83, 0x87, 0x5a, 0x07, 0xb8, 0x4c, 0xbe, 0x2b, + 0x7a, 0xc5, 0x84, 0xb1, 0x50, 0x18, 0xd5, 0x76, 0xb3, 0xa9, 0xe3, 0xd0, 0x63, 0x5b, 0x83, 0x62, + 0x9c, 0x59, 0x48, 0xc8, 0x77, 0x03, 0x67, 0xc4, 0x6e, 0x80, 0x84, 0x0f, 0xe1, 0x6a, 0x2e, 0x67, + 0xa1, 0x25, 0xb9, 0x92, 0xcf, 0x65, 0xe0, 0x84, 0xdf, 0x29, 0xf3, 0x4b, 0xcc, 0x2c, 0x9e, 0xb0, + 0xdb, 0x96, 0xe7, 0xef, 0x44, 0x5e, 0xec, 0x5c, 0x1d, 0xef, 0xa4, 0xcb, 0x69, 0x85, 0x79, 0x4b, + 0x82, 0xc0, 0x12, 0x81, 0x42, 0xd8, 0x48, 0x53, 0xab, 0x23, 0x91, 0x96, 0x5a, 0xef, 0x99, 0xeb, + 0xf0, 0x50, 0x47, 0x96, 0x5b, 0x99, 0xa1, 0xbd, 0xb2, 0x19, 0xfa, 0xaf, 0x32, 0xe1, 0x44, 0x14, + 0x13, 0x12, 0xb9, 0x0c, 0x10, 0x82, 0xc4, 0xc6, 0x74, 0x64, 0x73, 0xa3, 0x08, 0xa1, 0xd0, 0x34, + 0x89, 0x82, 0xcc, 0x43, 0x41, 0x88, 0x85, 0x67, 0xf7, 0x7d, 0xdf, 0x16, 0xbd, 0x70, 0x59, 0x96, + 0x03, 0x6e, 0x3a, 0xc5, 0x37, 0x0b, 0x36, 0x67, 0x5e, 0x80, 0xc1, 0xdd, 0x7e, 0xd7, 0xe7, 0x72, + 0x40, 0xe4, 0x5d, 0xe4, 0x01, 0x9a, 0xd8, 0x87, 0x78, 0x0a, 0xbb, 0x08, 0xfd, 0xec, 0x13, 0x30, + 0xdf, 0x85, 0x14, 0xdf, 0xb6, 0x2d, 0x60, 0x5a, 0x80, 0x0d, 0x83, 0x4b, 0xf5, 0xa5, 0x07, 0x97, + 0x52, 0xbf, 0x3f, 0x07, 0xa7, 0xe4, 0x0e, 0x29, 0x53, 0x0c, 0x99, 0x7f, 0xd4, 0x29, 0xef, 0x60, + 0xa7, 0xa8, 0x50, 0xe0, 0x9b, 0x07, 0x91, 0xbb, 0x80, 0x1f, 0xec, 0x20, 0x44, 0x13, 0x18, 0xf5, + 0xdf, 0x67, 0x61, 0x78, 0xc1, 0x76, 0xbd, 0x15, 0x87, 0xba, 0x0b, 0xba, 0xe3, 0x3e, 0xc0, 0xdd, + 0xf1, 0x01, 0x18, 0xc6, 0xf0, 0x40, 0x4d, 0x6a, 0xf1, 0x10, 0x3a, 0xbd, 0x52, 0xb2, 0x11, 0x1f, + 0x21, 0xf2, 0x4a, 0x45, 0x08, 0x99, 0xf6, 0x73, 0xcb, 0x4f, 0x0a, 0xda, 0xc4, 0xcd, 0x3e, 0x0e, + 0x57, 0x7f, 0x3c, 0x07, 0x43, 0xbe, 0x94, 0xc7, 0xcd, 0xc3, 0x7a, 0x53, 0x73, 0xb0, 0x42, 0xbe, + 0x02, 0xb0, 0x60, 0x3b, 0x9e, 0xde, 0x98, 0x0b, 0x35, 0x1f, 0x8f, 0x38, 0x5b, 0x08, 0xe5, 0x65, + 0x24, 0x12, 0x5c, 0xbf, 0x42, 0xb3, 0x9a, 0x4f, 0x4c, 0x7c, 0xfd, 0x0a, 0xa0, 0x9a, 0x44, 0xa1, + 0xfe, 0x4a, 0x16, 0x8e, 0xf9, 0x9d, 0x34, 0x79, 0x9f, 0xd6, 0xdb, 0x0f, 0xf2, 0xdc, 0x14, 0x95, + 0x76, 0xef, 0x96, 0xd2, 0x56, 0xff, 0xbb, 0x34, 0x91, 0x4c, 0x34, 0xec, 0xa3, 0x89, 0xe4, 0xcf, + 0x42, 0xc7, 0xd5, 0xef, 0xcc, 0xc1, 0x09, 0x5f, 0xea, 0x53, 0x6d, 0x0b, 0x0f, 0x07, 0x26, 0xf4, + 0x46, 0xe3, 0x41, 0xde, 0x8d, 0x0f, 0xfa, 0x82, 0x98, 0x17, 0xf1, 0xf6, 0x44, 0x8e, 0xbf, 0x65, + 0x01, 0xae, 0xd9, 0xa6, 0xa1, 0xc9, 0x44, 0xe4, 0x55, 0x18, 0xf2, 0x7f, 0x96, 0x9c, 0x15, 0x7f, + 0x0b, 0x8e, 0x47, 0xfd, 0x41, 0x21, 0xdd, 0x89, 0x84, 0x15, 0x88, 0x14, 0x50, 0xff, 0x63, 0x01, + 0xce, 0xdc, 0x31, 0x2d, 0xc3, 0x5e, 0x73, 0xfd, 0x14, 0x91, 0x87, 0xfe, 0xa8, 0xeb, 0xa0, 0x53, + 0x43, 0xbe, 0x0e, 0x27, 0xe3, 0x22, 0x75, 0x82, 0xc0, 0xdd, 0xa2, 0x77, 0xd6, 0x38, 0x41, 0xcd, + 0x4f, 0x16, 0x29, 0xee, 0xcb, 0xb4, 0xf4, 0x92, 0xf1, 0x6c, 0x93, 0x7d, 0xdb, 0xc9, 0x36, 0xf9, + 0x04, 0x14, 0xca, 0x76, 0x53, 0x37, 0xfd, 0x00, 0x33, 0x38, 0x8a, 0x83, 0x7a, 0x11, 0xa3, 0x09, + 0x0a, 0xc6, 0x5f, 0x54, 0x8c, 0x5d, 0x36, 0x10, 0xf2, 0xf7, 0x0b, 0x30, 0x2b, 0x4d, 0x93, 0x89, + 0x88, 0x0d, 0xc3, 0xa2, 0x3a, 0x71, 0xbb, 0x05, 0xb8, 0x79, 0x7a, 0xd6, 0x97, 0x51, 0x67, 0xb5, + 0xba, 0x1c, 0x29, 0xc7, 0xb7, 0x51, 0x3c, 0x09, 0xa6, 0xf8, 0x18, 0x7e, 0xcf, 0xa5, 0x45, 0xf9, + 0x4b, 0x42, 0xc0, 0x49, 0x66, 0x30, 0x29, 0x04, 0x9c, 0x65, 0x64, 0x22, 0x32, 0x09, 0x63, 0x18, + 0x5e, 0x39, 0xd8, 0x4a, 0x31, 0x95, 0x18, 0x42, 0xa3, 0x12, 0x2f, 0x4d, 0x78, 0x44, 0x66, 0xf6, + 0x71, 0xb5, 0xba, 0x40, 0x6b, 0xc9, 0x12, 0x67, 0x5e, 0x03, 0x92, 0x6c, 0xf3, 0x8e, 0xae, 0x4d, + 0xfe, 0x89, 0xb4, 0xaf, 0x3b, 0xec, 0x8e, 0x2f, 0xfb, 0x31, 0xdb, 0x45, 0x52, 0x87, 0xf5, 0xbe, + 0x93, 0xa9, 0xc3, 0x0a, 0xfb, 0x9a, 0x3a, 0x4c, 0xfd, 0xd9, 0x0c, 0x8c, 0x25, 0xe2, 0x8c, 0x93, + 0x67, 0x00, 0x38, 0x44, 0x8a, 0xe7, 0x88, 0x01, 0x52, 0xc2, 0xd8, 0xe3, 0x62, 0x0d, 0x0c, 0xc9, + 0xc8, 0x15, 0xe8, 0xe7, 0xbf, 0x44, 0x0c, 0xa6, 0x64, 0x91, 0x76, 0xdb, 0x34, 0xb4, 0x80, 0x28, + 0xac, 0x05, 0x2f, 0x0e, 0x73, 0xa9, 0x45, 0xbc, 0xf5, 0x56, 0x50, 0x0b, 0x23, 0x53, 0x3f, 0x9b, + 0x85, 0xa1, 0xa0, 0xc1, 0x25, 0xe3, 0xa0, 0x74, 0xae, 0x20, 0x42, 0xb6, 0xe7, 0xb6, 0x0a, 0xd9, + 0x1e, 0x9b, 0x54, 0x45, 0x8c, 0xf6, 0xfd, 0x7b, 0xf7, 0xf4, 0xf9, 0x2c, 0x1c, 0x0b, 0x6a, 0x3d, + 0xc0, 0x3b, 0xaa, 0x77, 0x91, 0x48, 0x3e, 0x97, 0x01, 0x65, 0xdc, 0x6c, 0x34, 0x4c, 0x6b, 0xa5, + 0x62, 0x2d, 0xdb, 0x4e, 0x13, 0x67, 0xbd, 0x83, 0x3b, 0xa7, 0x55, 0xbf, 0x27, 0x03, 0x63, 0xa2, + 0x41, 0x13, 0xba, 0x63, 0x1c, 0xdc, 0x21, 0x58, 0xbc, 0x25, 0x07, 0xa7, 0x2f, 0xea, 0x97, 0xb3, + 0x00, 0x33, 0x76, 0xfd, 0xee, 0x21, 0x7f, 0x36, 0xf5, 0x12, 0x14, 0x78, 0x20, 0x2c, 0xa1, 0xb1, + 0x63, 0xe2, 0x79, 0x10, 0xfb, 0x34, 0x8e, 0x18, 0x1f, 0x15, 0xf3, 0x71, 0x81, 0x07, 0xd2, 0x52, + 0x32, 0x9a, 0x28, 0xc2, 0x2a, 0x65, 0x74, 0x62, 0xc1, 0x08, 0x2a, 0x65, 0xb0, 0x68, 0xa5, 0x9b, + 0x1b, 0xc5, 0x7c, 0xc3, 0xae, 0xdf, 0xd5, 0x90, 0x5e, 0xfd, 0xd3, 0x0c, 0x97, 0xdd, 0x21, 0x7f, + 0xfc, 0xe9, 0x7f, 0x7e, 0x7e, 0x87, 0x9f, 0xff, 0xbd, 0x19, 0x38, 0xa1, 0xd1, 0xba, 0x7d, 0x8f, + 0x3a, 0xeb, 0x13, 0xb6, 0x41, 0xaf, 0x53, 0x8b, 0x3a, 0x07, 0x35, 0xa2, 0xfe, 0x3e, 0xe6, 0xb8, + 0x08, 0x1b, 0x73, 0xcb, 0xa5, 0xc6, 0xe1, 0xc9, 0x3f, 0xa2, 0xfe, 0xdd, 0x3e, 0x50, 0x52, 0x4d, + 0xdb, 0x43, 0x6b, 0xce, 0x75, 0xdc, 0xaf, 0xe4, 0xf7, 0x6b, 0xbf, 0xd2, 0xbb, 0xb3, 0xfd, 0x4a, + 0x61, 0xa7, 0xfb, 0x95, 0xbe, 0xed, 0xec, 0x57, 0x9a, 0xf1, 0xfd, 0x4a, 0x3f, 0xee, 0x57, 0x9e, + 0xe9, 0xba, 0x5f, 0x99, 0xb4, 0x8c, 0x5d, 0xee, 0x56, 0x0e, 0x6d, 0x6e, 0xdc, 0xdd, 0x6c, 0xb3, + 0x2e, 0xb2, 0x49, 0xb1, 0x6e, 0x3b, 0x06, 0x35, 0xc4, 0xee, 0x0a, 0x8f, 0xf6, 0x1d, 0x01, 0xd3, + 0x02, 0x6c, 0x22, 0xd1, 0xf0, 0xf0, 0x76, 0x12, 0x0d, 0xef, 0xc3, 0xfe, 0xeb, 0x33, 0x59, 0x18, + 0x9b, 0xa0, 0x8e, 0xc7, 0x23, 0x6d, 0xee, 0x87, 0xe7, 0x5a, 0x09, 0x8e, 0x49, 0x0c, 0xd1, 0x22, + 0xcf, 0x86, 0xde, 0x78, 0x75, 0xea, 0x78, 0x71, 0x67, 0xbe, 0x38, 0x3d, 0xab, 0xde, 0x4f, 0xf6, + 0x25, 0xc6, 0x6e, 0x50, 0xbd, 0x0f, 0xe7, 0x82, 0x34, 0xc5, 0x2f, 0x2d, 0xa0, 0x97, 0xf2, 0x77, + 0xe5, 0x77, 0x9e, 0xbf, 0x4b, 0xfd, 0x99, 0x0c, 0x5c, 0xd0, 0xa8, 0x45, 0xd7, 0xf4, 0xa5, 0x06, + 0x95, 0x9a, 0x25, 0x56, 0x06, 0x36, 0x6b, 0x98, 0x6e, 0x53, 0xf7, 0xea, 0xab, 0x7b, 0x92, 0xd1, + 0x14, 0x0c, 0xc9, 0xf3, 0xd7, 0x0e, 0xe6, 0xb6, 0x48, 0x39, 0xf5, 0xbf, 0xe4, 0xa0, 0x6f, 0xdc, + 0xf6, 0x6e, 0xd8, 0x7b, 0x4c, 0x28, 0x17, 0x4e, 0xf9, 0xd9, 0x1d, 0x1c, 0xe8, 0xbc, 0x1f, 0x2b, + 0x97, 0x62, 0xec, 0xa3, 0xa7, 0xe7, 0x92, 0x9d, 0xc8, 0x45, 0xe0, 0x93, 0xed, 0x30, 0x95, 0xdc, + 0x73, 0x30, 0x80, 0x41, 0x5a, 0xa4, 0x23, 0x57, 0xf4, 0xa3, 0xf6, 0x18, 0x30, 0x5e, 0x47, 0x48, + 0x4a, 0x3e, 0x12, 0x09, 0x0d, 0x5a, 0xd8, 0x7b, 0xea, 0x39, 0x39, 0x4a, 0xe8, 0x33, 0xfc, 0xb6, + 0x0e, 0xdb, 0x24, 0xa5, 0xe9, 0xc0, 0xa3, 0x92, 0x58, 0x93, 0x02, 0xc2, 0xfd, 0x4b, 0x0b, 0xa7, + 0x7e, 0x33, 0x0f, 0x43, 0xbe, 0xcb, 0xed, 0x01, 0x75, 0xfb, 0x53, 0x50, 0x98, 0xb6, 0xa5, 0x24, + 0x03, 0xe8, 0xa2, 0xbb, 0x6a, 0xbb, 0x31, 0xdf, 0x63, 0x41, 0xc4, 0x04, 0x36, 0x67, 0x1b, 0xb2, + 0x83, 0x39, 0x0a, 0xcc, 0xb2, 0x8d, 0xc4, 0x03, 0xdd, 0x80, 0x90, 0x5c, 0x80, 0x3c, 0xfa, 0xe6, + 0x4b, 0x07, 0xed, 0x31, 0x7f, 0x7c, 0xc4, 0x4b, 0x0a, 0x55, 0xd8, 0xa9, 0x42, 0xf5, 0xed, 0x56, + 0xa1, 0xfa, 0xf7, 0x57, 0xa1, 0xde, 0x80, 0x21, 0xac, 0xc9, 0xcf, 0x51, 0xb6, 0xf5, 0x9a, 0xf8, + 0x90, 0x58, 0xb6, 0x86, 0x79, 0xbb, 0x45, 0xa6, 0x32, 0x5c, 0xad, 0x22, 0xac, 0x62, 0x6a, 0x07, + 0x7b, 0x50, 0xbb, 0xdf, 0xc9, 0x40, 0xdf, 0x2d, 0xeb, 0xae, 0x65, 0xaf, 0xed, 0x4d, 0xe3, 0x9e, + 0x81, 0x41, 0xc1, 0x46, 0x5a, 0x18, 0xf0, 0xcd, 0x75, 0x9b, 0x83, 0x6b, 0xc8, 0x49, 0x93, 0xa9, + 0xc8, 0xcb, 0x41, 0x21, 0x7c, 0x7e, 0x93, 0x0b, 0xd3, 0x74, 0xf8, 0x85, 0xea, 0xd1, 0xcc, 0x02, + 0x32, 0x39, 0x39, 0x0b, 0xf9, 0x32, 0x6b, 0xaa, 0x14, 0xa7, 0x96, 0x35, 0x45, 0x43, 0xa8, 0xfa, + 0x99, 0x3c, 0x8c, 0xc4, 0xce, 0xac, 0x9e, 0x80, 0x01, 0x71, 0x66, 0x64, 0xfa, 0xa9, 0x0e, 0xf0, + 0x79, 0x4e, 0x00, 0xd4, 0xfa, 0xf9, 0x9f, 0x15, 0x83, 0x7c, 0x10, 0xfa, 0x6c, 0x17, 0xd7, 0x33, + 0xfc, 0x96, 0x91, 0x70, 0x08, 0xcd, 0x57, 0x59, 0xdb, 0xf9, 0xe0, 0x10, 0x24, 0xb2, 0x46, 0xda, + 0x2e, 0x7e, 0xda, 0x35, 0x18, 0xd0, 0x5d, 0x97, 0x7a, 0x35, 0x4f, 0x5f, 0x91, 0xb3, 0x1f, 0x04, + 0x40, 0x79, 0x74, 0x20, 0x70, 0x51, 0x5f, 0x21, 0xaf, 0xc1, 0x70, 0xdd, 0xa1, 0xb8, 0xe2, 0xe9, + 0x0d, 0xd6, 0x4a, 0xc9, 0x22, 0x8d, 0x20, 0xe4, 0xfb, 0x8d, 0x10, 0x51, 0x31, 0xc8, 0x6d, 0x18, + 0x16, 0x9f, 0xc3, 0x7d, 0xe3, 0x71, 0xa0, 0x8d, 0x84, 0x2b, 0x10, 0x17, 0x09, 0xf7, 0x8e, 0x17, + 0x4f, 0x24, 0x64, 0x72, 0x99, 0xaf, 0x21, 0x91, 0x92, 0x79, 0x20, 0x6b, 0x74, 0xa9, 0xa6, 0xb7, + 0xbd, 0x55, 0x56, 0x17, 0x0f, 0xde, 0x2d, 0x92, 0xfe, 0xe1, 0xbb, 0x82, 0x24, 0x56, 0x7e, 0x6e, + 0xb1, 0x46, 0x97, 0x4a, 0x11, 0x24, 0xb9, 0x03, 0x27, 0x93, 0x45, 0xd8, 0x27, 0xf3, 0xc3, 0xfb, + 0xc7, 0x36, 0x37, 0x8a, 0xc5, 0x54, 0x02, 0x89, 0xed, 0xf1, 0x04, 0xdb, 0x8a, 0x71, 0x23, 0xdf, + 0xdf, 0x37, 0xda, 0xaf, 0x8d, 0xb0, 0xb2, 0xbe, 0xf5, 0x67, 0x1a, 0xea, 0xd7, 0x32, 0xcc, 0xca, + 0x63, 0x1f, 0x84, 0x59, 0x8f, 0x99, 0xae, 0x37, 0x77, 0xa8, 0xeb, 0xcd, 0x30, 0x3f, 0x61, 0xc1, + 0xed, 0x32, 0xbb, 0x6a, 0x02, 0x4b, 0x2e, 0x43, 0xc1, 0x90, 0x0f, 0xbc, 0x4e, 0x45, 0x3b, 0xc1, + 0xaf, 0x47, 0x13, 0x54, 0xe4, 0x22, 0xe4, 0xd9, 0x6a, 0x13, 0xdf, 0xed, 0xca, 0x86, 0x81, 0x86, + 0x14, 0xea, 0xb7, 0x67, 0x61, 0x48, 0xfa, 0x9a, 0xab, 0x7b, 0xfa, 0x9c, 0x17, 0xb7, 0xd7, 0x4c, + 0xdf, 0x29, 0x05, 0xb7, 0x41, 0x7e, 0x93, 0xaf, 0x05, 0xa2, 0xd8, 0xd6, 0x85, 0x91, 0x10, 0xcc, + 0x73, 0xe2, 0x43, 0x0b, 0xdb, 0xdf, 0xf9, 0x31, 0xfa, 0x1b, 0xf9, 0xfe, 0xec, 0x68, 0xee, 0x46, + 0xbe, 0x3f, 0x3f, 0xda, 0x8b, 0x91, 0xae, 0x30, 0xb8, 0x34, 0xdf, 0x56, 0x5b, 0xcb, 0xe6, 0xca, + 0x21, 0x7f, 0x9d, 0xb1, 0xbf, 0x51, 0xc0, 0x62, 0xb2, 0x39, 0xe4, 0x4f, 0x35, 0xde, 0x51, 0xd9, + 0x1c, 0xe5, 0x33, 0x14, 0xb2, 0xf9, 0xdd, 0x0c, 0x28, 0xa9, 0xb2, 0x29, 0x1d, 0x90, 0x9f, 0xc2, + 0xfe, 0x65, 0x35, 0xfc, 0x46, 0x16, 0xc6, 0x2a, 0x96, 0x47, 0x57, 0xf8, 0x66, 0xef, 0x90, 0x4f, + 0x15, 0x37, 0x61, 0x50, 0xfa, 0x18, 0xd1, 0xe7, 0x0f, 0x07, 0x5b, 0xe9, 0x10, 0xd5, 0x81, 0x93, + 0x5c, 0x7a, 0x1f, 0x13, 0xa1, 0xc7, 0x84, 0x7c, 0xc8, 0xe7, 0x9c, 0xc3, 0x21, 0xe4, 0x43, 0x3e, + 0x79, 0xbd, 0x4b, 0x85, 0xfc, 0x5f, 0x33, 0x70, 0x3c, 0xa5, 0x72, 0x72, 0x01, 0xfa, 0xaa, 0xed, + 0x25, 0x0c, 0x6c, 0x95, 0x09, 0x3d, 0x7a, 0xdd, 0xf6, 0x12, 0xc6, 0xb4, 0xd2, 0x7c, 0x24, 0x59, + 0xc4, 0xe7, 0xeb, 0xf3, 0x95, 0xf2, 0x84, 0x90, 0xaa, 0x2a, 0x3d, 0xc4, 0x67, 0xe0, 0xb4, 0x2f, + 0x0b, 0x9e, 0xb8, 0xdb, 0xa6, 0x51, 0x8f, 0x3d, 0x71, 0x67, 0x65, 0xc8, 0x47, 0x61, 0xa0, 0xf4, + 0x56, 0xdb, 0xa1, 0xc8, 0x97, 0x4b, 0xfc, 0x3d, 0x01, 0x5f, 0x1f, 0x91, 0xc6, 0x99, 0xbf, 0xd6, + 0x67, 0x14, 0x71, 0xde, 0x21, 0x43, 0xf5, 0xb3, 0x19, 0x38, 0xd3, 0xb9, 0x75, 0xe4, 0xfd, 0xd0, + 0xc7, 0x76, 0xe6, 0x25, 0x6d, 0x4e, 0x7c, 0x3a, 0xcf, 0x00, 0x6a, 0x37, 0x68, 0x4d, 0x77, 0x64, + 0x63, 0xdf, 0x27, 0x23, 0xaf, 0xc0, 0x60, 0xc5, 0x75, 0xdb, 0xd4, 0xa9, 0x3e, 0x73, 0x4b, 0xab, + 0x88, 0x3d, 0x21, 0xee, 0x39, 0x4c, 0x04, 0xd7, 0xdc, 0x67, 0x62, 0xa1, 0xab, 0x64, 0x7a, 0xf5, + 0x53, 0x19, 0x38, 0xdb, 0xed, 0xab, 0xc8, 0x33, 0xd0, 0xbf, 0x48, 0x2d, 0xdd, 0xf2, 0x2a, 0x65, + 0xd1, 0x24, 0xdc, 0x62, 0x79, 0x08, 0x8b, 0xee, 0x14, 0x02, 0x42, 0x56, 0x88, 0x1f, 0x09, 0x06, + 0x3e, 0x08, 0xfc, 0xf8, 0x12, 0x61, 0xb1, 0x42, 0x3e, 0xa1, 0xfa, 0xab, 0x3a, 0xf4, 0xce, 0x5b, + 0x74, 0x7e, 0x99, 0x3c, 0x0d, 0x03, 0x4c, 0xf7, 0x31, 0xfd, 0xbe, 0x18, 0x68, 0x63, 0xf2, 0x80, + 0x41, 0xc4, 0x74, 0x8f, 0x16, 0x52, 0x91, 0x6b, 0x72, 0xce, 0x6f, 0xa1, 0x0e, 0x44, 0x2e, 0xc3, + 0x31, 0xd3, 0x3d, 0x9a, 0x9c, 0x1b, 0xfc, 0x9a, 0x9c, 0x6b, 0x59, 0x74, 0x76, 0xa4, 0x14, 0xc7, + 0xf8, 0xa5, 0xc4, 0x34, 0x30, 0x93, 0x96, 0x90, 0x38, 0x6e, 0x13, 0x24, 0x29, 0xa6, 0x7b, 0xb4, + 0xf4, 0x44, 0xc6, 0x43, 0xb2, 0x1b, 0x53, 0xfc, 0x16, 0x52, 0xc6, 0x4d, 0xf7, 0x68, 0x11, 0x5a, + 0xf2, 0x3c, 0x0c, 0x8a, 0xdf, 0x37, 0x6c, 0xd3, 0x8a, 0xc7, 0xb0, 0x90, 0x50, 0xd3, 0x3d, 0x9a, + 0x4c, 0x29, 0x55, 0xba, 0xe0, 0x98, 0x96, 0x27, 0x5e, 0xc6, 0xc5, 0x2b, 0x45, 0x9c, 0x54, 0x29, + 0xfe, 0x26, 0xaf, 0xc0, 0x70, 0x10, 0x1c, 0xe4, 0x4d, 0x5a, 0xf7, 0xc4, 0x91, 0xce, 0xc9, 0x58, + 0x61, 0x8e, 0x9c, 0xee, 0xd1, 0xa2, 0xd4, 0xe4, 0x22, 0x14, 0x34, 0xea, 0x9a, 0x6f, 0xf9, 0xf7, + 0x17, 0x23, 0xd2, 0x74, 0x66, 0xbe, 0xc5, 0xa4, 0x24, 0xf0, 0xac, 0x77, 0xc2, 0x0b, 0x13, 0x71, + 0x00, 0x43, 0x62, 0xb5, 0x4c, 0x5a, 0x06, 0xeb, 0x1d, 0xe9, 0xb6, 0xec, 0xb5, 0x30, 0x64, 0x8a, + 0x48, 0xb4, 0x36, 0x18, 0x7f, 0x9b, 0x2a, 0x63, 0xa7, 0x7b, 0xb4, 0x18, 0xbd, 0x24, 0xd5, 0xb2, + 0xe9, 0xde, 0x15, 0x51, 0xea, 0xe2, 0x52, 0x65, 0x28, 0x49, 0xaa, 0xec, 0xa7, 0x54, 0xf5, 0x1c, + 0xf5, 0xd6, 0x6c, 0xe7, 0xae, 0x88, 0x49, 0x17, 0xaf, 0x5a, 0x60, 0xa5, 0xaa, 0x05, 0x44, 0xae, + 0x9a, 0x2d, 0x32, 0x23, 0xe9, 0x55, 0xeb, 0x9e, 0x2e, 0x57, 0xcd, 0xf7, 0x97, 0x7e, 0x27, 0xcd, + 0x50, 0xfd, 0x1e, 0xcf, 0x77, 0x9b, 0xec, 0x50, 0xc4, 0x49, 0x1d, 0x8a, 0xbf, 0x59, 0xa5, 0x52, + 0x4e, 0x53, 0x91, 0xd0, 0x36, 0xa8, 0x54, 0x42, 0xb1, 0x4a, 0xe5, 0xec, 0xa7, 0xd7, 0xe4, 0x54, + 0x9f, 0xca, 0x58, 0xb4, 0x83, 0x42, 0x0c, 0xeb, 0x20, 0x29, 0x25, 0x68, 0x11, 0xd3, 0x08, 0x2a, + 0x04, 0xc9, 0x07, 0x83, 0x16, 0x4e, 0x2c, 0x4c, 0xf7, 0x68, 0x98, 0x60, 0x50, 0xe5, 0x09, 0x2a, + 0x95, 0xe3, 0x48, 0x31, 0xe4, 0x53, 0x30, 0xd8, 0x74, 0x8f, 0xc6, 0x93, 0x57, 0x3e, 0x2d, 0xa5, + 0x82, 0x52, 0x4e, 0x44, 0xa7, 0x88, 0x00, 0xc1, 0xa6, 0x88, 0x30, 0x61, 0xd4, 0x54, 0x32, 0x5d, + 0x92, 0x72, 0x32, 0xba, 0xa2, 0xc6, 0xf1, 0xd3, 0x3d, 0x5a, 0x32, 0xc5, 0xd2, 0xf3, 0x91, 0x0c, + 0x42, 0xca, 0xa9, 0x58, 0xe0, 0x98, 0x10, 0xc5, 0xc4, 0x25, 0xe7, 0x1a, 0x9a, 0x4f, 0xcd, 0xf9, + 0xad, 0x9c, 0x8e, 0x2e, 0xc7, 0x29, 0x24, 0xd3, 0x3d, 0x5a, 0x6a, 0xb6, 0xf0, 0x89, 0x44, 0x1e, + 0x1f, 0x45, 0x89, 0x5e, 0xd6, 0xc6, 0xd0, 0xd3, 0x3d, 0x5a, 0x22, 0xf3, 0xcf, 0x35, 0x39, 0x81, + 0x8e, 0xf2, 0x50, 0xb4, 0x13, 0x43, 0x0c, 0xeb, 0x44, 0x29, 0xd1, 0xce, 0x35, 0x39, 0xa9, 0x8a, + 0x72, 0x26, 0x59, 0x2a, 0x9c, 0x39, 0xa5, 0xe4, 0x2b, 0x5a, 0x7a, 0x9e, 0x08, 0xe5, 0x61, 0x91, + 0xa9, 0x4f, 0x94, 0x4f, 0xa3, 0x99, 0xee, 0xd1, 0xd2, 0x73, 0x4c, 0x68, 0xe9, 0x09, 0x16, 0x94, + 0xb3, 0xdd, 0x78, 0x06, 0xad, 0x4b, 0x4f, 0xce, 0xa0, 0x77, 0x09, 0x77, 0xaf, 0x9c, 0x8b, 0x46, + 0xad, 0xec, 0x48, 0x38, 0xdd, 0xa3, 0x75, 0x09, 0x9a, 0x7f, 0xab, 0x43, 0xec, 0x79, 0xe5, 0x7c, + 0x34, 0x51, 0x67, 0x2a, 0xd1, 0x74, 0x8f, 0xd6, 0x21, 0x72, 0xfd, 0xad, 0x0e, 0xa1, 0xc9, 0x95, + 0x62, 0x57, 0xb6, 0x81, 0x3c, 0x3a, 0x04, 0x36, 0x9f, 0x4f, 0x8d, 0xea, 0xad, 0x3c, 0x12, 0x55, + 0xdd, 0x14, 0x12, 0xa6, 0xba, 0x69, 0xf1, 0xc0, 0xe7, 0x53, 0xc3, 0x50, 0x2b, 0x8f, 0x76, 0x61, + 0x18, 0xb4, 0x31, 0x35, 0x80, 0xf5, 0x7c, 0x6a, 0x1c, 0x68, 0x45, 0x8d, 0x32, 0x4c, 0x21, 0x61, + 0x0c, 0xd3, 0x22, 0x48, 0xcf, 0xa7, 0x86, 0x0b, 0x56, 0x1e, 0xeb, 0xc2, 0x30, 0x6c, 0x61, 0x5a, + 0xa0, 0xe1, 0xe7, 0x23, 0xf1, 0x7a, 0x95, 0xf7, 0x44, 0xe7, 0x0d, 0x09, 0xc5, 0xe6, 0x0d, 0x39, + 0xb2, 0xef, 0x44, 0x22, 0x22, 0xa1, 0xf2, 0x78, 0x74, 0x98, 0xc7, 0xd0, 0x6c, 0x98, 0xc7, 0x63, + 0x18, 0x4e, 0x24, 0x22, 0xb3, 0x29, 0x17, 0x3a, 0x31, 0x41, 0x74, 0x94, 0x09, 0x8f, 0xe5, 0x56, + 0x49, 0x09, 0x0d, 0xa6, 0xbc, 0x37, 0xea, 0x68, 0x98, 0x20, 0x98, 0xee, 0xd1, 0x52, 0x02, 0x8a, + 0x69, 0xe9, 0x71, 0x30, 0x94, 0x8b, 0xd1, 0x61, 0x9b, 0x46, 0xc3, 0x86, 0x6d, 0x6a, 0x0c, 0x8d, + 0x99, 0x34, 0x6f, 0x68, 0xe5, 0x52, 0xd4, 0x30, 0x4b, 0x52, 0x30, 0xc3, 0x2c, 0xc5, 0x8b, 0x5a, + 0x4b, 0x8f, 0xec, 0xa0, 0x3c, 0xd1, 0xb5, 0x85, 0x48, 0x93, 0xd2, 0x42, 0x1e, 0xe8, 0x20, 0xb4, + 0x9d, 0x6e, 0xb5, 0x1a, 0xb6, 0x6e, 0x28, 0xef, 0x4b, 0xb5, 0x9d, 0x38, 0x52, 0xb2, 0x9d, 0x38, + 0x80, 0xad, 0xf2, 0xb2, 0xd3, 0xad, 0xf2, 0x64, 0x74, 0x95, 0x97, 0x71, 0x6c, 0x95, 0x8f, 0x38, + 0xe8, 0x4e, 0x24, 0x1c, 0x54, 0x95, 0xa7, 0xa2, 0x0a, 0x10, 0x43, 0x33, 0x05, 0x88, 0xbb, 0xb4, + 0x7e, 0xbc, 0xb3, 0x4b, 0xa7, 0x72, 0x19, 0xb9, 0x3d, 0xe2, 0x73, 0xeb, 0x44, 0x37, 0xdd, 0xa3, + 0x75, 0x76, 0x0b, 0xad, 0xa4, 0x78, 0x68, 0x2a, 0x57, 0xa2, 0x0a, 0x96, 0x20, 0x60, 0x0a, 0x96, + 0xf4, 0xeb, 0xac, 0xa4, 0xb8, 0x58, 0x2a, 0xef, 0xef, 0xc8, 0x2a, 0xf8, 0xe6, 0x14, 0xc7, 0xcc, + 0x6b, 0xb2, 0x8f, 0xa4, 0xf2, 0x74, 0x74, 0xb1, 0x0b, 0x31, 0x6c, 0xb1, 0x93, 0x7c, 0x29, 0xaf, + 0xc9, 0xde, 0x81, 0xca, 0xd5, 0x64, 0xa9, 0x70, 0x89, 0x94, 0xbc, 0x08, 0xb5, 0x74, 0xa7, 0x3a, + 0xe5, 0x99, 0xa8, 0xd6, 0xa5, 0xd1, 0x30, 0xad, 0x4b, 0x75, 0xc8, 0x9b, 0x4a, 0xfa, 0xc6, 0x29, + 0xd7, 0xe2, 0x67, 0x09, 0x51, 0x3c, 0xb3, 0x7c, 0x12, 0xfe, 0x74, 0xaf, 0xc5, 0x83, 0x34, 0x29, + 0xcf, 0xc6, 0x2e, 0x33, 0x22, 0x58, 0x66, 0xdf, 0xc6, 0x82, 0x3a, 0xbd, 0x16, 0x8f, 0x6b, 0xa4, + 0x3c, 0x97, 0xce, 0x21, 0xd0, 0x95, 0x78, 0x1c, 0xa4, 0xd7, 0xe2, 0xa1, 0x80, 0x94, 0xe7, 0xd3, + 0x39, 0x04, 0xd2, 0x8d, 0x87, 0x0e, 0x7a, 0x5a, 0x0a, 0x4e, 0xac, 0x7c, 0x20, 0x6a, 0x3a, 0x06, + 0x08, 0x66, 0x3a, 0x86, 0x21, 0x8c, 0x9f, 0x96, 0x82, 0xfa, 0x2a, 0x2f, 0x24, 0x8a, 0x04, 0x8d, + 0x95, 0x42, 0xff, 0x3e, 0x2d, 0x05, 0xc3, 0x55, 0x5e, 0x4c, 0x14, 0x09, 0x5a, 0x27, 0x85, 0xcc, + 0x35, 0xba, 0xbd, 0x9a, 0x52, 0x5e, 0x8a, 0x1e, 0x71, 0x74, 0xa6, 0x9c, 0xee, 0xd1, 0xba, 0xbd, + 0xbe, 0xfa, 0x78, 0x67, 0x4f, 0x43, 0xe5, 0xe5, 0xe8, 0x10, 0xee, 0x44, 0xc7, 0x86, 0x70, 0x47, + 0x6f, 0xc5, 0x57, 0x62, 0x2f, 0xa8, 0x95, 0x57, 0xa2, 0x53, 0x5c, 0x04, 0xc9, 0xa6, 0xb8, 0xf8, + 0x7b, 0xeb, 0xc8, 0xd3, 0x60, 0xe5, 0x83, 0xd1, 0x29, 0x4e, 0xc6, 0xb1, 0x29, 0x2e, 0xf2, 0x8c, + 0x78, 0x22, 0xf1, 0x62, 0x55, 0x79, 0x35, 0x3a, 0xc5, 0xc5, 0xd0, 0x6c, 0x8a, 0x8b, 0xbf, 0x71, + 0x7d, 0x25, 0xf6, 0x70, 0x53, 0x79, 0x2d, 0xbd, 0xfd, 0x88, 0x94, 0xdb, 0xcf, 0x9f, 0x79, 0x6a, + 0xe9, 0x2f, 0x10, 0x95, 0x52, 0x74, 0xfc, 0xa6, 0xd1, 0xb0, 0xf1, 0x9b, 0xfa, 0x7a, 0x31, 0xbe, + 0x71, 0x10, 0x5a, 0x35, 0xde, 0x65, 0xe3, 0x10, 0x9a, 0x22, 0x29, 0xe0, 0xc8, 0x1e, 0x99, 0x6f, + 0x84, 0x26, 0x3a, 0xec, 0x91, 0xfd, 0x6d, 0x50, 0x8c, 0x9e, 0xcd, 0xae, 0x09, 0xc7, 0x37, 0xa5, + 0x1c, 0x9d, 0x5d, 0x13, 0x04, 0x6c, 0x76, 0x4d, 0xba, 0xcb, 0x4d, 0xc1, 0xa8, 0xd0, 0x22, 0xee, + 0xcf, 0x67, 0x5a, 0x2b, 0xca, 0x64, 0xec, 0x01, 0x50, 0x0c, 0xcf, 0x66, 0xa7, 0x38, 0x0c, 0xd7, + 0x6b, 0x0e, 0x9b, 0x68, 0x98, 0xad, 0x25, 0x5b, 0x77, 0x8c, 0x2a, 0xb5, 0x0c, 0x65, 0x2a, 0xb6, + 0x5e, 0xa7, 0xd0, 0xe0, 0x7a, 0x9d, 0x02, 0xc7, 0xc0, 0x44, 0x31, 0xb8, 0x46, 0xeb, 0xd4, 0xbc, + 0x47, 0x95, 0xeb, 0xc8, 0xb6, 0xd8, 0x89, 0xad, 0x20, 0x9b, 0xee, 0xd1, 0x3a, 0x71, 0x60, 0xb6, + 0xfa, 0xec, 0x7a, 0xf5, 0xf5, 0x99, 0xe0, 0xd1, 0xeb, 0x82, 0x43, 0x5b, 0xba, 0x43, 0x95, 0xe9, + 0xa8, 0xad, 0x9e, 0x4a, 0xc4, 0x6c, 0xf5, 0x54, 0x44, 0x92, 0xad, 0x3f, 0x16, 0x2a, 0xdd, 0xd8, + 0x86, 0x23, 0x22, 0xbd, 0x34, 0x9b, 0x9d, 0xa2, 0x08, 0x26, 0xa0, 0x19, 0xdb, 0x5a, 0xc1, 0x93, + 0x8a, 0x1b, 0xd1, 0xd9, 0xa9, 0x33, 0x25, 0x9b, 0x9d, 0x3a, 0x63, 0x99, 0xaa, 0x47, 0xb1, 0x7c, + 0x0c, 0xde, 0x8c, 0xaa, 0x7a, 0x0a, 0x09, 0x53, 0xf5, 0x14, 0x70, 0x92, 0xa1, 0x46, 0x5d, 0xea, + 0x29, 0x33, 0xdd, 0x18, 0x22, 0x49, 0x92, 0x21, 0x82, 0x93, 0x0c, 0xa7, 0xa8, 0x57, 0x5f, 0x55, + 0x66, 0xbb, 0x31, 0x44, 0x92, 0x24, 0x43, 0x04, 0xb3, 0xcd, 0x66, 0x14, 0x3c, 0xde, 0x6e, 0xdc, + 0xf5, 0xfb, 0x6c, 0x2e, 0xba, 0xd9, 0xec, 0x48, 0xc8, 0x36, 0x9b, 0x1d, 0x91, 0xe4, 0x53, 0xdb, + 0x76, 0xcc, 0x54, 0xe6, 0xb1, 0xc2, 0xcb, 0xa1, 0x5d, 0xb0, 0x9d, 0x52, 0xd3, 0x3d, 0xda, 0x76, + 0x1d, 0x3f, 0xdf, 0x17, 0xb8, 0x42, 0x29, 0x0b, 0x58, 0xd5, 0xb1, 0xe0, 0xac, 0x82, 0x83, 0xa7, + 0x7b, 0xb4, 0xc0, 0x59, 0xea, 0x79, 0x18, 0xc4, 0x8f, 0xaa, 0x58, 0xa6, 0x57, 0x1e, 0x57, 0x5e, + 0x8f, 0x6e, 0x99, 0x24, 0x14, 0xdb, 0x32, 0x49, 0x3f, 0xd9, 0x24, 0x8e, 0x3f, 0xf9, 0x14, 0x53, + 0x1e, 0x57, 0xb4, 0xe8, 0x24, 0x1e, 0x41, 0xb2, 0x49, 0x3c, 0x02, 0x08, 0xea, 0x2d, 0x3b, 0x76, + 0xab, 0x3c, 0xae, 0x54, 0x53, 0xea, 0xe5, 0xa8, 0xa0, 0x5e, 0xfe, 0x33, 0xa8, 0xb7, 0xba, 0xda, + 0xf6, 0xca, 0xec, 0x1b, 0x17, 0x53, 0xea, 0xf5, 0x91, 0x41, 0xbd, 0x3e, 0x80, 0x4d, 0x85, 0x08, + 0x58, 0x70, 0x6c, 0x36, 0x69, 0xdf, 0x34, 0x1b, 0x0d, 0xe5, 0x56, 0x74, 0x2a, 0x8c, 0xe3, 0xd9, + 0x54, 0x18, 0x87, 0x31, 0xd3, 0x93, 0xb7, 0x8a, 0x2e, 0xb5, 0x57, 0x94, 0xdb, 0x51, 0xd3, 0x33, + 0xc4, 0x30, 0xd3, 0x33, 0xfc, 0x85, 0xbb, 0x0b, 0xf6, 0x4b, 0xa3, 0xcb, 0x0e, 0x75, 0x57, 0x95, + 0x3b, 0xb1, 0xdd, 0x85, 0x84, 0xc3, 0xdd, 0x85, 0xf4, 0x9b, 0xac, 0xc0, 0xc3, 0x91, 0x85, 0xc6, + 0xbf, 0x7b, 0xaa, 0x52, 0xdd, 0xa9, 0xaf, 0x2a, 0x1f, 0x42, 0x56, 0x8f, 0xa5, 0x2e, 0x55, 0x51, + 0xd2, 0xe9, 0x1e, 0xad, 0x1b, 0x27, 0xdc, 0x96, 0xbf, 0x3e, 0xc3, 0x23, 0x08, 0x6a, 0x0b, 0x13, + 0xfe, 0x26, 0xf4, 0x8d, 0xd8, 0xb6, 0x3c, 0x49, 0x82, 0xdb, 0xf2, 0x24, 0x98, 0xb4, 0xe0, 0x7c, + 0x6c, 0xab, 0x36, 0xab, 0x37, 0xd8, 0xbe, 0x84, 0x1a, 0x0b, 0x7a, 0xfd, 0x2e, 0xf5, 0x94, 0x0f, + 0x23, 0xef, 0x0b, 0x1d, 0x36, 0x7c, 0x31, 0xea, 0xe9, 0x1e, 0x6d, 0x0b, 0x7e, 0x44, 0x85, 0x7c, + 0x75, 0x6a, 0x71, 0x41, 0xf9, 0x48, 0xf4, 0x7c, 0x93, 0xc1, 0xa6, 0x7b, 0x34, 0xc4, 0x31, 0x2b, + 0xed, 0x56, 0x6b, 0xc5, 0xd1, 0x0d, 0xca, 0x0d, 0x2d, 0xb4, 0xdd, 0x84, 0x01, 0xfa, 0xd1, 0xa8, + 0x95, 0xd6, 0x89, 0x8e, 0x59, 0x69, 0x9d, 0x70, 0x4c, 0x51, 0x23, 0xc1, 0xf2, 0x95, 0x8f, 0x45, + 0x15, 0x35, 0x82, 0x64, 0x8a, 0x1a, 0x0d, 0xad, 0xff, 0x21, 0x38, 0x15, 0xec, 0xe7, 0xc5, 0xfa, + 0xcb, 0x3b, 0x4d, 0xf9, 0x38, 0xf2, 0x39, 0x9f, 0xb8, 0x0c, 0x88, 0x50, 0x4d, 0xf7, 0x68, 0x1d, + 0xca, 0xb3, 0x15, 0x37, 0x91, 0x07, 0x46, 0x98, 0x17, 0xdf, 0x16, 0x5d, 0x71, 0x3b, 0x90, 0xb1, + 0x15, 0xb7, 0x03, 0x2a, 0x95, 0xb9, 0x10, 0xaa, 0xbe, 0x05, 0xf3, 0x40, 0xa6, 0x9d, 0x38, 0xa4, + 0x32, 0x17, 0x96, 0xda, 0xd2, 0x16, 0xcc, 0x03, 0x6b, 0xad, 0x13, 0x07, 0x72, 0x11, 0x0a, 0xd5, + 0xea, 0xac, 0xd6, 0xb6, 0x94, 0x7a, 0xcc, 0x07, 0x0c, 0xa1, 0xd3, 0x3d, 0x9a, 0xc0, 0x33, 0x33, + 0x68, 0xb2, 0xa1, 0xbb, 0x9e, 0x59, 0x77, 0x71, 0xc4, 0xf8, 0x23, 0xc4, 0x88, 0x9a, 0x41, 0x69, + 0x34, 0xcc, 0x0c, 0x4a, 0x83, 0x33, 0x7b, 0x71, 0x42, 0x77, 0x5d, 0xdd, 0x32, 0x1c, 0x7d, 0x1c, + 0x97, 0x09, 0x1a, 0x7b, 0x1e, 0x10, 0xc1, 0x32, 0x7b, 0x31, 0x0a, 0xc1, 0xc3, 0x77, 0x1f, 0xe2, + 0x9b, 0x39, 0xcb, 0xb1, 0xc3, 0xf7, 0x18, 0x1e, 0x0f, 0xdf, 0x63, 0x30, 0xb4, 0x3b, 0x7d, 0x98, + 0x46, 0x57, 0x4c, 0x26, 0x22, 0x65, 0x25, 0x66, 0x77, 0xc6, 0x09, 0xd0, 0xee, 0x8c, 0x03, 0x23, + 0x4d, 0xf2, 0x97, 0xdb, 0xd5, 0x0e, 0x4d, 0x0a, 0x57, 0xd9, 0x44, 0x19, 0xb6, 0x7e, 0x87, 0x83, + 0xa3, 0xbc, 0x6e, 0xe9, 0x4d, 0xbb, 0x3c, 0xee, 0x4b, 0xdd, 0x8c, 0xae, 0xdf, 0x1d, 0x09, 0xd9, + 0xfa, 0xdd, 0x11, 0xc9, 0x66, 0x57, 0x7f, 0xa3, 0xb5, 0xaa, 0x3b, 0xd4, 0x28, 0x9b, 0x0e, 0x9e, + 0x2c, 0xae, 0xf3, 0xad, 0xe1, 0x9b, 0xd1, 0xd9, 0xb5, 0x0b, 0x29, 0x9b, 0x5d, 0xbb, 0xa0, 0x99, + 0x91, 0x97, 0x8e, 0xd6, 0xa8, 0x6e, 0x28, 0x77, 0xa3, 0x46, 0x5e, 0x67, 0x4a, 0x66, 0xe4, 0x75, + 0xc6, 0x76, 0xfe, 0x9c, 0x3b, 0x8e, 0xe9, 0x51, 0xa5, 0xb1, 0x9d, 0xcf, 0x41, 0xd2, 0xce, 0x9f, + 0x83, 0x68, 0xb6, 0x21, 0x8c, 0x77, 0x48, 0x33, 0xba, 0x21, 0x4c, 0x76, 0x43, 0xbc, 0x04, 0xb3, + 0x58, 0xc4, 0x2b, 0x11, 0xc5, 0x8a, 0x5a, 0x2c, 0x02, 0xcc, 0x2c, 0x96, 0xf0, 0x1d, 0x49, 0xe4, + 0x81, 0x81, 0x62, 0x47, 0xd7, 0x50, 0x19, 0xc7, 0xd6, 0xd0, 0xc8, 0x63, 0x84, 0xe7, 0x23, 0xde, + 0xb3, 0x4a, 0x2b, 0x6a, 0x75, 0x48, 0x28, 0x66, 0x75, 0xc8, 0x7e, 0xb6, 0x13, 0x70, 0x0c, 0x6f, + 0xc1, 0xb5, 0x76, 0x70, 0x8f, 0xf3, 0x89, 0xe8, 0x67, 0xc6, 0xd0, 0xec, 0x33, 0x63, 0xa0, 0x08, + 0x13, 0x31, 0x6d, 0x39, 0x1d, 0x98, 0x84, 0xe7, 0x83, 0x31, 0x10, 0x99, 0x01, 0x52, 0x2d, 0xcd, + 0xce, 0x54, 0x8c, 0x05, 0xf9, 0x8a, 0xcc, 0x8d, 0x9e, 0xc0, 0x26, 0x29, 0xa6, 0x7b, 0xb4, 0x94, + 0x72, 0xe4, 0x4d, 0x38, 0x2b, 0xa0, 0xe2, 0x09, 0x20, 0xa6, 0x8b, 0x36, 0x82, 0x05, 0xc1, 0x8b, + 0x7a, 0x67, 0x74, 0xa3, 0x9d, 0xee, 0xd1, 0xba, 0xf2, 0xea, 0x5c, 0x97, 0x58, 0x1f, 0xda, 0xdb, + 0xa9, 0x2b, 0x58, 0x24, 0xba, 0xf2, 0xea, 0x5c, 0x97, 0x90, 0xfb, 0xbd, 0xed, 0xd4, 0x15, 0x74, + 0x42, 0x57, 0x5e, 0xc4, 0x85, 0x62, 0x37, 0x7c, 0xa9, 0xd1, 0x50, 0xd6, 0xb0, 0xba, 0xf7, 0x6e, + 0xa7, 0xba, 0x12, 0x1a, 0x9c, 0x5b, 0x71, 0x64, 0xb3, 0xf4, 0x7c, 0x8b, 0x5a, 0xd5, 0xc8, 0x02, + 0x74, 0x3f, 0x3a, 0x4b, 0x27, 0x08, 0xd8, 0x2c, 0x9d, 0x00, 0xb2, 0x01, 0x25, 0x3b, 0x61, 0x2b, + 0xeb, 0xd1, 0x01, 0x25, 0xe3, 0xd8, 0x80, 0x8a, 0x38, 0x6c, 0xcf, 0xc3, 0xf1, 0xf9, 0xbb, 0x9e, + 0xee, 0x5b, 0x90, 0xae, 0xe8, 0xca, 0xb7, 0x62, 0x97, 0x4c, 0x49, 0x12, 0xbc, 0x64, 0x4a, 0x82, + 0xd9, 0x18, 0x61, 0xe0, 0xea, 0xba, 0x55, 0x9f, 0xd2, 0xcd, 0x46, 0xdb, 0xa1, 0xca, 0xff, 0x13, + 0x1d, 0x23, 0x31, 0x34, 0x1b, 0x23, 0x31, 0x10, 0x5b, 0xa0, 0x19, 0xa8, 0xe4, 0xba, 0xe6, 0x8a, + 0x25, 0xf6, 0x95, 0xed, 0x86, 0xa7, 0xfc, 0xbf, 0xd1, 0x05, 0x3a, 0x8d, 0x86, 0x2d, 0xd0, 0x69, + 0x70, 0x3c, 0x75, 0x4a, 0x49, 0xa5, 0xae, 0xfc, 0x7f, 0xb1, 0x53, 0xa7, 0x14, 0x1a, 0x3c, 0x75, + 0x4a, 0x4b, 0xc3, 0x3e, 0x05, 0xa3, 0xdc, 0x26, 0x9b, 0x31, 0x83, 0xbb, 0xea, 0xff, 0x3f, 0xba, + 0x3e, 0xc6, 0xf1, 0x6c, 0x7d, 0x8c, 0xc3, 0xa2, 0x7c, 0x44, 0x17, 0xfc, 0xb9, 0x4e, 0x7c, 0x02, + 0xf9, 0x27, 0xca, 0x90, 0xeb, 0x32, 0x1f, 0x31, 0x52, 0xbe, 0x3d, 0xd3, 0x89, 0x51, 0x30, 0x3c, + 0x12, 0x85, 0xa2, 0x8c, 0x34, 0x7a, 0xcf, 0xa4, 0x6b, 0xca, 0x27, 0x3b, 0x32, 0xe2, 0x04, 0x51, + 0x46, 0x1c, 0x46, 0xde, 0x80, 0x53, 0x21, 0x6c, 0x96, 0x36, 0x97, 0x82, 0x99, 0xe9, 0x3b, 0x32, + 0x51, 0x33, 0x38, 0x9d, 0x8c, 0x99, 0xc1, 0xe9, 0x98, 0x34, 0xd6, 0x42, 0x74, 0x7f, 0x7e, 0x0b, + 0xd6, 0x81, 0x04, 0x3b, 0x30, 0x48, 0x63, 0x2d, 0xa4, 0xf9, 0x9d, 0x5b, 0xb0, 0x0e, 0x64, 0xda, + 0x81, 0x01, 0xf9, 0x74, 0x06, 0x2e, 0xa4, 0xa3, 0x4a, 0x8d, 0xc6, 0x94, 0xed, 0x84, 0x38, 0xe5, + 0xbb, 0x32, 0xd1, 0x83, 0x86, 0xed, 0x15, 0x9b, 0xee, 0xd1, 0xb6, 0x59, 0x01, 0xf9, 0x20, 0x0c, + 0x97, 0xda, 0x86, 0xe9, 0xe1, 0xc5, 0x1b, 0x33, 0x9c, 0xbf, 0x3b, 0x13, 0xdb, 0xe2, 0xc8, 0x58, + 0xdc, 0xe2, 0xc8, 0x00, 0x72, 0x03, 0xc6, 0xaa, 0xb4, 0xde, 0x76, 0x4c, 0x6f, 0x5d, 0xc3, 0x34, + 0xf9, 0x8c, 0xc7, 0xf7, 0x64, 0xa2, 0x93, 0x58, 0x82, 0x82, 0x4d, 0x62, 0x09, 0x20, 0xb9, 0xdd, + 0x21, 0x99, 0xba, 0xf2, 0xa9, 0x4c, 0xd7, 0x6b, 0xf9, 0xa0, 0x2f, 0x3b, 0xe4, 0x62, 0x5f, 0x48, + 0x4d, 0x4e, 0xad, 0x7c, 0x3a, 0xd3, 0xe5, 0x1a, 0x5d, 0x9a, 0xe1, 0x52, 0xf2, 0x5a, 0x2f, 0xa4, + 0x66, 0x0e, 0x56, 0xbe, 0x37, 0xd3, 0xe5, 0xda, 0x3b, 0xe4, 0x98, 0x96, 0x74, 0xf8, 0x59, 0xee, + 0x29, 0x22, 0x18, 0xfd, 0x85, 0x4c, 0xd2, 0x55, 0x24, 0x28, 0x2f, 0x11, 0xb2, 0x62, 0xb7, 0xdc, + 0x40, 0xe9, 0x3f, 0x93, 0x49, 0xfa, 0xe6, 0x85, 0xc5, 0xc2, 0x5f, 0x84, 0xc2, 0x99, 0xc9, 0xfb, + 0x1e, 0x75, 0x2c, 0xbd, 0x81, 0xdd, 0x59, 0xf5, 0x6c, 0x47, 0x5f, 0xa1, 0x93, 0x96, 0xbe, 0xd4, + 0xa0, 0xca, 0x67, 0x33, 0x51, 0x0b, 0xb6, 0x33, 0x29, 0xb3, 0x60, 0x3b, 0x63, 0xc9, 0x2a, 0x3c, + 0x9c, 0x86, 0x2d, 0x9b, 0x2e, 0xd6, 0xf3, 0xb9, 0x4c, 0xd4, 0x84, 0xed, 0x42, 0xcb, 0x4c, 0xd8, + 0x2e, 0x68, 0x72, 0x15, 0x06, 0xc6, 0x6d, 0x7f, 0xfa, 0xfd, 0x8b, 0x31, 0x67, 0xc8, 0x00, 0x33, + 0xdd, 0xa3, 0x85, 0x64, 0xa2, 0x8c, 0x18, 0xd4, 0x9f, 0x4f, 0x96, 0x09, 0x2f, 0x9f, 0x82, 0x1f, + 0xa2, 0x8c, 0x10, 0xf7, 0x5f, 0x4a, 0x96, 0x09, 0xef, 0xb8, 0x82, 0x1f, 0x6c, 0x26, 0xe1, 0x35, + 0xce, 0x4e, 0x95, 0x98, 0xdd, 0x36, 0xb1, 0xaa, 0x37, 0x1a, 0xd4, 0x5a, 0xa1, 0xca, 0x17, 0x62, + 0x33, 0x49, 0x3a, 0x19, 0x9b, 0x49, 0xd2, 0x31, 0xe4, 0xa3, 0x70, 0xfa, 0xb6, 0xde, 0x30, 0x8d, + 0x10, 0xe7, 0xe7, 0x91, 0x55, 0xbe, 0x2f, 0x13, 0xdd, 0x4d, 0x77, 0xa0, 0x63, 0xbb, 0xe9, 0x0e, + 0x28, 0x32, 0x0b, 0x04, 0x97, 0xd1, 0x60, 0xb6, 0x60, 0xeb, 0xb3, 0xf2, 0x97, 0x33, 0x51, 0x3b, + 0x35, 0x49, 0xc2, 0xec, 0xd4, 0x24, 0x94, 0xd4, 0x3a, 0x07, 0xa4, 0x57, 0xbe, 0x3f, 0x13, 0x3d, + 0xad, 0xe9, 0x44, 0x38, 0xdd, 0xa3, 0x75, 0x8e, 0x6a, 0x7f, 0x1d, 0x46, 0xab, 0x0b, 0x95, 0xa9, + 0xa9, 0xc9, 0xea, 0xed, 0x4a, 0x19, 0xdd, 0x77, 0x0d, 0xe5, 0x07, 0x62, 0x2b, 0x56, 0x9c, 0x80, + 0xad, 0x58, 0x71, 0x18, 0x79, 0x09, 0x86, 0x58, 0xfb, 0xd9, 0x80, 0xc1, 0x4f, 0xfe, 0x62, 0x26, + 0x6a, 0x4e, 0xc9, 0x48, 0x66, 0x4e, 0xc9, 0xbf, 0x49, 0x15, 0x4e, 0x30, 0x29, 0x2e, 0x38, 0x74, + 0x99, 0x3a, 0xd4, 0xaa, 0xfb, 0x63, 0xfa, 0x07, 0x33, 0x51, 0x2b, 0x23, 0x8d, 0x88, 0x59, 0x19, + 0x69, 0x70, 0x72, 0x17, 0xce, 0xc6, 0x4f, 0x82, 0xe4, 0xc7, 0x54, 0xca, 0x0f, 0x65, 0x62, 0xc6, + 0x70, 0x17, 0x62, 0x34, 0x86, 0xbb, 0xe0, 0x89, 0x05, 0xe7, 0xc4, 0xb1, 0x8a, 0x70, 0xb8, 0x8c, + 0xd7, 0xf6, 0x57, 0x78, 0x6d, 0x8f, 0x87, 0x0e, 0x81, 0x5d, 0xa8, 0xa7, 0x7b, 0xb4, 0xee, 0xec, + 0x98, 0x9e, 0x25, 0xc3, 0xae, 0x2b, 0x3f, 0x9c, 0x49, 0xf7, 0x48, 0x89, 0xb8, 0x29, 0xa7, 0xc5, + 0x6b, 0x7f, 0xa3, 0x53, 0xd0, 0x70, 0xe5, 0x47, 0x62, 0xe3, 0x2d, 0x9d, 0x8c, 0x8d, 0xb7, 0x0e, + 0x51, 0xc7, 0x6f, 0xc0, 0x18, 0x57, 0xea, 0x05, 0x1d, 0x87, 0xa1, 0xb5, 0x42, 0x0d, 0xe5, 0xaf, + 0xc6, 0x56, 0xbb, 0x04, 0x05, 0xba, 0xf6, 0xc4, 0x81, 0x6c, 0xea, 0xae, 0xb6, 0x74, 0xcb, 0xc2, + 0x63, 0x56, 0xe5, 0xaf, 0xc5, 0xa6, 0xee, 0x10, 0x85, 0x8e, 0xbb, 0xc1, 0x2f, 0xa6, 0x09, 0xdd, + 0x12, 0x6e, 0x28, 0x3f, 0x1a, 0xd3, 0x84, 0x6e, 0xc4, 0x4c, 0x13, 0xba, 0x66, 0xef, 0xb8, 0xdd, + 0xe1, 0x61, 0xa3, 0xf2, 0xa5, 0xd8, 0x8a, 0x9c, 0x4a, 0xc5, 0x56, 0xe4, 0xf4, 0x77, 0x91, 0xb7, + 0x3b, 0x3c, 0x0a, 0x54, 0x7e, 0xac, 0x3b, 0xdf, 0x70, 0xa5, 0x4f, 0x7f, 0x53, 0x78, 0xbb, 0xc3, + 0x83, 0x3a, 0xe5, 0xc7, 0xbb, 0xf3, 0x0d, 0x1d, 0xfb, 0xd2, 0xdf, 0xe3, 0xd5, 0x3a, 0x3f, 0x46, + 0x53, 0x7e, 0x22, 0x3e, 0x75, 0x75, 0x20, 0xc4, 0xa9, 0xab, 0xd3, 0x8b, 0xb6, 0x1b, 0x29, 0x4f, + 0xc2, 0x94, 0x9f, 0x8c, 0x29, 0x56, 0x82, 0x82, 0x29, 0x56, 0xf2, 0x25, 0xd9, 0x8d, 0x94, 0x97, + 0x4f, 0xca, 0x5f, 0xef, 0xcc, 0x2b, 0x10, 0x6a, 0xca, 0x83, 0xa9, 0x1b, 0x29, 0x0f, 0x7c, 0x94, + 0xbf, 0xd1, 0x99, 0x57, 0xe8, 0x1f, 0x94, 0x00, 0x8e, 0xf7, 0x41, 0x2f, 0xee, 0x38, 0xd5, 0x2f, + 0x65, 0x60, 0xa8, 0xea, 0x39, 0x54, 0x6f, 0x8a, 0x68, 0x0f, 0x67, 0xa0, 0x9f, 0xbb, 0x6e, 0xf9, + 0xaf, 0x27, 0xb4, 0xe0, 0x37, 0xb9, 0x00, 0x23, 0x33, 0xba, 0xeb, 0x61, 0xc9, 0x8a, 0x65, 0xd0, + 0xfb, 0xf8, 0x6c, 0x21, 0xa7, 0xc5, 0xa0, 0x64, 0x86, 0xd3, 0xf1, 0x72, 0x18, 0x9b, 0x27, 0xb7, + 0x65, 0x90, 0x83, 0xfe, 0xb7, 0x37, 0x8a, 0x3d, 0x18, 0xd3, 0x20, 0x56, 0x56, 0xfd, 0x5a, 0x06, + 0x12, 0x4e, 0x65, 0xbb, 0x7f, 0xd5, 0x34, 0x0f, 0xc7, 0x62, 0xf1, 0xa0, 0xc4, 0xdb, 0x8b, 0x6d, + 0x86, 0x8b, 0x8a, 0x97, 0x26, 0xef, 0x0d, 0x7c, 0xfe, 0x6f, 0x69, 0x33, 0x22, 0x80, 0x45, 0xdf, + 0xe6, 0x46, 0x31, 0xd7, 0x76, 0x1a, 0x9a, 0x84, 0x12, 0x0f, 0x94, 0x7f, 0x61, 0x34, 0x0c, 0x76, + 0x43, 0x2e, 0x88, 0x27, 0x56, 0x99, 0x30, 0xec, 0x45, 0x2c, 0x95, 0x22, 0x7f, 0x52, 0xf5, 0x41, + 0x18, 0xaa, 0x34, 0x5b, 0xd4, 0x71, 0x6d, 0x4b, 0xf7, 0x6c, 0x3f, 0x65, 0x3b, 0x86, 0x44, 0x30, + 0x25, 0xb8, 0xfc, 0x4c, 0x5f, 0xa6, 0x27, 0x97, 0xfc, 0xec, 0x0e, 0x39, 0x0c, 0x33, 0x84, 0xb1, + 0x32, 0xe3, 0xe9, 0xf9, 0x38, 0x05, 0x23, 0xbd, 0xe5, 0xea, 0xf8, 0x3a, 0x24, 0x20, 0x6d, 0x33, + 0x80, 0x4c, 0x8a, 0x14, 0xe4, 0x49, 0x28, 0xe0, 0x69, 0x9a, 0x8b, 0x59, 0x5b, 0x44, 0x30, 0x8e, + 0x06, 0x42, 0xe4, 0xd0, 0x07, 0x9c, 0x86, 0xdc, 0x84, 0xd1, 0xf0, 0xaa, 0xe0, 0xba, 0x63, 0xb7, + 0x5b, 0x7e, 0x9c, 0x66, 0x4c, 0x6b, 0x78, 0x37, 0xc0, 0xd5, 0x56, 0x10, 0x29, 0xb1, 0x48, 0x14, + 0x24, 0xd3, 0x70, 0x2c, 0x84, 0x31, 0x11, 0xf9, 0xf1, 0xe1, 0x31, 0x37, 0x8f, 0xc4, 0x8b, 0x89, + 0x33, 0x92, 0x9b, 0x27, 0x56, 0x8c, 0x54, 0xa0, 0xcf, 0x8f, 0xc4, 0xd1, 0xbf, 0xa5, 0x92, 0x1e, + 0x17, 0x91, 0x38, 0xfa, 0xe4, 0x18, 0x1c, 0x7e, 0x79, 0x32, 0x05, 0x23, 0x9a, 0xdd, 0xf6, 0xe8, + 0xa2, 0x2d, 0xd6, 0x58, 0x11, 0x40, 0x18, 0xdb, 0xe4, 0x30, 0x4c, 0xcd, 0xb3, 0xfd, 0xac, 0x90, + 0x72, 0x76, 0xc2, 0x68, 0x29, 0x32, 0x07, 0x63, 0x89, 0x4b, 0x15, 0x39, 0x57, 0xa3, 0xf4, 0x79, + 0x49, 0x66, 0xc9, 0xa2, 0xe4, 0xbb, 0x33, 0x50, 0x58, 0x74, 0x74, 0xd3, 0x73, 0xc5, 0xc3, 0x92, + 0x93, 0x97, 0xd7, 0x1c, 0xbd, 0xc5, 0xf4, 0xe3, 0x32, 0xc6, 0x91, 0xba, 0xad, 0x37, 0xda, 0xd4, + 0x1d, 0xbf, 0xc3, 0xbe, 0xee, 0x5f, 0x6f, 0x14, 0x5f, 0x5a, 0xc1, 0xad, 0xdb, 0xe5, 0xba, 0xdd, + 0xbc, 0xb2, 0xe2, 0xe8, 0xf7, 0x4c, 0x0f, 0xa7, 0x0e, 0xbd, 0x71, 0xc5, 0xa3, 0x0d, 0xdc, 0x21, + 0x5e, 0xd1, 0x5b, 0xe6, 0x15, 0x8c, 0x57, 0x78, 0x25, 0xe0, 0xc4, 0x6b, 0x60, 0x2a, 0xe0, 0xe1, + 0x5f, 0xb2, 0x0a, 0x70, 0x1c, 0x99, 0x63, 0x1b, 0x2b, 0xfc, 0xd4, 0x52, 0xab, 0x25, 0x5e, 0xa9, + 0x48, 0xfb, 0x2a, 0x1f, 0xc3, 0x15, 0x3b, 0x10, 0x98, 0xde, 0x6a, 0xc9, 0xd9, 0x60, 0x43, 0x3a, + 0xa6, 0x05, 0x8b, 0xa2, 0x45, 0xbe, 0x98, 0x86, 0x43, 0x89, 0xfb, 0x8d, 0x4d, 0x11, 0x52, 0xbc, + 0x18, 0x59, 0x82, 0x63, 0x82, 0x6f, 0x10, 0xd1, 0x77, 0x24, 0x3a, 0x2b, 0xc4, 0xd0, 0x5c, 0x69, + 0x83, 0x36, 0x1a, 0x02, 0x2c, 0xd7, 0x11, 0x2b, 0x41, 0xc6, 0xc3, 0x34, 0x63, 0x73, 0x7a, 0x93, + 0xba, 0xca, 0x31, 0xd4, 0xd8, 0xb3, 0x9b, 0x1b, 0x45, 0xc5, 0x2f, 0x8f, 0x41, 0x69, 0x52, 0x93, + 0x66, 0x62, 0x11, 0x99, 0x07, 0xd7, 0xfa, 0xd1, 0x14, 0x1e, 0x71, 0x9d, 0x8f, 0x16, 0x21, 0x13, + 0x30, 0x1c, 0x38, 0xc9, 0xde, 0xba, 0x55, 0x29, 0xe3, 0x33, 0x98, 0x81, 0xf1, 0x73, 0x9b, 0x1b, + 0xc5, 0x87, 0x62, 0x31, 0x77, 0x65, 0x26, 0x91, 0x32, 0xd2, 0x7b, 0x39, 0xfe, 0x2e, 0x26, 0xf6, + 0x5e, 0xae, 0x95, 0xf2, 0x5e, 0x6e, 0x81, 0xbc, 0x02, 0x83, 0xa5, 0x3b, 0x55, 0xf1, 0x0e, 0xd0, + 0x55, 0x8e, 0x87, 0x51, 0xda, 0x31, 0x6f, 0xaa, 0x78, 0x33, 0x28, 0x37, 0x5d, 0xa6, 0x27, 0x93, + 0x30, 0x12, 0xb9, 0x67, 0x77, 0x95, 0x13, 0xc8, 0x01, 0x5b, 0xae, 0x23, 0xa6, 0xe6, 0x08, 0x54, + 0x24, 0x93, 0x6f, 0xa4, 0x10, 0xd3, 0x1a, 0xb6, 0x55, 0x6d, 0x34, 0xec, 0x35, 0x8d, 0xe2, 0x93, + 0x43, 0x7c, 0x54, 0xd3, 0xcf, 0xb5, 0xc6, 0x10, 0xa8, 0x9a, 0xc3, 0x71, 0x91, 0xd4, 0xbd, 0xd1, + 0x62, 0xe4, 0x4d, 0x20, 0x18, 0x23, 0x9b, 0x1a, 0xfe, 0xb1, 0x6b, 0xa5, 0xec, 0x2a, 0xa7, 0x30, + 0x9e, 0x1e, 0x89, 0xbf, 0x79, 0xad, 0x94, 0xc7, 0x2f, 0x88, 0xe9, 0xe3, 0xbc, 0xce, 0x4b, 0xd5, + 0x1c, 0x81, 0xab, 0x99, 0x91, 0x04, 0x62, 0x29, 0x5c, 0xc9, 0x1a, 0x9c, 0x5e, 0x70, 0xe8, 0x3d, + 0xd3, 0x6e, 0xbb, 0xfe, 0xf2, 0xe1, 0xcf, 0x5b, 0xa7, 0xb7, 0x9c, 0xb7, 0x1e, 0x15, 0x15, 0x9f, + 0x6c, 0x39, 0xf4, 0x5e, 0xcd, 0x8f, 0xa2, 0x16, 0x89, 0x24, 0xd4, 0x89, 0x3b, 0xa6, 0x41, 0x7b, + 0xab, 0xed, 0x50, 0x01, 0x37, 0xa9, 0xab, 0x28, 0xe1, 0x54, 0xcb, 0x5f, 0x8f, 0x9a, 0x01, 0x2e, + 0x92, 0x06, 0x2d, 0x5a, 0x8c, 0x68, 0x40, 0xae, 0x4f, 0xf8, 0x47, 0xf0, 0xa5, 0x3a, 0x4f, 0x16, + 0xa5, 0x3c, 0x84, 0xcc, 0x54, 0x26, 0x96, 0x95, 0x7a, 0x10, 0x51, 0xb1, 0xa6, 0x0b, 0xbc, 0x2c, + 0x96, 0x64, 0x69, 0x32, 0x03, 0xa3, 0x0b, 0x0e, 0x6e, 0x08, 0x6e, 0xd2, 0xf5, 0x05, 0xbb, 0x61, + 0xd6, 0xd7, 0xf1, 0x6d, 0x8f, 0x98, 0x2a, 0x5b, 0x1c, 0x57, 0xbb, 0x4b, 0xd7, 0x6b, 0x2d, 0xc4, + 0xca, 0xcb, 0x4a, 0xbc, 0xa4, 0x1c, 0xe1, 0xec, 0xe1, 0xed, 0x45, 0x38, 0xa3, 0x30, 0x2a, 0x0e, + 0xf0, 0xef, 0x7b, 0xd4, 0x62, 0x4b, 0xbd, 0x2b, 0xde, 0xf1, 0x28, 0xb1, 0x03, 0xff, 0x00, 0x2f, + 0xd2, 0xf8, 0xf2, 0x51, 0x46, 0x03, 0xb0, 0xdc, 0xb0, 0x78, 0x11, 0xf5, 0x17, 0x72, 0xf2, 0xd4, + 0x49, 0xce, 0x42, 0x5e, 0x0a, 0xb0, 0x8d, 0x31, 0x8e, 0x30, 0x18, 0x61, 0x5e, 0x44, 0x5d, 0x1b, + 0x10, 0x66, 0x47, 0xf0, 0x98, 0x15, 0xd3, 0xa6, 0x84, 0x71, 0x6f, 0xb4, 0x90, 0x00, 0x53, 0x56, + 0xb4, 0x97, 0x1a, 0x66, 0x1d, 0x43, 0x54, 0xe6, 0xa4, 0x94, 0x15, 0x08, 0xe5, 0x11, 0x2a, 0x25, + 0x12, 0x72, 0x15, 0x06, 0xfd, 0x3d, 0x64, 0x18, 0xe3, 0x0b, 0x23, 0x17, 0xfa, 0x09, 0x8f, 0x79, + 0x60, 0x44, 0x89, 0x88, 0xbc, 0x88, 0x29, 0xbf, 0xfd, 0x87, 0xc2, 0xbd, 0xa1, 0xf9, 0x22, 0x0f, + 0xfc, 0x58, 0xce, 0x6f, 0xff, 0xbd, 0xf0, 0x38, 0x0c, 0xcb, 0x9a, 0xe4, 0x27, 0xe9, 0xc1, 0x39, + 0x2f, 0xa2, 0x7e, 0x72, 0xdf, 0x46, 0x8b, 0x90, 0x79, 0x18, 0x4b, 0x28, 0x8f, 0x88, 0x08, 0x86, + 0x89, 0x1a, 0x53, 0x34, 0x4f, 0x5e, 0x53, 0x13, 0x65, 0xc9, 0x63, 0x90, 0xbb, 0xa5, 0x55, 0x44, + 0x54, 0x22, 0x1e, 0xd0, 0x2a, 0xf2, 0x64, 0x99, 0x61, 0xd5, 0xef, 0xc8, 0x26, 0x96, 0x15, 0x26, + 0x3d, 0xc1, 0x4a, 0xea, 0x41, 0x94, 0x9e, 0x5f, 0x3f, 0x97, 0x9e, 0x44, 0x44, 0x2e, 0x42, 0x7f, + 0x2c, 0x35, 0x38, 0xbe, 0x2f, 0x0f, 0xf2, 0x82, 0x07, 0x58, 0x72, 0x55, 0xca, 0x2d, 0x25, 0xc5, + 0xe8, 0xf3, 0x73, 0x4b, 0xc5, 0x83, 0xd5, 0x61, 0x96, 0xa9, 0xab, 0xb1, 0x30, 0xf6, 0x7e, 0x06, + 0xe7, 0xe4, 0x92, 0x16, 0x86, 0xad, 0x0f, 0x0c, 0xca, 0xde, 0xad, 0x0c, 0x4a, 0xf5, 0x57, 0x33, + 0xc9, 0x21, 0x42, 0xae, 0x25, 0x63, 0x6e, 0xf1, 0xe4, 0xcd, 0x3e, 0x50, 0xae, 0x35, 0x88, 0xbe, + 0x15, 0x89, 0x9e, 0x95, 0xdd, 0x75, 0xf4, 0xac, 0xdc, 0x0e, 0xa3, 0x67, 0xa9, 0xff, 0x2b, 0xdf, + 0xd5, 0x57, 0xec, 0x40, 0xa2, 0x2c, 0xbc, 0xc0, 0x36, 0x45, 0xac, 0xf6, 0x92, 0x9b, 0x30, 0xed, + 0xb9, 0x2b, 0x4c, 0x4d, 0xe7, 0x43, 0xcb, 0xd5, 0xa2, 0x94, 0xe4, 0x55, 0x18, 0xf2, 0x3f, 0x00, + 0xa3, 0xb2, 0x49, 0xd1, 0xc4, 0x82, 0x05, 0x29, 0x9e, 0x7f, 0x5b, 0x2e, 0x40, 0x9e, 0x85, 0x01, + 0x34, 0x47, 0x5a, 0x7a, 0xdd, 0x0f, 0xd9, 0xc7, 0x63, 0xfc, 0xf9, 0x40, 0x39, 0x92, 0x40, 0x40, + 0x49, 0x3e, 0x06, 0x85, 0x48, 0x02, 0xf8, 0x2b, 0xdb, 0x70, 0xae, 0xbb, 0x2c, 0x87, 0x9b, 0xe5, + 0x1b, 0x8c, 0x78, 0xf2, 0x77, 0xc1, 0x94, 0x2c, 0xc2, 0xf1, 0x05, 0x87, 0x1a, 0xe8, 0xc6, 0x39, + 0x79, 0xbf, 0xe5, 0x88, 0x60, 0xc0, 0x7c, 0x94, 0xe3, 0xfa, 0xd2, 0xf2, 0xd1, 0x6c, 0xe5, 0x13, + 0x78, 0x39, 0x6e, 0x58, 0x4a, 0x71, 0x66, 0x74, 0xf0, 0x96, 0xdc, 0xa4, 0xeb, 0x6b, 0x98, 0x04, + 0xb4, 0x3f, 0x34, 0x3a, 0x84, 0xa0, 0xef, 0x0a, 0x94, 0x6c, 0x74, 0x44, 0x0b, 0x9d, 0x79, 0x01, + 0x06, 0x77, 0x1b, 0xb2, 0xf5, 0xe7, 0xb3, 0x1d, 0xbc, 0xae, 0x1f, 0xdc, 0xac, 0x19, 0x41, 0xbe, + 0xb6, 0xde, 0x0e, 0xf9, 0xda, 0xbe, 0x99, 0xed, 0xe0, 0x52, 0xfe, 0x40, 0xe7, 0x55, 0x0a, 0x84, + 0x11, 0xcd, 0xab, 0x14, 0xa6, 0xb4, 0x32, 0x0d, 0x4d, 0x26, 0x8a, 0x65, 0x60, 0x2b, 0x6c, 0x99, + 0x81, 0xed, 0xa7, 0x72, 0xdd, 0x5c, 0xee, 0x8f, 0x64, 0xbf, 0x13, 0xd9, 0x5f, 0x85, 0xc1, 0x40, + 0xb2, 0x95, 0x32, 0x1a, 0x3d, 0xc3, 0x41, 0x80, 0x68, 0x0e, 0xc6, 0x32, 0x12, 0x11, 0xb9, 0xc4, + 0xdb, 0x5a, 0x35, 0xdf, 0xe2, 0xf1, 0x4e, 0x87, 0x45, 0x24, 0x4b, 0xdd, 0xd3, 0x6b, 0xae, 0xf9, + 0x16, 0xd5, 0x02, 0xb4, 0xfa, 0x0f, 0xb3, 0xa9, 0xef, 0x16, 0x8e, 0xfa, 0x68, 0x07, 0x7d, 0x94, + 0x22, 0x44, 0xfe, 0xe2, 0xe2, 0x48, 0x88, 0x3b, 0x10, 0xe2, 0x1f, 0x66, 0x53, 0xdf, 0xa7, 0x1c, + 0x09, 0x71, 0x27, 0xb3, 0xc5, 0x93, 0x30, 0xa0, 0xd9, 0x6b, 0x2e, 0xa6, 0x5b, 0x16, 0x73, 0x05, + 0x4e, 0xd4, 0x8e, 0xbd, 0xe6, 0xf2, 0x54, 0xd4, 0x5a, 0x48, 0xa0, 0xfe, 0x71, 0xb6, 0xcb, 0x0b, + 0x9e, 0x23, 0xc1, 0xbf, 0x93, 0x4b, 0xe4, 0x2f, 0x65, 0x23, 0x2f, 0x84, 0x1e, 0xe8, 0x04, 0xa5, + 0xd5, 0xfa, 0x2a, 0x6d, 0xea, 0xf1, 0x04, 0xa5, 0x2e, 0x42, 0x45, 0x9a, 0xb0, 0x90, 0x44, 0xfd, + 0x72, 0x36, 0xf6, 0x44, 0xea, 0x48, 0x76, 0xdb, 0x96, 0x5d, 0xa0, 0x75, 0xe2, 0xd5, 0xd7, 0x91, + 0xe4, 0xb6, 0x2b, 0xb9, 0x4f, 0x65, 0x63, 0x0f, 0xe4, 0x1e, 0x58, 0xd9, 0xb1, 0x01, 0x98, 0x7c, + 0xb8, 0xf7, 0xc0, 0x6a, 0xd2, 0x93, 0x30, 0x20, 0xe4, 0x10, 0x2c, 0x15, 0x7c, 0xde, 0xe7, 0x40, + 0x3c, 0x65, 0x0d, 0x08, 0xd4, 0xef, 0xca, 0x42, 0xf4, 0xe1, 0xe2, 0x03, 0xaa, 0x43, 0xbf, 0x94, + 0x8d, 0x3e, 0xd9, 0x7c, 0x70, 0xf5, 0xe7, 0x32, 0x40, 0xb5, 0xbd, 0x54, 0x17, 0x11, 0xff, 0x7a, + 0xa5, 0x63, 0xfa, 0x00, 0xaa, 0x49, 0x14, 0xea, 0xff, 0xce, 0xa6, 0xbe, 0x23, 0x7d, 0x70, 0x05, + 0xf8, 0x0c, 0x9e, 0x8a, 0xd7, 0xad, 0x70, 0x22, 0xc7, 0x43, 0x48, 0x36, 0xfe, 0x12, 0x89, 0x46, + 0x7c, 0x42, 0xf2, 0x81, 0x14, 0x73, 0x0d, 0xc3, 0xa0, 0x86, 0xe6, 0x9a, 0x7c, 0x0d, 0x21, 0x19, + 0x6e, 0xff, 0x2c, 0xbb, 0xd5, 0xb3, 0xdb, 0x07, 0x79, 0x55, 0xed, 0x5b, 0xd0, 0xd7, 0x31, 0x3c, + 0x14, 0xeb, 0x89, 0x21, 0x9e, 0x06, 0xa3, 0xc5, 0x41, 0xf2, 0xb5, 0x99, 0xa0, 0x52, 0xff, 0xa0, + 0x37, 0xfd, 0xcd, 0xe7, 0x83, 0x2b, 0xc2, 0xb3, 0x90, 0x5f, 0xd0, 0xbd, 0x55, 0xa1, 0xc9, 0x78, + 0xa5, 0xd7, 0xd2, 0xbd, 0x55, 0x0d, 0xa1, 0xe4, 0x12, 0xf4, 0x6b, 0xfa, 0x1a, 0x3f, 0xf3, 0x2c, + 0x84, 0x29, 0x4a, 0x1c, 0x7d, 0xad, 0xc6, 0xcf, 0x3d, 0x03, 0x34, 0x51, 0x83, 0x14, 0x39, 0xfc, + 0xe4, 0x1b, 0xf3, 0x33, 0xf0, 0x14, 0x39, 0x41, 0x62, 0x9c, 0xb3, 0x90, 0x1f, 0xb7, 0x8d, 0x75, + 0xbc, 0xbe, 0x1a, 0xe2, 0x95, 0x2d, 0xd9, 0xc6, 0xba, 0x86, 0x50, 0xf2, 0xe9, 0x0c, 0xf4, 0x4d, + 0x53, 0xdd, 0x60, 0x23, 0x64, 0xa0, 0x9b, 0xc3, 0xc8, 0x87, 0xf6, 0xc7, 0x61, 0x64, 0x6c, 0x95, 0x57, 0x26, 0x2b, 0x8a, 0xa8, 0x9f, 0x5c, 0x87, 0xfe, 0x09, 0xdd, 0xa3, 0x2b, 0xb6, 0xb3, 0x8e, - 0xde, 0x2d, 0x23, 0xa1, 0x4b, 0x60, 0x44, 0x7f, 0x7c, 0x22, 0x7e, 0x33, 0x56, 0x17, 0xbf, 0xb4, - 0xa0, 0x30, 0x13, 0x8b, 0x48, 0xa5, 0x39, 0x18, 0x8a, 0x85, 0xe7, 0xcc, 0x0c, 0x32, 0x66, 0x06, - 0xc7, 0xca, 0x43, 0xe9, 0xc7, 0xca, 0x68, 0x3d, 0xa2, 0x07, 0x1c, 0xe6, 0x9c, 0x19, 0xc6, 0x45, - 0x9f, 0x5b, 0x8f, 0x08, 0xc5, 0x94, 0x33, 0x9a, 0x44, 0xa2, 0x7e, 0xbd, 0x17, 0x52, 0x1f, 0x7f, - 0x1d, 0x29, 0xf9, 0x91, 0x92, 0x87, 0x4a, 0x5e, 0x4e, 0x28, 0xf9, 0x99, 0xe4, 0x73, 0xc2, 0x77, - 0xa9, 0x86, 0x7f, 0x31, 0x9f, 0x78, 0x8c, 0xfc, 0x60, 0xef, 0x2e, 0x43, 0xe9, 0xf5, 0x6e, 0x29, + 0x2e, 0x30, 0x23, 0xa1, 0xdf, 0x60, 0x44, 0x7f, 0x7c, 0x22, 0x7e, 0x33, 0x56, 0x17, 0xbf, 0xb4, + 0xa0, 0x30, 0x13, 0x8b, 0xc8, 0xb7, 0x39, 0x18, 0x8a, 0x85, 0x27, 0xd6, 0x0c, 0xd2, 0x6a, 0x06, + 0xc7, 0xca, 0x43, 0xe9, 0xc7, 0xca, 0x68, 0x3d, 0xa2, 0x9b, 0x1c, 0x26, 0xa6, 0x19, 0xc6, 0x45, + 0x9f, 0x5b, 0x8f, 0x08, 0xc5, 0xbc, 0x34, 0x9a, 0x44, 0xa2, 0x7e, 0xbd, 0x17, 0x52, 0x5f, 0x88, + 0x1d, 0x29, 0xf9, 0x91, 0x92, 0x87, 0x4a, 0x5e, 0x4e, 0x28, 0xf9, 0x99, 0xe4, 0x9b, 0xc3, 0x77, + 0xa9, 0x86, 0x7f, 0x31, 0x9f, 0x78, 0xb1, 0xfc, 0x60, 0xef, 0x2e, 0x43, 0xe9, 0xf5, 0x6e, 0x29, 0xbd, 0x60, 0x40, 0x14, 0xb6, 0x1c, 0x10, 0x7d, 0xdb, 0x1d, 0x10, 0xfd, 0x1d, 0x07, 0x44, 0xa8, - 0x20, 0x03, 0x1d, 0x15, 0xa4, 0x22, 0x06, 0x0d, 0x74, 0xcf, 0x67, 0x76, 0x76, 0x73, 0xa3, 0x38, - 0xc2, 0x46, 0x53, 0x6a, 0x26, 0x33, 0x64, 0xa1, 0x7e, 0x2d, 0xdf, 0x25, 0x82, 0xc0, 0x81, 0xe8, - 0xc8, 0x33, 0x90, 0x2b, 0xb5, 0x5a, 0x42, 0x3f, 0x8e, 0x4b, 0xc1, 0x0b, 0x3a, 0x94, 0x62, 0xd4, - 0xe4, 0x45, 0xc8, 0x95, 0xee, 0x54, 0xe3, 0x71, 0xd0, 0x4b, 0x77, 0xaa, 0xe2, 0x4b, 0x3a, 0x96, - 0xbd, 0x53, 0x25, 0x2f, 0x87, 0x01, 0xc9, 0x56, 0xdb, 0xd6, 0x5d, 0xb1, 0x51, 0x14, 0x4e, 0xb0, - 0xbe, 0xa7, 0x4d, 0x9d, 0xa1, 0xd8, 0x76, 0x31, 0x46, 0x1b, 0xd3, 0xa6, 0xc2, 0xf6, 0xb5, 0xa9, + 0x20, 0x03, 0x1d, 0x15, 0xa4, 0x22, 0x06, 0x0d, 0x74, 0x4f, 0x7a, 0x76, 0x76, 0x73, 0xa3, 0x38, + 0xc2, 0x46, 0x53, 0x6a, 0xba, 0x33, 0x64, 0xa1, 0x7e, 0x2d, 0xdf, 0x25, 0xcc, 0xc0, 0x81, 0xe8, + 0xc8, 0x33, 0x90, 0x2b, 0xb5, 0x5a, 0x42, 0x3f, 0x8e, 0x4b, 0x11, 0x0e, 0x3a, 0x94, 0x62, 0xd4, + 0xe4, 0x45, 0xc8, 0x95, 0xee, 0x54, 0xe3, 0xc1, 0xd2, 0x4b, 0x77, 0xaa, 0xe2, 0x4b, 0x3a, 0x96, + 0xbd, 0x53, 0x25, 0x2f, 0x87, 0x51, 0xcb, 0x56, 0xdb, 0xd6, 0x5d, 0xb1, 0x51, 0x14, 0x9e, 0xb2, + 0xbe, 0x3b, 0x4e, 0x9d, 0xa1, 0xd8, 0x76, 0x31, 0x46, 0x1b, 0xd3, 0xa6, 0xc2, 0xf6, 0xb5, 0xa9, 0x6f, 0x4b, 0x6d, 0xea, 0xdf, 0xae, 0x36, 0x0d, 0x6c, 0x43, 0x9b, 0x60, 0x4b, 0x6d, 0x1a, 0xdc, - 0xbb, 0x36, 0xb5, 0xe0, 0x4c, 0x32, 0xea, 0x4b, 0xa0, 0x11, 0x1a, 0x90, 0x24, 0x56, 0x38, 0x96, - 0xe0, 0xd5, 0x7f, 0x9b, 0x63, 0x6b, 0x3c, 0xe5, 0x6d, 0x3c, 0x61, 0xac, 0x96, 0x52, 0x5a, 0xfd, - 0xf9, 0x6c, 0xe7, 0x60, 0x35, 0x87, 0x73, 0x8a, 0xfb, 0xb6, 0x54, 0x29, 0xe5, 0xa3, 0x8f, 0x07, - 0x3b, 0x4b, 0x39, 0xc6, 0x36, 0x4d, 0x66, 0x5f, 0xcd, 0x74, 0x8a, 0xa0, 0xb3, 0x27, 0x89, 0x3d, - 0x9e, 0x74, 0x56, 0x43, 0xef, 0x79, 0x37, 0xea, 0xa5, 0x16, 0xcf, 0xa0, 0x9a, 0xdb, 0x65, 0x06, - 0xd5, 0x5f, 0xc9, 0xc0, 0xf1, 0x9b, 0xed, 0x25, 0x2a, 0x9c, 0xd3, 0x82, 0x66, 0xbc, 0x09, 0xc0, - 0xc0, 0xc2, 0x89, 0x25, 0x83, 0x4e, 0x2c, 0xef, 0x93, 0xa3, 0xdf, 0xc4, 0x0a, 0x5c, 0x0e, 0xa9, - 0xb9, 0x03, 0xcb, 0x39, 0xdf, 0xc5, 0xf2, 0x6e, 0x7b, 0x89, 0xd6, 0x12, 0x9e, 0x2c, 0x12, 0xf7, - 0x33, 0xaf, 0x70, 0xe7, 0xf5, 0xdd, 0x3a, 0x8d, 0xfc, 0x6c, 0xb6, 0x63, 0xc0, 0xa1, 0x43, 0x9b, - 0xef, 0xe5, 0x23, 0xa9, 0xbd, 0x12, 0xcf, 0xfb, 0x92, 0x42, 0x12, 0xe3, 0x98, 0xc6, 0x25, 0x5d, - 0x60, 0x87, 0x3c, 0x0b, 0xd1, 0x3b, 0x2a, 0xb0, 0xdf, 0xcc, 0x74, 0x0c, 0x0c, 0x75, 0x58, 0x05, - 0xa6, 0xfe, 0xc7, 0x9c, 0x1f, 0x8f, 0x6a, 0x4f, 0x9f, 0xf0, 0x24, 0x0c, 0x88, 0x67, 0x79, 0x51, - 0xdf, 0x5a, 0x71, 0x94, 0x87, 0x47, 0xc3, 0x01, 0x01, 0x5b, 0xe6, 0xfd, 0x78, 0x39, 0x41, 0xfa, - 0x5c, 0x5c, 0xe6, 0x4d, 0x01, 0x65, 0xf4, 0x12, 0x09, 0x5b, 0xc8, 0x27, 0xef, 0x9b, 0x1e, 0x5a, + 0xbb, 0x36, 0xb5, 0xe0, 0x4c, 0x32, 0x34, 0x4c, 0xa0, 0x11, 0x1a, 0x90, 0x24, 0x56, 0x38, 0x96, + 0xe0, 0xd5, 0x7f, 0x9b, 0x63, 0x6b, 0x3c, 0x2f, 0x6e, 0x3c, 0xab, 0xac, 0x96, 0x52, 0x5a, 0xfd, + 0xf9, 0x6c, 0xe7, 0x88, 0x36, 0x87, 0x73, 0x8a, 0xfb, 0xb6, 0x54, 0x29, 0xe5, 0xa3, 0x2f, 0x0c, + 0x3b, 0x4b, 0x39, 0xc6, 0x36, 0x4d, 0x66, 0x5f, 0xcd, 0x74, 0x0a, 0xb3, 0xb3, 0x27, 0x89, 0x3d, + 0x9e, 0xf4, 0x68, 0x43, 0x17, 0x7b, 0x37, 0xea, 0xca, 0x16, 0x4f, 0xb3, 0x9a, 0xdb, 0x65, 0x9a, + 0xd5, 0x5f, 0xcd, 0xc0, 0xf1, 0x9b, 0xed, 0x25, 0x2a, 0x3c, 0xd8, 0x82, 0x66, 0xbc, 0x09, 0xc0, + 0xc0, 0xc2, 0x89, 0x25, 0x83, 0x4e, 0x2c, 0xef, 0x93, 0x43, 0xe4, 0xc4, 0x0a, 0x5c, 0x0e, 0xa9, + 0xb9, 0x03, 0xcb, 0x39, 0xdf, 0x0f, 0xf3, 0x6e, 0x7b, 0x89, 0xd6, 0x12, 0x9e, 0x2c, 0x12, 0xf7, + 0x33, 0xaf, 0x70, 0x0f, 0xf7, 0xdd, 0x3a, 0x8d, 0xfc, 0x6c, 0xb6, 0x63, 0x54, 0xa2, 0x43, 0x9b, + 0x14, 0xe6, 0x23, 0xa9, 0xbd, 0x12, 0x4f, 0x0e, 0x93, 0x42, 0x12, 0xe3, 0x98, 0xc6, 0x25, 0x5d, + 0x60, 0x87, 0x3c, 0x55, 0xd1, 0x3b, 0x2a, 0xb0, 0xdf, 0xca, 0x74, 0x8c, 0x1e, 0x75, 0x58, 0x05, + 0xa6, 0xfe, 0x87, 0x9c, 0x1f, 0xb4, 0x6a, 0x4f, 0x9f, 0xf0, 0x24, 0x0c, 0x88, 0xb7, 0x7b, 0x51, + 0x07, 0x5c, 0x71, 0x94, 0x87, 0x47, 0xc3, 0x01, 0x01, 0x5b, 0xe6, 0xfd, 0xa0, 0x3a, 0x41, 0x8e, + 0x5d, 0x5c, 0xe6, 0x4d, 0x01, 0x65, 0xf4, 0x12, 0x09, 0x5b, 0xc8, 0x27, 0xef, 0x9b, 0x1e, 0x5a, 0x05, 0xac, 0x2f, 0x73, 0x7c, 0x21, 0xa7, 0xf7, 0x4d, 0x8f, 0xdb, 0x04, 0x01, 0x9a, 0x2d, 0xd2, - 0xd5, 0x30, 0xc7, 0xa2, 0x58, 0xa4, 0x5d, 0x91, 0x6a, 0x52, 0x3c, 0xe6, 0x7a, 0x12, 0x06, 0x84, - 0xc3, 0xaa, 0x70, 0x33, 0x11, 0xad, 0x15, 0x2e, 0xae, 0xd8, 0xda, 0x80, 0x80, 0x71, 0xd4, 0xe8, + 0xd5, 0x30, 0x11, 0xa3, 0x58, 0xa4, 0x5d, 0x91, 0x8f, 0x52, 0xbc, 0xf8, 0x7a, 0x12, 0x06, 0x84, + 0x57, 0xab, 0x70, 0x33, 0x11, 0xad, 0x15, 0x7e, 0xb0, 0xd8, 0xda, 0x80, 0x80, 0x71, 0xd4, 0xe8, 0x4a, 0xe8, 0x58, 0x87, 0x1c, 0x1d, 0x84, 0x68, 0x02, 0x43, 0xae, 0xc2, 0x48, 0xd5, 0xd3, 0x2d, 0x43, 0x77, 0x8c, 0xf9, 0xb6, 0xd7, 0x6a, 0x7b, 0xb2, 0x51, 0xea, 0x7a, 0x86, 0xdd, 0xf6, 0xb4, 0x18, 0x05, 0x79, 0x3f, 0x0c, 0xfb, 0x90, 0x49, 0xc7, 0xb1, 0x1d, 0xd9, 0xf2, 0x70, 0x3d, 0x83, - 0x3a, 0x8e, 0x16, 0x25, 0x20, 0x1f, 0x80, 0xe1, 0x8a, 0x75, 0xcf, 0xe6, 0xc9, 0x3b, 0x6f, 0x69, - 0x33, 0xc2, 0x0e, 0xc1, 0x07, 0x52, 0x66, 0x80, 0xa8, 0xb5, 0x9d, 0x86, 0x16, 0x25, 0x54, 0x37, - 0xb3, 0xc9, 0xb0, 0x5d, 0x0f, 0xee, 0xa6, 0xe5, 0x52, 0xd4, 0x99, 0x0e, 0x3d, 0x48, 0xd1, 0x20, + 0x3a, 0x8e, 0x16, 0x25, 0x20, 0x1f, 0x80, 0xe1, 0x8a, 0x75, 0xcf, 0xe6, 0x19, 0x3e, 0x6f, 0x69, + 0x33, 0xc2, 0x0e, 0xc1, 0x57, 0x54, 0x66, 0x80, 0xa8, 0xb5, 0x9d, 0x86, 0x16, 0x25, 0x54, 0x37, + 0xb3, 0xc9, 0xd8, 0x5e, 0x0f, 0xee, 0xa6, 0xe5, 0x52, 0xd4, 0x99, 0x0e, 0x3d, 0x48, 0xd1, 0x20, 0x94, 0x7d, 0x79, 0xb9, 0x5d, 0x78, 0x15, 0xfa, 0x6f, 0xd2, 0x75, 0xee, 0xf7, 0x59, 0x08, 0x5d, - 0x85, 0xef, 0x0a, 0x98, 0x7c, 0xe2, 0xea, 0xd3, 0xa9, 0x5f, 0xc9, 0x26, 0x03, 0x92, 0x3d, 0xb8, + 0x85, 0xef, 0x0a, 0x98, 0x7c, 0xe2, 0xea, 0xd3, 0xa9, 0x5f, 0xc9, 0x26, 0xa3, 0x96, 0x3d, 0xb8, 0xc2, 0x7e, 0x3f, 0xf4, 0xa1, 0x28, 0x2b, 0xfe, 0x91, 0x3f, 0x0a, 0x10, 0xc5, 0x1d, 0xf5, 0x40, - 0xf6, 0xc9, 0xd4, 0x1f, 0x2b, 0xc4, 0xa3, 0xd4, 0x3d, 0xb8, 0xd2, 0x7b, 0x09, 0x06, 0x27, 0x6c, - 0xcb, 0x35, 0x5d, 0x8f, 0x5a, 0x75, 0x5f, 0x61, 0x1f, 0x62, 0x06, 0x55, 0x3d, 0x04, 0xcb, 0x2f, - 0x83, 0x24, 0xea, 0xdd, 0x28, 0x2f, 0x79, 0x0e, 0x06, 0x50, 0xe4, 0xe8, 0x27, 0x2d, 0x25, 0x07, + 0xf6, 0xc9, 0xd4, 0x1f, 0x2b, 0xc4, 0x43, 0xd9, 0x3d, 0xb8, 0xd2, 0x7b, 0x09, 0x06, 0x27, 0x6c, + 0xcb, 0x35, 0x5d, 0x8f, 0x5a, 0x75, 0x5f, 0x61, 0x1f, 0x62, 0x06, 0x55, 0x3d, 0x04, 0xcb, 0xcf, + 0x87, 0x24, 0xea, 0xdd, 0x28, 0x2f, 0x79, 0x0e, 0x06, 0x50, 0xe4, 0xe8, 0x27, 0x2d, 0x65, 0x10, 0x5f, 0x62, 0xc0, 0xb8, 0x93, 0x74, 0x48, 0x4a, 0x6e, 0x41, 0xff, 0xc4, 0xaa, 0xd9, 0x30, 0x1c, - 0x6a, 0xa1, 0xbf, 0xb0, 0x14, 0x2b, 0x2f, 0xda, 0x97, 0x97, 0xf1, 0x5f, 0xa4, 0xe5, 0xcd, 0xa9, - 0x8b, 0x62, 0x91, 0xb7, 0x51, 0x02, 0x76, 0xe6, 0xfb, 0xb3, 0x00, 0x61, 0x01, 0xf2, 0x08, 0x64, - 0x83, 0xf4, 0x65, 0xe8, 0xa6, 0x12, 0xd1, 0xa0, 0x2c, 0x2e, 0x15, 0x62, 0x6c, 0x67, 0xb7, 0x1c, - 0xdb, 0xb7, 0xa0, 0xc0, 0x4f, 0xbc, 0xd0, 0x93, 0x5c, 0x0a, 0x9c, 0xd5, 0xb1, 0xc1, 0x97, 0x91, + 0x6a, 0xa1, 0xbf, 0xb0, 0x14, 0x50, 0x2f, 0xda, 0x97, 0x97, 0xf1, 0x5f, 0xa4, 0xe5, 0xcd, 0xa9, + 0x8b, 0x62, 0x91, 0x07, 0x54, 0x02, 0x76, 0xe6, 0xfb, 0xb3, 0x00, 0x61, 0x01, 0xf2, 0x08, 0x64, + 0x83, 0x1c, 0x67, 0xe8, 0xa6, 0x12, 0xd1, 0xa0, 0x2c, 0x2e, 0x15, 0x62, 0x6c, 0x67, 0xb7, 0x1c, + 0xdb, 0xb7, 0xa0, 0xc0, 0x4f, 0xbc, 0xd0, 0x93, 0x5c, 0x8a, 0xae, 0xd5, 0xb1, 0xc1, 0x97, 0x91, 0x9e, 0x6f, 0x66, 0xd1, 0xf2, 0x8c, 0x78, 0x65, 0x73, 0x66, 0x67, 0xea, 0xd0, 0x8b, 0x7f, 0x91, 0x0b, 0x90, 0x47, 0x29, 0x66, 0x70, 0x1f, 0x8b, 0xb3, 0x74, 0x4c, 0x7e, 0x88, 0x67, 0xdd, 0x34, 0x61, 0x5b, 0x1e, 0xab, 0x1a, 0x5b, 0x3d, 0x24, 0xe4, 0x22, 0x60, 0x11, 0xb9, 0x08, 0x98, 0xfa, - 0xcf, 0xb2, 0x29, 0xf1, 0x13, 0x1f, 0xdc, 0x61, 0xf2, 0x02, 0x00, 0x3e, 0xb4, 0x66, 0xf2, 0xf4, - 0x9f, 0x68, 0xe0, 0x28, 0x41, 0x46, 0xa8, 0xb6, 0x91, 0x6d, 0x47, 0x48, 0xac, 0xfe, 0x5a, 0x26, - 0x11, 0x74, 0x6f, 0x4f, 0x72, 0x94, 0xad, 0xb2, 0xec, 0x2e, 0xcd, 0x58, 0xbf, 0x2f, 0x72, 0x3b, - 0xeb, 0x8b, 0xe8, 0xb7, 0xec, 0x83, 0x65, 0x7a, 0x90, 0xdf, 0xf2, 0xf5, 0x6c, 0x5a, 0x08, 0xc2, - 0xc3, 0xa9, 0xe2, 0xd7, 0x02, 0xa3, 0x34, 0xbf, 0x9d, 0xc4, 0xdf, 0xc2, 0x4c, 0xfd, 0x38, 0x1c, - 0x8b, 0x05, 0xe6, 0x13, 0x39, 0x05, 0x2f, 0x74, 0x8f, 0xf0, 0xd7, 0xf9, 0x89, 0x7e, 0x84, 0x4c, - 0xfd, 0xbf, 0x99, 0xee, 0x61, 0x19, 0x0f, 0x5c, 0x75, 0x52, 0x04, 0x90, 0xfb, 0xd3, 0x11, 0xc0, + 0x4f, 0xb3, 0x29, 0x41, 0x16, 0x1f, 0xdc, 0x61, 0xf2, 0x02, 0x00, 0xbe, 0xc6, 0x66, 0xf2, 0xf4, + 0x9f, 0x68, 0xe0, 0x28, 0x41, 0x46, 0xa8, 0xb6, 0x91, 0x6d, 0x47, 0x48, 0xac, 0xfe, 0x7a, 0x26, + 0x11, 0x99, 0x6f, 0x4f, 0x72, 0x94, 0xad, 0xb2, 0xec, 0x2e, 0xcd, 0x58, 0xbf, 0x2f, 0x72, 0x3b, + 0xeb, 0x8b, 0xe8, 0xb7, 0xec, 0x83, 0x65, 0x7a, 0x90, 0xdf, 0xf2, 0xf5, 0x6c, 0x5a, 0x9c, 0xc2, + 0xc3, 0xa9, 0xe2, 0xd7, 0x02, 0xa3, 0x34, 0xbf, 0x9d, 0xec, 0xe0, 0xc2, 0x4c, 0xfd, 0x38, 0x1c, + 0x8b, 0x45, 0xef, 0x13, 0x89, 0x07, 0x2f, 0x74, 0x0f, 0x03, 0xd8, 0xf9, 0x1d, 0x7f, 0x84, 0x4c, + 0xfd, 0x3f, 0x99, 0xee, 0xb1, 0x1b, 0x0f, 0x5c, 0x75, 0x52, 0x04, 0x90, 0xfb, 0xb3, 0x11, 0xc0, 0x3e, 0x6c, 0x83, 0x0f, 0xb7, 0x00, 0xde, 0x25, 0x93, 0xc7, 0x3b, 0x2d, 0x80, 0x1f, 0xcb, 0x6c, - 0x19, 0x55, 0xf3, 0xa0, 0x65, 0xa0, 0xfe, 0xbb, 0x4c, 0x6a, 0xf4, 0xcb, 0x3d, 0xb5, 0xeb, 0x65, - 0x28, 0x70, 0xb7, 0x1a, 0xd1, 0x2a, 0x29, 0x5f, 0x08, 0x83, 0x76, 0x28, 0x2f, 0xca, 0x90, 0x19, - 0xe8, 0xe3, 0x6d, 0x30, 0xe2, 0x79, 0x75, 0x53, 0xda, 0x69, 0x74, 0x9a, 0x1c, 0x05, 0x5a, 0xfd, - 0xd5, 0x4c, 0x22, 0x18, 0xe7, 0x01, 0x7e, 0x5b, 0x38, 0x55, 0xe7, 0xb6, 0x3f, 0x55, 0xab, 0xbf, - 0x97, 0x4d, 0x8f, 0x05, 0x7a, 0x80, 0x1f, 0xb2, 0x1f, 0xc7, 0x69, 0xbb, 0x5b, 0xb7, 0x16, 0x61, - 0x24, 0x2a, 0x0b, 0xb1, 0x6c, 0x9d, 0x4f, 0x8f, 0x88, 0xda, 0xa1, 0x15, 0x31, 0x1e, 0xea, 0xdb, - 0x99, 0x64, 0x18, 0xd3, 0x03, 0x9f, 0x9f, 0x76, 0xa7, 0x2d, 0xd1, 0x4f, 0x79, 0x97, 0xac, 0x35, - 0xfb, 0xf1, 0x29, 0xef, 0x92, 0x55, 0x63, 0x77, 0x9f, 0xf2, 0xd3, 0xd9, 0x4e, 0x51, 0x60, 0x0f, - 0xfc, 0x83, 0x3e, 0x2c, 0x0b, 0x99, 0xb7, 0x4c, 0x7c, 0xda, 0x23, 0x9d, 0xc2, 0xae, 0x76, 0xe0, + 0x19, 0x7a, 0xf3, 0xa0, 0x65, 0xa0, 0xfe, 0xdb, 0x4c, 0x6a, 0x88, 0xcc, 0x3d, 0xb5, 0xeb, 0x65, + 0x28, 0x70, 0xb7, 0x1a, 0xd1, 0x2a, 0x29, 0xa9, 0x08, 0x83, 0x76, 0x28, 0x2f, 0xca, 0x90, 0x19, + 0xe8, 0xe3, 0x6d, 0x30, 0xe2, 0xc9, 0x77, 0x53, 0xda, 0x69, 0x74, 0x9a, 0x1c, 0x05, 0x5a, 0xfd, + 0xb5, 0x4c, 0x22, 0x62, 0xe7, 0x01, 0x7e, 0x5b, 0x38, 0x55, 0xe7, 0xb6, 0x3f, 0x55, 0xab, 0xbf, + 0x9f, 0x4d, 0x0f, 0x18, 0x7a, 0x80, 0x1f, 0xb2, 0x1f, 0xc7, 0x69, 0xbb, 0x5b, 0xb7, 0x16, 0x61, + 0x24, 0x2a, 0x0b, 0xb1, 0x6c, 0x9d, 0x4f, 0x0f, 0x9b, 0xda, 0xa1, 0x15, 0x31, 0x1e, 0xea, 0xdb, + 0x99, 0x64, 0xac, 0xd3, 0x03, 0x9f, 0x9f, 0x76, 0xa7, 0x2d, 0xd1, 0x4f, 0x79, 0x97, 0xac, 0x35, + 0xfb, 0xf1, 0x29, 0xef, 0x92, 0x55, 0x63, 0x77, 0x9f, 0xf2, 0xd3, 0xd9, 0x4e, 0xa1, 0x62, 0x0f, + 0xfc, 0x83, 0x3e, 0x2c, 0x0b, 0x99, 0xb7, 0x4c, 0x7c, 0xda, 0x23, 0x9d, 0x62, 0xb3, 0x76, 0xe0, 0x99, 0xe0, 0xb3, 0xbb, 0x31, 0x9e, 0x2a, 0xac, 0x77, 0x89, 0x22, 0x1f, 0x0e, 0x61, 0xbd, 0x4b, - 0x86, 0xca, 0xbb, 0x4f, 0x58, 0x7f, 0x3f, 0xbb, 0xdd, 0xd0, 0xc3, 0x47, 0xc2, 0x4b, 0x08, 0xef, - 0xf3, 0xd9, 0x64, 0x48, 0xec, 0x03, 0x17, 0xd3, 0x14, 0x14, 0x44, 0x70, 0xee, 0x8e, 0xc2, 0xe1, + 0x86, 0xca, 0xbb, 0x4f, 0x58, 0x7f, 0x2f, 0xbb, 0xdd, 0xf8, 0xc4, 0x47, 0xc2, 0x4b, 0x08, 0xef, + 0xf3, 0xd9, 0x64, 0xdc, 0xec, 0x03, 0x17, 0xd3, 0x14, 0x14, 0x44, 0x04, 0xef, 0x8e, 0xc2, 0xe1, 0xf8, 0x4e, 0x16, 0x8d, 0xf8, 0x8e, 0x6b, 0x20, 0x2e, 0x72, 0xb6, 0x27, 0x12, 0x4e, 0xab, 0xfe, - 0x51, 0x26, 0x16, 0x3f, 0xfa, 0x40, 0x8e, 0x10, 0x76, 0xb5, 0x24, 0x91, 0x57, 0xfc, 0xc3, 0xcc, - 0x7c, 0x2c, 0x7e, 0x67, 0xf0, 0x3d, 0x65, 0xea, 0xe9, 0x66, 0x23, 0x5e, 0x5e, 0xc4, 0x04, 0xf8, - 0x4a, 0x16, 0xc6, 0x12, 0xa4, 0xe4, 0x42, 0x24, 0x4a, 0x0e, 0x1e, 0x4b, 0xc6, 0x9c, 0xc7, 0x79, - 0xbc, 0x9c, 0x1d, 0x9c, 0xa4, 0x5e, 0x80, 0x7c, 0x59, 0x5f, 0xe7, 0xdf, 0xd6, 0xcb, 0x59, 0x1a, + 0x71, 0x26, 0x16, 0x64, 0xfa, 0x40, 0x8e, 0x10, 0x76, 0xb5, 0x24, 0x91, 0x57, 0xfc, 0xc3, 0xcc, + 0x7c, 0x2c, 0xc8, 0x67, 0xf0, 0x3d, 0x65, 0xea, 0xe9, 0x66, 0x23, 0x5e, 0x5e, 0xc4, 0x04, 0xf8, + 0x4a, 0x16, 0xc6, 0x12, 0xa4, 0xe4, 0x42, 0x24, 0x94, 0x0e, 0x1e, 0x4b, 0xc6, 0x9c, 0xc7, 0x79, + 0x50, 0x9d, 0x1d, 0x9c, 0xa4, 0x5e, 0x80, 0x7c, 0x59, 0x5f, 0xe7, 0xdf, 0xd6, 0xcb, 0x59, 0x1a, 0xfa, 0xba, 0x7c, 0xe2, 0x86, 0x78, 0xb2, 0x04, 0x27, 0xf9, 0x7d, 0x88, 0x69, 0x5b, 0x8b, 0x66, 0x93, 0x56, 0xac, 0x59, 0xb3, 0xd1, 0x30, 0x5d, 0x71, 0xa9, 0xf7, 0xe4, 0xe6, 0x46, 0xf1, 0xa2, 0x67, 0x7b, 0x7a, 0xa3, 0x46, 0x7d, 0xb2, 0x9a, 0x67, 0x36, 0x69, 0xcd, 0xb4, 0x6a, 0x4d, 0xa4, - 0x94, 0x58, 0xa6, 0xb3, 0x22, 0x15, 0x1e, 0xaa, 0xb5, 0x5a, 0xd7, 0x2d, 0x8b, 0x1a, 0x15, 0x6b, + 0x94, 0x58, 0xa6, 0xb3, 0x22, 0x15, 0x1e, 0xcf, 0xb5, 0x5a, 0xd7, 0x2d, 0x8b, 0x1a, 0x15, 0x6b, 0x7c, 0xdd, 0xa3, 0xfc, 0x32, 0x30, 0xc7, 0x8f, 0x04, 0xf9, 0xdb, 0x70, 0x8e, 0x66, 0x8c, 0x97, - 0x18, 0x81, 0x96, 0x52, 0x48, 0xfd, 0xe5, 0x7c, 0x4a, 0xe8, 0xf0, 0x43, 0xa4, 0x3e, 0x7e, 0x4f, + 0x18, 0x81, 0x96, 0x52, 0x48, 0xfd, 0x95, 0x7c, 0x4a, 0x7c, 0xf1, 0x43, 0xa4, 0x3e, 0x7e, 0x4f, 0xe7, 0xb7, 0xe8, 0xe9, 0x2b, 0xd0, 0x77, 0x9b, 0x3a, 0x78, 0xbe, 0xc5, 0x2f, 0x18, 0xd0, 0x99, 0xfd, 0x1e, 0x07, 0xc9, 0x37, 0x34, 0x82, 0x8a, 0x34, 0xe0, 0xcc, 0x22, 0xeb, 0xa6, 0xf4, 0xce, 0x2c, 0xec, 0xa2, 0x33, 0xbb, 0xf0, 0x23, 0x6f, 0xc0, 0x69, 0xc4, 0xa6, 0x74, 0x6b, 0x1f, 0x56, - 0x85, 0x91, 0xa3, 0x78, 0x55, 0xe9, 0x9d, 0xdb, 0xa9, 0x3c, 0xf9, 0x30, 0x0c, 0x05, 0x03, 0xc4, - 0xa4, 0xae, 0xb8, 0xb9, 0xe8, 0x32, 0xce, 0x78, 0x58, 0x36, 0x06, 0x46, 0x17, 0xb2, 0x68, 0x68, - 0xaf, 0x08, 0x2f, 0xf5, 0xdf, 0x66, 0xba, 0x85, 0x30, 0x3f, 0xf0, 0x59, 0xf9, 0x15, 0xe8, 0x33, - 0xf8, 0x47, 0x09, 0x9d, 0xea, 0x1e, 0xe4, 0x9c, 0x93, 0x6a, 0x7e, 0x19, 0xf5, 0x77, 0x33, 0x5d, - 0x23, 0xa7, 0x1f, 0xf6, 0xcf, 0xfb, 0x7c, 0xae, 0xc3, 0xe7, 0x89, 0x49, 0xf4, 0x12, 0x8c, 0x9a, - 0x61, 0xf8, 0xd8, 0x5a, 0x18, 0x7e, 0x4a, 0x3b, 0x26, 0xc1, 0x71, 0x74, 0x5d, 0x83, 0x53, 0xbe, + 0x85, 0xe1, 0xa5, 0x78, 0x55, 0xe9, 0x9d, 0xdb, 0xa9, 0x3c, 0xf9, 0x30, 0x0c, 0x05, 0x03, 0xc4, + 0xa4, 0xae, 0xb8, 0xb9, 0xe8, 0x32, 0xce, 0x78, 0xec, 0x36, 0x06, 0x46, 0x17, 0xb2, 0x68, 0xfc, + 0xaf, 0x08, 0x2f, 0xf5, 0xdf, 0x64, 0xba, 0xc5, 0x39, 0x3f, 0xf0, 0x59, 0xf9, 0x15, 0xe8, 0x33, + 0xf8, 0x47, 0x09, 0x9d, 0xea, 0x1e, 0x09, 0x9d, 0x93, 0x6a, 0x7e, 0x19, 0xf5, 0xf7, 0x32, 0x5d, + 0xc3, 0xab, 0x1f, 0xf6, 0xcf, 0xfb, 0x7c, 0xae, 0xc3, 0xe7, 0x89, 0x49, 0xf4, 0x12, 0x8c, 0x9a, + 0x61, 0x8c, 0xd9, 0x5a, 0x18, 0x7e, 0x4a, 0x3b, 0x26, 0xc1, 0x71, 0x74, 0x5d, 0x83, 0x53, 0xbe, 0xe3, 0xa3, 0xe3, 0x7b, 0x88, 0xb9, 0xb5, 0xb6, 0x63, 0xf2, 0x71, 0xa9, 0x9d, 0x70, 0x63, 0xee, 0x63, 0xee, 0x2d, 0xc7, 0x64, 0x15, 0xe8, 0xde, 0x2a, 0xb5, 0xf4, 0xda, 0x9a, 0xed, 0xdc, 0xc5, - 0xd8, 0x9f, 0x7c, 0x70, 0x6a, 0xc7, 0x38, 0xfc, 0x8e, 0x0f, 0x26, 0x8f, 0xc1, 0xf0, 0x4a, 0xa3, - 0x4d, 0x83, 0x68, 0x8b, 0xfc, 0xae, 0x4f, 0x1b, 0x62, 0xc0, 0xe0, 0x86, 0xe4, 0x1c, 0x00, 0x12, - 0x79, 0x18, 0xd7, 0x1e, 0x2f, 0xf6, 0xb4, 0x01, 0x06, 0x59, 0x14, 0xdd, 0x75, 0x86, 0x6b, 0x35, + 0x00, 0xa1, 0x7c, 0x70, 0x6a, 0xc7, 0x38, 0xfc, 0x8e, 0x0f, 0x26, 0x8f, 0xc1, 0xf0, 0x4a, 0xa3, + 0x4d, 0x83, 0x90, 0x8c, 0xfc, 0xae, 0x4f, 0x1b, 0x62, 0xc0, 0xe0, 0x86, 0xe4, 0x1c, 0x00, 0x12, + 0x79, 0x18, 0xfc, 0x1e, 0x2f, 0xf6, 0xb4, 0x01, 0x06, 0x59, 0x14, 0xdd, 0x75, 0x86, 0x6b, 0x35, 0x17, 0x52, 0xad, 0x61, 0x5b, 0x2b, 0x35, 0x8f, 0x3a, 0x4d, 0x6c, 0x28, 0x3a, 0x33, 0x68, 0xa7, 0x90, 0x02, 0xaf, 0x4e, 0xdc, 0x19, 0xdb, 0x5a, 0x59, 0xa4, 0x4e, 0x93, 0x35, 0xf5, 0x49, 0x20, 0xa2, 0xa9, 0x0e, 0x1e, 0x7a, 0xf0, 0x8f, 0x43, 0x6f, 0x06, 0x4d, 0x7c, 0x04, 0x3f, 0x0d, 0xc1, - 0x0f, 0x2b, 0xc2, 0x20, 0x0f, 0x39, 0xc7, 0x85, 0x86, 0x2e, 0x0c, 0x1a, 0x70, 0x10, 0xca, 0xeb, - 0x14, 0x08, 0xef, 0x0a, 0xee, 0xd5, 0xad, 0x89, 0x5f, 0xea, 0x67, 0x72, 0x69, 0xc1, 0xde, 0xf7, + 0x0f, 0x2b, 0xc2, 0x20, 0x8f, 0x4b, 0xc7, 0x85, 0x86, 0x2e, 0x0c, 0x1a, 0x70, 0x10, 0xca, 0xeb, + 0x14, 0x08, 0xef, 0x0a, 0xee, 0xd5, 0xad, 0x89, 0x5f, 0xea, 0x67, 0x72, 0x69, 0x11, 0xe1, 0xf7, 0xa4, 0x68, 0xe1, 0xb4, 0x9a, 0xdd, 0xd1, 0xb4, 0x7a, 0xcc, 0x6a, 0x37, 0x6b, 0x7a, 0xab, 0x55, 0x5b, 0x36, 0x1b, 0xf8, 0xac, 0x0a, 0x17, 0x3e, 0x6d, 0xd8, 0x6a, 0x37, 0x4b, 0xad, 0xd6, 0x14, - 0x07, 0x92, 0x27, 0x60, 0x8c, 0xd1, 0x61, 0x27, 0x05, 0x94, 0x79, 0xa4, 0x64, 0x0c, 0x30, 0x66, + 0x07, 0x92, 0x27, 0x60, 0x8c, 0xd1, 0x61, 0x27, 0x05, 0x94, 0x79, 0xa4, 0x64, 0x0c, 0x30, 0xb0, 0xab, 0x4f, 0xfb, 0x10, 0xf4, 0x0b, 0x9e, 0x7c, 0xad, 0xea, 0xd5, 0xfa, 0x38, 0x33, 0x97, 0xf5, - 0x5c, 0xc0, 0x86, 0x4f, 0xae, 0xbd, 0xda, 0x80, 0x5f, 0x1e, 0x23, 0x13, 0x5b, 0xed, 0x26, 0x8f, - 0x88, 0xd5, 0x87, 0xc8, 0xe0, 0x37, 0xb9, 0x00, 0x23, 0x8c, 0x4b, 0x20, 0x30, 0x1e, 0xcc, 0xb5, + 0x5c, 0xc0, 0x86, 0x4f, 0xae, 0xbd, 0xda, 0x80, 0x5f, 0x1e, 0xc3, 0x17, 0x5b, 0xed, 0x26, 0x8f, + 0x88, 0xd5, 0x87, 0xc8, 0xe0, 0x37, 0xb9, 0x00, 0x23, 0x8c, 0x4b, 0x20, 0x30, 0x1e, 0xf1, 0xb5, 0x57, 0x8b, 0x41, 0xc9, 0x55, 0x38, 0x11, 0x81, 0x70, 0x1b, 0x94, 0x3f, 0x13, 0xe8, 0xd5, 0x52, - 0x71, 0xea, 0x97, 0x73, 0xd1, 0x10, 0xf4, 0x07, 0xd0, 0x11, 0xa7, 0xa1, 0xcf, 0x76, 0x56, 0x6a, + 0x71, 0xea, 0x97, 0x73, 0xd1, 0x38, 0xf5, 0x07, 0xd0, 0x11, 0xa7, 0xa1, 0xcf, 0x76, 0x56, 0x6a, 0x6d, 0xa7, 0x21, 0xc6, 0x5e, 0xc1, 0x76, 0x56, 0x6e, 0x39, 0x0d, 0x72, 0x12, 0x0a, 0xac, 0x77, - 0x4c, 0x43, 0x0c, 0xb1, 0x5e, 0xbd, 0xd5, 0xaa, 0x18, 0xa4, 0xc4, 0x3b, 0x04, 0x03, 0x81, 0xd6, - 0xea, 0xb8, 0xb5, 0xe7, 0x4e, 0x09, 0xbd, 0x7c, 0xc5, 0x4b, 0x20, 0xb1, 0x9f, 0x30, 0x3c, 0x28, + 0x4c, 0x43, 0x0c, 0xb1, 0x5e, 0xbd, 0xd5, 0xaa, 0x18, 0xa4, 0xc4, 0x3b, 0x04, 0xa3, 0x85, 0xd6, + 0xea, 0xb8, 0xb5, 0xe7, 0x4e, 0x09, 0xbd, 0x7c, 0xc5, 0x4b, 0x20, 0xb1, 0x9f, 0x30, 0x86, 0x28, 0x3f, 0x08, 0x88, 0xb1, 0x30, 0x70, 0x5b, 0x62, 0xf0, 0x3e, 0x89, 0xb3, 0x10, 0xc8, 0x90, 0x05, 0xdf, 0xc4, 0x18, 0xa4, 0x0c, 0x24, 0xa4, 0x6a, 0xda, 0x86, 0xb9, 0x6c, 0x52, 0xfe, 0xaa, 0xa3, 0x97, 0x5f, 0xfc, 0x26, 0xb1, 0xda, 0xa8, 0xcf, 0x64, 0x56, 0x40, 0xc8, 0x4b, 0x5c, 0x09, 0x39, 0x1d, 0xae, 0x7d, 0xbc, 0x6f, 0xb9, 0x9d, 0x16, 0x43, 0xa1, 0x66, 0x62, 0x79, 0x5c, 0x08, 0xd5, - 0xb7, 0x73, 0xc9, 0x3c, 0x04, 0x07, 0x62, 0xd7, 0x4c, 0x03, 0x88, 0x34, 0x23, 0xe1, 0xe5, 0x5a, + 0xb7, 0x73, 0xc9, 0x64, 0x05, 0x07, 0x62, 0xd7, 0x4c, 0x03, 0x88, 0x5c, 0x24, 0xe1, 0xe5, 0x5a, 0xe0, 0x71, 0x1e, 0x62, 0x3a, 0xf0, 0x90, 0xca, 0x92, 0x4b, 0xd0, 0xcf, 0xbf, 0xa8, 0x52, 0x16, 0xf6, 0x0e, 0xba, 0x88, 0xb9, 0x2d, 0x73, 0x79, 0x19, 0xfd, 0xc9, 0x02, 0x34, 0xb9, 0x00, 0x7d, 0xe5, 0xb9, 0x6a, 0xb5, 0x34, 0xe7, 0xdf, 0x14, 0xe3, 0xfb, 0x12, 0xc3, 0x72, 0x6b, 0xae, 0x6e, 0xb9, 0x9a, 0x8f, 0x24, 0x8f, 0x41, 0xa1, 0xb2, 0x80, 0x64, 0xfc, 0xd5, 0xe4, 0xe0, 0xe6, 0x46, 0xb1, 0xcf, 0x6c, 0x71, 0x2a, 0x81, 0xc2, 0x7a, 0x6f, 0x57, 0xca, 0x92, 0xbb, 0x04, 0xaf, 0xf7, 0x9e, 0x69, 0xe0, 0xb5, 0xb3, 0x16, 0xa0, 0xc9, 0xb3, 0x30, 0x54, 0xa5, 0x8e, 0xa9, 0x37, 0xe6, - 0xda, 0xb8, 0x55, 0xe4, 0x2e, 0x62, 0x63, 0x9b, 0x1b, 0xc5, 0x61, 0x17, 0xe1, 0x35, 0x0b, 0x11, - 0x5a, 0x84, 0x8c, 0x9c, 0x85, 0xfc, 0xb4, 0x69, 0xf9, 0x4f, 0x18, 0xd0, 0xc7, 0x7d, 0xd5, 0xb4, - 0x3c, 0x0d, 0xa1, 0xea, 0x7f, 0xcf, 0xa6, 0x27, 0x73, 0x38, 0x80, 0xe1, 0xb8, 0xcb, 0x9b, 0xde, - 0x98, 0x12, 0xe4, 0xf7, 0xa0, 0x04, 0xcb, 0x70, 0xac, 0x64, 0x34, 0x4d, 0xab, 0x84, 0x3f, 0xdd, - 0xd9, 0xa9, 0x12, 0x0e, 0x6f, 0xe9, 0x09, 0x5d, 0x0c, 0x2d, 0xbe, 0x87, 0x87, 0xca, 0x65, 0xa8, - 0x9a, 0xce, 0x71, 0xb5, 0xe6, 0xb2, 0x5e, 0xab, 0xf3, 0x3c, 0x08, 0x5a, 0x9c, 0xa9, 0xfa, 0x7d, - 0xd9, 0x2d, 0xf2, 0x4f, 0x3c, 0x88, 0xd2, 0x57, 0xbf, 0x90, 0xed, 0x9e, 0x02, 0xe4, 0x81, 0x14, - 0xca, 0x1f, 0x64, 0x53, 0x12, 0x72, 0xec, 0x49, 0x12, 0x97, 0xa0, 0x9f, 0xb3, 0x09, 0x5c, 0x6d, - 0x71, 0xc6, 0xe1, 0xca, 0x8a, 0x33, 0x9d, 0x8f, 0x26, 0x73, 0x70, 0xa2, 0xb4, 0xbc, 0x4c, 0xeb, - 0x5e, 0x18, 0x34, 0x79, 0x2e, 0x0c, 0x94, 0xca, 0x23, 0xcd, 0x0a, 0x7c, 0x18, 0x74, 0x19, 0x03, - 0x82, 0xa4, 0x96, 0x23, 0x8b, 0x70, 0x2a, 0x0e, 0xaf, 0x72, 0x33, 0x3d, 0x2f, 0x05, 0x9f, 0x4d, - 0x70, 0xe4, 0xff, 0x69, 0x1d, 0xca, 0xa6, 0xb5, 0x12, 0xa7, 0xd3, 0xde, 0x6e, 0xad, 0xc4, 0xb9, - 0x35, 0xb5, 0x9c, 0xfa, 0x95, 0x9c, 0x9c, 0xb7, 0xe4, 0xc1, 0x75, 0x8a, 0xba, 0x16, 0x71, 0x85, - 0xde, 0xee, 0x90, 0x79, 0x56, 0x44, 0xf9, 0x30, 0xda, 0x8e, 0xef, 0x35, 0x18, 0x44, 0x19, 0x40, - 0xa0, 0xec, 0xff, 0x17, 0x50, 0x92, 0x0a, 0xe4, 0x4b, 0xce, 0x0a, 0x37, 0x41, 0xb7, 0x7a, 0xf8, - 0xa4, 0x3b, 0x2b, 0x6e, 0xfa, 0xc3, 0x27, 0xc6, 0xe2, 0x89, 0x59, 0x1e, 0xd2, 0xf7, 0xa6, 0x69, - 0x19, 0xe4, 0x21, 0x38, 0x79, 0xab, 0x3a, 0xa9, 0xd5, 0x6e, 0x56, 0xe6, 0xca, 0xb5, 0x5b, 0x73, - 0xd5, 0x85, 0xc9, 0x89, 0xca, 0x54, 0x65, 0xb2, 0x3c, 0xda, 0x43, 0x8e, 0xc3, 0xb1, 0x10, 0x35, - 0x7d, 0x6b, 0xb6, 0x34, 0x37, 0x9a, 0x21, 0x63, 0x30, 0x1c, 0x02, 0xc7, 0xe7, 0x17, 0x47, 0xb3, - 0x4f, 0xbc, 0x17, 0x06, 0x71, 0xcf, 0xc2, 0xe7, 0x6f, 0x32, 0x04, 0xfd, 0xf3, 0xe3, 0xd5, 0x49, - 0xed, 0x36, 0x32, 0x01, 0x28, 0x94, 0x27, 0xe7, 0x18, 0xc3, 0xcc, 0x13, 0xff, 0x2b, 0x03, 0x50, - 0x9d, 0x5a, 0x5c, 0x10, 0x84, 0x83, 0xd0, 0x57, 0x99, 0xbb, 0x5d, 0x9a, 0xa9, 0x30, 0xba, 0x7e, - 0xc8, 0xcf, 0x2f, 0x4c, 0xb2, 0x1a, 0x06, 0xa0, 0x77, 0x62, 0x66, 0xbe, 0x3a, 0x39, 0x9a, 0x65, - 0x40, 0x6d, 0xb2, 0x54, 0x1e, 0xcd, 0x31, 0xe0, 0x1d, 0xad, 0xb2, 0x38, 0x39, 0x9a, 0x67, 0x7f, - 0xce, 0x54, 0x17, 0x4b, 0x8b, 0xa3, 0xbd, 0xec, 0xcf, 0x29, 0xfc, 0xb3, 0xc0, 0x98, 0x55, 0x27, - 0x17, 0xf1, 0x47, 0x1f, 0x6b, 0xc2, 0x94, 0xff, 0xab, 0x9f, 0xa1, 0x18, 0xeb, 0x72, 0x45, 0x1b, - 0x1d, 0x60, 0x3f, 0x18, 0x4b, 0xf6, 0x03, 0x58, 0xe3, 0xb4, 0xc9, 0xd9, 0xf9, 0xdb, 0x93, 0xa3, - 0x83, 0x8c, 0xd7, 0xec, 0x4d, 0x06, 0x1e, 0x62, 0x7f, 0x6a, 0xb3, 0xec, 0xcf, 0x61, 0xc6, 0x49, - 0x9b, 0x2c, 0xcd, 0x2c, 0x94, 0x16, 0xa7, 0x47, 0x47, 0x58, 0x7b, 0x90, 0xe7, 0x31, 0x5e, 0x72, - 0xae, 0x34, 0x3b, 0x39, 0x3a, 0x2a, 0x68, 0xca, 0x33, 0x95, 0xb9, 0x9b, 0xa3, 0x63, 0xd8, 0x90, - 0x37, 0x66, 0xf1, 0x07, 0x61, 0x05, 0xf0, 0xaf, 0xe3, 0x4f, 0x7c, 0x14, 0x0a, 0xf3, 0x55, 0xb4, - 0x52, 0x4e, 0xc3, 0xf1, 0xf9, 0x6a, 0x6d, 0xf1, 0x8d, 0x85, 0xc9, 0x98, 0xbc, 0xc7, 0x60, 0xd8, - 0x47, 0xcc, 0x54, 0xe6, 0x6e, 0x7d, 0x88, 0x4b, 0xdb, 0x07, 0xcd, 0x96, 0x26, 0xe6, 0xab, 0xa3, - 0x59, 0xd6, 0x2b, 0x3e, 0xe8, 0x4e, 0x65, 0xae, 0x3c, 0x7f, 0xa7, 0x3a, 0x9a, 0x7b, 0xe2, 0x9e, - 0x9f, 0xfb, 0x73, 0xde, 0x31, 0x57, 0x4c, 0x8b, 0x9c, 0x83, 0x87, 0xca, 0x93, 0xb7, 0x2b, 0x13, - 0x93, 0xb5, 0x79, 0xad, 0x72, 0xbd, 0x32, 0x17, 0xab, 0xe9, 0x24, 0x8c, 0x45, 0xd1, 0xa5, 0x85, - 0xca, 0x68, 0x86, 0x9c, 0x02, 0x12, 0x05, 0xdf, 0x28, 0xcd, 0x4e, 0x8d, 0x66, 0x89, 0x02, 0x27, - 0xa2, 0xf0, 0xca, 0xdc, 0xe2, 0xad, 0xb9, 0xc9, 0xd1, 0xdc, 0x13, 0x3f, 0x91, 0x81, 0x93, 0xa9, - 0x8f, 0xe6, 0x89, 0x0a, 0xe7, 0x27, 0x67, 0x4a, 0xd5, 0xc5, 0xca, 0x44, 0x75, 0xb2, 0xa4, 0x4d, - 0x4c, 0xd7, 0x26, 0x4a, 0x8b, 0x93, 0xd7, 0xe7, 0xb5, 0x37, 0x6a, 0xd7, 0x27, 0xe7, 0x26, 0xb5, - 0xd2, 0xcc, 0x68, 0x0f, 0x79, 0x0c, 0x8a, 0x1d, 0x68, 0xaa, 0x93, 0x13, 0xb7, 0xb4, 0xca, 0xe2, - 0x1b, 0xa3, 0x19, 0xf2, 0x28, 0x9c, 0xeb, 0x48, 0xc4, 0x7e, 0x8f, 0x66, 0xc9, 0x79, 0x38, 0xd3, - 0x89, 0xe4, 0xf5, 0x99, 0xd1, 0xdc, 0x13, 0x3f, 0x98, 0x01, 0x92, 0x7c, 0xf5, 0x4c, 0x1e, 0x81, - 0xb3, 0x4c, 0x2f, 0x6a, 0x9d, 0x1b, 0xf8, 0x28, 0x9c, 0x4b, 0xa5, 0x90, 0x9a, 0x57, 0x84, 0x87, - 0x3b, 0x90, 0x88, 0xc6, 0x9d, 0x05, 0x25, 0x9d, 0x00, 0x9b, 0xf6, 0x0b, 0x19, 0x38, 0x99, 0x6a, - 0x32, 0x91, 0x8b, 0xf0, 0x9e, 0x52, 0x79, 0x96, 0xf5, 0xcd, 0xc4, 0x62, 0x65, 0x7e, 0xae, 0x5a, - 0x9b, 0x9d, 0x2a, 0xd5, 0x98, 0xf6, 0xdd, 0xaa, 0xc6, 0x7a, 0xf3, 0x02, 0xa8, 0x5d, 0x28, 0x27, - 0xa6, 0x4b, 0x73, 0xd7, 0xd9, 0xf0, 0x23, 0xef, 0x81, 0x47, 0x3a, 0xd2, 0x4d, 0xce, 0x95, 0xc6, - 0x67, 0x26, 0xcb, 0xa3, 0x59, 0xf2, 0x38, 0x3c, 0xda, 0x91, 0xaa, 0x5c, 0xa9, 0x72, 0xb2, 0xdc, - 0x78, 0xf9, 0xed, 0x7f, 0x7f, 0xbe, 0xe7, 0xed, 0x6f, 0x9c, 0xcf, 0xfc, 0xc6, 0x37, 0xce, 0x67, - 0x7e, 0xef, 0x1b, 0xe7, 0x33, 0x1f, 0xbe, 0xba, 0x93, 0xd7, 0xec, 0x7c, 0xa2, 0x5c, 0x2a, 0xe0, - 0xf4, 0xf5, 0xcc, 0xff, 0x0b, 0x00, 0x00, 0xff, 0xff, 0x42, 0xa5, 0x51, 0xd7, 0x8d, 0x55, 0x01, - 0x00, + 0xda, 0xb8, 0x55, 0x94, 0x42, 0x29, 0xba, 0x08, 0xaf, 0x59, 0x88, 0xd0, 0x22, 0x64, 0xe4, 0x2c, + 0xe4, 0xa7, 0x4d, 0xcb, 0x7f, 0xc2, 0x80, 0x3e, 0xee, 0xab, 0xa6, 0xe5, 0x69, 0x08, 0x55, 0xff, + 0x5b, 0x36, 0x3d, 0xe3, 0xc3, 0x01, 0x0c, 0xc7, 0x5d, 0xde, 0xf4, 0xc6, 0x94, 0x20, 0xbf, 0x07, + 0x25, 0x58, 0x86, 0x63, 0x25, 0xa3, 0x69, 0x5a, 0x25, 0xfc, 0xe9, 0xce, 0x4e, 0x95, 0x70, 0x78, + 0x4b, 0x4f, 0xe8, 0x62, 0x68, 0xf1, 0x3d, 0x3c, 0x9e, 0x2e, 0x43, 0xd5, 0x74, 0x8e, 0xab, 0x35, + 0x97, 0xf5, 0x5a, 0x9d, 0x27, 0x4b, 0xd0, 0xe2, 0x4c, 0xd5, 0xef, 0xcb, 0x6e, 0x91, 0xa4, 0xe2, + 0x41, 0x94, 0xbe, 0xfa, 0x85, 0x6c, 0xf7, 0x3c, 0x21, 0x0f, 0xa4, 0x50, 0xfe, 0x30, 0x9b, 0x92, + 0xb5, 0x63, 0x4f, 0x92, 0xb8, 0x04, 0xfd, 0x9c, 0x4d, 0xe0, 0x6a, 0x8b, 0x33, 0x0e, 0x57, 0x56, + 0x9c, 0xe9, 0x7c, 0x34, 0x99, 0x83, 0x13, 0xa5, 0xe5, 0x65, 0x5a, 0xf7, 0xc2, 0xc8, 0xca, 0x73, + 0x61, 0xa0, 0x54, 0x1e, 0x8e, 0x56, 0xe0, 0xc3, 0xc8, 0xcc, 0x18, 0x10, 0x24, 0xb5, 0x1c, 0x59, + 0x84, 0x53, 0x71, 0x78, 0x95, 0x9b, 0xe9, 0x79, 0x29, 0x42, 0x6d, 0x82, 0x23, 0xff, 0x4f, 0xeb, + 0x50, 0x36, 0xad, 0x95, 0x38, 0x9d, 0xf6, 0x76, 0x6b, 0x25, 0xce, 0xad, 0xa9, 0xe5, 0xd4, 0xaf, + 0xe4, 0xe4, 0xe4, 0x26, 0x0f, 0xae, 0x53, 0xd4, 0xb5, 0x88, 0x2b, 0xf4, 0x76, 0x87, 0xcc, 0xb3, + 0x22, 0xca, 0x87, 0xd1, 0x76, 0x7c, 0xaf, 0xc1, 0x20, 0xca, 0x00, 0x02, 0x65, 0xff, 0xbf, 0x80, + 0x92, 0x54, 0x20, 0x5f, 0x72, 0x56, 0xb8, 0x09, 0xba, 0xd5, 0xc3, 0x27, 0xdd, 0x59, 0x71, 0xd3, + 0x1f, 0x3e, 0x31, 0x16, 0x4f, 0xcc, 0xf2, 0x90, 0xbe, 0x37, 0x4d, 0xcb, 0x20, 0x0f, 0xc1, 0xc9, + 0x5b, 0xd5, 0x49, 0xad, 0x76, 0xb3, 0x32, 0x57, 0xae, 0xdd, 0x9a, 0xab, 0x2e, 0x4c, 0x4e, 0x54, + 0xa6, 0x2a, 0x93, 0xe5, 0xd1, 0x1e, 0x72, 0x1c, 0x8e, 0x85, 0xa8, 0xe9, 0x5b, 0xb3, 0xa5, 0xb9, + 0xd1, 0x0c, 0x19, 0x83, 0xe1, 0x10, 0x38, 0x3e, 0xbf, 0x38, 0x9a, 0x7d, 0xe2, 0xbd, 0x30, 0x88, + 0x7b, 0x16, 0x3e, 0x7f, 0x93, 0x21, 0xe8, 0x9f, 0x1f, 0xaf, 0x4e, 0x6a, 0xb7, 0x91, 0x09, 0x40, + 0xa1, 0x3c, 0x39, 0xc7, 0x18, 0x66, 0x9e, 0xf8, 0x9f, 0x19, 0x80, 0xea, 0xd4, 0xe2, 0x82, 0x20, + 0x1c, 0x84, 0xbe, 0xca, 0xdc, 0xed, 0xd2, 0x4c, 0x85, 0xd1, 0xf5, 0x43, 0x7e, 0x7e, 0x61, 0x92, + 0xd5, 0x30, 0x00, 0xbd, 0x13, 0x33, 0xf3, 0xd5, 0xc9, 0xd1, 0x2c, 0x03, 0x6a, 0x93, 0xa5, 0xf2, + 0x68, 0x8e, 0x01, 0xef, 0x68, 0x95, 0xc5, 0xc9, 0xd1, 0x3c, 0xfb, 0x73, 0xa6, 0xba, 0x58, 0x5a, + 0x1c, 0xed, 0x65, 0x7f, 0x4e, 0xe1, 0x9f, 0x05, 0xc6, 0xac, 0x3a, 0xb9, 0x88, 0x3f, 0xfa, 0x58, + 0x13, 0xa6, 0xfc, 0x5f, 0xfd, 0x0c, 0xc5, 0x58, 0x97, 0x2b, 0xda, 0xe8, 0x00, 0xfb, 0xc1, 0x58, + 0xb2, 0x1f, 0xc0, 0x1a, 0xa7, 0x4d, 0xce, 0xce, 0xdf, 0x9e, 0x1c, 0x1d, 0x64, 0xbc, 0x66, 0x6f, + 0x32, 0xf0, 0x10, 0xfb, 0x53, 0x9b, 0x65, 0x7f, 0x0e, 0x33, 0x4e, 0xda, 0x64, 0x69, 0x66, 0xa1, + 0xb4, 0x38, 0x3d, 0x3a, 0xc2, 0xda, 0x83, 0x3c, 0x8f, 0xf1, 0x92, 0x73, 0xa5, 0xd9, 0xc9, 0xd1, + 0x51, 0x41, 0x53, 0x9e, 0xa9, 0xcc, 0xdd, 0x1c, 0x1d, 0xc3, 0x86, 0xbc, 0x31, 0x8b, 0x3f, 0x08, + 0x2b, 0x80, 0x7f, 0x1d, 0x7f, 0xe2, 0xa3, 0x50, 0x98, 0xaf, 0xa2, 0x95, 0x72, 0x1a, 0x8e, 0xcf, + 0x57, 0x6b, 0x8b, 0x6f, 0x2c, 0x4c, 0xc6, 0xe4, 0x3d, 0x06, 0xc3, 0x3e, 0x62, 0xa6, 0x32, 0x77, + 0xeb, 0x43, 0x5c, 0xda, 0x3e, 0x68, 0xb6, 0x34, 0x31, 0x5f, 0x1d, 0xcd, 0xb2, 0x5e, 0xf1, 0x41, + 0x77, 0x2a, 0x73, 0xe5, 0xf9, 0x3b, 0xd5, 0xd1, 0xdc, 0x13, 0xf7, 0xfc, 0x04, 0xa1, 0xf3, 0x8e, + 0xb9, 0x62, 0x5a, 0xe4, 0x1c, 0x3c, 0x54, 0x9e, 0xbc, 0x5d, 0x99, 0x98, 0xac, 0xcd, 0x6b, 0x95, + 0xeb, 0x95, 0xb9, 0x58, 0x4d, 0x27, 0x61, 0x2c, 0x8a, 0x2e, 0x2d, 0x54, 0x46, 0x33, 0xe4, 0x14, + 0x90, 0x28, 0xf8, 0x46, 0x69, 0x76, 0x6a, 0x34, 0x4b, 0x14, 0x38, 0x11, 0x85, 0x57, 0xe6, 0x16, + 0x6f, 0xcd, 0x4d, 0x8e, 0xe6, 0x9e, 0xf8, 0x89, 0x0c, 0x9c, 0x4c, 0x7d, 0x34, 0x4f, 0x54, 0x38, + 0x3f, 0x39, 0x53, 0xaa, 0x2e, 0x56, 0x26, 0xaa, 0x93, 0x25, 0x6d, 0x62, 0xba, 0x36, 0x51, 0x5a, + 0x9c, 0xbc, 0x3e, 0xaf, 0xbd, 0x51, 0xbb, 0x3e, 0x39, 0x37, 0xa9, 0x95, 0x66, 0x46, 0x7b, 0xc8, + 0x63, 0x50, 0xec, 0x40, 0x53, 0x9d, 0x9c, 0xb8, 0xa5, 0x55, 0x16, 0xdf, 0x18, 0xcd, 0x90, 0x47, + 0xe1, 0x5c, 0x47, 0x22, 0xf6, 0x7b, 0x34, 0x4b, 0xce, 0xc3, 0x99, 0x4e, 0x24, 0xaf, 0xcf, 0x8c, + 0xe6, 0x9e, 0xf8, 0xc1, 0x0c, 0x90, 0xe4, 0xab, 0x67, 0xf2, 0x08, 0x9c, 0x65, 0x7a, 0x51, 0xeb, + 0xdc, 0xc0, 0x47, 0xe1, 0x5c, 0x2a, 0x85, 0xd4, 0xbc, 0x22, 0x3c, 0xdc, 0x81, 0x44, 0x34, 0xee, + 0x2c, 0x28, 0xe9, 0x04, 0xd8, 0xb4, 0x5f, 0xcc, 0xc0, 0xc9, 0x54, 0x93, 0x89, 0x5c, 0x84, 0xf7, + 0x94, 0xca, 0xb3, 0xac, 0x6f, 0x26, 0x16, 0x2b, 0xf3, 0x73, 0xd5, 0xda, 0xec, 0x54, 0xa9, 0xc6, + 0xb4, 0xef, 0x56, 0x35, 0xd6, 0x9b, 0x17, 0x40, 0xed, 0x42, 0x39, 0x31, 0x5d, 0x9a, 0xbb, 0xce, + 0x86, 0x1f, 0x79, 0x0f, 0x3c, 0xd2, 0x91, 0x6e, 0x72, 0xae, 0x34, 0x3e, 0x33, 0x59, 0x1e, 0xcd, + 0x92, 0xc7, 0xe1, 0xd1, 0x8e, 0x54, 0xe5, 0x4a, 0x95, 0x93, 0xe5, 0xc6, 0xcb, 0x6f, 0xff, 0xbb, + 0xf3, 0x3d, 0x6f, 0x7f, 0xe3, 0x7c, 0xe6, 0x37, 0xbf, 0x71, 0x3e, 0xf3, 0xfb, 0xdf, 0x38, 0x9f, + 0xf9, 0xf0, 0xd5, 0x9d, 0xbc, 0x66, 0xe7, 0x13, 0xe5, 0x52, 0x01, 0xa7, 0xaf, 0x67, 0xfe, 0x6f, + 0x00, 0x00, 0x00, 0xff, 0xff, 0x63, 0x10, 0x84, 0x17, 0xb2, 0x55, 0x01, 0x00, } func (m *Metadata) Marshal() (dAtA []byte, err error) { @@ -28931,6 +28933,13 @@ func (m *RouteToApp) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.URI) > 0 { + i -= len(m.URI) + copy(dAtA[i:], m.URI) + i = encodeVarintEvents(dAtA, i, uint64(len(m.URI))) + i-- + dAtA[i] = 0x42 + } if len(m.GCPServiceAccount) > 0 { i -= len(m.GCPServiceAccount) copy(dAtA[i:], m.GCPServiceAccount) @@ -39887,6 +39896,10 @@ func (m *RouteToApp) Size() (n int) { if l > 0 { n += 1 + l + sovEvents(uint64(l)) } + l = len(m.URI) + if l > 0 { + n += 1 + l + sovEvents(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -79645,6 +79658,38 @@ func (m *RouteToApp) Unmarshal(dAtA []byte) error { } m.GCPServiceAccount = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field URI", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.URI = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipEvents(dAtA[iNdEx:]) diff --git a/integrations/operator/crdgen/testdata/protofiles/teleport/legacy/types/events/events.proto b/integrations/operator/crdgen/testdata/protofiles/teleport/legacy/types/events/events.proto index a47222154eaa8..704e84c47d7a8 100644 --- a/integrations/operator/crdgen/testdata/protofiles/teleport/legacy/types/events/events.proto +++ b/integrations/operator/crdgen/testdata/protofiles/teleport/legacy/types/events/events.proto @@ -3562,6 +3562,8 @@ message RouteToApp { string AzureIdentity = 6 [(gogoproto.jsontag) = "azure_identity,omitempty"]; // GCPServiceAccount is the GCP service account to assume when accessing GCP API. string GCPServiceAccount = 7 [(gogoproto.jsontag) = "gcp_service_account,omitempty"]; + // URI is the application URI. + string URI = 8 [(gogoproto.jsontag) = "uri,omitempty"]; } // RouteToDatabase combines parameters for database service routing information. diff --git a/lib/auth/auth.go b/lib/auth/auth.go index dd13e284b2f32..10a3ea1b68e88 100644 --- a/lib/auth/auth.go +++ b/lib/auth/auth.go @@ -1964,6 +1964,8 @@ type certRequest struct { appClusterName string // appName is the name of the application to generate cert for. appName string + // appURI is the URI of the app. This is the internal endpoint where the application is running and isn't user-facing. + appURI string // awsRoleARN is the role ARN to generate certificate for. awsRoleARN string // azureIdentity is the Azure identity to generate certificate for. @@ -3027,6 +3029,7 @@ func generateCert(ctx context.Context, a *Server, req certRequest, caType types. KubernetesUsers: kubeUsers, RouteToApp: tlsca.RouteToApp{ SessionID: req.appSessionID, + URI: req.appURI, PublicAddr: req.appPublicAddr, ClusterName: req.appClusterName, Name: req.appName, diff --git a/lib/auth/auth_with_roles.go b/lib/auth/auth_with_roles.go index 6085711cc821b..7605176a34c84 100644 --- a/lib/auth/auth_with_roles.go +++ b/lib/auth/auth_with_roles.go @@ -3185,6 +3185,8 @@ func (a *ServerWithRoles) generateUserCerts(ctx context.Context, req proto.UserC GCPServiceAccount: req.RouteToApp.GCPServiceAccount, MFAVerified: verifiedMFADeviceID, DeviceExtensions: DeviceExtensions(a.context.Identity.GetIdentity().DeviceExtensions), + AppName: req.RouteToApp.Name, + AppURI: req.RouteToApp.URI, }) if err != nil { return nil, trace.Wrap(err) @@ -3236,6 +3238,7 @@ func (a *ServerWithRoles) generateUserCerts(ctx context.Context, req proto.UserC appSessionID: appSessionID, appName: req.RouteToApp.Name, appPublicAddr: req.RouteToApp.PublicAddr, + appURI: req.RouteToApp.URI, appClusterName: req.RouteToApp.ClusterName, awsRoleARN: req.RouteToApp.AWSRoleARN, azureIdentity: req.RouteToApp.AzureIdentity, diff --git a/lib/auth/authclient/clt.go b/lib/auth/authclient/clt.go index d3faeac1b1ac7..6f2d930582542 100644 --- a/lib/auth/authclient/clt.go +++ b/lib/auth/authclient/clt.go @@ -1730,6 +1730,8 @@ func TryCreateAppSessionForClientCertV15(ctx context.Context, client CreateAppSe AWSRoleARN: routeToApp.AWSRoleARN, AzureIdentity: routeToApp.AzureIdentity, GCPServiceAccount: routeToApp.GCPServiceAccount, + URI: routeToApp.URI, + AppName: routeToApp.Name, }) if err != nil { return "", trace.Wrap(err) diff --git a/lib/auth/sessions.go b/lib/auth/sessions.go index c81a861b791be..9b49071884ee8 100644 --- a/lib/auth/sessions.go +++ b/lib/auth/sessions.go @@ -29,9 +29,11 @@ import ( apidefaults "github.com/gravitational/teleport/api/defaults" mfav1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/mfa/v1" "github.com/gravitational/teleport/api/types" + apievents "github.com/gravitational/teleport/api/types/events" "github.com/gravitational/teleport/api/utils/keys" "github.com/gravitational/teleport/lib/auth/native" "github.com/gravitational/teleport/lib/defaults" + "github.com/gravitational/teleport/lib/events" "github.com/gravitational/teleport/lib/jwt" "github.com/gravitational/teleport/lib/modules" "github.com/gravitational/teleport/lib/services" @@ -267,6 +269,14 @@ type NewAppSessionRequest struct { MFAVerified string // DeviceExtensions holds device-aware user certificate extensions. DeviceExtensions DeviceExtensions + // AppName is the name of the app. + AppName string + // AppURI is the URI of the app. This is the internal endpoint where the application is running and isn't user-facing. + AppURI string + // Identity is the identity of the user. + Identity tlsca.Identity + // ClientAddr is a client (user's) address. + ClientAddr string } // CreateAppSession creates and inserts a services.WebSession into the @@ -325,6 +335,8 @@ func (a *Server) CreateAppSession(ctx context.Context, req *proto.CreateAppSessi AzureIdentity: req.AzureIdentity, GCPServiceAccount: req.GCPServiceAccount, MFAVerified: verifiedMFADeviceID, + AppName: req.AppName, + AppURI: req.URI, DeviceExtensions: DeviceExtensions(identity.DeviceExtensions), }) if err != nil { @@ -430,6 +442,42 @@ func (a *Server) CreateAppSessionFromReq(ctx context.Context, req NewAppSessionR } log.Debugf("Generated application web session for %v with TTL %v.", req.User, req.SessionTTL) UserLoginCount.Inc() + + userMetadata := req.Identity.GetUserMetadata() + userMetadata.User = session.GetUser() + userMetadata.AWSRoleARN = req.AWSRoleARN + + err = a.emitter.EmitAuditEvent(a.closeCtx, &apievents.AppSessionStart{ + Metadata: apievents.Metadata{ + Type: events.AppSessionStartEvent, + Code: events.AppSessionStartCode, + ClusterName: req.ClusterName, + }, + ServerMetadata: apievents.ServerMetadata{ + ServerVersion: teleport.Version, + ServerID: a.ServerID, + ServerNamespace: apidefaults.Namespace, + }, + SessionMetadata: apievents.SessionMetadata{ + SessionID: session.GetName(), + WithMFA: req.MFAVerified, + PrivateKeyPolicy: string(req.Identity.PrivateKeyPolicy), + }, + UserMetadata: userMetadata, + ConnectionMetadata: apievents.ConnectionMetadata{ + RemoteAddr: req.ClientAddr, + }, + PublicAddr: req.PublicAddr, + AppMetadata: apievents.AppMetadata{ + AppURI: req.AppURI, + AppPublicAddr: req.PublicAddr, + AppName: req.AppName, + }, + }) + if err != nil { + log.WithError(err).Warn("Failed to emit app session start event") + } + return session, nil } diff --git a/lib/teleterm/clusters/cluster_apps.go b/lib/teleterm/clusters/cluster_apps.go index 65f49e2ad377d..035b27a165862 100644 --- a/lib/teleterm/clusters/cluster_apps.go +++ b/lib/teleterm/clusters/cluster_apps.go @@ -169,6 +169,7 @@ func (c *Cluster) ReissueAppCert(ctx context.Context, clusterClient *client.Clus AWSRoleARN: "", AzureIdentity: "", GCPServiceAccount: "", + URI: app.GetURI(), } // TODO (Joerger): DELETE IN v17.0.0 diff --git a/lib/tlsca/ca.go b/lib/tlsca/ca.go index ff67923ae8ae6..b7dc63b39b843 100644 --- a/lib/tlsca/ca.go +++ b/lib/tlsca/ca.go @@ -228,6 +228,9 @@ type RouteToApp struct { // GCPServiceAccount is the GCP service account to assume when accessing GCP API. GCPServiceAccount string + + // URI is the URI of the app. This is the internal endpoint where the application is running and isn't user-facing. + URI string } // RouteToDatabase contains routing information for databases. @@ -304,6 +307,7 @@ func (id *Identity) GetEventIdentity() events.Identity { AWSRoleARN: id.RouteToApp.AWSRoleARN, AzureIdentity: id.RouteToApp.AzureIdentity, GCPServiceAccount: id.RouteToApp.GCPServiceAccount, + URI: id.RouteToApp.URI, } } var routeToDatabase *events.RouteToDatabase diff --git a/lib/web/apps.go b/lib/web/apps.go index c2678c6e7821b..7366cdbed5135 100644 --- a/lib/web/apps.go +++ b/lib/web/apps.go @@ -29,17 +29,13 @@ import ( "github.com/gravitational/trace" "github.com/julienschmidt/httprouter" - "github.com/gravitational/teleport" apiclient "github.com/gravitational/teleport/api/client" "github.com/gravitational/teleport/api/client/proto" apidefaults "github.com/gravitational/teleport/api/defaults" "github.com/gravitational/teleport/api/types" - apievents "github.com/gravitational/teleport/api/types/events" wantypes "github.com/gravitational/teleport/lib/auth/webauthntypes" - "github.com/gravitational/teleport/lib/events" "github.com/gravitational/teleport/lib/httplib" "github.com/gravitational/teleport/lib/reversetunnelclient" - "github.com/gravitational/teleport/lib/tlsca" "github.com/gravitational/teleport/lib/utils" "github.com/gravitational/teleport/lib/web/app" "github.com/gravitational/teleport/lib/web/ui" @@ -260,58 +256,14 @@ func (h *Handler) createAppSession(w http.ResponseWriter, r *http.Request, p htt ClusterName: result.ClusterName, AWSRoleARN: req.AWSRole, MFAResponse: mfaProtoResponse, + AppName: result.App.GetName(), + URI: result.App.GetURI(), + ClientAddr: r.RemoteAddr, }) if err != nil { return nil, trace.Wrap(err) } - // Extract the identity of the user. - certificate, err := tlsca.ParseCertificatePEM(ws.GetTLSCert()) - if err != nil { - return nil, trace.Wrap(err) - } - identity, err := tlsca.FromSubject(certificate.Subject, certificate.NotAfter) - if err != nil { - return nil, trace.Wrap(err) - } - - userMetadata := identity.GetUserMetadata() - userMetadata.User = ws.GetUser() - userMetadata.AWSRoleARN = req.AWSRole - - // Now that the certificate has been issued, emit a "new session created" - // for all events associated with this certificate. - appSessionStartEvent := &apievents.AppSessionStart{ - Metadata: apievents.Metadata{ - Type: events.AppSessionStartEvent, - Code: events.AppSessionStartCode, - ClusterName: identity.RouteToApp.ClusterName, - }, - ServerMetadata: apievents.ServerMetadata{ - ServerVersion: teleport.Version, - ServerID: h.cfg.HostUUID, - ServerNamespace: apidefaults.Namespace, - }, - SessionMetadata: apievents.SessionMetadata{ - SessionID: identity.RouteToApp.SessionID, - WithMFA: identity.MFAVerified, - PrivateKeyPolicy: string(identity.PrivateKeyPolicy), - }, - UserMetadata: userMetadata, - ConnectionMetadata: apievents.ConnectionMetadata{ - RemoteAddr: r.RemoteAddr, - }, - PublicAddr: identity.RouteToApp.PublicAddr, - AppMetadata: apievents.AppMetadata{ - AppURI: result.App.GetURI(), - AppPublicAddr: result.App.GetPublicAddr(), - AppName: result.App.GetName(), - }, - } - if err := h.cfg.Emitter.EmitAuditEvent(h.cfg.Context, appSessionStartEvent); err != nil { - return nil, trace.Wrap(err) - } - return &CreateAppSessionResponse{ CookieValue: ws.GetName(), SubjectCookieValue: ws.GetBearerToken(), diff --git a/tool/tctl/common/auth_command.go b/tool/tctl/common/auth_command.go index 255c6922c68ee..bfe6edc3c9f2c 100644 --- a/tool/tctl/common/auth_command.go +++ b/tool/tctl/common/auth_command.go @@ -895,6 +895,7 @@ func (a *AuthCommand) generateUserKeys(ctx context.Context, clusterAPI certifica Name: a.appName, PublicAddr: server.GetApp().GetPublicAddr(), ClusterName: a.leafCluster, + URI: server.GetApp().GetURI(), } // TODO (Joerger): DELETE IN v17.0.0 diff --git a/tool/tsh/common/app.go b/tool/tsh/common/app.go index d55dd89f1bc62..eb7964e43a33f 100644 --- a/tool/tsh/common/app.go +++ b/tool/tsh/common/app.go @@ -345,6 +345,7 @@ func onAppConfig(cf *CLIConf) error { AWSRoleARN: app.AWSRoleARN, AzureIdentity: app.AzureIdentity, GCPServiceAccount: app.GCPServiceAccount, + URI: app.GetURI(), } conf, err := formatAppConfig(tc, profile, routeToApp, cf.Format) if err != nil { @@ -528,6 +529,7 @@ func getAppInfo(cf *CLIConf, tc *client.TeleportClient, matchRouteToApp func(tls Name: app.GetName(), PublicAddr: app.GetPublicAddr(), ClusterName: tc.SiteName, + URI: app.GetURI(), }, app: app, } @@ -655,5 +657,6 @@ func tlscaRouteToAppToProto(route tlsca.RouteToApp) proto.RouteToApp { AWSRoleARN: route.AWSRoleARN, AzureIdentity: route.AzureIdentity, GCPServiceAccount: route.GCPServiceAccount, + URI: route.URI, } } diff --git a/tool/tsh/common/app_test.go b/tool/tsh/common/app_test.go index 72b13180c59f9..7ffe458a7ba87 100644 --- a/tool/tsh/common/app_test.go +++ b/tool/tsh/common/app_test.go @@ -37,10 +37,12 @@ import ( "github.com/gravitational/teleport/api/client/proto" "github.com/gravitational/teleport/api/constants" "github.com/gravitational/teleport/api/types" + apievents "github.com/gravitational/teleport/api/types/events" "github.com/gravitational/teleport/lib" "github.com/gravitational/teleport/lib/asciitable" "github.com/gravitational/teleport/lib/auth/mocku2f" "github.com/gravitational/teleport/lib/client" + "github.com/gravitational/teleport/lib/events" "github.com/gravitational/teleport/lib/service/servicecfg" testserver "github.com/gravitational/teleport/tool/teleport/testenv" ) @@ -261,6 +263,26 @@ func TestAppCommands(t *testing.T) { assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, app.name, resp.Header.Get("Server")) + // Verify that the app.session.start event was emitted. + if app.cluster == "root" { + require.EventuallyWithT(t, func(t *assert.CollectT) { + now := time.Now() + ctx := context.Background() + es, _, err := rootAuthServer.SearchEvents(ctx, events.SearchEventsRequest{ + From: now.Add(-time.Hour), + To: now.Add(time.Hour), + Order: types.EventOrderDescending, + EventTypes: []string{events.AppSessionStartEvent}, + }) + assert.NoError(t, err) + + for _, e := range es { + assert.Equal(t, e.(*apievents.AppSessionStart).AppName, app.name) + return + } + t.Errorf("failed to find AppSessionStartCode event (0/%d events matched)", len(es)) + }, 5*time.Second, 500*time.Millisecond) + } // app logout. err = Run(ctx, []string{ "app", diff --git a/tool/tsh/common/vnet_common.go b/tool/tsh/common/vnet_common.go index 6dae51fc692d1..80f03eaa3c536 100644 --- a/tool/tsh/common/vnet_common.go +++ b/tool/tsh/common/vnet_common.go @@ -177,6 +177,7 @@ func (p *vnetAppProvider) reissueAppCert(ctx context.Context, tc *client.Telepor Name: app.GetName(), PublicAddr: app.GetPublicAddr(), ClusterName: tc.SiteName, + URI: app.GetURI(), } profile, err := tc.ProfileStatus() From 68dd3d4ab6c0c8cf932c4481ac4c4a863e7209c1 Mon Sep 17 00:00:00 2001 From: Edoardo Spadolini Date: Tue, 30 Jul 2024 17:52:27 +0200 Subject: [PATCH 008/139] Fix rare TestResumption deadlock (#44822) --- lib/resumption/client.go | 10 ++++++---- lib/resumption/resumption_test.go | 3 +++ 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/lib/resumption/client.go b/lib/resumption/client.go index f12f51a35805f..3325a3b74e7f4 100644 --- a/lib/resumption/client.go +++ b/lib/resumption/client.go @@ -219,6 +219,12 @@ func runClientResumableUnlocking(ctx context.Context, resumableConn *Conn, first case <-detached: } + reconnectTicker.Stop() + select { + case <-reconnectTicker.Chan(): + default: + } + slog.DebugContext(ctx, "connection lost, starting reconnection loop", "host_id", hostID) reconnectDeadline := time.Now().Add(reconnectTimeout) backoff := minBackoff @@ -262,10 +268,6 @@ func runClientResumableUnlocking(ctx context.Context, resumableConn *Conn, first } reconnectTicker.Reset(replacementInterval) - select { - case <-reconnectTicker.Chan(): - default: - } } } diff --git a/lib/resumption/resumption_test.go b/lib/resumption/resumption_test.go index de6f74a89f58c..db915fcb062f3 100644 --- a/lib/resumption/resumption_test.go +++ b/lib/resumption/resumption_test.go @@ -212,6 +212,9 @@ func testResumption(t *testing.T, network, address string, expectedHostID string default: } + // wait until the reconnection loop has passed the reconnection phase + // and is waiting on the reconnection timer again + clock.BlockUntil(1) clock.Advance(replacementInterval) redialingSyncPoint <- struct{}{} From b86df29403579541cf333f7d96583a9016d09619 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Cie=C5=9Blak?= Date: Tue, 30 Jul 2024 18:04:28 +0200 Subject: [PATCH 009/139] [v16] VNet: Make sure daemon client has adequate permissions for passed `TELEPORT_HOME` (#44823) * Setup package logger for lib/vnet * Pass egid and euid of client process from Obj-C to Go * Drop root privileges before reading files from TELEPORT_HOME * Adjust message for errXPCConnectionCodeSigningRequirementFailure * Pass egid and euid to osascript * Add Valid field to ClientCred to make sure creds were set * Log dropping privileges before attempting to do so * Panic instead of erroring when changing creds fails * Make sure privileges can't be dropped multiple times in parallel * Implement LogValue for ClientCred --- lib/vnet/customdnszonevalidator.go | 5 +-- lib/vnet/daemon/client_darwin.go | 10 ++++- lib/vnet/daemon/common.go | 23 ++++++++++ lib/vnet/daemon/service_darwin.go | 10 ++++- lib/vnet/daemon/service_darwin.h | 11 ++++- lib/vnet/daemon/service_darwin.m | 31 ++++++++++++- lib/vnet/osconfig.go | 71 ++++++++++++++++++------------ lib/vnet/osconfig_darwin.go | 52 +++++++++++++++++++--- lib/vnet/osconfig_other.go | 34 ++++++++++++++ lib/vnet/setup.go | 31 ++++++++----- lib/vnet/setup_darwin.go | 4 +- lib/vnet/setup_other.go | 4 -- tool/tsh/common/vnet_darwin.go | 13 ++++++ 13 files changed, 242 insertions(+), 57 deletions(-) create mode 100644 lib/vnet/osconfig_other.go diff --git a/lib/vnet/customdnszonevalidator.go b/lib/vnet/customdnszonevalidator.go index a328df5bea1a6..752606581eaa4 100644 --- a/lib/vnet/customdnszonevalidator.go +++ b/lib/vnet/customdnszonevalidator.go @@ -19,7 +19,6 @@ package vnet import ( "context" "errors" - "log/slog" "net" "slices" "sync" @@ -67,7 +66,7 @@ func (c *customDNSZoneValidator) validate(ctx context.Context, clusterName, cust } requiredTXTRecord := clusterTXTRecordPrefix + clusterName - slog.InfoContext(ctx, "Checking validity of custom DNS zone by querying for required TXT record.", "zone", customDNSZone, "record", requiredTXTRecord) + log.InfoContext(ctx, "Checking validity of custom DNS zone by querying for required TXT record.", "zone", customDNSZone, "record", requiredTXTRecord) records, err := c.lookupTXT(ctx, customDNSZone) if err != nil { @@ -83,7 +82,7 @@ func (c *customDNSZoneValidator) validate(ctx context.Context, clusterName, cust return trace.Wrap(errNoTXTRecord(customDNSZone, requiredTXTRecord)) } - slog.InfoContext(ctx, "Custom DNS zone has valid TXT record.", "zone", customDNSZone, "cluster", clusterName) + log.InfoContext(ctx, "Custom DNS zone has valid TXT record.", "zone", customDNSZone, "cluster", clusterName) c.mu.Lock() defer c.mu.Unlock() diff --git a/lib/vnet/daemon/client_darwin.go b/lib/vnet/daemon/client_darwin.go index 9c53d8a7ee580..56775166e8d95 100644 --- a/lib/vnet/daemon/client_darwin.go +++ b/lib/vnet/daemon/client_darwin.go @@ -320,7 +320,15 @@ func startByCalling(ctx context.Context, bundlePath string, config Config) error } if errorDomain == nsCocoaErrorDomain && errorCode == errorCodeNSXPCConnectionCodeSigningRequirementFailure { - errC <- trace.Wrap(errXPCConnectionCodeSigningRequirementFailure, "the daemon does not appear to be code signed correctly") + // If the client submits TELEPORT_HOME to which the user doesn't have access, the daemon is + // going to shut down with an error soon after starting. Because of that, macOS won't have + // enough time to perform the verification of the code signing requirement of the daemon, as + // requested by the client. + // + // In that scenario, macOS is going to simply error that connection with + // NSXPCConnectionCodeSigningRequirementFailure. Without looking at logs, it's not possible + // to differentiate that from a "legitimate" failure caused by an incorrect requirement. + errC <- trace.Wrap(errXPCConnectionCodeSigningRequirementFailure, "either daemon is not signed correctly or it shut down before signature could be verified") return } diff --git a/lib/vnet/daemon/common.go b/lib/vnet/daemon/common.go index 896e6b2ab5814..fbcd3969d5926 100644 --- a/lib/vnet/daemon/common.go +++ b/lib/vnet/daemon/common.go @@ -17,6 +17,7 @@ package daemon import ( + "log/slog" "time" "github.com/gravitational/trace" @@ -34,6 +35,26 @@ type Config struct { DNSAddr string // HomePath points to TELEPORT_HOME that will be used by the admin process. HomePath string + // ClientCred are the credentials of the unprivileged process that wants to start VNet. + ClientCred ClientCred +} + +// ClientCred are the credentials of the unprivileged process that wants to start VNet. +type ClientCred struct { + // Valid is set if the Euid and Egid fields have been set. + Valid bool + // Egid is the effective group ID of the unprivileged process. + Egid int + // Euid is the effective user ID of the unprivileged process. + Euid int +} + +func (c ClientCred) LogValue() slog.Value { + return slog.GroupValue( + slog.Bool("creds_valid", c.Valid), + slog.Int("egid", c.Egid), + slog.Int("euid", c.Euid), + ) } func (c *Config) CheckAndSetDefaults() error { @@ -46,6 +67,8 @@ func (c *Config) CheckAndSetDefaults() error { return trace.BadParameter("missing DNS address") case c.HomePath == "": return trace.BadParameter("missing home path") + case c.ClientCred.Valid == false: + return trace.BadParameter("missing client credentials") } return nil } diff --git a/lib/vnet/daemon/service_darwin.go b/lib/vnet/daemon/service_darwin.go index bd7db4096da06..b4e940c77bb63 100644 --- a/lib/vnet/daemon/service_darwin.go +++ b/lib/vnet/daemon/service_darwin.go @@ -77,6 +77,7 @@ func Start(ctx context.Context, workFn func(context.Context, Config) error) erro "ipv6_prefix", config.IPv6Prefix, "dns_addr", config.DNSAddr, "home_path", config.HomePath, + "client_cred", config.ClientCred, ) return trace.Wrap(workFn(ctx, config)) @@ -101,8 +102,10 @@ func waitForVnetConfig(ctx context.Context) (Config, error) { C.free(unsafe.Pointer(result.home_path)) }() + var clientCred C.ClientCred + // This call gets unblocked when the daemon gets stopped through C.DaemonStop. - C.WaitForVnetConfig(&result) + C.WaitForVnetConfig(&result, &clientCred) if !result.ok { errC <- trace.Wrap(errors.New(C.GoString(result.error_description))) return @@ -113,6 +116,11 @@ func waitForVnetConfig(ctx context.Context) (Config, error) { IPv6Prefix: C.GoString(result.ipv6_prefix), DNSAddr: C.GoString(result.dns_addr), HomePath: C.GoString(result.home_path), + ClientCred: ClientCred{ + Valid: bool(clientCred.valid), + Egid: int(clientCred.egid), + Euid: int(clientCred.euid), + }, } errC <- nil }() diff --git a/lib/vnet/daemon/service_darwin.h b/lib/vnet/daemon/service_darwin.h index fd39979eed25f..9d14d06780b4f 100644 --- a/lib/vnet/daemon/service_darwin.h +++ b/lib/vnet/daemon/service_darwin.h @@ -48,11 +48,20 @@ typedef struct VnetConfigResult { const char *home_path; } VnetConfigResult; +typedef struct ClientCred { + // valid is set if the euid and egid fields have been set. + bool valid; + // egid is the effective group ID of the process on the other side of the XPC connection. + gid_t egid; + // euid is the effective user ID of the process on the other side of the XPC connection. + uid_t euid; +} ClientCred; + // WaitForVnetConfig blocks until a client calls the daemon with a config necessary to start VNet. // It can be interrupted by calling DaemonStop. // // The caller is expected to check outResult.ok to see if the call succeeded and to free strings // in VnetConfigResult. -void WaitForVnetConfig(VnetConfigResult *outResult); +void WaitForVnetConfig(VnetConfigResult *outResult, ClientCred *outClientCred); #endif /* TELEPORT_LIB_VNET_DAEMON_SERVICE_DARWIN_H_ */ diff --git a/lib/vnet/daemon/service_darwin.m b/lib/vnet/daemon/service_darwin.m index 01b636f72fe6a..613ec18f116c5 100644 --- a/lib/vnet/daemon/service_darwin.m +++ b/lib/vnet/daemon/service_darwin.m @@ -25,6 +25,21 @@ #include +@interface VNEClientCred : NSObject +{ + BOOL valid; + gid_t egid; + uid_t euid; +} +@property(nonatomic, readwrite) BOOL valid; +@property(nonatomic, readwrite) gid_t egid; +@property(nonatomic, readwrite) uid_t euid; +@end + +@implementation VNEClientCred +@synthesize valid,egid,euid; +@end + @interface VNEDaemonService () @property(nonatomic, strong, readwrite) NSXPCListener *listener; @@ -37,6 +52,7 @@ @interface VNEDaemonService () @property(nonatomic, readwrite) NSString *ipv6Prefix; @property(nonatomic, readwrite) NSString *dnsAddr; @property(nonatomic, readwrite) NSString *homePath; +@property(nonatomic, readwrite) VNEClientCred *clientCred; @property(nonatomic, readwrite) dispatch_semaphore_t gotVnetConfigSema; @end @@ -106,6 +122,12 @@ - (void)startVnet:(VnetConfig *)vnetConfig completion:(void (^)(NSError *error)) _dnsAddr = @(vnetConfig->dns_addr); _homePath = @(vnetConfig->home_path); + NSXPCConnection *currentConn = [NSXPCConnection currentConnection]; + _clientCred = [[VNEClientCred alloc] init]; + [_clientCred setEgid:[currentConn effectiveGroupIdentifier]]; + [_clientCred setEuid:[currentConn effectiveUserIdentifier]]; + [_clientCred setValid:YES]; + dispatch_semaphore_signal(_gotVnetConfigSema); completion(nil); } @@ -158,7 +180,7 @@ void DaemonStop(void) { } } -void WaitForVnetConfig(VnetConfigResult *outResult) { +void WaitForVnetConfig(VnetConfigResult *outResult, ClientCred *outClientCred) { if (!daemonService) { outResult->error_description = strdup("daemon was not initialized yet"); return; @@ -180,6 +202,13 @@ void WaitForVnetConfig(VnetConfigResult *outResult) { outResult->ipv6_prefix = VNECopyNSString([daemonService ipv6Prefix]); outResult->dns_addr = VNECopyNSString([daemonService dnsAddr]); outResult->home_path = VNECopyNSString([daemonService homePath]); + + if ([daemonService clientCred] && [[daemonService clientCred] valid]) { + outClientCred->egid = [[daemonService clientCred] egid]; + outClientCred->euid = [[daemonService clientCred] euid]; + outClientCred->valid = true; + } + outResult->ok = true; } } diff --git a/lib/vnet/osconfig.go b/lib/vnet/osconfig.go index b47aec5415b12..0642ebd0980dd 100644 --- a/lib/vnet/osconfig.go +++ b/lib/vnet/osconfig.go @@ -18,7 +18,6 @@ package vnet import ( "context" - "log/slog" "net" "github.com/gravitational/trace" @@ -28,6 +27,7 @@ import ( "github.com/gravitational/teleport/api/utils" "github.com/gravitational/teleport/lib/client" "github.com/gravitational/teleport/lib/client/clientcache" + "github.com/gravitational/teleport/lib/vnet/daemon" ) type osConfig struct { @@ -43,14 +43,16 @@ type osConfigurator struct { clientStore *client.Store clientCache *clientcache.Cache clusterConfigCache *ClusterConfigCache - tunName string - tunIPv6 string - dnsAddr string - homePath string - tunIPv4 string + // daemonClientCred are the credentials of the process that contacted the daemon. + daemonClientCred daemon.ClientCred + tunName string + tunIPv6 string + dnsAddr string + homePath string + tunIPv4 string } -func newOSConfigurator(tunName, ipv6Prefix, dnsAddr, homePath string) (*osConfigurator, error) { +func newOSConfigurator(tunName, ipv6Prefix, dnsAddr, homePath string, daemonClientCred daemon.ClientCred) (*osConfigurator, error) { if homePath == "" { // This runs as root so we need to be configured with the user's home path. return nil, trace.BadParameter("homePath must be passed from unprivileged process") @@ -61,11 +63,12 @@ func newOSConfigurator(tunName, ipv6Prefix, dnsAddr, homePath string) (*osConfig tunIPv6 := ipv6Prefix + "1" configurator := &osConfigurator{ - tunName: tunName, - tunIPv6: tunIPv6, - dnsAddr: dnsAddr, - homePath: homePath, - clientStore: client.NewFSClientStore(homePath), + tunName: tunName, + tunIPv6: tunIPv6, + dnsAddr: dnsAddr, + homePath: homePath, + clientStore: client.NewFSClientStore(homePath), + daemonClientCred: daemonClientCred, } configurator.clusterConfigCache = NewClusterConfigCache(clockwork.NewRealClock()) @@ -89,18 +92,32 @@ func (c *osConfigurator) close() error { return trace.Wrap(c.clientCache.Clear()) } +// updateOSConfiguration reads tsh profiles out of [c.homePath]. For each profile, it reads the VNet +// config of the root cluster and of each leaf cluster. Then it proceeds to update the OS based on +// information from that config. +// +// For the duration of reading data from clusters, it drops the root privileges, only to regain them +// before configuring the OS. func (c *osConfigurator) updateOSConfiguration(ctx context.Context) error { var dnsZones []string var cidrRanges []string - profileNames, err := profile.ListProfileNames(c.homePath) - if err != nil { - return trace.Wrap(err, "listing user profiles") - } - for _, profileName := range profileNames { - profileDNSZones, profileCIDRRanges := c.getDNSZonesAndCIDRRangesForProfile(ctx, profileName) - dnsZones = append(dnsZones, profileDNSZones...) - cidrRanges = append(cidrRanges, profileCIDRRanges...) + // Drop privileges to ensure that the user who spawned the daemon client has privileges necessary + // to access c.homePath that it sent when starting the daemon. + // Otherwise a client could make the daemon read a profile out of any directory. + if err := c.doWithDroppedRootPrivileges(ctx, func() error { + profileNames, err := profile.ListProfileNames(c.homePath) + if err != nil { + return trace.Wrap(err, "listing user profiles") + } + for _, profileName := range profileNames { + profileDNSZones, profileCIDRRanges := c.getDNSZonesAndCIDRRangesForProfile(ctx, profileName) + dnsZones = append(dnsZones, profileDNSZones...) + cidrRanges = append(cidrRanges, profileCIDRRanges...) + } + return nil + }); err != nil { + return trace.Wrap(err) } dnsZones = utils.Deduplicate(dnsZones) @@ -114,7 +131,7 @@ func (c *osConfigurator) updateOSConfiguration(ctx context.Context) error { } } - err = configureOS(ctx, &osConfig{ + err := configureOS(ctx, &osConfig{ tunName: c.tunName, tunIPv6: c.tunIPv6, tunIPv4: c.tunIPv4, @@ -137,14 +154,14 @@ func (c *osConfigurator) getDNSZonesAndCIDRRangesForProfile(ctx context.Context, defer func() { if shouldClearCacheForRoot { if err := c.clientCache.ClearForRoot(profileName); err != nil { - slog.ErrorContext(ctx, "Error while clearing client cache", "profile", profileName, "error", err) + log.ErrorContext(ctx, "Error while clearing client cache", "profile", profileName, "error", err) } } }() rootClient, err := c.clientCache.Get(ctx, profileName, "" /*leafClusterName*/) if err != nil { - slog.WarnContext(ctx, + log.WarnContext(ctx, "Failed to get root cluster client from cache, profile may be expired, not configuring VNet for this cluster", "profile", profileName, "error", err) @@ -152,7 +169,7 @@ func (c *osConfigurator) getDNSZonesAndCIDRRangesForProfile(ctx context.Context, } clusterConfig, err := c.clusterConfigCache.GetClusterConfig(ctx, rootClient) if err != nil { - slog.WarnContext(ctx, + log.WarnContext(ctx, "Failed to load VNet configuration, profile may be expired, not configuring VNet for this cluster", "profile", profileName, "error", err) @@ -164,7 +181,7 @@ func (c *osConfigurator) getDNSZonesAndCIDRRangesForProfile(ctx context.Context, leafClusters, err := getLeafClusters(ctx, rootClient) if err != nil { - slog.WarnContext(ctx, + log.WarnContext(ctx, "Failed to list leaf clusters, profile may be expired, not configuring VNet for leaf clusters of this cluster", "profile", profileName, "error", err) @@ -179,7 +196,7 @@ func (c *osConfigurator) getDNSZonesAndCIDRRangesForProfile(ctx context.Context, for _, leafClusterName := range leafClusters { clusterClient, err := c.clientCache.Get(ctx, profileName, leafClusterName) if err != nil { - slog.WarnContext(ctx, + log.WarnContext(ctx, "Failed to create leaf cluster client, not configuring VNet for this cluster", "profile", profileName, "leaf_cluster", leafClusterName, "error", err) continue @@ -187,7 +204,7 @@ func (c *osConfigurator) getDNSZonesAndCIDRRangesForProfile(ctx context.Context, clusterConfig, err := c.clusterConfigCache.GetClusterConfig(ctx, clusterClient) if err != nil { - slog.WarnContext(ctx, + log.WarnContext(ctx, "Failed to load VNet configuration, not configuring VNet for this cluster", "profile", profileName, "leaf_cluster", leafClusterName, "error", err) continue diff --git a/lib/vnet/osconfig_darwin.go b/lib/vnet/osconfig_darwin.go index e2428bf46b773..27864c80bb400 100644 --- a/lib/vnet/osconfig_darwin.go +++ b/lib/vnet/osconfig_darwin.go @@ -19,10 +19,11 @@ package vnet import ( "bufio" "context" - "log/slog" "os" "os/exec" "path/filepath" + "sync/atomic" + "syscall" "github.com/gravitational/trace" ) @@ -34,14 +35,14 @@ func configureOS(ctx context.Context, cfg *osConfig) error { // process exits and the TUN is deleted. if cfg.tunIPv4 != "" { - slog.InfoContext(ctx, "Setting IPv4 address for the TUN device.", "device", cfg.tunName, "address", cfg.tunIPv4) + log.InfoContext(ctx, "Setting IPv4 address for the TUN device.", "device", cfg.tunName, "address", cfg.tunIPv4) cmd := exec.CommandContext(ctx, "ifconfig", cfg.tunName, cfg.tunIPv4, cfg.tunIPv4, "up") if err := cmd.Run(); err != nil { return trace.Wrap(err, "running %v", cmd.Args) } } for _, cidrRange := range cfg.cidrRanges { - slog.InfoContext(ctx, "Setting an IP route for the VNet.", "netmask", cidrRange) + log.InfoContext(ctx, "Setting an IP route for the VNet.", "netmask", cidrRange) cmd := exec.CommandContext(ctx, "route", "add", "-net", cidrRange, "-interface", cfg.tunName) if err := cmd.Run(); err != nil { return trace.Wrap(err, "running %v", cmd.Args) @@ -49,13 +50,13 @@ func configureOS(ctx context.Context, cfg *osConfig) error { } if cfg.tunIPv6 != "" { - slog.InfoContext(ctx, "Setting IPv6 address for the TUN device.", "device", cfg.tunName, "address", cfg.tunIPv6) + log.InfoContext(ctx, "Setting IPv6 address for the TUN device.", "device", cfg.tunName, "address", cfg.tunIPv6) cmd := exec.CommandContext(ctx, "ifconfig", cfg.tunName, "inet6", cfg.tunIPv6, "prefixlen", "64") if err := cmd.Run(); err != nil { return trace.Wrap(err, "running %v", cmd.Args) } - slog.InfoContext(ctx, "Setting an IPv6 route for the VNet.") + log.InfoContext(ctx, "Setting an IPv6 route for the VNet.") cmd = exec.CommandContext(ctx, "route", "add", "-inet6", cfg.tunIPv6, "-prefixlen", "64", "-interface", cfg.tunName) if err := cmd.Run(); err != nil { return trace.Wrap(err, "running %v", cmd.Args) @@ -78,7 +79,7 @@ func configureDNS(ctx context.Context, nameserver string, zones []string) error return trace.BadParameter("empty nameserver with non-empty zones") } - slog.DebugContext(ctx, "Configuring DNS.", "nameserver", nameserver, "zones", zones) + log.DebugContext(ctx, "Configuring DNS.", "nameserver", nameserver, "zones", zones) if err := os.MkdirAll(resolverPath, os.FileMode(0755)); err != nil { return trace.Wrap(err, "creating %s", resolverPath) } @@ -140,3 +141,42 @@ func vnetManagedResolverFiles() (map[string]struct{}, error) { } return matchingFiles, nil } + +var hasDroppedPrivileges atomic.Bool + +// doWithDroppedRootPrivileges drops the privileges of the current process to those of the client +// process that called the VNet daemon. +func (c *osConfigurator) doWithDroppedRootPrivileges(ctx context.Context, fn func() error) (err error) { + if !hasDroppedPrivileges.CompareAndSwap(false, true) { + // At the moment of writing, the VNet daemon wasn't expected to do multiple things in parallel + // with dropped privileges. If you run into this error, consider if employing a mutex is going + // to be enough or if a more elaborate refactoring is required. + return trace.CompareFailed("privileges are being temporarily dropped already") + } + defer hasDroppedPrivileges.Store(false) + + rootEgid := os.Getegid() + rootEuid := os.Geteuid() + + log.InfoContext(ctx, "Temporarily dropping root privileges.", "egid", c.daemonClientCred.Egid, "euid", c.daemonClientCred.Euid) + + if err := syscall.Setegid(c.daemonClientCred.Egid); err != nil { + panic(trace.Wrap(err, "setting egid")) + } + if err := syscall.Seteuid(c.daemonClientCred.Euid); err != nil { + panic(trace.Wrap(err, "setting euid")) + } + + defer func() { + if err := syscall.Seteuid(rootEuid); err != nil { + panic(trace.Wrap(err, "reverting euid")) + } + if err := syscall.Setegid(rootEgid); err != nil { + panic(trace.Wrap(err, "reverting egid")) + } + + log.InfoContext(ctx, "Restored root privileges.", "egid", rootEgid, "euid", rootEuid) + }() + + return trace.Wrap(fn()) +} diff --git a/lib/vnet/osconfig_other.go b/lib/vnet/osconfig_other.go new file mode 100644 index 0000000000000..22780f8bc5f11 --- /dev/null +++ b/lib/vnet/osconfig_other.go @@ -0,0 +1,34 @@ +// Teleport +// Copyright (C) 2024 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +//go:build !darwin +// +build !darwin + +package vnet + +import ( + "context" + + "github.com/gravitational/trace" +) + +func configureOS(ctx context.Context, cfg *osConfig) error { + return trace.Wrap(ErrVnetNotImplemented) +} + +func (c *osConfigurator) doWithDroppedRootPrivileges(ctx context.Context, fn func() error) (err error) { + return trace.Wrap(ErrVnetNotImplemented) +} diff --git a/lib/vnet/setup.go b/lib/vnet/setup.go index cf0e360a8b5f1..446fa5d1022c6 100644 --- a/lib/vnet/setup.go +++ b/lib/vnet/setup.go @@ -20,7 +20,6 @@ import ( "context" "errors" "fmt" - "log/slog" "os" "time" @@ -28,11 +27,15 @@ import ( "golang.org/x/sync/errgroup" "golang.zx2c4.com/wireguard/tun" + "github.com/gravitational/teleport" "github.com/gravitational/teleport/api/profile" "github.com/gravitational/teleport/api/types" + logutils "github.com/gravitational/teleport/lib/utils/log" "github.com/gravitational/teleport/lib/vnet/daemon" ) +var log = logutils.NewPackageLogger(teleport.ComponentKey, "vnet") + // SetupAndRun creates a network stack for VNet and runs it in the background. To do this, it also // needs to launch an admin process in the background. It returns [ProcessManager] which controls // the lifecycle of both background tasks. @@ -68,7 +71,7 @@ func SetupAndRun(ctx context.Context, config *SetupAndRunConfig) (*ProcessManage if err != nil { return nil, trace.Wrap(err) } - slog.DebugContext(ctx, "Created unix socket for admin process", "socket", socketPath) + log.DebugContext(ctx, "Created unix socket for admin process", "socket", socketPath) pm.AddCriticalBackgroundTask("socket closer", func() error { // Keep the socket open until the process context is canceled. // Closing the socket signals the admin process to terminate. @@ -115,7 +118,7 @@ func SetupAndRun(ctx context.Context, config *SetupAndRunConfig) (*ProcessManage // problem with the admin process. // Returning error from processCtx will be more informative to the user, e.g., the error // will say "password prompt closed by user" instead of "read from closed socket". - slog.DebugContext(ctx, "Error from recvTUNErr ignored in favor of processCtx.Err", "error", err) + log.DebugContext(ctx, "Error from recvTUNErr ignored in favor of processCtx.Err", "error", err) return nil, trace.Wrap(context.Cause(processCtx)) } return nil, trace.Wrap(err, "receiving TUN device from admin process") @@ -219,6 +222,9 @@ func (pm *ProcessManager) Close() { // It also handles host OS configuration that must run as root, and stays alive to keep the host configuration // up to date. It will stay running until the socket at config.socketPath is deleted or until encountering an // unrecoverable error. +// +// OS configuration is updated every [osConfigurationInterval]. During the update, it temporarily +// changes egid and euid of the process to that of the client connecting to the daemon. func AdminSetup(ctx context.Context, config daemon.Config) error { if err := config.CheckAndSetDefaults(); err != nil { return trace.Wrap(err) @@ -234,7 +240,7 @@ func AdminSetup(ctx context.Context, config daemon.Config) error { errCh := make(chan error) go func() { - errCh <- trace.Wrap(osConfigurationLoop(ctx, tunName, config.IPv6Prefix, config.DNSAddr, config.HomePath)) + errCh <- trace.Wrap(osConfigurationLoop(ctx, tunName, config.IPv6Prefix, config.DNSAddr, config.HomePath, config.ClientCred)) }() // Stay alive until we get an error on errCh, indicating that the osConfig loop exited. @@ -246,7 +252,7 @@ func AdminSetup(ctx context.Context, config daemon.Config) error { select { case <-ticker.C: if _, err := os.Stat(config.SocketPath); err != nil { - slog.DebugContext(ctx, "failed to stat socket path, assuming parent exited") + log.DebugContext(ctx, "failed to stat socket path, assuming parent exited") cancel() return trace.Wrap(<-errCh) } @@ -267,7 +273,7 @@ func createAndSendTUNDevice(ctx context.Context, socketPath string) (string, err defer func() { // We can safely close the TUN device in the admin process after it has been sent on the socket. if err := tun.Close(); err != nil { - slog.WarnContext(ctx, "Failed to close TUN device.", "error", trace.Wrap(err)) + log.WarnContext(ctx, "Failed to close TUN device.", "error", trace.Wrap(err)) } }() @@ -279,14 +285,14 @@ func createAndSendTUNDevice(ctx context.Context, socketPath string) (string, err // osConfigurationLoop will keep running until [ctx] is canceled or an unrecoverable error is encountered, in // order to keep the host OS configuration up to date. -func osConfigurationLoop(ctx context.Context, tunName, ipv6Prefix, dnsAddr, homePath string) error { - osConfigurator, err := newOSConfigurator(tunName, ipv6Prefix, dnsAddr, homePath) +func osConfigurationLoop(ctx context.Context, tunName, ipv6Prefix, dnsAddr, homePath string, clientCred daemon.ClientCred) error { + osConfigurator, err := newOSConfigurator(tunName, ipv6Prefix, dnsAddr, homePath, clientCred) if err != nil { return trace.Wrap(err, "creating OS configurator") } defer func() { if err := osConfigurator.close(); err != nil { - slog.ErrorContext(ctx, "Error while closing OS configurator", "error", err) + log.ErrorContext(ctx, "Error while closing OS configurator", "error", err) } }() @@ -301,7 +307,7 @@ func osConfigurationLoop(ctx context.Context, tunName, ipv6Prefix, dnsAddr, home // Shutting down, deconfigure OS. Pass context.Background because [ctx] has likely been canceled // already but we still need to clean up. if err := osConfigurator.deconfigureOS(context.Background()); err != nil { - slog.ErrorContext(ctx, "Error deconfiguring host OS before shutting down.", "error", err) + log.ErrorContext(ctx, "Error deconfiguring host OS before shutting down.", "error", err) } }() @@ -311,7 +317,8 @@ func osConfigurationLoop(ctx context.Context, tunName, ipv6Prefix, dnsAddr, home // Re-configure the host OS every 10 seconds. This will pick up any newly logged-in clusters by // reading profiles from TELEPORT_HOME. - ticker := time.NewTicker(10 * time.Second) + const osConfigurationInterval = 10 * time.Second + ticker := time.NewTicker(osConfigurationInterval) defer ticker.Stop() for { select { @@ -326,7 +333,7 @@ func osConfigurationLoop(ctx context.Context, tunName, ipv6Prefix, dnsAddr, home } func createTUNDevice(ctx context.Context) (tun.Device, string, error) { - slog.DebugContext(ctx, "Creating TUN device.") + log.DebugContext(ctx, "Creating TUN device.") dev, err := tun.CreateTUN("utun", mtu) if err != nil { return nil, "", trace.Wrap(err, "creating TUN device") diff --git a/lib/vnet/setup_darwin.go b/lib/vnet/setup_darwin.go index 688a39ff55c04..e967eb8f11b73 100644 --- a/lib/vnet/setup_darwin.go +++ b/lib/vnet/setup_darwin.go @@ -72,9 +72,11 @@ do shell script quoted form of executableName & `+ `" %s -d --socket " & quoted form of socketPath & `+ `" --ipv6-prefix " & quoted form of ipv6Prefix & `+ `" --dns-addr " & quoted form of dnsAddr & `+ + `" --egid %d --euid %d" & `+ `" >/var/log/vnet.log 2>&1" `+ `with prompt "Teleport VNet wants to set up a virtual network device." with administrator privileges`, - executableName, config.SocketPath, config.IPv6Prefix, config.DNSAddr, teleport.VnetAdminSetupSubCommand) + executableName, config.SocketPath, config.IPv6Prefix, config.DNSAddr, teleport.VnetAdminSetupSubCommand, + os.Getegid(), os.Geteuid()) // The context we pass here has effect only on the password prompt being shown. Once osascript spawns the // privileged process, canceling the context (and thus killing osascript) has no effect on the privileged diff --git a/lib/vnet/setup_other.go b/lib/vnet/setup_other.go index e7f723138b187..11916d1bd94a7 100644 --- a/lib/vnet/setup_other.go +++ b/lib/vnet/setup_other.go @@ -48,10 +48,6 @@ func receiveTUNDevice(socket *net.UnixListener) (tun.Device, error) { return nil, trace.Wrap(ErrVnetNotImplemented) } -func configureOS(ctx context.Context, cfg *osConfig) error { - return trace.Wrap(ErrVnetNotImplemented) -} - func execAdminProcess(ctx context.Context, config daemon.Config) error { return trace.Wrap(ErrVnetNotImplemented) } diff --git a/tool/tsh/common/vnet_darwin.go b/tool/tsh/common/vnet_darwin.go index 05e849a973287..9a155298e41f1 100644 --- a/tool/tsh/common/vnet_darwin.go +++ b/tool/tsh/common/vnet_darwin.go @@ -80,6 +80,12 @@ type vnetAdminSetupCommand struct { ipv6Prefix string // dnsAddr is the IP address for the VNet DNS server. dnsAddr string + // egid of the user starting VNet. Unsafe for production use, as the egid comes from an unstrusted + // source. + egid int + // euid of the user starting VNet. Unsafe for production use, as the euid comes from an unstrusted + // source. + euid int } func newVnetAdminSetupCommand(app *kingpin.Application) *vnetAdminSetupCommand { @@ -89,6 +95,8 @@ func newVnetAdminSetupCommand(app *kingpin.Application) *vnetAdminSetupCommand { cmd.Flag("socket", "unix socket path").StringVar(&cmd.socketPath) cmd.Flag("ipv6-prefix", "IPv6 prefix for the VNet").StringVar(&cmd.ipv6Prefix) cmd.Flag("dns-addr", "VNet DNS address").StringVar(&cmd.dnsAddr) + cmd.Flag("egid", "effective group ID of the user starting VNet").IntVar(&cmd.egid) + cmd.Flag("euid", "effective user ID of the user starting VNet").IntVar(&cmd.euid) return cmd } @@ -104,6 +112,11 @@ func (c *vnetAdminSetupCommand) run(cf *CLIConf) error { IPv6Prefix: c.ipv6Prefix, DNSAddr: c.dnsAddr, HomePath: homePath, + ClientCred: daemon.ClientCred{ + Valid: true, + Egid: c.egid, + Euid: c.euid, + }, } return trace.Wrap(vnet.AdminSetup(cf.Context, config)) From ca24d48c0a4c92ce9ba8a285c851d592784d3cb1 Mon Sep 17 00:00:00 2001 From: Steven Martin Date: Tue, 30 Jul 2024 12:16:24 -0400 Subject: [PATCH 010/139] [v16] docs: update ansible server access steps (#44824) * docs: update ansible server access steps * docs: cp example change for ansible Co-authored-by: Zac Bergquist * docs: fix spelling in comments for ansible instructions --------- Co-authored-by: Zac Bergquist --- docs/pages/enroll-resources/server-access/guides/ansible.mdx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/pages/enroll-resources/server-access/guides/ansible.mdx b/docs/pages/enroll-resources/server-access/guides/ansible.mdx index 8a1b8bc203058..0d3d239fd4ba5 100644 --- a/docs/pages/enroll-resources/server-access/guides/ansible.mdx +++ b/docs/pages/enroll-resources/server-access/guides/ansible.mdx @@ -43,6 +43,8 @@ Create a folder `ansible` where we will collect all generated files: ```code $ mkdir -p ansible +# Copy the openssh configuration from the previous step to the ansible dir +$ cp ssh.cfg ansible/ $ cd ansible ``` From 65d0dde33c2966c44cdb6eb7c1e4db2e89f6f7e5 Mon Sep 17 00:00:00 2001 From: Anton Miniailo Date: Tue, 30 Jul 2024 12:59:03 -0400 Subject: [PATCH 011/139] [v16] Fix flaky test for reissuing certificate for local kube proxy. (#44827) * Fix flaky test again. * Increase timeout to 5 seconds. --- lib/srv/alpnproxy/local_proxy_test.go | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/lib/srv/alpnproxy/local_proxy_test.go b/lib/srv/alpnproxy/local_proxy_test.go index 1a7321457d112..f7940ef22c069 100644 --- a/lib/srv/alpnproxy/local_proxy_test.go +++ b/lib/srv/alpnproxy/local_proxy_test.go @@ -533,12 +533,18 @@ func TestKubeMiddleware(t *testing.T) { err := km.CheckAndSetDefaults() require.NoError(t, err) - rw := responsewriters.NewMemoryResponseWriter() - // HandleRequest will reissue certificate if needed. - km.HandleRequest(rw, req) - - // request timed out. - require.Equal(t, http.StatusInternalServerError, rw.Status()) + var rw *responsewriters.MemoryResponseWriter + // We use `require.Eventually` to avoid a very rare test flakiness case when reissue goroutine manages to + // successfully finish before the parent goroutine has a chance to check the context (and see that it's expired). + require.Eventually(t, func() bool { + rw = responsewriters.NewMemoryResponseWriter() + // HandleRequest will reissue certificate if needed. + km.HandleRequest(rw, req) + + // request timed out. + return rw.Status() == http.StatusInternalServerError + + }, 5*time.Second, 100*time.Millisecond) require.Contains(t, rw.Buffer().String(), "context canceled") // just let the reissuing goroutine some time to replace certs. From 36bce7e590024864ee08198476c984393ba52fc6 Mon Sep 17 00:00:00 2001 From: Paul Gottschling Date: Tue, 30 Jul 2024 13:21:15 -0400 Subject: [PATCH 012/139] Fix automatic updater installation instructions (#44775) Closes #43865 For self-hosted Teleport Enterprise users, the current instructions show you how to use the one-line installation script to install Teleport on a Linux server. This script does not install the updater if the second argument is set to `enterprise`. Instead, instruct the user to visit the Installation page section for package managers, install the `teleport` binary, and use the package manager to install the updater. An alternative approach would be to use a nested `Tabs` component with instructions for different package managers, but nested `Tabs` look unsightly on our docs site. --- docs/pages/upgrading/automatic-agent-updates.mdx | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/docs/pages/upgrading/automatic-agent-updates.mdx b/docs/pages/upgrading/automatic-agent-updates.mdx index ba6eb626da644..86f2174bb335d 100644 --- a/docs/pages/upgrading/automatic-agent-updates.mdx +++ b/docs/pages/upgrading/automatic-agent-updates.mdx @@ -189,9 +189,16 @@ Server ID Hostname Services Version Upgrader - ```code - $ curl https://goteleport.com/static/install.sh | bash -s ${TELEPORT_VERSION?} enterprise - ``` + 1. Follow the instructions in the Teleport [installation + guide](../installation.mdx#package-repositories) to install the `teleport` + binary on your Linux server for your package manager. + + 1. Using your package manager, install `teleport-ent-updater` on the + server where you installed `teleport`. For example: + + ```code + $ apt-get install -y teleport-ent-updater + ``` From 66688a6822cd292eab115f08d4a6f5bd19134a07 Mon Sep 17 00:00:00 2001 From: Gavin Frazar Date: Tue, 30 Jul 2024 10:23:37 -0700 Subject: [PATCH 013/139] update aws oidc db enrollment role permissions (#44784) --- lib/cloud/aws/policy_statements.go | 2 ++ .../teleport/src/Discover/Shared/Aws/ConfigureIamPerms.tsx | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/cloud/aws/policy_statements.go b/lib/cloud/aws/policy_statements.go index ead15df770078..07b890ea99aa0 100644 --- a/lib/cloud/aws/policy_statements.go +++ b/lib/cloud/aws/policy_statements.go @@ -219,6 +219,8 @@ func StatementForListRDSDatabases() *Statement { "rds:DescribeDBInstances", "rds:DescribeDBClusters", "ec2:DescribeSecurityGroups", + "ec2:DescribeSubnets", + "ec2:DescribeVpcs", }, Resources: allResources, } diff --git a/web/packages/teleport/src/Discover/Shared/Aws/ConfigureIamPerms.tsx b/web/packages/teleport/src/Discover/Shared/Aws/ConfigureIamPerms.tsx index 71d1f57364af6..26201a6ea5b69 100644 --- a/web/packages/teleport/src/Discover/Shared/Aws/ConfigureIamPerms.tsx +++ b/web/packages/teleport/src/Discover/Shared/Aws/ConfigureIamPerms.tsx @@ -142,7 +142,9 @@ export function ConfigureIamPerms({ "Action": [ "rds:DescribeDBInstances", "rds:DescribeDBClusters", - "ec2:DescribeSecurityGroups" + "ec2:DescribeSecurityGroups", + "ec2:DescribeSubnets", + "ec2:DescribeVpcs" ], "Resource": "*" } From 7a5cbbe692d89192f22f3717934fa53223fc4d69 Mon Sep 17 00:00:00 2001 From: Gavin Frazar Date: Tue, 30 Jul 2024 10:24:14 -0700 Subject: [PATCH 014/139] fix discovery overwriting dynamic resources (#44785) When the resource already exists, check its origin as well as discovery group. If it's not of discovery origin, then don't update it. If it's not in the same discovery group, and its discovery group is not blank, then don't update it. --- lib/srv/discovery/database_watcher.go | 15 +-- lib/srv/discovery/discovery.go | 38 ++++++- lib/srv/discovery/discovery_test.go | 125 +++++++++++++++++---- lib/srv/discovery/kube_services_watcher.go | 11 +- lib/srv/discovery/kube_watcher.go | 12 +- 5 files changed, 159 insertions(+), 42 deletions(-) diff --git a/lib/srv/discovery/database_watcher.go b/lib/srv/discovery/database_watcher.go index c49b32f4eaeb5..c3ab1abb437bf 100644 --- a/lib/srv/discovery/database_watcher.go +++ b/lib/srv/discovery/database_watcher.go @@ -138,16 +138,17 @@ func (s *Server) getCurrentDatabases() map[string]types.Database { func (s *Server) onDatabaseCreate(ctx context.Context, database types.Database) error { s.Log.Debugf("Creating database %s.", database.GetName()) err := s.AccessPoint.CreateDatabase(ctx, database) - // If the database already exists but has an empty discovery group, update it. - if trace.IsAlreadyExists(err) && s.updatesEmptyDiscoveryGroup( - func() (types.ResourceWithLabels, error) { + // If the database already exists but has cloud origin and an empty + // discovery group, then update it. + if err != nil { + err := s.resolveCreateErr(err, types.OriginCloud, func() (types.ResourceWithLabels, error) { return s.AccessPoint.GetDatabase(ctx, database.GetName()) - }) { + }) + if err != nil { + return trace.Wrap(err) + } return trace.Wrap(s.onDatabaseUpdate(ctx, database, nil)) } - if err != nil { - return trace.Wrap(err) - } err = s.emitUsageEvents(map[string]*usageeventsv1.ResourceCreateEvent{ databaseEventPrefix + database.GetName(): { ResourceType: types.DiscoveredResourceDatabase, diff --git a/lib/srv/discovery/discovery.go b/lib/srv/discovery/discovery.go index dcf4da61cee47..9f9d4c0d33481 100644 --- a/lib/srv/discovery/discovery.go +++ b/lib/srv/discovery/discovery.go @@ -1686,14 +1686,42 @@ func splitMatchers[T types.Matcher](matchers []T, matcherTypeCheck func(string) return } -func (s *Server) updatesEmptyDiscoveryGroup(getter func() (types.ResourceWithLabels, error)) bool { - if s.DiscoveryGroup == "" { - return false +func (s *Server) resolveCreateErr(createErr error, discoveryOrigin string, getter func() (types.ResourceWithLabels, error)) error { + // We can only resolve the error if we have a discovery group configured + // and the error is that the resource already exists. + if s.DiscoveryGroup == "" || !trace.IsAlreadyExists(createErr) { + return trace.Wrap(createErr) } + old, err := getter() if err != nil { - return false + return trace.NewAggregate(createErr, err) + } + + // Check that the registered resource origin matches the origin we want. + oldOrigin, err := types.GetOrigin(old) + if err != nil { + return trace.NewAggregate(createErr, err) + } + if oldOrigin != discoveryOrigin { + return trace.Wrap(createErr, + "not updating because the resource origin indicates that it is not managed by auto-discovery", + ) } + + // Check that the registered resource's discovery group is blank or matches + // this server's discovery group. + // We check if the old group is empty because that's a special case where + // the old/new groups don't match but we still want to update the resource. + // In this way, discovery agents with a discovery_group essentially claim + // the resources they discover that used to be (or currently are) discovered + // by an agent that did not have a discovery_group configured. oldDiscoveryGroup, _ := old.GetLabel(types.TeleportInternalDiscoveryGroupName) - return oldDiscoveryGroup == "" + if oldDiscoveryGroup != "" && oldDiscoveryGroup != s.DiscoveryGroup { + return trace.Wrap(createErr, + "not updating because the resource is in a different discovery group", + ) + } + + return nil } diff --git a/lib/srv/discovery/discovery_test.go b/lib/srv/discovery/discovery_test.go index 18c02109becf9..ce0e18db784a2 100644 --- a/lib/srv/discovery/discovery_test.go +++ b/lib/srv/discovery/discovery_test.go @@ -2793,12 +2793,7 @@ func TestGCPVMDiscovery(t *testing.T) { // TestServer_onCreate tests the update of the discovery_group of a resource // when a resource already exists with the same name but an empty discovery_group. func TestServer_onCreate(t *testing.T) { - _, awsRedshiftDB := makeRedshiftCluster(t, "aws-redshift", "us-east-1", "test") - _, awsRedshiftDBEmptyDiscoveryGroup := makeRedshiftCluster(t, "aws-redshift", "us-east-1", "" /* empty discovery group */) - accessPoint := &fakeAccessPoint{ - kube: mustConvertEKSToKubeCluster(t, eksMockClusters[0], "" /* empty discovery group */), - database: awsRedshiftDBEmptyDiscoveryGroup, - } + accessPoint := &fakeAccessPoint{} s := &Server{ Config: &Config{ DiscoveryGroup: "test-cluster", @@ -2808,31 +2803,106 @@ func TestServer_onCreate(t *testing.T) { } t.Run("onCreate update kube", func(t *testing.T) { + // With cloud origin and an empty discovery group, it should update. + accessPoint.kube = mustConvertEKSToKubeCluster(t, eksMockClusters[0], "" /* empty discovery group */) err := s.onKubeCreate(context.Background(), mustConvertEKSToKubeCluster(t, eksMockClusters[0], "test-cluster")) require.NoError(t, err) - require.True(t, accessPoint.updateKube) + require.True(t, accessPoint.updatedKube) + + // Reset the updated flag and set the registered kube cluster to have + // non-cloud origin. It should not update. + accessPoint.updatedKube = false + accessPoint.kube.SetOrigin(types.OriginDynamic) + err = s.onKubeCreate(context.Background(), mustConvertEKSToKubeCluster(t, eksMockClusters[0], "test-cluster")) + require.Error(t, err) + require.False(t, accessPoint.updatedKube) - // Reset the update flag. - accessPoint.updateKube = false + // Reset the updated flag and set the registered kube cluster to have + // an empty origin. It should not update. + accessPoint.updatedKube = false + accessPoint.kube.SetOrigin("") + err = s.onKubeCreate(context.Background(), mustConvertEKSToKubeCluster(t, eksMockClusters[0], "test-cluster")) + require.Error(t, err) + require.False(t, accessPoint.updatedKube) + + // Reset the update flag and set the registered kube cluster to have + // a non-empty discovery group. It should not update. + accessPoint.updatedKube = false accessPoint.kube = mustConvertEKSToKubeCluster(t, eksMockClusters[0], "nonEmpty") - // Update the kube cluster with non-empty discovery group. err = s.onKubeCreate(context.Background(), mustConvertEKSToKubeCluster(t, eksMockClusters[0], "test-cluster")) require.Error(t, err) - require.False(t, accessPoint.updateKube) + require.False(t, accessPoint.updatedKube) }) t.Run("onCreate update database", func(t *testing.T) { + _, awsRedshiftDB := makeRedshiftCluster(t, "aws-redshift", "us-east-1", "test") + _, awsRedshiftDBEmptyDiscoveryGroup := makeRedshiftCluster(t, "aws-redshift", "us-east-1", "" /* empty discovery group */) + + // With cloud origin and an empty discovery group, it should update. + accessPoint.database = awsRedshiftDBEmptyDiscoveryGroup err := s.onDatabaseCreate(context.Background(), awsRedshiftDB) require.NoError(t, err) - require.True(t, accessPoint.updateDatabase) + require.True(t, accessPoint.updatedDatabase) - // Reset the update flag. - accessPoint.updateDatabase = false + // Reset the updated flag and set the db to empty discovery group + // but non-cloud origin. It should not update. + accessPoint.updatedDatabase = false + accessPoint.database.SetOrigin(types.OriginDynamic) + err = s.onDatabaseCreate(context.Background(), awsRedshiftDB) + require.Error(t, err) + require.False(t, accessPoint.updatedDatabase) + + // Reset the updated flag and set the db to empty discovery group + // but empty origin. It should not update. + accessPoint.updatedDatabase = false + accessPoint.database.SetOrigin("") + err = s.onDatabaseCreate(context.Background(), awsRedshiftDB) + require.Error(t, err) + require.False(t, accessPoint.updatedDatabase) + + // Reset the updated flag and set the registered db to have a non-empty + // discovery group. It should not update. + accessPoint.updatedDatabase = false accessPoint.database = awsRedshiftDB - // Update the db with non-empty discovery group. err = s.onDatabaseCreate(context.Background(), awsRedshiftDB) require.Error(t, err) - require.False(t, accessPoint.updateDatabase) + require.False(t, accessPoint.updatedDatabase) + }) + + t.Run("onCreate update app", func(t *testing.T) { + kubeSvc := newMockKubeService("service1", "ns1", "", + map[string]string{"test-label": "testval"}, nil, + []corev1.ServicePort{{Port: 42, Name: "http", Protocol: corev1.ProtocolTCP}}) + + // With kube origin and empty discovery group, it should update. + accessPoint.app = mustConvertKubeServiceToApp(t, "" /*empty discovery group*/, "http", kubeSvc, kubeSvc.Spec.Ports[0]) + err := s.onAppCreate(context.Background(), mustConvertKubeServiceToApp(t, "notEmpty", "http", kubeSvc, kubeSvc.Spec.Ports[0])) + require.NoError(t, err) + require.True(t, accessPoint.updatedApp) + + // Reset the updated flag and set the app to empty discovery group + // but non-cloud origin. It should not update. + accessPoint.updatedApp = false + accessPoint.app.SetOrigin(types.OriginDynamic) + err = s.onAppCreate(context.Background(), mustConvertKubeServiceToApp(t, "notEmpty", "http", kubeSvc, kubeSvc.Spec.Ports[0])) + require.Error(t, err) + require.False(t, accessPoint.updatedApp) + + // Reset the updated flag and set the app to empty discovery group + // but non-cloud origin. It should not update. + accessPoint.updatedApp = false + accessPoint.app.SetOrigin("") + err = s.onAppCreate(context.Background(), mustConvertKubeServiceToApp(t, "notEmpty", "http", kubeSvc, kubeSvc.Spec.Ports[0])) + require.Error(t, err) + require.False(t, accessPoint.updatedApp) + + // Reset the updated flag and set the app to non-empty discovery group. + // It should not update. + accessPoint.updatedApp = false + accessPoint.app = mustConvertKubeServiceToApp(t, "nonEmpty", "http", kubeSvc, kubeSvc.Spec.Ports[0]) + err = s.onAppCreate(context.Background(), mustConvertKubeServiceToApp(t, "notEmpty", "http", kubeSvc, kubeSvc.Spec.Ports[0])) + require.Error(t, err) + require.False(t, accessPoint.updatedApp) }) } @@ -2931,10 +3001,12 @@ type fakeAccessPoint struct { ping func(context.Context) (proto.PingResponse, error) enrollEKSClusters func(context.Context, *integrationpb.EnrollEKSClustersRequest, ...grpc.CallOption) (*integrationpb.EnrollEKSClustersResponse, error) - updateKube bool - updateDatabase bool + updatedKube bool + updatedDatabase bool + updatedApp bool kube types.KubeCluster database types.Database + app types.Application upsertedServerInfos chan types.ServerInfo reports map[string][]discoveryconfig.Status } @@ -2981,7 +3053,7 @@ func (f *fakeAccessPoint) CreateDatabase(ctx context.Context, database types.Dat } func (f *fakeAccessPoint) UpdateDatabase(ctx context.Context, database types.Database) error { - f.updateDatabase = true + f.updatedDatabase = true return nil } @@ -2991,7 +3063,20 @@ func (f *fakeAccessPoint) CreateKubernetesCluster(ctx context.Context, cluster t // UpdateKubernetesCluster updates existing kubernetes cluster resource. func (f *fakeAccessPoint) UpdateKubernetesCluster(ctx context.Context, cluster types.KubeCluster) error { - f.updateKube = true + f.updatedKube = true + return nil +} + +func (f *fakeAccessPoint) GetApp(ctx context.Context, name string) (types.Application, error) { + return f.app, nil +} + +func (f *fakeAccessPoint) CreateApp(ctx context.Context, _ types.Application) error { + return trace.AlreadyExists("already exists") +} + +func (f *fakeAccessPoint) UpdateApp(ctx context.Context, _ types.Application) error { + f.updatedApp = true return nil } diff --git a/lib/srv/discovery/kube_services_watcher.go b/lib/srv/discovery/kube_services_watcher.go index 88b978f283cff..eb6d68cc964f7 100644 --- a/lib/srv/discovery/kube_services_watcher.go +++ b/lib/srv/discovery/kube_services_watcher.go @@ -122,11 +122,14 @@ func (s *Server) onAppCreate(ctx context.Context, app types.Application) error { // In this case, we need to update the resource with the // discovery group label to ensure the user doesn't have to manually delete // the resource. - if trace.IsAlreadyExists(err) { - return trace.Wrap(s.onAppUpdate(ctx, app, nil)) - } if err != nil { - return trace.Wrap(err) + err := s.resolveCreateErr(err, types.OriginDiscoveryKubernetes, func() (types.ResourceWithLabels, error) { + return s.AccessPoint.GetApp(ctx, app.GetName()) + }) + if err != nil { + return trace.Wrap(err) + } + return trace.Wrap(s.onAppUpdate(ctx, app, nil)) } err = s.emitUsageEvents(map[string]*usageeventsv1.ResourceCreateEvent{ appEventPrefix + app.GetName(): { diff --git a/lib/srv/discovery/kube_watcher.go b/lib/srv/discovery/kube_watcher.go index 58c61475c8f32..e18cc23e68c99 100644 --- a/lib/srv/discovery/kube_watcher.go +++ b/lib/srv/discovery/kube_watcher.go @@ -121,15 +121,15 @@ func (s *Server) onKubeCreate(ctx context.Context, kubeCluster types.KubeCluster s.Log.Debugf("Creating kube_cluster %s.", kubeCluster.GetName()) err := s.AccessPoint.CreateKubernetesCluster(ctx, kubeCluster) // If the kube already exists but has an empty discovery group, update it. - if trace.IsAlreadyExists(err) && s.updatesEmptyDiscoveryGroup( - func() (types.ResourceWithLabels, error) { + if err != nil { + err := s.resolveCreateErr(err, types.OriginCloud, func() (types.ResourceWithLabels, error) { return s.AccessPoint.GetKubernetesCluster(ctx, kubeCluster.GetName()) - }) { + }) + if err != nil { + return trace.Wrap(err) + } return trace.Wrap(s.onKubeUpdate(ctx, kubeCluster, nil)) } - if err != nil { - return trace.Wrap(err) - } err = s.emitUsageEvents(map[string]*usageeventsv1.ResourceCreateEvent{ kubeEventPrefix + kubeCluster.GetName(): { ResourceType: types.DiscoveredResourceKubernetes, From 0393697e702abc105cd1e8fc4477088c2f9b1c23 Mon Sep 17 00:00:00 2001 From: Hugo Shaka Date: Tue, 30 Jul 2024 14:17:55 -0400 Subject: [PATCH 015/139] [v16] Document operator annotations (#44770) * Document operator annotations * Apply suggestions from code review Co-authored-by: Paul Gottschling --------- Co-authored-by: Paul Gottschling --- .../dynamic-resources/teleport-operator.mdx | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/docs/pages/management/dynamic-resources/teleport-operator.mdx b/docs/pages/management/dynamic-resources/teleport-operator.mdx index e4ab426ee9ccd..9b2fc860b306d 100644 --- a/docs/pages/management/dynamic-resources/teleport-operator.mdx +++ b/docs/pages/management/dynamic-resources/teleport-operator.mdx @@ -45,6 +45,33 @@ follow [the guide for Helm-deployed clusters](./teleport-operator-helm.mdx). If you are hosting Teleport out of Kubernetes (Teleport Cloud, Terraform, ...), follow [the standalone operator guide](./teleport-operator-standalone.mdx). +### Control reconciliation with annotations + +The operator supports two annotations on CRs: + +#### `teleport.dev/keep` + +This annotation instructs the operator to keep the Teleport resource if the CR is deleted. +This is useful if you want to migrate between two resource versions. + +For example, to migrate from `TeleportRoleV6` to `TeleportRoleV7`: +- Annotate the existing `TeleportRoleV6` resource with `teleport.dev/keep: "true"` +- Delete the `TeleportRoleV6` CR, the operator won't delete the associated Teleport role +- Create a `TeleportRoleV7` CR with the same name, the operator will find the existing v6 role and adopt it. + +Possible values are `"true"` or `"false"` (those are strings, as Booleans are not valid label values in Kubernetes). + +#### `teleport.dev/ignore` + +This annotation instructs the operator to ignore the CR when reconciling. +This means the resource will not be created, updated, or deleted in Teleport. + +This also means the operator will not remove its finalizer if you try to delete an ignored CR. +The finalizer will stay and the deletion be blocked until you patch the resource to remove the +finalizer or remove the ignore annotation. + +Possible values are `"true"` or `"false"` (those are strings, as Booleans are not valid label values in Kubernetes). + ### Troubleshooting (!docs/pages/includes/diagnostics/kubernetes-operator-troubleshooting.mdx!) From 5ef5824c05a298a440d0684a4e9e44f4bab99e9d Mon Sep 17 00:00:00 2001 From: Gus Luxton Date: Tue, 30 Jul 2024 15:18:23 -0300 Subject: [PATCH 016/139] [v16] Change to using tctl desktop ls (#44761) * Change to using tctl desktops ls `tctl get windows_desktop` -> `tctl desktops ls` * Apply suggestions from code review Co-authored-by: Zac Bergquist --------- Co-authored-by: Zac Bergquist --- docs/pages/choose-an-edition/migrate-to-cloud.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/pages/choose-an-edition/migrate-to-cloud.mdx b/docs/pages/choose-an-edition/migrate-to-cloud.mdx index 7af5cabcd6988..e2c4068cba9da 100644 --- a/docs/pages/choose-an-edition/migrate-to-cloud.mdx +++ b/docs/pages/choose-an-edition/migrate-to-cloud.mdx @@ -318,7 +318,7 @@ your new Teleport cluster, ensure that the setup is complete. List all registered Windows desktops: ```code - $ tctl get windows_desktop + $ tctl desktop ls ``` 1. Ensure that end users have the expected SSO access to your infrastructure. From 1d2fb7018454675725a551c1c6868ac2ff9f6aec Mon Sep 17 00:00:00 2001 From: rosstimothy <39066650+rosstimothy@users.noreply.github.com> Date: Tue, 30 Jul 2024 14:43:44 -0400 Subject: [PATCH 017/139] Omit prerelease information from rejected connection alert (#44756) The oldest supported version used in the version check has a prerelease of `-aa` to account for any alpha,beta,rc releases. Since the alert blindly included said version it resulted in alerts including `<15.0.0-aa` in the message causing confusion. This change ensures that only the major, minor, and patch release are included in any user facing messaging when connections are rejected. --- lib/auth/middleware.go | 7 ++++++- lib/auth/middleware_test.go | 4 ++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/lib/auth/middleware.go b/lib/auth/middleware.go index 0e53634a75a18..3bc1abf457e0e 100644 --- a/lib/auth/middleware.go +++ b/lib/auth/middleware.go @@ -464,9 +464,14 @@ func (a *Middleware) displayRejectedClientAlert(ctx context.Context, userAgent s return } + alertVersion := semver.Version{ + Major: a.OldestSupportedVersion.Major, + Minor: a.OldestSupportedVersion.Minor, + Patch: a.OldestSupportedVersion.Patch, + } alert, err := types.NewClusterAlert( "rejected-unsupported-connection", - fmt.Sprintf("Connections were rejected from %s running unsupported Teleport versions(<%s), they will be inaccessible until upgraded.", connectionType, a.OldestSupportedVersion), + fmt.Sprintf("Connections were rejected from %s running unsupported Teleport versions(<%s), they will be inaccessible until upgraded.", connectionType, alertVersion), types.WithAlertSeverity(types.AlertSeverity_MEDIUM), types.WithAlertLabel(types.AlertOnLogin, "yes"), types.WithAlertLabel(types.AlertVerbPermit, fmt.Sprintf("%s:%s", types.KindToken, types.VerbCreate)), diff --git a/lib/auth/middleware_test.go b/lib/auth/middleware_test.go index dc56ecfb2635f..971953d4c82ab 100644 --- a/lib/auth/middleware_test.go +++ b/lib/auth/middleware_test.go @@ -789,6 +789,8 @@ func TestRejectedClientClusterAlert(t *testing.T) { require.Len(t, alerts, 1) require.Equal(t, "rejected-unsupported-connection", alerts[0].GetName()) require.Contains(t, alerts[0].Spec.Message, "agents") + // Assert that the version in the message does not contain any prereleases + require.NotContains(t, alerts[0].Spec.Message, "-aa") for _, tool := range []string{"tsh", "tctl", "tbot"} { t.Run(tool, func(t *testing.T) { @@ -825,6 +827,8 @@ func TestRejectedClientClusterAlert(t *testing.T) { require.Len(t, alerts, 1) assert.Equal(t, "rejected-unsupported-connection", alerts[0].GetName()) require.Contains(t, alerts[0].Spec.Message, tool) + // Assert that the version in the message does not contain any prereleases + require.NotContains(t, alerts[0].Spec.Message, "-aa") }) } From a31c2ac6439a7d11108798392b2f1aeeac88e34e Mon Sep 17 00:00:00 2001 From: Alan Parra Date: Tue, 30 Jul 2024 16:56:44 -0300 Subject: [PATCH 018/139] [v16] fix: Issue DeviceWebToken during Github authn (#44808) * fix: Issue DeviceWebToken during Github authn (#44656) * Move trusted device mode calculation into CreateWebSessionFromReq * Add the GithubAuthRequest.ClientUserAgent field * Update generated protos * Issue DeviceWebToken during Github authn * Issue DeviceWebToken as part of CreateWebSessionFromReq * nit: Move methods to sessions.go * Fix imports and merged code * Fix imports yet again --- api/proto/teleport/legacy/types/types.proto | 3 + api/types/types.pb.go | 3357 ++++++++++--------- lib/auth/auth.go | 2 +- lib/auth/auth_test.go | 2 +- lib/auth/github.go | 16 +- lib/auth/methods.go | 86 +- lib/auth/sessions.go | 132 +- lib/web/apiserver.go | 4 + 8 files changed, 1848 insertions(+), 1754 deletions(-) diff --git a/api/proto/teleport/legacy/types/types.proto b/api/proto/teleport/legacy/types/types.proto index c164db3a03c08..435728fc1366b 100644 --- a/api/proto/teleport/legacy/types/types.proto +++ b/api/proto/teleport/legacy/types/types.proto @@ -4755,6 +4755,9 @@ message GithubAuthRequest { teleport.attestation.v1.AttestationStatement attestation_statement = 16 [(gogoproto.jsontag) = "attestation_statement,omitempty"]; // ClientLoginIP specifies IP address of the client for login, it will be written to the user's certificates. string ClientLoginIP = 17 [(gogoproto.jsontag) = "client_login_ip,omitempty"]; + // ClientUserAgent is the user agent of the Web browser, used for issuing + // a DeviceWebToken. + string ClientUserAgent = 18 [(gogoproto.jsontag) = "client_user_agent,omitempty"]; } // SSOWarnings conveys a user-facing main message along with auxiliary warnings. diff --git a/api/types/types.pb.go b/api/types/types.pb.go index 1b5939c90c4e0..ef29d41be7928 100644 --- a/api/types/types.pb.go +++ b/api/types/types.pb.go @@ -12073,7 +12073,10 @@ type GithubAuthRequest struct { // attestation_statement is an attestation statement for the given public key. AttestationStatement *v1.AttestationStatement `protobuf:"bytes,16,opt,name=attestation_statement,json=attestationStatement,proto3" json:"attestation_statement,omitempty"` // ClientLoginIP specifies IP address of the client for login, it will be written to the user's certificates. - ClientLoginIP string `protobuf:"bytes,17,opt,name=ClientLoginIP,proto3" json:"client_login_ip,omitempty"` + ClientLoginIP string `protobuf:"bytes,17,opt,name=ClientLoginIP,proto3" json:"client_login_ip,omitempty"` + // ClientUserAgent is the user agent of the Web browser, used for issuing + // a DeviceWebToken. + ClientUserAgent string `protobuf:"bytes,18,opt,name=ClientUserAgent,proto3" json:"client_user_agent,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -19285,1658 +19288,1661 @@ func init() { func init() { proto.RegisterFile("teleport/legacy/types/types.proto", fileDescriptor_9198ee693835762e) } var fileDescriptor_9198ee693835762e = []byte{ - // 26408 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x6b, 0x70, 0x1c, 0x49, - 0x7a, 0x20, 0x36, 0xfd, 0x00, 0xd0, 0xf8, 0xf0, 0x6a, 0x24, 0x40, 0x12, 0xe4, 0x90, 0x03, 0x4e, - 0x71, 0x86, 0x43, 0xce, 0x83, 0x5c, 0x82, 0x3b, 0xdc, 0x9d, 0x9d, 0x67, 0xa3, 0x1b, 0x24, 0x9a, - 0x04, 0x01, 0x6c, 0x35, 0x08, 0xec, 0x68, 0x76, 0xb7, 0xb6, 0xd0, 0x9d, 0x00, 0x6a, 0xd0, 0xdd, - 0xd5, 0x5b, 0x55, 0x4d, 0x10, 0xab, 0x3b, 0x6b, 0x25, 0x9d, 0x6e, 0x2d, 0xdf, 0xe9, 0xe5, 0x5b, - 0x59, 0x7b, 0x0e, 0x9d, 0x42, 0x21, 0xdf, 0x9d, 0xe5, 0xc7, 0x29, 0x1c, 0x92, 0x2e, 0x7c, 0x0e, - 0x85, 0xe5, 0x93, 0x43, 0x56, 0xc8, 0x72, 0x9c, 0x2d, 0x87, 0xdf, 0x6b, 0x05, 0x64, 0x59, 0x17, - 0x17, 0x0e, 0x86, 0xed, 0xd0, 0x59, 0x8e, 0x0b, 0x7b, 0x1c, 0xb2, 0x1d, 0xf9, 0x65, 0x66, 0x55, - 0x66, 0x55, 0x75, 0xa3, 0x31, 0xc3, 0x39, 0x89, 0x63, 0xff, 0x21, 0xd1, 0x5f, 0x7e, 0xdf, 0x97, - 0xcf, 0xca, 0xfc, 0xf2, 0xcb, 0xef, 0x01, 0xcf, 0x07, 0xb4, 0x49, 0x3b, 0xae, 0x17, 0x5c, 0x6f, - 0xd2, 0x5d, 0xbb, 0x7e, 0x78, 0x3d, 0x38, 0xec, 0x50, 0x9f, 0xff, 0x7b, 0xad, 0xe3, 0xb9, 0x81, - 0x4b, 0x86, 0xf0, 0xc7, 0xb9, 0xd9, 0x5d, 0x77, 0xd7, 0x45, 0xc8, 0x75, 0xf6, 0x17, 0x2f, 0x3c, - 0x37, 0xbf, 0xeb, 0xba, 0xbb, 0x4d, 0x7a, 0x1d, 0x7f, 0x6d, 0x77, 0x77, 0xae, 0x07, 0x4e, 0x8b, - 0xfa, 0x81, 0xdd, 0xea, 0x08, 0x84, 0xab, 0x61, 0x05, 0x76, 0x10, 0xb0, 0x92, 0xc0, 0x71, 0xdb, - 0xd7, 0x1f, 0xde, 0x50, 0x7f, 0x0a, 0xd4, 0xd7, 0xd2, 0xdb, 0x72, 0xe0, 0xd9, 0x9d, 0x0e, 0xf5, - 0xa2, 0x3f, 0x38, 0xba, 0xf1, 0x0b, 0x39, 0x18, 0xbd, 0x47, 0x69, 0xa7, 0xd4, 0x74, 0x1e, 0x52, - 0x72, 0x09, 0xf2, 0xab, 0x76, 0x8b, 0xce, 0x65, 0x2e, 0x66, 0xae, 0x8c, 0x2e, 0x4e, 0x3d, 0x3e, - 0x9a, 0x1f, 0xf3, 0xa9, 0xf7, 0x90, 0x7a, 0x56, 0xdb, 0x6e, 0x51, 0x13, 0x0b, 0xc9, 0x2b, 0x30, - 0xca, 0xfe, 0xf7, 0x3b, 0x76, 0x9d, 0xce, 0x65, 0x11, 0x73, 0xe2, 0xf1, 0xd1, 0xfc, 0x68, 0x5b, - 0x02, 0xcd, 0xa8, 0x9c, 0x54, 0x61, 0x64, 0xe9, 0x51, 0xc7, 0xf1, 0xa8, 0x3f, 0x97, 0xbf, 0x98, - 0xb9, 0x32, 0xb6, 0x70, 0xee, 0x1a, 0xef, 0xec, 0x35, 0xd9, 0xd9, 0x6b, 0x1b, 0xb2, 0xb3, 0x8b, - 0x33, 0xbf, 0x7b, 0x34, 0xff, 0xcc, 0xe3, 0xa3, 0xf9, 0x11, 0xca, 0x49, 0x7e, 0xfa, 0x0f, 0xe7, - 0x33, 0xa6, 0xa4, 0x27, 0x6f, 0x41, 0x7e, 0xe3, 0xb0, 0x43, 0xe7, 0x46, 0x2f, 0x66, 0xae, 0x4c, - 0x2e, 0x3c, 0x77, 0x8d, 0x0f, 0x6f, 0xd8, 0xf8, 0xe8, 0x2f, 0x86, 0xb5, 0x58, 0x78, 0x7c, 0x34, - 0x9f, 0x67, 0x28, 0x26, 0x52, 0x91, 0xd7, 0x60, 0x78, 0xd9, 0xf5, 0x83, 0x6a, 0x65, 0x0e, 0xb0, - 0xc9, 0xa7, 0x1e, 0x1f, 0xcd, 0x4f, 0xef, 0xb9, 0x7e, 0x60, 0x39, 0x8d, 0x57, 0xdd, 0x96, 0x13, - 0xd0, 0x56, 0x27, 0x38, 0x34, 0x05, 0x92, 0xf1, 0x08, 0x26, 0x34, 0x7e, 0x64, 0x0c, 0x46, 0x1e, - 0xac, 0xde, 0x5b, 0x5d, 0xdb, 0x5a, 0x2d, 0x3e, 0x43, 0x0a, 0x90, 0x5f, 0x5d, 0xab, 0x2c, 0x15, - 0x33, 0x64, 0x04, 0x72, 0xa5, 0xf5, 0xf5, 0x62, 0x96, 0x8c, 0x43, 0xa1, 0x52, 0xda, 0x28, 0x2d, - 0x96, 0x6a, 0x4b, 0xc5, 0x1c, 0x99, 0x81, 0xa9, 0xad, 0xea, 0x6a, 0x65, 0x6d, 0xab, 0x66, 0x55, - 0x96, 0x6a, 0xf7, 0x36, 0xd6, 0xd6, 0x8b, 0x79, 0x32, 0x09, 0x70, 0xef, 0xc1, 0xe2, 0x92, 0xb9, - 0xba, 0xb4, 0xb1, 0x54, 0x2b, 0x0e, 0x91, 0x59, 0x28, 0x4a, 0x12, 0xab, 0xb6, 0x64, 0x6e, 0x56, - 0xcb, 0x4b, 0xc5, 0xe1, 0xbb, 0xf9, 0x42, 0xae, 0x98, 0x37, 0x47, 0x56, 0xa8, 0xed, 0xd3, 0x6a, - 0xc5, 0xf8, 0xd7, 0x72, 0x50, 0xb8, 0x4f, 0x03, 0xbb, 0x61, 0x07, 0x36, 0x39, 0xaf, 0xcd, 0x0f, - 0x76, 0x51, 0x99, 0x98, 0x4b, 0xc9, 0x89, 0x19, 0x7a, 0x7c, 0x34, 0x9f, 0x79, 0x4d, 0x9d, 0x90, - 0x37, 0x61, 0xac, 0x42, 0xfd, 0xba, 0xe7, 0x74, 0xd8, 0xa2, 0x99, 0xcb, 0x21, 0xda, 0xd9, 0xc7, - 0x47, 0xf3, 0xa7, 0x1a, 0x11, 0x58, 0x19, 0x10, 0x15, 0x9b, 0x54, 0x61, 0x78, 0xc5, 0xde, 0xa6, - 0x4d, 0x7f, 0x6e, 0xe8, 0x62, 0xee, 0xca, 0xd8, 0xc2, 0xb3, 0x62, 0x12, 0x64, 0x03, 0xaf, 0xf1, - 0xd2, 0xa5, 0x76, 0xe0, 0x1d, 0x2e, 0xce, 0x3e, 0x3e, 0x9a, 0x2f, 0x36, 0x11, 0xa0, 0x0e, 0x30, - 0x47, 0x21, 0xb5, 0x68, 0x61, 0x0c, 0x1f, 0xbb, 0x30, 0x2e, 0xfc, 0xee, 0xd1, 0x7c, 0x86, 0x4d, - 0x98, 0x58, 0x18, 0x11, 0x3f, 0x7d, 0x89, 0x2c, 0x40, 0xc1, 0xa4, 0x0f, 0x1d, 0x9f, 0xf5, 0xac, - 0x80, 0x3d, 0x3b, 0xfd, 0xf8, 0x68, 0x9e, 0x78, 0x02, 0xa6, 0x34, 0x23, 0xc4, 0x3b, 0xf7, 0x06, - 0x8c, 0x29, 0xad, 0x26, 0x45, 0xc8, 0xed, 0xd3, 0x43, 0x3e, 0xc2, 0x26, 0xfb, 0x93, 0xcc, 0xc2, - 0xd0, 0x43, 0xbb, 0xd9, 0x15, 0x43, 0x6a, 0xf2, 0x1f, 0x5f, 0xca, 0x7e, 0x31, 0x73, 0x37, 0x5f, - 0x18, 0x29, 0x16, 0xcc, 0x6c, 0xb5, 0x62, 0xfc, 0xcb, 0x79, 0x28, 0x98, 0x2e, 0xff, 0x10, 0xc9, - 0x55, 0x18, 0xaa, 0x05, 0x76, 0x20, 0xa7, 0x69, 0xe6, 0xf1, 0xd1, 0xfc, 0x14, 0xfb, 0x48, 0xa9, - 0x52, 0x3f, 0xc7, 0x60, 0xa8, 0xeb, 0x7b, 0xb6, 0x2f, 0xa7, 0x0b, 0x51, 0x3b, 0x0c, 0xa0, 0xa2, - 0x22, 0x06, 0xb9, 0x0c, 0xf9, 0xfb, 0x6e, 0x83, 0x8a, 0x19, 0x23, 0x8f, 0x8f, 0xe6, 0x27, 0x5b, - 0x6e, 0x43, 0x45, 0xc4, 0x72, 0xf2, 0x2a, 0x8c, 0x96, 0xbb, 0x9e, 0x47, 0xdb, 0x6c, 0xad, 0xe7, - 0x11, 0x79, 0xf2, 0xf1, 0xd1, 0x3c, 0xd4, 0x39, 0xd0, 0x72, 0x1a, 0x66, 0x84, 0xc0, 0xa6, 0xa1, - 0x16, 0xd8, 0x5e, 0x40, 0x1b, 0x73, 0x43, 0x03, 0x4d, 0x03, 0xfb, 0x3e, 0xa7, 0x7d, 0x4e, 0x12, - 0x9f, 0x06, 0xc1, 0x89, 0x2c, 0xc3, 0xd8, 0x1d, 0xcf, 0xae, 0xd3, 0x75, 0xea, 0x39, 0x6e, 0x03, - 0xe7, 0x37, 0xb7, 0x78, 0xf9, 0xf1, 0xd1, 0xfc, 0xe9, 0x5d, 0x06, 0xb6, 0x3a, 0x08, 0x8f, 0xa8, - 0x3f, 0x3a, 0x9a, 0x2f, 0x54, 0xba, 0x1e, 0x8e, 0x9e, 0xa9, 0x92, 0x92, 0x6f, 0xb0, 0xc9, 0xf1, - 0x03, 0x1c, 0x5a, 0xda, 0x98, 0x1b, 0x39, 0xb6, 0x89, 0x86, 0x68, 0xe2, 0xe9, 0xa6, 0xed, 0x07, - 0x96, 0xc7, 0xe9, 0x62, 0xed, 0x54, 0x59, 0x92, 0x35, 0x28, 0xd4, 0xea, 0x7b, 0xb4, 0xd1, 0x6d, - 0x52, 0x5c, 0x32, 0x63, 0x0b, 0x67, 0xc4, 0xa2, 0x96, 0xf3, 0x29, 0x8b, 0x17, 0xcf, 0x09, 0xde, - 0xc4, 0x17, 0x10, 0x75, 0x3d, 0x49, 0xac, 0x2f, 0x15, 0xbe, 0xf7, 0x8b, 0xf3, 0xcf, 0x7c, 0xfb, - 0x0f, 0x2e, 0x3e, 0x63, 0xfc, 0xbb, 0x59, 0x28, 0xc6, 0x99, 0x90, 0x1d, 0x98, 0x78, 0xd0, 0x69, - 0xd8, 0x01, 0x2d, 0x37, 0x1d, 0xda, 0x0e, 0x7c, 0x5c, 0x24, 0xfd, 0xfb, 0xf4, 0x82, 0xa8, 0x77, - 0xae, 0x8b, 0x84, 0x56, 0x9d, 0x53, 0xc6, 0x7a, 0xa5, 0xb3, 0x8d, 0xea, 0xa9, 0xe1, 0x06, 0xee, - 0xe3, 0x0a, 0x3b, 0x59, 0x3d, 0x7c, 0xeb, 0xef, 0x51, 0x8f, 0x60, 0x2b, 0x16, 0x50, 0xbb, 0xb1, - 0x7d, 0x88, 0x2b, 0x73, 0xf0, 0x05, 0xc4, 0x48, 0x52, 0x16, 0x10, 0x03, 0x1b, 0xff, 0x38, 0x03, - 0x93, 0x26, 0xf5, 0xdd, 0xae, 0x57, 0xa7, 0xcb, 0xd4, 0x6e, 0x50, 0x8f, 0x2d, 0xff, 0x7b, 0x4e, - 0xbb, 0x21, 0xbe, 0x29, 0x5c, 0xfe, 0xfb, 0x4e, 0x5b, 0xdd, 0xba, 0xb1, 0x9c, 0x7c, 0x0e, 0x46, - 0x6a, 0xdd, 0x6d, 0x44, 0xcd, 0x46, 0x3b, 0x80, 0xdf, 0xdd, 0xb6, 0x62, 0xe8, 0x12, 0x8d, 0x5c, - 0x87, 0x91, 0x4d, 0xea, 0xf9, 0xd1, 0x6e, 0x88, 0x47, 0xc3, 0x43, 0x0e, 0x52, 0x09, 0x04, 0x16, - 0xb9, 0x13, 0xed, 0xc8, 0xe2, 0x50, 0x9b, 0x8a, 0xed, 0x83, 0xd1, 0x52, 0x69, 0x09, 0x88, 0xba, - 0x54, 0x24, 0x96, 0xf1, 0x33, 0x59, 0x28, 0x56, 0xec, 0xc0, 0xde, 0xb6, 0x7d, 0x31, 0x9e, 0x9b, - 0x37, 0xd9, 0x1e, 0xaf, 0x74, 0x14, 0xf7, 0x78, 0xd6, 0xf2, 0x8f, 0xdd, 0xbd, 0x17, 0xe3, 0xdd, - 0x1b, 0x63, 0x27, 0xac, 0xe8, 0x5e, 0xd4, 0xa9, 0xb7, 0x8f, 0xef, 0x54, 0x51, 0x74, 0xaa, 0x20, - 0x3b, 0x15, 0x75, 0x85, 0xbc, 0x0d, 0xf9, 0x5a, 0x87, 0xd6, 0xc5, 0x26, 0x22, 0xcf, 0x05, 0xbd, - 0x73, 0x0c, 0x61, 0xf3, 0xe6, 0xe2, 0xb8, 0x60, 0x93, 0xf7, 0x3b, 0xb4, 0x6e, 0x22, 0x99, 0xf2, - 0xd1, 0xfc, 0x83, 0x1c, 0xcc, 0xa6, 0x91, 0xa9, 0xfd, 0x18, 0xee, 0xd3, 0x8f, 0x2b, 0x50, 0x60, - 0x47, 0x38, 0x3b, 0x16, 0x71, 0xbb, 0x18, 0x5d, 0x1c, 0x67, 0x4d, 0xde, 0x13, 0x30, 0x33, 0x2c, - 0x25, 0x97, 0x42, 0x89, 0xa0, 0x10, 0xf1, 0x13, 0x12, 0x81, 0x94, 0x03, 0xd8, 0x5c, 0xcb, 0x4f, - 0x18, 0x05, 0x87, 0x68, 0x58, 0x24, 0x38, 0x9a, 0x6b, 0x4f, 0x40, 0xb4, 0x63, 0x46, 0x1e, 0x0a, - 0x4b, 0x50, 0x90, 0xdd, 0x9a, 0x1b, 0x47, 0x46, 0xd3, 0xb1, 0x41, 0xda, 0xbc, 0xc9, 0x27, 0xb3, - 0x21, 0x7e, 0xab, 0x6c, 0x24, 0x0e, 0xb9, 0x09, 0x85, 0x75, 0xcf, 0x7d, 0x74, 0x58, 0xad, 0xf8, - 0x73, 0x13, 0x17, 0x73, 0x57, 0x46, 0x17, 0xcf, 0x3c, 0x3e, 0x9a, 0x9f, 0xe9, 0x30, 0x98, 0xe5, - 0x34, 0xd4, 0x93, 0x36, 0x44, 0xbc, 0x9b, 0x2f, 0x64, 0x8a, 0xd9, 0xbb, 0xf9, 0x42, 0xb6, 0x98, - 0xe3, 0xe2, 0xc5, 0xdd, 0x7c, 0x21, 0x5f, 0x1c, 0xba, 0x9b, 0x2f, 0x0c, 0xa1, 0xc0, 0x31, 0x5a, - 0x84, 0xbb, 0xf9, 0xc2, 0x58, 0x71, 0x5c, 0x3b, 0xed, 0x91, 0x41, 0xe0, 0xd6, 0xdd, 0xa6, 0x99, - 0x7b, 0x60, 0x56, 0xcd, 0xe1, 0x72, 0xa9, 0x4c, 0xbd, 0xc0, 0xcc, 0x95, 0xb6, 0x6a, 0xe6, 0x44, - 0xe5, 0xb0, 0x6d, 0xb7, 0x9c, 0x3a, 0x3f, 0x3a, 0xcd, 0xdc, 0x9d, 0xf2, 0xba, 0x51, 0x82, 0xc9, - 0xa8, 0x2f, 0x2b, 0x8e, 0x1f, 0x90, 0xeb, 0x30, 0x2a, 0x21, 0x6c, 0xa3, 0xcb, 0xa5, 0xf6, 0xda, - 0x8c, 0x70, 0x8c, 0xdf, 0xc9, 0x02, 0x44, 0x25, 0x4f, 0xe9, 0xb7, 0xf0, 0x05, 0xed, 0x5b, 0x38, - 0x15, 0xff, 0x16, 0x7a, 0x7e, 0x05, 0xe4, 0x5d, 0x18, 0x66, 0x62, 0x41, 0x57, 0x8a, 0x44, 0x67, - 0xe2, 0xa4, 0x58, 0xb8, 0x79, 0x73, 0x71, 0x52, 0x10, 0x0f, 0xfb, 0x08, 0x31, 0x05, 0x99, 0xf2, - 0x19, 0xfd, 0xc2, 0x48, 0x34, 0x19, 0xe2, 0x03, 0xba, 0x02, 0xe1, 0x84, 0x8a, 0x01, 0xc5, 0x2f, - 0xa3, 0x23, 0x27, 0x39, 0x2c, 0x25, 0x67, 0x81, 0x4d, 0xb8, 0x18, 0xd4, 0x91, 0xc7, 0x47, 0xf3, - 0xb9, 0xae, 0xe7, 0xe0, 0x22, 0x20, 0xd7, 0x41, 0x2c, 0x03, 0x31, 0x80, 0x6c, 0xf5, 0x4d, 0xd7, - 0x6d, 0xab, 0x4e, 0xbd, 0x20, 0x1a, 0xf1, 0xb9, 0x8c, 0x5c, 0x2d, 0xa4, 0x03, 0xfa, 0x52, 0x99, - 0xcb, 0xe3, 0x32, 0xb8, 0x92, 0x3a, 0x2a, 0xd7, 0x34, 0x54, 0x2e, 0x46, 0x5e, 0x94, 0xa7, 0x52, - 0x83, 0x97, 0x59, 0x09, 0x91, 0x52, 0xaf, 0x80, 0xdc, 0x04, 0xb6, 0x42, 0xc5, 0xe8, 0x83, 0xa8, - 0xa7, 0xb4, 0x55, 0x5b, 0x3c, 0x25, 0x38, 0x4d, 0xd8, 0x07, 0x2a, 0x39, 0xc3, 0x26, 0x6f, 0x02, - 0x5b, 0xc2, 0x62, 0xdc, 0x89, 0x20, 0xba, 0x53, 0x5e, 0x2f, 0x37, 0xdd, 0x6e, 0xa3, 0xf6, 0xe5, - 0x95, 0x88, 0x78, 0xb7, 0xde, 0x51, 0x89, 0xef, 0x94, 0xd7, 0xc9, 0x9b, 0x30, 0x54, 0xfa, 0x56, - 0xd7, 0xa3, 0x42, 0x3e, 0x19, 0x97, 0x75, 0x32, 0xd8, 0xe2, 0x19, 0x41, 0x38, 0x65, 0xb3, 0x9f, - 0xaa, 0x5c, 0x87, 0xe5, 0xac, 0xe6, 0x8d, 0x95, 0x9a, 0x90, 0x3d, 0x48, 0x6c, 0x58, 0x36, 0x56, - 0x94, 0x66, 0x07, 0x5a, 0xaf, 0x19, 0x15, 0xb9, 0x0e, 0xd9, 0x52, 0x05, 0x6f, 0x44, 0x63, 0x0b, - 0xa3, 0xb2, 0xda, 0xca, 0xe2, 0xac, 0x20, 0x19, 0xb7, 0xd5, 0xcf, 0x20, 0x5b, 0xaa, 0x90, 0x45, - 0x18, 0xba, 0x7f, 0x58, 0xfb, 0xf2, 0x8a, 0xd8, 0xcc, 0x66, 0xe4, 0xba, 0x66, 0xb0, 0x35, 0xfc, - 0xec, 0xfd, 0xa8, 0xc5, 0xad, 0x43, 0xff, 0x9b, 0x4d, 0xb5, 0xc5, 0x88, 0x46, 0xd6, 0x61, 0xb4, - 0xd4, 0x68, 0x39, 0xed, 0x07, 0x3e, 0xf5, 0xe6, 0xc6, 0x90, 0xcf, 0x5c, 0xac, 0xdd, 0x61, 0xf9, - 0xe2, 0xdc, 0xe3, 0xa3, 0xf9, 0x59, 0x9b, 0xfd, 0xb4, 0xba, 0x3e, 0xf5, 0x14, 0x6e, 0x11, 0x13, - 0xb2, 0x0e, 0x70, 0xdf, 0x6d, 0xef, 0xba, 0xa5, 0xa0, 0x69, 0xfb, 0xb1, 0xed, 0x31, 0x2a, 0x08, - 0xc5, 0x87, 0x53, 0x2d, 0x06, 0xb3, 0x6c, 0x06, 0x54, 0x18, 0x2a, 0x3c, 0xc8, 0x6d, 0x18, 0x5e, - 0xf3, 0xec, 0x7a, 0x93, 0xce, 0x4d, 0x20, 0xb7, 0x59, 0xc1, 0x8d, 0x03, 0x65, 0x4f, 0xe7, 0x04, - 0xc3, 0xa2, 0x8b, 0x60, 0xf5, 0x9a, 0xc2, 0x11, 0xcf, 0x6d, 0x01, 0x49, 0xae, 0xc9, 0x94, 0x4b, - 0xc2, 0x2b, 0xea, 0x25, 0x21, 0xfa, 0xe8, 0xcb, 0x6e, 0xab, 0x65, 0xb7, 0x1b, 0x48, 0xbb, 0xb9, - 0xa0, 0xdc, 0x1d, 0x8c, 0x6f, 0xc2, 0x74, 0x62, 0xb0, 0x8e, 0xb9, 0xdf, 0xbd, 0x03, 0x53, 0x15, - 0xba, 0x63, 0x77, 0x9b, 0x41, 0x78, 0x92, 0xf0, 0x4f, 0x14, 0x6f, 0x5a, 0x0d, 0x5e, 0x64, 0xc9, - 0xe3, 0xc3, 0x8c, 0x23, 0x1b, 0x6f, 0xc3, 0x84, 0xd6, 0x7d, 0x76, 0x55, 0x28, 0x75, 0x1b, 0x4e, - 0x80, 0x13, 0x99, 0x89, 0xae, 0x0a, 0x36, 0x03, 0xe2, 0x74, 0x99, 0x11, 0x82, 0xf1, 0xb7, 0x55, - 0x69, 0x45, 0xec, 0x44, 0xec, 0x5a, 0x2d, 0xf6, 0x83, 0x4c, 0x24, 0x3b, 0x25, 0xf6, 0x83, 0x70, - 0x37, 0xb8, 0xca, 0xbf, 0xcd, 0x6c, 0xe2, 0xdb, 0x1c, 0x13, 0x33, 0x91, 0xb3, 0x0f, 0x7c, 0xfe, - 0x45, 0x86, 0x2b, 0x35, 0xf7, 0xf1, 0x57, 0xea, 0xbb, 0x30, 0x7e, 0xdf, 0x6e, 0xdb, 0xbb, 0xb4, - 0xc1, 0x7a, 0xc0, 0xf7, 0x9e, 0xd1, 0xc5, 0x67, 0x1f, 0x1f, 0xcd, 0x9f, 0x69, 0x71, 0x38, 0xf6, - 0x52, 0x5d, 0x44, 0x1a, 0x01, 0xb9, 0x21, 0xbf, 0xec, 0xa1, 0x94, 0x2f, 0x7b, 0x42, 0xd4, 0x3e, - 0x84, 0x5f, 0xb6, 0xf8, 0x9e, 0x8d, 0xff, 0xbd, 0x80, 0x7d, 0x24, 0xaf, 0xc2, 0xb0, 0x49, 0x77, - 0xd9, 0x51, 0x93, 0x89, 0x26, 0xc9, 0x43, 0x88, 0x3a, 0x30, 0x1c, 0x07, 0xe5, 0x0c, 0xda, 0xf0, - 0xf7, 0x9c, 0x9d, 0x40, 0x8c, 0x4e, 0x28, 0x67, 0x08, 0xb0, 0x22, 0x67, 0x08, 0x88, 0x7e, 0x9d, - 0xe5, 0x30, 0xb6, 0xfb, 0x99, 0x95, 0x9a, 0x18, 0x34, 0x39, 0xc2, 0x66, 0x45, 0xd9, 0x46, 0x3c, - 0x4d, 0x4a, 0x60, 0xd8, 0xe4, 0x16, 0x8c, 0x96, 0xea, 0x75, 0xb7, 0xab, 0xdc, 0x19, 0xf9, 0x77, - 0xcb, 0x81, 0xba, 0x8a, 0x24, 0x42, 0x25, 0x35, 0x18, 0x5b, 0x62, 0x17, 0x2d, 0xa7, 0x6c, 0xd7, - 0xf7, 0xe4, 0x20, 0xc9, 0x3d, 0x4c, 0x29, 0x89, 0xbe, 0x5c, 0x8a, 0xc0, 0x3a, 0x03, 0xaa, 0x4a, - 0x06, 0x05, 0x97, 0x6c, 0xc0, 0x58, 0x8d, 0xd6, 0x3d, 0x1a, 0xd4, 0x02, 0xd7, 0xa3, 0xb1, 0x2d, - 0x59, 0x29, 0x59, 0x7c, 0x4e, 0xde, 0xf5, 0x7c, 0x04, 0x5a, 0x3e, 0x83, 0xaa, 0x5c, 0x15, 0x64, - 0x2e, 0xb4, 0xb7, 0x5c, 0xef, 0xb0, 0xb2, 0x28, 0xb6, 0xe9, 0xe8, 0x4c, 0xe7, 0x60, 0x55, 0x68, - 0x67, 0x90, 0xc6, 0xb6, 0x2e, 0xb4, 0x73, 0x2c, 0x9c, 0xa9, 0x4a, 0x0d, 0x65, 0x2b, 0xb1, 0x69, - 0x4f, 0x45, 0xa3, 0x8c, 0x60, 0x65, 0xa6, 0x1a, 0x3e, 0x4a, 0x66, 0xda, 0x4c, 0x09, 0x2c, 0xd2, - 0x01, 0x22, 0x67, 0x8d, 0x0b, 0xba, 0x4d, 0xea, 0xfb, 0x62, 0x2f, 0x3f, 0x1b, 0x9b, 0xfc, 0x08, - 0x61, 0xf1, 0x45, 0xc1, 0xfc, 0x82, 0x5c, 0x06, 0xe2, 0x9e, 0xc6, 0x0a, 0x95, 0x7a, 0x52, 0x78, - 0x93, 0x37, 0x00, 0x96, 0x1e, 0x05, 0xd4, 0x6b, 0xdb, 0xcd, 0x50, 0x0f, 0x86, 0xaa, 0x1f, 0x2a, - 0xa0, 0xfa, 0x44, 0x2b, 0xc8, 0xa4, 0x0c, 0x13, 0x25, 0xdf, 0xef, 0xb6, 0xa8, 0xe9, 0x36, 0x69, - 0xc9, 0x5c, 0xc5, 0x7d, 0x7f, 0x74, 0xf1, 0xc2, 0xe3, 0xa3, 0xf9, 0xb3, 0x36, 0x16, 0x58, 0x9e, - 0xdb, 0xa4, 0x96, 0xed, 0xa9, 0xab, 0x5b, 0xa7, 0x21, 0x6b, 0x00, 0x6b, 0x1d, 0xda, 0xae, 0x51, - 0xdb, 0xab, 0xef, 0xc5, 0xb6, 0xf9, 0xa8, 0x60, 0xf1, 0xbc, 0xe8, 0xe1, 0xac, 0xdb, 0xa1, 0x6d, - 0x1f, 0x61, 0x6a, 0xab, 0x22, 0x4c, 0xb2, 0x05, 0x53, 0xd5, 0xd2, 0xfd, 0x75, 0xb7, 0xe9, 0xd4, - 0x0f, 0x85, 0xe4, 0x34, 0x89, 0xda, 0xc1, 0xd3, 0x82, 0x6b, 0xac, 0x94, 0x6f, 0x4f, 0x8e, 0xdd, - 0xb2, 0x3a, 0x08, 0xb5, 0x84, 0xfc, 0x14, 0xe7, 0x42, 0xde, 0x67, 0x6b, 0xd0, 0x67, 0xc2, 0xe0, - 0x86, 0xbd, 0xeb, 0xcf, 0x4d, 0x69, 0xda, 0xae, 0xd2, 0x56, 0xed, 0x9a, 0x52, 0xca, 0xc5, 0x94, - 0x73, 0x7c, 0x21, 0x22, 0xd4, 0x0a, 0xec, 0x5d, 0x5f, 0x5f, 0x88, 0x21, 0xf6, 0xb9, 0x77, 0xa0, - 0x18, 0x27, 0x3e, 0xa1, 0xd2, 0x69, 0xa2, 0x38, 0xa9, 0xb4, 0x78, 0xe9, 0x91, 0xe3, 0x07, 0xbe, - 0xf1, 0x83, 0xda, 0x57, 0xc3, 0xbe, 0xe8, 0x7b, 0xf4, 0x70, 0xdd, 0xa3, 0x3b, 0xce, 0x23, 0xb1, - 0x01, 0xe1, 0x17, 0xbd, 0x4f, 0x0f, 0xad, 0x0e, 0x42, 0xd5, 0x2f, 0x3a, 0x44, 0x25, 0x9f, 0x87, - 0xc2, 0xbd, 0xfb, 0xb5, 0x7b, 0xf4, 0xb0, 0x5a, 0x11, 0x87, 0x0b, 0x27, 0x6b, 0xf9, 0x16, 0x23, - 0xd5, 0xd6, 0x47, 0x88, 0x69, 0x2c, 0x46, 0xbb, 0x17, 0xab, 0xb9, 0xdc, 0xec, 0xfa, 0x01, 0xf5, - 0xaa, 0x15, 0xb5, 0xe6, 0x3a, 0x07, 0xc6, 0xf6, 0x92, 0x10, 0xd5, 0xf8, 0x07, 0x59, 0xdc, 0xb9, - 0xd8, 0x22, 0xad, 0xb6, 0xfd, 0xc0, 0x6e, 0xd7, 0x69, 0xc8, 0x00, 0x17, 0xa9, 0x23, 0xa0, 0xb1, - 0x45, 0x1a, 0x21, 0xeb, 0x55, 0x67, 0x07, 0xae, 0x9a, 0x55, 0x29, 0xb5, 0x0d, 0xd5, 0x8a, 0xaa, - 0x12, 0xf5, 0x04, 0x34, 0x56, 0x65, 0x84, 0x4c, 0x2e, 0xc3, 0x48, 0xb5, 0x74, 0xbf, 0xd4, 0x0d, - 0xf6, 0x70, 0xdf, 0x2c, 0x70, 0x99, 0x9a, 0xad, 0x30, 0xbb, 0x1b, 0xec, 0x99, 0xb2, 0x90, 0x5c, - 0xc7, 0xbb, 0x4a, 0x9b, 0x06, 0x5c, 0x75, 0x2a, 0x0e, 0x4a, 0x9f, 0x83, 0x62, 0x57, 0x15, 0x06, - 0x22, 0x2f, 0xc3, 0xd0, 0xe6, 0x7a, 0xb9, 0x5a, 0x11, 0x97, 0x5d, 0x3c, 0x3d, 0x1e, 0x76, 0xea, - 0x7a, 0x4b, 0x38, 0x8a, 0xf1, 0x5b, 0x99, 0x68, 0x4f, 0x22, 0x97, 0x35, 0x19, 0x02, 0x15, 0x25, - 0x4c, 0x86, 0x50, 0x15, 0x25, 0x28, 0x4d, 0x98, 0x40, 0xca, 0x5d, 0x3f, 0x70, 0x5b, 0x4b, 0xed, - 0x46, 0xc7, 0x75, 0xda, 0x01, 0x52, 0xf1, 0x51, 0x33, 0x1e, 0x1f, 0xcd, 0x3f, 0x57, 0xc7, 0x52, - 0x8b, 0x8a, 0x62, 0x2b, 0xc6, 0x25, 0x85, 0xfa, 0x13, 0x0c, 0xa4, 0xf1, 0x7b, 0x59, 0xed, 0x2c, - 0x61, 0xcd, 0x33, 0x69, 0xa7, 0xe9, 0xd4, 0xf1, 0xfa, 0x7c, 0xc7, 0x73, 0xbb, 0x9d, 0x70, 0x39, - 0x60, 0xf3, 0xbc, 0xa8, 0xd4, 0xda, 0x65, 0xc5, 0x3a, 0xef, 0x14, 0x6a, 0xf2, 0x1e, 0x8c, 0xb3, - 0x63, 0x5d, 0xfc, 0xf4, 0xe7, 0xb2, 0x38, 0x13, 0xe7, 0x51, 0xe5, 0xe5, 0x53, 0x2f, 0x64, 0xa3, - 0xc9, 0x03, 0x2a, 0x05, 0x69, 0xc0, 0xdc, 0x86, 0x67, 0xb7, 0x7d, 0x27, 0x58, 0x6a, 0xd7, 0xbd, - 0x43, 0x14, 0x43, 0x96, 0xda, 0xf6, 0x76, 0x93, 0x36, 0xb0, 0xbb, 0x85, 0xc5, 0x2b, 0x8f, 0x8f, - 0xe6, 0x5f, 0x08, 0x38, 0x8e, 0x45, 0x43, 0x24, 0x8b, 0x72, 0x2c, 0x85, 0x73, 0x4f, 0x4e, 0x4c, - 0x6c, 0x91, 0xc3, 0x8a, 0x2f, 0x1e, 0xfc, 0x44, 0x46, 0xb1, 0x25, 0x9c, 0x0d, 0xb6, 0x15, 0xa9, - 0xcd, 0x54, 0x09, 0x8c, 0x7f, 0x96, 0x89, 0x4e, 0x3b, 0xf2, 0x16, 0x8c, 0x89, 0xa5, 0xae, 0xac, - 0x0b, 0xdc, 0xae, 0xe4, 0x77, 0x11, 0x9b, 0x59, 0x15, 0x9d, 0x5d, 0xb2, 0x4b, 0xe5, 0x15, 0x65, - 0x6d, 0xe0, 0x25, 0xdb, 0xae, 0x37, 0xe3, 0x54, 0x12, 0x8d, 0x2d, 0x82, 0x8d, 0x95, 0x9a, 0x3e, - 0x2a, 0xb8, 0x08, 0x82, 0xa6, 0x9f, 0x32, 0x0c, 0x0a, 0xf2, 0x27, 0xef, 0xf8, 0x7f, 0x93, 0x49, - 0x3b, 0x54, 0xc9, 0x22, 0x4c, 0x6c, 0xb9, 0xde, 0x3e, 0xce, 0xaf, 0x32, 0x08, 0x38, 0xf3, 0x07, - 0xb2, 0x20, 0xde, 0x21, 0x9d, 0x44, 0x6d, 0x9b, 0x32, 0x1a, 0x7a, 0xdb, 0x62, 0x1c, 0x34, 0x02, - 0x36, 0x0f, 0x21, 0xc7, 0xf0, 0xeb, 0xc0, 0x79, 0x88, 0x9a, 0xa0, 0x2d, 0x61, 0x15, 0xdd, 0xf8, - 0xf7, 0x33, 0xea, 0xe1, 0xc9, 0x06, 0xb9, 0xe2, 0xb6, 0x6c, 0xa7, 0xad, 0x74, 0x87, 0xbf, 0xe2, - 0x20, 0x34, 0xde, 0x12, 0x05, 0x99, 0xdc, 0x84, 0x02, 0xff, 0x15, 0x6e, 0x92, 0xa8, 0x42, 0x12, - 0x84, 0xfa, 0x0e, 0x2f, 0x11, 0x13, 0x33, 0x93, 0x3b, 0xe9, 0xcc, 0x7c, 0x3b, 0x03, 0x63, 0xca, - 0x7d, 0x9a, 0xed, 0xd5, 0xeb, 0x9e, 0xfb, 0x21, 0xad, 0x07, 0xfa, 0x31, 0xd1, 0xe1, 0xc0, 0xd8, - 0x5e, 0x1d, 0xa2, 0xc6, 0x8e, 0x87, 0xec, 0x09, 0x8e, 0x07, 0xe3, 0x9f, 0x66, 0x84, 0x34, 0x3f, - 0xf0, 0x1e, 0xa9, 0xef, 0x67, 0xd9, 0x93, 0x1c, 0x0c, 0xef, 0xc1, 0x90, 0x49, 0x1b, 0x8e, 0x2f, - 0x24, 0xf1, 0x69, 0xf5, 0xe6, 0x80, 0x05, 0xd1, 0xe5, 0xc5, 0x63, 0x3f, 0xd5, 0x5d, 0x1d, 0xcb, - 0x99, 0xc8, 0x55, 0xf5, 0x6f, 0x37, 0xe9, 0x23, 0x87, 0xaf, 0x64, 0x71, 0xc0, 0xa0, 0xc8, 0xe5, - 0xf8, 0xd6, 0x0e, 0x2b, 0x11, 0xb2, 0x9f, 0xba, 0x6a, 0x35, 0x1a, 0xe3, 0x7d, 0x80, 0xa8, 0x4a, - 0x72, 0x0f, 0x8a, 0xe2, 0xdb, 0x76, 0xda, 0xbb, 0x5c, 0x7c, 0x10, 0x63, 0x30, 0xff, 0xf8, 0x68, - 0xfe, 0xd9, 0x7a, 0x58, 0x26, 0xe4, 0x23, 0x85, 0x6f, 0x82, 0xd0, 0xf8, 0xd7, 0xb3, 0x90, 0x2d, - 0xe1, 0x84, 0xdc, 0xa3, 0x87, 0x81, 0xbd, 0x7d, 0xdb, 0x69, 0x6a, 0x2b, 0x71, 0x1f, 0xa1, 0xd6, - 0x8e, 0xa3, 0x5d, 0xac, 0x15, 0x64, 0xb6, 0x12, 0xef, 0x79, 0xdb, 0xaf, 0x23, 0xa1, 0xb2, 0x12, - 0xf7, 0xbd, 0xed, 0xd7, 0xe3, 0x64, 0x21, 0x22, 0x31, 0x60, 0x98, 0xaf, 0x4a, 0xb1, 0x06, 0xe1, - 0xf1, 0xd1, 0xfc, 0x30, 0x5f, 0xbc, 0xa6, 0x28, 0x21, 0x67, 0x21, 0x57, 0x5b, 0x5f, 0x15, 0xdb, - 0x07, 0x2a, 0xb0, 0xfc, 0x4e, 0xdb, 0x64, 0x30, 0x56, 0xe7, 0x4a, 0xa5, 0xb4, 0x8e, 0x57, 0xd6, - 0xa1, 0xa8, 0xce, 0x66, 0xc3, 0xee, 0xc4, 0x2f, 0xad, 0x21, 0x22, 0x79, 0x1b, 0xc6, 0xee, 0x55, - 0xca, 0xcb, 0xae, 0xcf, 0x3f, 0xfd, 0xe1, 0x68, 0xf1, 0xef, 0x37, 0xea, 0x16, 0xea, 0x8c, 0xe3, - 0x7b, 0xa8, 0x82, 0x6f, 0xfc, 0x58, 0x16, 0xc6, 0x14, 0x8d, 0x0e, 0xf9, 0xbc, 0x78, 0xca, 0xcb, - 0x68, 0xb2, 0xaa, 0x82, 0xc1, 0x4a, 0xf9, 0xf5, 0xbf, 0xe5, 0x36, 0xa8, 0x78, 0xd8, 0x8b, 0xae, - 0xda, 0xd9, 0x41, 0xae, 0xda, 0x6f, 0x00, 0xf0, 0x35, 0x80, 0x4d, 0x56, 0xce, 0x62, 0xe5, 0x45, - 0x5f, 0x9d, 0x97, 0x08, 0x99, 0x6c, 0xc2, 0xcc, 0x86, 0xd7, 0xf5, 0x83, 0xda, 0xa1, 0x1f, 0xd0, - 0x16, 0xe3, 0xb6, 0xee, 0xba, 0x4d, 0xb1, 0xfe, 0x5e, 0x78, 0x7c, 0x34, 0x7f, 0x31, 0x60, 0xc5, - 0x96, 0x8f, 0xe5, 0xd8, 0x00, 0xab, 0xe3, 0xba, 0xea, 0x05, 0x3c, 0x8d, 0x81, 0x61, 0xc2, 0xb8, - 0x7a, 0x7d, 0x67, 0xdb, 0xb2, 0x78, 0xf6, 0x10, 0x4a, 0x59, 0x65, 0x5b, 0x16, 0xad, 0x4c, 0x3e, - 0xc3, 0xe8, 0x24, 0xc6, 0xe7, 0x55, 0xd5, 0xd1, 0xa0, 0x1f, 0xb6, 0xf1, 0x23, 0x99, 0x68, 0x1b, - 0xd9, 0xbc, 0x41, 0xde, 0x84, 0x61, 0xfe, 0xcc, 0x24, 0x5e, 0xe3, 0x4e, 0x85, 0xd7, 0x2f, 0xf5, - 0x0d, 0x8a, 0xeb, 0x6c, 0x7f, 0x9f, 0x3f, 0x45, 0x3f, 0x63, 0x0a, 0x92, 0x50, 0xdd, 0xab, 0x6b, - 0x7e, 0x24, 0x77, 0x54, 0x6c, 0xde, 0x48, 0x53, 0xf7, 0x1a, 0xbf, 0x9d, 0x87, 0x49, 0x1d, 0x4d, - 0x7d, 0x8b, 0xca, 0x0c, 0xf4, 0x16, 0xf5, 0x1e, 0x14, 0xd8, 0x78, 0x38, 0x75, 0x2a, 0xc5, 0x99, - 0x17, 0x50, 0x09, 0x2e, 0x60, 0xda, 0x1b, 0x2b, 0xf0, 0xe9, 0x60, 0xb7, 0x31, 0x33, 0xa4, 0x22, - 0x0b, 0xca, 0x83, 0x49, 0x2e, 0x3a, 0xe1, 0xe5, 0x83, 0x89, 0xfa, 0x3d, 0x84, 0x4f, 0x27, 0xaf, - 0xc1, 0x30, 0x93, 0x6a, 0x43, 0x65, 0x01, 0xb6, 0x92, 0x09, 0xbc, 0x31, 0x63, 0x0a, 0x8e, 0x44, - 0xb6, 0xa0, 0xb0, 0x62, 0xfb, 0x41, 0x8d, 0xd2, 0xf6, 0x00, 0xaf, 0xcc, 0xf3, 0x62, 0xa8, 0x66, - 0xf0, 0x09, 0xd7, 0xa7, 0xb4, 0x1d, 0x7b, 0x26, 0x0c, 0x99, 0x91, 0xaf, 0x01, 0x94, 0xdd, 0x76, - 0xe0, 0xb9, 0xcd, 0x15, 0x77, 0x77, 0x6e, 0x18, 0x6f, 0x69, 0xcf, 0xc5, 0x26, 0x20, 0x42, 0xe0, - 0x17, 0xb5, 0x50, 0x15, 0x51, 0xe7, 0x05, 0x56, 0xd3, 0xdd, 0x55, 0xbf, 0x83, 0x08, 0x9f, 0xdc, - 0x86, 0xa2, 0xbc, 0x02, 0x3f, 0xe8, 0xec, 0x7a, 0xb8, 0x40, 0x46, 0xa2, 0x63, 0x9b, 0x3e, 0x0a, - 0xac, 0xae, 0x80, 0xab, 0x3b, 0x65, 0x9c, 0x86, 0x7c, 0x15, 0xce, 0xc4, 0x61, 0x72, 0x96, 0x0b, - 0x91, 0x40, 0xab, 0xb2, 0x4b, 0x59, 0xf7, 0xbd, 0x58, 0x18, 0x1f, 0x65, 0xe1, 0x4c, 0x8f, 0xce, - 0xb2, 0xef, 0x01, 0x8f, 0x6b, 0xe5, 0x7b, 0x88, 0x9d, 0xd2, 0xdc, 0x3a, 0xe6, 0x22, 0x64, 0xc5, - 0x01, 0x97, 0x5f, 0x2c, 0x3e, 0x3e, 0x9a, 0x1f, 0xd7, 0xe6, 0x31, 0x5b, 0xad, 0x90, 0xbb, 0x90, - 0x67, 0x53, 0x34, 0xc0, 0x23, 0xaf, 0xd4, 0x7e, 0x4c, 0x06, 0x8e, 0xba, 0x7c, 0x70, 0xea, 0x90, - 0x07, 0xf9, 0x3c, 0xe4, 0x36, 0x36, 0x56, 0x70, 0xed, 0xe4, 0xb0, 0xef, 0x13, 0x41, 0xd0, 0xd4, - 0x96, 0xea, 0x04, 0xa3, 0xbd, 0x16, 0xda, 0x04, 0x30, 0x74, 0xf2, 0x95, 0x98, 0xf1, 0xc9, 0xcb, - 0xfd, 0x27, 0x7a, 0x70, 0x5b, 0x94, 0x4f, 0x60, 0x02, 0x62, 0xfc, 0x7c, 0x36, 0xfa, 0x86, 0x6f, - 0x3b, 0xcd, 0x80, 0x7a, 0xe4, 0x1c, 0xff, 0x24, 0xa3, 0xfb, 0xaf, 0x19, 0xfe, 0x26, 0x73, 0xd1, - 0xf7, 0xcd, 0x59, 0x85, 0x1f, 0xf2, 0xcb, 0xca, 0x87, 0x9c, 0xc3, 0x0f, 0x79, 0xb2, 0xe7, 0x27, - 0xfb, 0x72, 0xca, 0xba, 0xc4, 0x0f, 0x31, 0x65, 0xed, 0xbd, 0x00, 0x13, 0xab, 0xee, 0xd2, 0xa3, - 0x20, 0x44, 0x64, 0x1f, 0x60, 0xc1, 0xd4, 0x81, 0x8c, 0xe3, 0x5a, 0xb3, 0x41, 0xbd, 0x8d, 0x3d, - 0xbb, 0xad, 0xbd, 0xb2, 0x9a, 0x09, 0x38, 0xc3, 0x5d, 0xa5, 0x07, 0x3a, 0xee, 0x08, 0xc7, 0x8d, - 0xc3, 0x8d, 0x1f, 0xce, 0xca, 0xc1, 0xd8, 0x5c, 0x78, 0x4a, 0x5f, 0xf3, 0x5e, 0xd7, 0x5e, 0xf3, - 0x66, 0x42, 0x3d, 0x64, 0xf8, 0x34, 0xbd, 0x70, 0xcc, 0x8b, 0xf6, 0x7f, 0x3b, 0x04, 0xe3, 0x2a, - 0x3a, 0x1b, 0x87, 0x52, 0xa3, 0xe1, 0xa9, 0xe3, 0x60, 0x37, 0x1a, 0x9e, 0x89, 0x50, 0xed, 0x01, - 0x3b, 0xd7, 0xf7, 0x01, 0xfb, 0xeb, 0x30, 0x5a, 0x6e, 0x35, 0xb4, 0x67, 0x35, 0x23, 0xa5, 0x79, - 0xd7, 0x42, 0x24, 0xfe, 0x2d, 0x84, 0xea, 0xb5, 0x7a, 0xab, 0x91, 0x7c, 0x4c, 0x8b, 0x58, 0x6a, - 0x6f, 0xdf, 0x43, 0x9f, 0xe4, 0xed, 0xfb, 0x16, 0x8c, 0x3e, 0xf0, 0xe9, 0x46, 0xb7, 0xdd, 0xa6, - 0x4d, 0x5c, 0x56, 0x05, 0x2e, 0xeb, 0x77, 0x7d, 0x6a, 0x05, 0x08, 0x55, 0x1b, 0x10, 0xa2, 0xaa, - 0x13, 0x3c, 0xd2, 0x67, 0x82, 0x6f, 0x42, 0x61, 0x9d, 0x52, 0x0f, 0xc7, 0x74, 0x2c, 0x12, 0xe9, - 0x3a, 0x94, 0x7a, 0x16, 0x1b, 0x58, 0xed, 0x4d, 0x5c, 0x20, 0x6a, 0x0f, 0xe9, 0xe3, 0x03, 0x3e, - 0xa4, 0x93, 0xe7, 0x61, 0xbc, 0xd3, 0xdd, 0x6e, 0x3a, 0x75, 0xe4, 0x2b, 0x5e, 0xe0, 0xcd, 0x31, - 0x0e, 0x63, 0x6c, 0x7d, 0xf2, 0x15, 0x98, 0xc0, 0x3b, 0x4e, 0xb8, 0xe4, 0x26, 0xb5, 0xf7, 0x27, - 0xad, 0x8c, 0x4b, 0x3a, 0x75, 0x06, 0xb2, 0x52, 0x0c, 0x45, 0x74, 0x46, 0xe7, 0x6a, 0x30, 0xa9, - 0xcf, 0xe4, 0x13, 0x78, 0x86, 0x0a, 0x8d, 0x02, 0x0a, 0xc5, 0xd1, 0xbb, 0xf9, 0x02, 0x14, 0xc7, - 0xb8, 0x39, 0x80, 0x09, 0xeb, 0x61, 0x9f, 0x4c, 0x72, 0xaf, 0xbb, 0x4d, 0xbd, 0x36, 0x0d, 0xa8, - 0x2f, 0x2e, 0x01, 0xbe, 0x99, 0x2f, 0x75, 0x3a, 0xbe, 0xf1, 0xeb, 0x59, 0x18, 0x29, 0x6d, 0xd5, - 0xaa, 0xed, 0x1d, 0x17, 0x1f, 0x93, 0xc2, 0x37, 0x04, 0xf5, 0x31, 0x29, 0x7c, 0x43, 0x50, 0x5f, - 0x0e, 0xae, 0xa7, 0x5c, 0xe3, 0xd0, 0xde, 0x54, 0xb9, 0xc6, 0x69, 0xba, 0xbd, 0xe8, 0x39, 0x25, - 0x37, 0xc0, 0x73, 0x4a, 0xa8, 0x3d, 0xcb, 0x1f, 0xab, 0x3d, 0x23, 0x6f, 0xc2, 0x58, 0xb5, 0x1d, - 0xd0, 0x5d, 0x2f, 0x5a, 0xe9, 0xe1, 0x95, 0x32, 0x04, 0xab, 0xa2, 0xbd, 0x82, 0xcd, 0x96, 0x11, - 0xd7, 0xd8, 0x85, 0x9a, 0x3a, 0x5c, 0x46, 0x5c, 0xb1, 0x17, 0xbb, 0x4c, 0x4b, 0x44, 0xa3, 0x12, - 0x5b, 0x23, 0xf2, 0xc9, 0x9a, 0x0b, 0x9f, 0x93, 0x91, 0x9a, 0x99, 0x0d, 0xec, 0xe2, 0x74, 0xfa, - 0x93, 0xb5, 0xf1, 0x9d, 0x2c, 0x8c, 0x95, 0x3a, 0x9d, 0xa7, 0xdc, 0x70, 0xe8, 0x8b, 0xda, 0xf6, - 0x2a, 0xef, 0x42, 0x61, 0xbf, 0x06, 0xb2, 0x19, 0xfa, 0x95, 0x2c, 0x4c, 0xc5, 0x28, 0xd4, 0xd6, - 0x67, 0x06, 0x34, 0x17, 0xca, 0x0e, 0x68, 0x2e, 0x94, 0x1b, 0xcc, 0x5c, 0x28, 0xff, 0x49, 0xb6, - 0xcc, 0x97, 0x20, 0x57, 0xea, 0x74, 0xe2, 0xcf, 0x8e, 0x9d, 0xce, 0xe6, 0x4d, 0x7e, 0x9f, 0xb5, - 0x3b, 0x1d, 0x93, 0x61, 0x68, 0xfb, 0xd8, 0xf0, 0x80, 0xfb, 0x98, 0xf1, 0x1a, 0x8c, 0x22, 0x2f, - 0x34, 0xd2, 0xb9, 0x08, 0xf8, 0x31, 0x0b, 0xfb, 0x1c, 0xad, 0x2e, 0xf1, 0x99, 0xff, 0x5f, 0x19, - 0x18, 0xc2, 0xdf, 0x4f, 0xe9, 0x1a, 0x5b, 0xd0, 0xd6, 0x58, 0x51, 0x59, 0x63, 0x83, 0xac, 0xae, - 0xff, 0x35, 0x8f, 0xa3, 0x25, 0xd6, 0x95, 0xb0, 0x8d, 0xc9, 0xa4, 0xd8, 0xc6, 0xbc, 0x01, 0xca, - 0xae, 0xa9, 0x6a, 0x8b, 0x94, 0x33, 0x43, 0xbd, 0x69, 0x44, 0xc8, 0x64, 0x3f, 0x6e, 0x25, 0x93, - 0xc3, 0xc9, 0xb8, 0x14, 0x6f, 0xea, 0x13, 0x31, 0x90, 0x59, 0x06, 0x52, 0x6d, 0xfb, 0xb4, 0xde, - 0xf5, 0x68, 0x6d, 0xdf, 0xe9, 0x6c, 0x52, 0xcf, 0xd9, 0x39, 0x14, 0xb7, 0x7b, 0x3c, 0x97, 0x1d, - 0x51, 0x6a, 0xf9, 0xfb, 0x4e, 0x87, 0x5d, 0x45, 0x9c, 0x9d, 0x43, 0x33, 0x85, 0x86, 0xbc, 0x0b, - 0x23, 0x26, 0x3d, 0xf0, 0x9c, 0x40, 0xbe, 0xfd, 0x4e, 0x86, 0x17, 0x67, 0x84, 0xf2, 0x8b, 0xa1, - 0xc7, 0x7f, 0xa8, 0xf3, 0x2f, 0xca, 0xc9, 0x02, 0xdf, 0xf8, 0xf8, 0x1b, 0xef, 0x44, 0xd4, 0xdb, - 0xd2, 0x56, 0xad, 0xd7, 0xbe, 0x47, 0xae, 0xc2, 0x10, 0xee, 0x9e, 0x42, 0x26, 0x40, 0x9b, 0x69, - 0x3c, 0x43, 0xd5, 0xad, 0x1d, 0x31, 0xc8, 0x73, 0x00, 0xa1, 0xfa, 0xde, 0x9f, 0x2b, 0xe0, 0x69, - 0xad, 0x40, 0xe2, 0x5b, 0xff, 0xe8, 0x49, 0xb6, 0xfe, 0x4f, 0xcf, 0x34, 0xe4, 0x57, 0xb2, 0x70, - 0x29, 0xdc, 0xce, 0xd6, 0xbc, 0x5a, 0xe9, 0xfe, 0x4a, 0xb5, 0xb1, 0x2e, 0xa4, 0xff, 0x75, 0xcf, - 0x7d, 0xe8, 0xb0, 0xdb, 0xdf, 0x8d, 0x63, 0x3e, 0xc6, 0x15, 0xbe, 0x6a, 0xb9, 0xea, 0x30, 0xab, - 0x3d, 0xa2, 0x2b, 0xa7, 0x86, 0x78, 0xe7, 0xef, 0x74, 0x12, 0x9a, 0xc4, 0xe5, 0x67, 0xcc, 0x88, - 0x01, 0xf9, 0x91, 0x0c, 0x9c, 0x4e, 0x6f, 0x88, 0xb8, 0x11, 0xce, 0x4b, 0xc9, 0xb3, 0x47, 0x6b, - 0x17, 0x5f, 0x7a, 0x7c, 0x34, 0x7f, 0xc9, 0xb7, 0x5b, 0x4d, 0xcb, 0x69, 0xf0, 0xda, 0x9c, 0x3a, - 0xb5, 0x3a, 0x02, 0x41, 0xab, 0xb7, 0x47, 0x4d, 0x5f, 0x02, 0xf9, 0x4d, 0xce, 0x65, 0x16, 0x01, - 0x0a, 0x52, 0x3b, 0x63, 0xfc, 0xfd, 0x0c, 0x28, 0x2b, 0xaa, 0x60, 0xd2, 0x86, 0xe3, 0xd1, 0x7a, - 0x80, 0x3b, 0x5a, 0xe8, 0x02, 0xc0, 0x61, 0x31, 0x9b, 0x09, 0x84, 0x91, 0x77, 0x60, 0x84, 0xeb, - 0x72, 0xb8, 0x0e, 0x25, 0x5a, 0x89, 0x42, 0xef, 0xc3, 0x7d, 0x45, 0x38, 0x86, 0xba, 0x8a, 0x05, - 0x11, 0x93, 0x6f, 0xef, 0x6e, 0x6d, 0x94, 0x9b, 0xb6, 0xd3, 0xf2, 0xc5, 0x3e, 0x86, 0xc3, 0xfa, - 0xe1, 0x41, 0x60, 0xd5, 0x11, 0xaa, 0xca, 0xb7, 0x21, 0xaa, 0x71, 0x47, 0xaa, 0x9d, 0x8e, 0x31, - 0xfc, 0x99, 0x87, 0xa1, 0xcd, 0xe8, 0xfa, 0xb9, 0x38, 0xfa, 0xf8, 0x68, 0x9e, 0x2f, 0x17, 0x93, - 0xc3, 0x8d, 0xbf, 0x96, 0x81, 0x49, 0x7d, 0x3d, 0x91, 0x6b, 0x30, 0x2c, 0xcc, 0xef, 0x33, 0x78, - 0xcd, 0x66, 0xa3, 0x30, 0xcc, 0x0d, 0xef, 0x35, 0x73, 0x7b, 0x81, 0xc5, 0x76, 0x62, 0xc1, 0x41, - 0xe8, 0x91, 0x70, 0x27, 0xae, 0x73, 0x90, 0x29, 0xcb, 0x88, 0xc1, 0xc4, 0x30, 0xbf, 0xdb, 0x0c, - 0x54, 0xed, 0xab, 0x87, 0x10, 0x53, 0x94, 0x18, 0x65, 0x18, 0xe6, 0x9f, 0x70, 0xcc, 0xe0, 0x20, - 0x73, 0x02, 0x83, 0x03, 0xe3, 0x28, 0x03, 0x50, 0xab, 0x2d, 0xdf, 0xa3, 0x87, 0xeb, 0xb6, 0xe3, - 0xe1, 0x73, 0x01, 0x6e, 0x97, 0xf7, 0xc4, 0xc7, 0x35, 0x2e, 0x9e, 0x0b, 0xf8, 0xd6, 0xba, 0x4f, - 0x0f, 0xb5, 0xe7, 0x02, 0x89, 0x8a, 0x7b, 0xb2, 0xe7, 0x3c, 0xb4, 0x03, 0xca, 0x08, 0xb3, 0x48, - 0xc8, 0xf7, 0x64, 0x0e, 0x8d, 0x51, 0x2a, 0xc8, 0xe4, 0x6b, 0x30, 0x19, 0xfd, 0x0a, 0x1f, 0x3d, - 0x26, 0xc3, 0x0f, 0x58, 0x2f, 0x5c, 0x7c, 0xee, 0xf1, 0xd1, 0xfc, 0x39, 0x85, 0x6b, 0xfc, 0x39, - 0x24, 0xc6, 0xcc, 0xf8, 0xa5, 0x0c, 0xbe, 0x93, 0xc9, 0x0e, 0x5e, 0x86, 0x7c, 0x68, 0x46, 0x35, - 0xce, 0x35, 0x35, 0x31, 0xc5, 0x2e, 0x96, 0x93, 0x4b, 0x90, 0x8b, 0x7a, 0x82, 0x5b, 0xa4, 0xde, - 0x03, 0x56, 0x4a, 0xee, 0xc0, 0xc8, 0x40, 0x6d, 0xc6, 0x4f, 0x23, 0xa5, 0xad, 0x92, 0x1a, 0x67, - 0xe1, 0xee, 0xd6, 0xc6, 0x67, 0x77, 0x16, 0x7e, 0x2a, 0x0b, 0x53, 0x6c, 0x5c, 0x4b, 0xdd, 0x60, - 0xcf, 0xf5, 0x9c, 0xe0, 0xf0, 0xa9, 0xd5, 0x53, 0xbc, 0xa5, 0x09, 0x39, 0xe7, 0xe4, 0x29, 0xa3, - 0xf6, 0x6d, 0x20, 0x75, 0xc5, 0xef, 0x0c, 0xc1, 0x4c, 0x0a, 0x15, 0x79, 0x55, 0x53, 0x25, 0xce, - 0x49, 0xf7, 0xba, 0x8f, 0x8e, 0xe6, 0xc7, 0x25, 0xfa, 0x46, 0xe4, 0x6e, 0xb7, 0xa0, 0x3f, 0x3a, - 0xf3, 0x91, 0x42, 0xcd, 0xa2, 0xfa, 0xe8, 0xac, 0x3f, 0x35, 0x5f, 0x85, 0x21, 0xd3, 0x6d, 0x52, - 0x69, 0x21, 0x81, 0x07, 0xbb, 0xc7, 0x00, 0xda, 0xdb, 0x18, 0x03, 0x90, 0x65, 0x18, 0x61, 0x7f, - 0xdc, 0xb7, 0x3b, 0x42, 0xeb, 0x4b, 0x42, 0x31, 0x1b, 0xa1, 0x1d, 0xa7, 0xbd, 0xab, 0x4a, 0xda, - 0x4d, 0x6a, 0xb5, 0xec, 0x8e, 0x26, 0x81, 0x70, 0x44, 0x4d, 0x62, 0x2f, 0xf4, 0x96, 0xd8, 0x33, - 0xc7, 0x4a, 0xec, 0x0d, 0x80, 0x9a, 0xb3, 0xdb, 0x76, 0xda, 0xbb, 0xa5, 0xe6, 0xae, 0x70, 0x52, - 0xbc, 0xda, 0x7b, 0x16, 0xae, 0x45, 0xc8, 0xb8, 0x70, 0xf9, 0xd3, 0x0c, 0x87, 0x59, 0x76, 0x53, - 0x53, 0x49, 0x47, 0xa8, 0x64, 0x15, 0xa0, 0x54, 0x0f, 0x9c, 0x87, 0x6c, 0x01, 0xfb, 0xc2, 0xf8, - 0x56, 0x36, 0xb8, 0x5c, 0xba, 0x47, 0x0f, 0x6b, 0x34, 0x88, 0x54, 0xdc, 0x36, 0xa2, 0xb2, 0xef, - 0x40, 0xb3, 0x93, 0x8d, 0x38, 0x90, 0x0e, 0x9c, 0x2a, 0x35, 0x1a, 0x0e, 0xeb, 0x81, 0xdd, 0xc4, - 0x37, 0x1b, 0xda, 0x40, 0xd6, 0xe3, 0xe9, 0xac, 0xaf, 0x0a, 0xd6, 0xcf, 0xdb, 0x21, 0x95, 0x15, - 0x70, 0xb2, 0x78, 0x35, 0xe9, 0x8c, 0x8d, 0x35, 0x98, 0xd4, 0xbb, 0xae, 0xbb, 0x56, 0x8e, 0x43, - 0xc1, 0xac, 0x95, 0xac, 0xda, 0x72, 0xe9, 0x46, 0x31, 0x43, 0x8a, 0x30, 0x2e, 0x7e, 0x2d, 0x58, - 0x0b, 0xaf, 0xdf, 0x2a, 0x66, 0x35, 0xc8, 0xeb, 0x37, 0x16, 0x12, 0x1e, 0x0d, 0x23, 0xc5, 0x02, - 0x57, 0x64, 0x18, 0xbf, 0x9a, 0x81, 0x82, 0x6c, 0x37, 0xb9, 0x05, 0xb9, 0x5a, 0x6d, 0x39, 0xe6, - 0x83, 0x10, 0x9d, 0x2f, 0x7c, 0x27, 0xf5, 0x7d, 0xd5, 0xd0, 0x8c, 0x11, 0x30, 0xba, 0x8d, 0x95, - 0x9a, 0x10, 0x0b, 0x24, 0x5d, 0xb4, 0x6d, 0x73, 0xba, 0x14, 0xc3, 0xec, 0x5b, 0x90, 0xbb, 0xbb, - 0xb5, 0x21, 0xc4, 0x78, 0x49, 0x17, 0xed, 0xa4, 0x9c, 0xee, 0xc3, 0x03, 0x75, 0x7f, 0x67, 0x04, - 0x86, 0x09, 0x63, 0xca, 0x12, 0xe6, 0xc7, 0x6d, 0xcb, 0x0d, 0x7d, 0x09, 0xc5, 0x71, 0xcb, 0x20, - 0xa6, 0x28, 0x61, 0xd2, 0xc1, 0x8a, 0x5b, 0xb7, 0x9b, 0xe2, 0xdc, 0x46, 0xe9, 0xa0, 0xc9, 0x00, - 0x26, 0x87, 0x1b, 0xbf, 0x95, 0x81, 0x22, 0xca, 0x50, 0x68, 0x74, 0xe6, 0xee, 0xd3, 0xf6, 0xe6, - 0x0d, 0xf2, 0x9a, 0xfc, 0xd8, 0x32, 0xe1, 0xa5, 0x71, 0x08, 0x3f, 0xb6, 0x98, 0xd6, 0x59, 0x7c, - 0x70, 0x8a, 0xbb, 0x66, 0x76, 0x70, 0x37, 0xaf, 0x63, 0xdc, 0x35, 0xe7, 0x61, 0x08, 0x9b, 0x23, - 0xb6, 0x45, 0x6c, 0x79, 0xc0, 0x00, 0x26, 0x87, 0x2b, 0xbb, 0xd2, 0xcf, 0x64, 0x13, 0x7d, 0x58, - 0xf8, 0x4c, 0xb9, 0x4a, 0xe9, 0x9d, 0x1b, 0x68, 0xa7, 0x7e, 0x1f, 0x66, 0xe3, 0x43, 0x82, 0x17, - 0xfa, 0x12, 0x4c, 0xe9, 0x70, 0x79, 0xb7, 0x3f, 0x93, 0x5a, 0xd7, 0xe6, 0x82, 0x19, 0xc7, 0x37, - 0xfe, 0xc7, 0x0c, 0x8c, 0xe2, 0x9f, 0x66, 0xb7, 0x89, 0x66, 0x10, 0xa5, 0xad, 0x9a, 0x50, 0xde, - 0xa9, 0x62, 0x9c, 0x7d, 0xe0, 0x5b, 0x42, 0xbf, 0xa7, 0xed, 0x2f, 0x21, 0xb2, 0x20, 0xe5, 0x5a, - 0x39, 0xf9, 0x42, 0x19, 0x92, 0x72, 0xf5, 0x9d, 0x1f, 0x23, 0x15, 0xc8, 0x68, 0x79, 0xb4, 0x55, - 0x63, 0xcb, 0x4f, 0x7d, 0x97, 0x44, 0x3a, 0xb7, 0xa9, 0x5b, 0x1e, 0x71, 0x34, 0x7c, 0x96, 0xdc, - 0xaa, 0x95, 0xcc, 0x55, 0xed, 0x59, 0x92, 0xb5, 0x51, 0xb3, 0x4a, 0x15, 0x48, 0xc6, 0x3f, 0x1a, - 0x8d, 0x0f, 0xa0, 0x38, 0xea, 0x4e, 0xf8, 0x6d, 0xbc, 0x09, 0x43, 0xa5, 0x66, 0xd3, 0x3d, 0x10, - 0xbb, 0x84, 0xd4, 0x2f, 0x84, 0xe3, 0xc7, 0x4f, 0x32, 0x9b, 0xa1, 0x68, 0xee, 0x1f, 0x0c, 0x40, - 0xca, 0x30, 0x5a, 0xda, 0xaa, 0x55, 0xab, 0x95, 0x8d, 0x0d, 0x6e, 0xea, 0x9e, 0x5b, 0x7c, 0x51, - 0x8e, 0x8f, 0xe3, 0x34, 0xac, 0xf8, 0xcb, 0x58, 0x24, 0xb9, 0x47, 0x74, 0xe4, 0x6d, 0x80, 0xbb, - 0xae, 0xd3, 0xbe, 0x4f, 0x83, 0x3d, 0xb7, 0x21, 0x3a, 0x7f, 0xe1, 0xf1, 0xd1, 0xfc, 0xd8, 0x87, - 0xae, 0xd3, 0xb6, 0x5a, 0x08, 0x66, 0x6d, 0x8f, 0x90, 0x4c, 0xe5, 0x6f, 0x36, 0xd2, 0x8b, 0x2e, - 0x37, 0x6d, 0x18, 0x8a, 0x46, 0x7a, 0xdb, 0x4d, 0x58, 0x35, 0x48, 0x34, 0xd2, 0x82, 0xa9, 0x5a, - 0x77, 0x77, 0x97, 0xb2, 0x5d, 0x5d, 0x68, 0x2c, 0x86, 0xc5, 0xed, 0x36, 0x0c, 0x30, 0xc0, 0x6f, - 0x22, 0xec, 0x7e, 0xe2, 0x2f, 0xbe, 0xca, 0x16, 0xf2, 0xf7, 0x8f, 0xe6, 0xc5, 0x8b, 0x1b, 0x13, - 0xd2, 0x7c, 0x49, 0x9f, 0xd4, 0x57, 0xc4, 0x79, 0x93, 0x35, 0x18, 0xbe, 0xe3, 0x04, 0xcb, 0xdd, - 0x6d, 0x61, 0xba, 0xfd, 0x7c, 0x9f, 0x8f, 0x86, 0x23, 0x72, 0x95, 0xef, 0xae, 0x13, 0xec, 0x75, - 0x55, 0x33, 0x6e, 0xc1, 0x86, 0x6c, 0x41, 0xa1, 0xec, 0x78, 0xf5, 0x26, 0x2d, 0x57, 0xc5, 0xa9, - 0x7f, 0xa9, 0x0f, 0x4b, 0x89, 0xca, 0xc7, 0xa5, 0x8e, 0xbf, 0xea, 0x8e, 0x2a, 0x05, 0x48, 0x0c, - 0xf2, 0x37, 0x32, 0xf0, 0x6c, 0xd8, 0xfa, 0xd2, 0x2e, 0x6d, 0x07, 0xf7, 0xed, 0xa0, 0xbe, 0x47, - 0x3d, 0x31, 0x4a, 0xa3, 0xfd, 0x46, 0xe9, 0x4b, 0x89, 0x51, 0xba, 0x12, 0x8d, 0x92, 0xcd, 0x98, - 0x59, 0x2d, 0xce, 0x2d, 0x39, 0x66, 0xfd, 0x6a, 0x25, 0x16, 0x40, 0xa4, 0xc3, 0x17, 0xae, 0x3f, - 0x2f, 0xf6, 0xe9, 0x70, 0x84, 0x2c, 0xcc, 0x7f, 0xc3, 0xdf, 0x9a, 0x25, 0x4f, 0x08, 0x25, 0xf7, - 0xa4, 0x9f, 0x04, 0x97, 0x48, 0x2e, 0xf6, 0xe1, 0xcd, 0x7d, 0x27, 0x66, 0xfa, 0x78, 0x44, 0xf1, - 0xd9, 0x5e, 0xb1, 0xb7, 0x85, 0x10, 0x72, 0xcc, 0x6c, 0xaf, 0xd8, 0xd1, 0x6c, 0x37, 0xed, 0xf8, - 0x6c, 0xaf, 0xd8, 0xdb, 0xa4, 0xcc, 0x9d, 0xbb, 0xb8, 0x27, 0xd0, 0x73, 0xfd, 0xb8, 0x95, 0xd7, - 0xf9, 0xc9, 0x9c, 0xe2, 0xe4, 0xf5, 0x01, 0x8c, 0xd6, 0x3a, 0x76, 0x9d, 0x36, 0x9d, 0x9d, 0x40, - 0x3c, 0xea, 0xbc, 0xd0, 0x87, 0x55, 0x88, 0x2b, 0x1e, 0x04, 0xe4, 0x4f, 0xf5, 0x82, 0x14, 0xe2, - 0xb0, 0x16, 0x6e, 0xac, 0xdf, 0x9f, 0x9b, 0x3a, 0xb6, 0x85, 0x1b, 0xeb, 0xf7, 0x85, 0xcc, 0xd1, - 0x69, 0x69, 0x32, 0xc7, 0xfa, 0x7d, 0xe3, 0x37, 0x72, 0x70, 0xa6, 0x07, 0x0d, 0x59, 0x95, 0x7b, - 0x54, 0x46, 0x53, 0x2c, 0xf6, 0x40, 0xbf, 0x76, 0xec, 0xb6, 0xb5, 0x02, 0xc5, 0xa5, 0x7b, 0x28, - 0xd6, 0xb2, 0x9f, 0xb4, 0x51, 0x2e, 0xc9, 0xdd, 0xfd, 0xe2, 0xe3, 0xa3, 0xf9, 0xf3, 0x74, 0x1f, - 0x8d, 0x82, 0x6c, 0x5e, 0x68, 0xd5, 0x35, 0x3f, 0xad, 0x04, 0xe5, 0xb9, 0x1f, 0xce, 0x42, 0x1e, - 0x4f, 0x9a, 0x58, 0x74, 0x8a, 0xcc, 0x89, 0xa2, 0x53, 0xbc, 0x07, 0xe3, 0x4b, 0xf7, 0xf8, 0xa5, - 0x73, 0xd9, 0xf6, 0xf7, 0xc4, 0x3e, 0x88, 0x6f, 0x6c, 0x74, 0xdf, 0x12, 0x77, 0xd4, 0x3d, 0x5b, - 0x13, 0xf2, 0x34, 0x0a, 0xf2, 0x00, 0x66, 0x78, 0xdb, 0x9c, 0x1d, 0xa7, 0xce, 0x9d, 0xdc, 0x1d, - 0xbb, 0x29, 0x36, 0xc5, 0x4b, 0x8f, 0x8f, 0xe6, 0xe7, 0xe9, 0x3e, 0x9a, 0x3b, 0x89, 0x72, 0xcb, - 0x47, 0x04, 0xd5, 0xee, 0x29, 0x85, 0x5e, 0xf5, 0xbc, 0x35, 0x47, 0xb1, 0x42, 0x56, 0x1b, 0xab, - 0x9b, 0xe1, 0x72, 0x24, 0xe3, 0xef, 0x0f, 0xc1, 0xb9, 0xde, 0xfb, 0x19, 0xf9, 0xb2, 0x3e, 0x81, - 0x97, 0x8f, 0xdd, 0x01, 0x8f, 0x9f, 0xc3, 0xaf, 0xc0, 0xec, 0x52, 0x3b, 0xa0, 0x5e, 0xc7, 0x73, - 0xa4, 0xaf, 0xf5, 0xb2, 0xeb, 0x4b, 0xf3, 0x32, 0xb4, 0xf3, 0xa2, 0x61, 0xb9, 0xd0, 0x0f, 0xa2, - 0xb1, 0x9b, 0xc2, 0x2a, 0x95, 0x03, 0x59, 0x82, 0x49, 0x05, 0xde, 0xec, 0xee, 0x8a, 0x13, 0x1c, - 0x6d, 0x17, 0x55, 0x9e, 0xcd, 0xae, 0x7a, 0xd1, 0x89, 0x11, 0x9d, 0xfb, 0xa5, 0x9c, 0x58, 0x16, - 0x97, 0x20, 0x57, 0xeb, 0x6e, 0x8b, 0xe5, 0xc0, 0x45, 0x75, 0x6d, 0x5b, 0x67, 0xa5, 0xe4, 0x8b, - 0x00, 0x26, 0xed, 0xb8, 0xbe, 0x13, 0xb8, 0xde, 0xa1, 0x6a, 0xfe, 0xef, 0x85, 0x50, 0xdd, 0x56, - 0x53, 0x42, 0xc9, 0x32, 0x4c, 0x45, 0xbf, 0xd6, 0x0e, 0xda, 0x42, 0xa9, 0x39, 0xca, 0xb5, 0x09, - 0x11, 0xb9, 0xe5, 0xb2, 0x32, 0xf5, 0xa0, 0x8a, 0x91, 0x91, 0x05, 0x28, 0x6c, 0xb9, 0xde, 0xfe, - 0x0e, 0x9b, 0xa8, 0x7c, 0x74, 0x94, 0x1e, 0x08, 0x98, 0x7a, 0x64, 0x48, 0x3c, 0xb6, 0xe6, 0x97, - 0xda, 0x0f, 0x1d, 0xcf, 0x6d, 0xb7, 0x68, 0x3b, 0x50, 0xdf, 0x1f, 0x69, 0x04, 0xd6, 0x9c, 0xa5, - 0x22, 0x30, 0xbb, 0x33, 0x97, 0xea, 0x81, 0xeb, 0x89, 0xc7, 0x47, 0x3e, 0xdd, 0x0c, 0xa0, 0x4d, - 0x37, 0x03, 0xb0, 0x41, 0x34, 0xe9, 0x8e, 0xd0, 0x9a, 0xe3, 0x20, 0x7a, 0x74, 0x47, 0xf3, 0x04, - 0xa3, 0x3b, 0x4c, 0x14, 0x30, 0xe9, 0x0e, 0x5e, 0xf4, 0xb5, 0x00, 0x2a, 0x3b, 0x09, 0x15, 0x91, - 0x40, 0x33, 0x7e, 0x77, 0xb4, 0xe7, 0xba, 0x65, 0x7b, 0xef, 0xc9, 0xd6, 0xed, 0x8a, 0x3d, 0xc0, - 0xba, 0x7d, 0x35, 0xb4, 0x00, 0x55, 0xdd, 0x1f, 0x11, 0xa2, 0x6e, 0xfe, 0x1c, 0xe7, 0xdc, 0x2f, - 0x17, 0x4e, 0xb2, 0x88, 0xc4, 0x20, 0x65, 0x07, 0x1d, 0xa4, 0xdc, 0x40, 0x83, 0x44, 0x16, 0x61, - 0x22, 0x0c, 0xc1, 0xb3, 0x6e, 0x07, 0xda, 0xde, 0x14, 0xc6, 0x4d, 0xb2, 0x3a, 0x76, 0xa0, 0xee, - 0x4d, 0x3a, 0x09, 0x79, 0x0b, 0xc6, 0x84, 0x19, 0x34, 0x72, 0x18, 0x8a, 0x0c, 0xd1, 0xa4, 0xcd, - 0x74, 0x8c, 0x5e, 0x45, 0x67, 0x9f, 0xe4, 0xba, 0xd3, 0xa1, 0x4d, 0xa7, 0x4d, 0x6b, 0xa8, 0x35, - 0x17, 0x2b, 0x06, 0x3f, 0xc9, 0x8e, 0x28, 0xb1, 0xb8, 0x42, 0x5d, 0xd3, 0x97, 0x69, 0x44, 0xf1, - 0xc5, 0x3a, 0x72, 0xa2, 0xc5, 0xca, 0xed, 0x40, 0xbc, 0x15, 0x77, 0xd7, 0x91, 0x96, 0x6f, 0xd2, - 0x0e, 0xc4, 0xb3, 0x9a, 0x0c, 0x1a, 0xb3, 0x03, 0xe1, 0xa8, 0x4c, 0xae, 0x67, 0x3f, 0xaa, 0x15, - 0xf1, 0x42, 0x83, 0x72, 0x3d, 0x12, 0xe9, 0xe6, 0x86, 0x1c, 0x49, 0x56, 0xb3, 0xd4, 0xb2, 0x9d, - 0xa6, 0xf0, 0x72, 0x8b, 0xaa, 0xa1, 0x0c, 0x1a, 0xaf, 0x06, 0x51, 0x49, 0x1d, 0xc6, 0x4d, 0xba, - 0xb3, 0xee, 0xb9, 0x01, 0xad, 0x07, 0xb4, 0x21, 0x64, 0x19, 0x29, 0xce, 0x2f, 0xba, 0x2e, 0x97, - 0xd3, 0x16, 0x5f, 0xfb, 0xdd, 0xa3, 0xf9, 0xcc, 0xf7, 0x8f, 0xe6, 0x81, 0x81, 0xb8, 0x2d, 0xeb, - 0xe3, 0xa3, 0xf9, 0x33, 0x6c, 0xfe, 0x3b, 0x92, 0x58, 0x3d, 0x62, 0x54, 0xa6, 0xe4, 0x07, 0xd9, - 0xa6, 0x1b, 0x0e, 0x49, 0x54, 0xd9, 0x78, 0x8f, 0xca, 0x5e, 0x4f, 0xad, 0x6c, 0x5e, 0x19, 0xed, - 0xd4, 0x4a, 0x53, 0x2b, 0x21, 0x6f, 0xc3, 0x58, 0xb9, 0x5a, 0x76, 0xdb, 0x3b, 0xce, 0x6e, 0x6d, - 0xb9, 0x84, 0x02, 0x91, 0xb0, 0x63, 0xae, 0x3b, 0x56, 0x1d, 0xe1, 0x96, 0xbf, 0x67, 0x6b, 0xbe, - 0x20, 0x11, 0x3e, 0xb9, 0x03, 0x93, 0xf2, 0xa7, 0x49, 0x77, 0x1e, 0x98, 0x55, 0x94, 0x83, 0xa4, - 0xf1, 0x78, 0xc8, 0x81, 0x0d, 0x44, 0xd7, 0x53, 0xe5, 0xe3, 0x18, 0x19, 0x5b, 0x8c, 0x15, 0xda, - 0x69, 0xba, 0x87, 0xac, 0x79, 0x1b, 0x0e, 0xf5, 0x50, 0xf2, 0x11, 0x8b, 0xb1, 0x11, 0x96, 0x58, - 0x81, 0xa3, 0x6d, 0xb7, 0x31, 0x22, 0xb2, 0x0a, 0xd3, 0x62, 0x89, 0x6f, 0x3a, 0xbe, 0xb3, 0xed, - 0x34, 0x9d, 0xe0, 0x70, 0xae, 0x88, 0x9c, 0x50, 0x0a, 0x91, 0xdf, 0xc5, 0xc3, 0xb0, 0x54, 0x61, - 0x96, 0x24, 0x35, 0x7e, 0x35, 0x0b, 0xe7, 0xfb, 0xc9, 0xff, 0xa4, 0xa6, 0x6f, 0x66, 0x57, 0x06, - 0xb8, 0x33, 0x1c, 0xbf, 0x9d, 0x2d, 0xc1, 0xe4, 0x9a, 0xb7, 0x6b, 0xb7, 0x9d, 0x6f, 0xe1, 0xbd, - 0x2e, 0x34, 0x87, 0xc1, 0xc1, 0x70, 0x95, 0x12, 0x7d, 0xb5, 0xc7, 0x88, 0xce, 0x3d, 0x14, 0xdb, - 0xdc, 0xc7, 0x75, 0xac, 0xb8, 0x05, 0xa3, 0x65, 0xb7, 0x1d, 0xd0, 0x47, 0x41, 0xcc, 0x79, 0x8e, - 0x03, 0xe3, 0xce, 0x73, 0x12, 0xd5, 0xf8, 0x7f, 0xb2, 0x70, 0xa1, 0xaf, 0x00, 0x4c, 0x36, 0xf4, - 0x51, 0xbb, 0x3a, 0x88, 0xd4, 0x7c, 0xfc, 0xb0, 0x2d, 0x24, 0x2c, 0x37, 0x8e, 0xb5, 0x5b, 0x3e, - 0xf7, 0x5f, 0x64, 0xc4, 0x20, 0x7d, 0x0e, 0x46, 0xb0, 0xaa, 0x70, 0x88, 0xb8, 0x6e, 0x08, 0x77, - 0x61, 0x47, 0xd7, 0x0d, 0x71, 0x34, 0x72, 0x13, 0x0a, 0x65, 0xbb, 0xd9, 0x54, 0x5c, 0x0b, 0x51, - 0xae, 0xaf, 0x23, 0x2c, 0x66, 0xe8, 0x23, 0x11, 0xc9, 0x1b, 0x00, 0xfc, 0x6f, 0xe5, 0xac, 0xc0, - 0xcd, 0x52, 0x90, 0xc5, 0x8e, 0x0b, 0x05, 0x19, 0x83, 0x88, 0xd5, 0xdd, 0xd0, 0x07, 0x8a, 0x07, - 0x11, 0x63, 0x00, 0x2d, 0x88, 0x18, 0x03, 0x18, 0xbf, 0x96, 0x83, 0xe7, 0xfa, 0xdf, 0xe2, 0xc8, - 0x03, 0x7d, 0x0a, 0x5e, 0x1e, 0xe8, 0xee, 0x77, 0xfc, 0x1c, 0xc8, 0x90, 0x7c, 0x7c, 0x40, 0xae, - 0x24, 0xcd, 0x8b, 0x3f, 0x3a, 0x9a, 0x57, 0xac, 0xc7, 0xee, 0xba, 0x4e, 0x5b, 0x79, 0x23, 0xf8, - 0x26, 0x40, 0x2d, 0xb0, 0x03, 0xa7, 0x7e, 0x77, 0xeb, 0x9e, 0xf4, 0x58, 0xbf, 0x35, 0x58, 0xcb, - 0x22, 0x3a, 0xbe, 0xaf, 0x08, 0xf5, 0x39, 0x42, 0xad, 0x0f, 0x0f, 0xf6, 0xb5, 0x7b, 0x6a, 0x84, - 0x7c, 0xee, 0x4b, 0x50, 0x8c, 0x93, 0x92, 0xcb, 0x90, 0xc7, 0x06, 0x28, 0x36, 0xd2, 0x31, 0x0e, - 0x58, 0x7e, 0xee, 0xbe, 0x58, 0x3b, 0x4b, 0x30, 0x29, 0x1e, 0xa6, 0x75, 0x8d, 0x18, 0x7e, 0xaf, - 0xf2, 0x5d, 0x3b, 0xa9, 0x15, 0x8b, 0x11, 0x19, 0x7f, 0x96, 0x81, 0xb3, 0x3d, 0xef, 0xc7, 0x64, - 0x5d, 0x9f, 0xb0, 0x17, 0x8f, 0xbb, 0x50, 0x1f, 0x3b, 0x57, 0xe7, 0x7e, 0x42, 0xae, 0xfd, 0x77, - 0x60, 0xbc, 0xd6, 0xdd, 0x8e, 0x5f, 0xb2, 0xb8, 0xff, 0xb2, 0x02, 0x57, 0x4f, 0x30, 0x15, 0x9f, - 0xf5, 0x5f, 0xbe, 0xbc, 0x0b, 0xc3, 0x0a, 0x7e, 0xf1, 0xc3, 0xfe, 0x87, 0x8e, 0x51, 0xe8, 0xb7, - 0xa6, 0x0e, 0x62, 0x8c, 0xc8, 0xf8, 0x95, 0x6c, 0xfa, 0x6d, 0x95, 0xdd, 0xb5, 0x4f, 0x70, 0x5b, - 0xbd, 0x53, 0x5e, 0x3f, 0xbe, 0xef, 0xff, 0xa1, 0xec, 0x3b, 0x3e, 0x44, 0x8a, 0x1d, 0x4f, 0xaa, - 0xf7, 0xc4, 0x43, 0xa4, 0xdc, 0x1d, 0x7d, 0xfd, 0x21, 0x52, 0x22, 0x93, 0xd7, 0x61, 0x74, 0xc5, - 0xe5, 0xfe, 0xa4, 0xb2, 0xc7, 0xdc, 0x73, 0x48, 0x02, 0xd5, 0xed, 0x31, 0xc4, 0x64, 0x77, 0x0b, - 0x7d, 0xe2, 0xa5, 0x79, 0x37, 0xde, 0x2d, 0x62, 0xcb, 0x45, 0x57, 0x82, 0xe9, 0x64, 0xc6, 0x4f, - 0x64, 0x61, 0x92, 0x2f, 0x5e, 0xae, 0xa4, 0x7d, 0x6a, 0x15, 0xe0, 0x6f, 0x6a, 0x0a, 0x70, 0x19, - 0xea, 0x40, 0xed, 0xda, 0x40, 0xea, 0xef, 0x3d, 0x20, 0x49, 0x1a, 0x62, 0xc2, 0xb8, 0x0a, 0xed, - 0xaf, 0xf9, 0xbe, 0x11, 0x45, 0xc5, 0x10, 0x7b, 0x07, 0x3e, 0x3f, 0xf8, 0xa6, 0xc6, 0xc3, 0xf8, - 0x6b, 0x59, 0x98, 0x50, 0x1e, 0x2a, 0x9f, 0xda, 0x81, 0xff, 0x92, 0x36, 0xf0, 0x73, 0xa1, 0x49, - 0x72, 0xd8, 0xb3, 0x81, 0xc6, 0xbd, 0x0b, 0xd3, 0x09, 0x92, 0xf8, 0x7b, 0x6f, 0x66, 0x90, 0xf7, - 0xde, 0x57, 0x93, 0xee, 0xfa, 0x3c, 0x52, 0x65, 0xe8, 0xae, 0xaf, 0xc6, 0x07, 0xf8, 0xa9, 0x2c, - 0xcc, 0x8a, 0x5f, 0x18, 0x93, 0x86, 0xef, 0xde, 0x4f, 0xed, 0x5c, 0x94, 0xb4, 0xb9, 0x98, 0xd7, - 0xe7, 0x42, 0xe9, 0x60, 0xef, 0x29, 0x31, 0xfe, 0x0a, 0xc0, 0x5c, 0x2f, 0x82, 0x81, 0x3d, 0x7f, - 0x22, 0xbb, 0xea, 0xec, 0x00, 0x76, 0xd5, 0x2b, 0x50, 0xc4, 0xaa, 0x44, 0x04, 0x0b, 0x9f, 0xdd, - 0x01, 0x72, 0x91, 0xc0, 0xcd, 0x03, 0x07, 0x89, 0x28, 0x18, 0x7e, 0xec, 0x12, 0x90, 0xa0, 0x24, - 0xbf, 0x94, 0x81, 0x49, 0x04, 0x2e, 0x3d, 0xa4, 0xed, 0x00, 0x99, 0xe5, 0x85, 0x19, 0x70, 0xa8, - 0x1f, 0xaf, 0x05, 0x9e, 0xd3, 0xde, 0x15, 0x0a, 0xf2, 0x6d, 0xa1, 0x20, 0x7f, 0x8b, 0x2b, 0xf6, - 0xaf, 0xd5, 0xdd, 0xd6, 0xf5, 0x5d, 0xcf, 0x7e, 0xe8, 0xf0, 0x37, 0x78, 0xbb, 0x79, 0x3d, 0x0a, - 0x94, 0xdc, 0x71, 0x62, 0xa1, 0x8f, 0x05, 0x2b, 0x7c, 0x7c, 0xe0, 0x0d, 0xa5, 0x58, 0x6d, 0xfc, - 0xae, 0xa2, 0xb7, 0x88, 0xfc, 0x00, 0x9c, 0xe1, 0xee, 0xe9, 0x4c, 0xe4, 0x75, 0xda, 0x5d, 0xb7, - 0xeb, 0x2f, 0xda, 0xf5, 0x7d, 0x76, 0xee, 0x71, 0x57, 0x06, 0xec, 0x79, 0x3d, 0x2c, 0xb4, 0xb6, - 0x79, 0xa9, 0xe6, 0xba, 0x95, 0xce, 0x80, 0x2c, 0xc3, 0x34, 0x2f, 0x2a, 0x75, 0x03, 0xb7, 0x56, - 0xb7, 0x9b, 0x4e, 0x7b, 0x17, 0xef, 0xd4, 0x05, 0x7e, 0x1e, 0xdb, 0xdd, 0xc0, 0xb5, 0x7c, 0x0e, - 0x57, 0xaf, 0x2e, 0x09, 0x22, 0x52, 0x85, 0x29, 0x93, 0xda, 0x8d, 0xfb, 0xf6, 0xa3, 0xb2, 0xdd, - 0xb1, 0xeb, 0xec, 0x22, 0x54, 0xc0, 0xc7, 0x24, 0xbc, 0x9b, 0x79, 0xd4, 0x6e, 0x58, 0x2d, 0xfb, - 0x91, 0x55, 0x17, 0x85, 0xba, 0x0e, 0x4b, 0xa3, 0x0b, 0x59, 0x39, 0xed, 0x90, 0xd5, 0x68, 0x9c, - 0x95, 0xd3, 0xee, 0xcd, 0x2a, 0xa2, 0x93, 0xac, 0x36, 0x6c, 0x6f, 0x97, 0x06, 0xdc, 0x84, 0x8d, - 0xdd, 0xc7, 0x33, 0x0a, 0xab, 0x00, 0xcb, 0x2c, 0x34, 0x67, 0x8b, 0xb3, 0x52, 0xe8, 0xd8, 0xca, - 0xdb, 0xf2, 0x9c, 0x80, 0xaa, 0x3d, 0x1c, 0xc3, 0x66, 0xe1, 0xf8, 0xa3, 0xf1, 0x5f, 0xaf, 0x2e, - 0x26, 0x28, 0x23, 0x6e, 0x4a, 0x27, 0xc7, 0x13, 0xdc, 0xd2, 0x7b, 0x99, 0xa0, 0x0c, 0xb9, 0xa9, - 0xfd, 0x9c, 0xc0, 0x7e, 0x2a, 0xdc, 0x7a, 0x74, 0x34, 0x41, 0x49, 0x56, 0xd9, 0xa0, 0x05, 0xb4, - 0xcd, 0x56, 0xb4, 0x30, 0xe1, 0x9b, 0xc4, 0xa6, 0xbd, 0x20, 0xec, 0x50, 0x8a, 0x9e, 0x2c, 0xb6, - 0x52, 0x0c, 0xfa, 0xe2, 0xc4, 0xe4, 0x2f, 0xc1, 0xd4, 0x03, 0x9f, 0xde, 0xae, 0xae, 0xd7, 0xa4, - 0x43, 0x3e, 0xde, 0xb6, 0x27, 0x17, 0x6e, 0x1c, 0xb3, 0xe9, 0x5c, 0x53, 0x69, 0x30, 0x5e, 0x31, - 0x9f, 0xb7, 0xae, 0x4f, 0xad, 0x1d, 0xa7, 0xe3, 0x87, 0xa1, 0x41, 0xd4, 0x79, 0x8b, 0x55, 0x65, - 0x2c, 0xc3, 0x74, 0x82, 0x0d, 0x99, 0x04, 0x60, 0x40, 0xeb, 0xc1, 0x6a, 0x6d, 0x69, 0xa3, 0xf8, - 0x0c, 0x29, 0xc2, 0x38, 0xfe, 0x5e, 0x5a, 0x2d, 0x2d, 0xae, 0x2c, 0x55, 0x8a, 0x19, 0x32, 0x0d, - 0x13, 0x08, 0xa9, 0x54, 0x6b, 0x1c, 0x94, 0xe5, 0xd1, 0x2a, 0xcd, 0x22, 0xff, 0x74, 0x03, 0xf6, - 0x01, 0xe0, 0x99, 0x62, 0xfc, 0xcd, 0x2c, 0x9c, 0x95, 0xc7, 0x0a, 0x0d, 0x0e, 0x5c, 0x6f, 0xdf, - 0x69, 0xef, 0x3e, 0xe5, 0xa7, 0xc3, 0x6d, 0xed, 0x74, 0x78, 0x21, 0x76, 0x52, 0xc7, 0x7a, 0xd9, - 0xe7, 0x88, 0xf8, 0x9f, 0x0b, 0x70, 0xa1, 0x2f, 0x15, 0xf9, 0x32, 0x3b, 0xcd, 0x1d, 0xda, 0x0e, - 0xaa, 0x8d, 0x26, 0xdd, 0x70, 0x5a, 0xd4, 0xed, 0x06, 0xc2, 0x64, 0xf4, 0x12, 0x5e, 0x70, 0xb1, - 0xd0, 0x72, 0x1a, 0x4d, 0x6a, 0x05, 0xbc, 0x58, 0x5b, 0x6e, 0x49, 0x6a, 0xc6, 0x32, 0x8c, 0x9d, - 0x5e, 0x6d, 0x07, 0xd4, 0x7b, 0x88, 0xc6, 0x29, 0x21, 0xcb, 0x7d, 0x4a, 0x3b, 0x96, 0xcd, 0x4a, - 0x2d, 0x47, 0x14, 0xeb, 0x2c, 0x13, 0xd4, 0xe4, 0xb6, 0xc2, 0xb2, 0xcc, 0xc4, 0xe1, 0xfb, 0xf6, - 0x23, 0xf1, 0x5a, 0x2e, 0xc2, 0x1a, 0x85, 0x2c, 0xb9, 0xb7, 0x51, 0xcb, 0x7e, 0x64, 0x26, 0x49, - 0xc8, 0xd7, 0xe0, 0x94, 0x38, 0x80, 0x84, 0xb7, 0xa8, 0xec, 0x31, 0xf7, 0x45, 0x7d, 0xe9, 0xf1, - 0xd1, 0xfc, 0x19, 0x19, 0xc4, 0x49, 0xfa, 0x07, 0xa7, 0xf5, 0x3a, 0x9d, 0x0b, 0xd9, 0x60, 0x07, - 0x72, 0x6c, 0x38, 0xee, 0x53, 0xdf, 0xb7, 0x77, 0xe5, 0xcb, 0x3a, 0xb7, 0xaf, 0x57, 0x06, 0xd3, - 0x6a, 0xf1, 0x72, 0xb3, 0x27, 0x25, 0x59, 0x86, 0xc9, 0x2d, 0xba, 0xad, 0xce, 0xcf, 0x70, 0xb8, - 0x55, 0x15, 0x0f, 0xe8, 0x76, 0xef, 0xc9, 0x89, 0xd1, 0x11, 0x07, 0x15, 0x66, 0x8f, 0x0e, 0x57, - 0x1c, 0x3f, 0xa0, 0x6d, 0xea, 0x61, 0x14, 0x82, 0x11, 0xdc, 0x0c, 0xe6, 0x22, 0x09, 0x59, 0x2f, - 0x5f, 0x7c, 0xfe, 0xf1, 0xd1, 0xfc, 0x05, 0xee, 0x4f, 0xd2, 0x14, 0x70, 0x2b, 0x16, 0x79, 0x3c, - 0xc9, 0x95, 0x7c, 0x03, 0xa6, 0x4c, 0xb7, 0x1b, 0x38, 0xed, 0xdd, 0x5a, 0xe0, 0xd9, 0x01, 0xdd, - 0xe5, 0x07, 0x52, 0x14, 0xee, 0x20, 0x56, 0x2a, 0xde, 0x5a, 0x38, 0xd0, 0xf2, 0x05, 0x54, 0x3b, - 0x11, 0x74, 0x02, 0xf2, 0x75, 0x98, 0xe4, 0x7e, 0x82, 0x61, 0x05, 0xa3, 0x5a, 0xd4, 0x54, 0xbd, - 0x70, 0xf3, 0x06, 0xbf, 0xa0, 0x72, 0x7f, 0xc3, 0xb4, 0x0a, 0x62, 0xdc, 0xc8, 0x07, 0x62, 0xb0, - 0xd6, 0x9d, 0xf6, 0x6e, 0xb8, 0x8c, 0x01, 0x47, 0xfe, 0xb5, 0x68, 0x48, 0x3a, 0xac, 0xb9, 0x72, - 0x19, 0xf7, 0xb0, 0xd4, 0x48, 0xf2, 0x21, 0x01, 0x5c, 0x28, 0xf9, 0xbe, 0xe3, 0x07, 0xc2, 0xb0, - 0x7a, 0xe9, 0x11, 0xad, 0x77, 0x19, 0xf2, 0x96, 0xeb, 0xed, 0x53, 0x8f, 0x9b, 0xf6, 0x0d, 0x2d, - 0x5e, 0x7b, 0x7c, 0x34, 0xff, 0xb2, 0x8d, 0x88, 0x96, 0xb0, 0xc5, 0xb6, 0xa8, 0x44, 0xb5, 0x0e, - 0x38, 0xae, 0xd2, 0x87, 0xfe, 0x4c, 0xc9, 0xd7, 0xe1, 0x74, 0xd9, 0xf6, 0x69, 0xb5, 0xed, 0xd3, - 0xb6, 0xef, 0x04, 0xce, 0x43, 0x2a, 0x06, 0x15, 0x0f, 0xbf, 0x02, 0xc6, 0x68, 0x37, 0xea, 0xb6, - 0xcf, 0x3e, 0xcc, 0x10, 0xc5, 0x12, 0x93, 0xa2, 0x54, 0xd3, 0x83, 0x8b, 0x71, 0x94, 0x81, 0x62, - 0x7c, 0xd8, 0xc9, 0x57, 0x60, 0x94, 0x9b, 0x24, 0x50, 0x7f, 0x4f, 0xb8, 0xb8, 0xc9, 0x17, 0xee, - 0x10, 0xae, 0x13, 0x09, 0xa7, 0x04, 0x6e, 0xf0, 0x40, 0xd5, 0xf7, 0x5a, 0x74, 0x4a, 0x90, 0x44, - 0xa4, 0x01, 0xe3, 0x7c, 0x64, 0x29, 0xc6, 0x25, 0x11, 0x96, 0x69, 0xcf, 0xab, 0x2b, 0x59, 0x14, - 0xc5, 0xf8, 0xa3, 0xca, 0x5b, 0xcc, 0x1f, 0x47, 0xd0, 0xaa, 0xd0, 0xb8, 0x2e, 0x02, 0x14, 0x24, - 0xa1, 0x71, 0x16, 0xce, 0xf4, 0x68, 0xb3, 0xf1, 0x10, 0x9f, 0xc1, 0x7a, 0xd4, 0x48, 0xbe, 0x02, - 0xb3, 0x48, 0x58, 0x76, 0xdb, 0x6d, 0x5a, 0x0f, 0x70, 0xeb, 0x90, 0xaa, 0xa3, 0x1c, 0x7f, 0x6b, - 0xe5, 0xfd, 0xad, 0x87, 0x08, 0x56, 0x5c, 0x83, 0x94, 0xca, 0xc1, 0xf8, 0xb9, 0x2c, 0xcc, 0x89, - 0xdd, 0xc8, 0xa4, 0x75, 0xd7, 0x6b, 0x3c, 0xfd, 0xa7, 0xdf, 0x92, 0x76, 0xfa, 0x5d, 0x0a, 0x7d, - 0x9a, 0xd3, 0x3a, 0xd9, 0xe7, 0xf0, 0xfb, 0x95, 0x0c, 0x9c, 0xef, 0x47, 0xc4, 0x46, 0x27, 0x8c, - 0xc3, 0x32, 0x9a, 0x88, 0xb7, 0xd2, 0x81, 0x19, 0x9c, 0xd0, 0xf2, 0x1e, 0xad, 0xef, 0xfb, 0xcb, - 0xae, 0x1f, 0xa0, 0x61, 0x6c, 0xb6, 0xc7, 0x43, 0xcd, 0xab, 0xa9, 0x0f, 0x35, 0xa7, 0xf9, 0x2a, - 0xab, 0x23, 0x0f, 0x1e, 0x29, 0x66, 0x9f, 0x1e, 0xfa, 0x66, 0x1a, 0x6b, 0x34, 0x72, 0x2c, 0x75, - 0x83, 0xbd, 0x75, 0x8f, 0xee, 0x50, 0x8f, 0xb6, 0xeb, 0xf4, 0x33, 0x66, 0xe4, 0xa8, 0x77, 0x6e, - 0x20, 0x6d, 0xc3, 0xaf, 0x8c, 0xc3, 0x6c, 0x1a, 0x19, 0x1b, 0x17, 0xe5, 0x82, 0x1b, 0x4f, 0xf7, - 0xf2, 0xa3, 0x19, 0x18, 0xaf, 0xd1, 0xba, 0xdb, 0x6e, 0xdc, 0xc6, 0xe7, 0x70, 0x31, 0x3a, 0x16, - 0x3f, 0xe0, 0x19, 0xdc, 0xda, 0x89, 0xbd, 0x93, 0x7f, 0x74, 0x34, 0xff, 0xde, 0x60, 0xf7, 0xca, - 0xba, 0x8b, 0x7e, 0xc9, 0x01, 0x86, 0x23, 0x0d, 0xab, 0x40, 0xcd, 0xb6, 0x56, 0x29, 0x59, 0x84, - 0x09, 0xf1, 0xb9, 0xba, 0x6a, 0x18, 0x1e, 0xee, 0xf6, 0x2d, 0x0b, 0x12, 0x71, 0xc7, 0x34, 0x12, - 0x72, 0x13, 0x72, 0x0f, 0x16, 0x6e, 0x8b, 0x39, 0x90, 0x01, 0x5d, 0x1f, 0x2c, 0xdc, 0x46, 0xd5, - 0x15, 0xbb, 0x0e, 0x4c, 0x74, 0x17, 0xb4, 0x17, 0xea, 0x07, 0x0b, 0xb7, 0xc9, 0x0f, 0xc1, 0xa9, - 0x8a, 0xe3, 0x8b, 0x2a, 0xb8, 0xb9, 0x6d, 0x03, 0xdd, 0x4b, 0x86, 0x7b, 0xac, 0xde, 0x2f, 0xa4, - 0xae, 0xde, 0xe7, 0x1b, 0x21, 0x13, 0x8b, 0xdb, 0xf2, 0x36, 0xe2, 0xe1, 0x86, 0xd2, 0xeb, 0x21, - 0x1f, 0xc2, 0x24, 0xaa, 0x5e, 0xd1, 0x02, 0x19, 0xc3, 0x23, 0x8e, 0xf4, 0xa8, 0xf9, 0x73, 0xa9, - 0x35, 0x9f, 0x43, 0x4d, 0xae, 0x85, 0x76, 0xcc, 0x18, 0x4a, 0x51, 0xbb, 0xa1, 0x6b, 0x9c, 0xc9, - 0x5d, 0x98, 0x12, 0xa2, 0xd2, 0xda, 0xce, 0xc6, 0x1e, 0xad, 0xd8, 0x87, 0xe2, 0x71, 0x19, 0x6f, - 0x5f, 0x42, 0xbe, 0xb2, 0xdc, 0x1d, 0x2b, 0xd8, 0xa3, 0x56, 0xc3, 0xd6, 0x84, 0x8a, 0x18, 0x21, - 0xf9, 0x41, 0x18, 0x5b, 0x71, 0xeb, 0x4c, 0x4a, 0xc6, 0x9d, 0x81, 0xbf, 0x37, 0xbf, 0x8f, 0x09, - 0x45, 0x38, 0x38, 0x26, 0xfa, 0x7c, 0x74, 0x34, 0xff, 0xe6, 0x49, 0x17, 0x8d, 0x52, 0x81, 0xa9, - 0xd6, 0x46, 0xca, 0x50, 0xd8, 0xa2, 0xdb, 0xac, 0xb7, 0xf1, 0x64, 0x03, 0x12, 0x2c, 0xcc, 0x49, - 0xc4, 0x2f, 0xcd, 0x9c, 0x44, 0xc0, 0x88, 0x07, 0xd3, 0x38, 0x3e, 0xeb, 0xb6, 0xef, 0x1f, 0xb8, - 0x5e, 0x03, 0xa3, 0xca, 0xf6, 0x7a, 0xca, 0x5e, 0x48, 0x1d, 0xfc, 0xf3, 0x7c, 0xf0, 0x3b, 0x0a, - 0x07, 0x55, 0xd8, 0x4b, 0xb0, 0x27, 0xdf, 0x80, 0x49, 0x93, 0x7e, 0xb3, 0xeb, 0x78, 0xf4, 0xfe, - 0xed, 0x12, 0x7e, 0x95, 0xe3, 0x9a, 0x93, 0x8e, 0x5e, 0xc8, 0x25, 0x4a, 0x8f, 0xc3, 0xa4, 0xb6, - 0xc8, 0x6a, 0xed, 0xd8, 0xfa, 0x6b, 0x81, 0x4a, 0x42, 0xd6, 0x61, 0xac, 0x42, 0x1f, 0x3a, 0x75, - 0x8a, 0xae, 0x04, 0xc2, 0x94, 0x2f, 0x8c, 0x96, 0x1e, 0x95, 0x70, 0xbd, 0x49, 0x03, 0x01, 0xdc, - 0x31, 0x41, 0xb7, 0x16, 0x0b, 0x11, 0xc9, 0x2d, 0xc8, 0x55, 0x2b, 0xeb, 0xc2, 0x92, 0x4f, 0x5a, - 0xe8, 0x57, 0x1b, 0xeb, 0x32, 0xb6, 0x34, 0x1a, 0x7f, 0x38, 0x0d, 0xcd, 0x0e, 0xb0, 0x5a, 0x59, - 0x27, 0x3b, 0x30, 0x81, 0x03, 0xb0, 0x4c, 0x6d, 0x3e, 0xb6, 0x53, 0x3d, 0xc6, 0xf6, 0x5a, 0xea, - 0xd8, 0xce, 0xf1, 0xb1, 0xdd, 0x13, 0xd4, 0x5a, 0xb0, 0x5c, 0x95, 0x2d, 0x13, 0x3f, 0x45, 0x00, - 0x6f, 0x19, 0x2e, 0x76, 0x63, 0x05, 0x1f, 0xb7, 0x85, 0xf8, 0x29, 0xe3, 0x7d, 0x87, 0x31, 0x67, - 0x7b, 0x1a, 0x0a, 0x27, 0xf9, 0x90, 0x2f, 0x41, 0x7e, 0x6d, 0x3f, 0xb0, 0xe7, 0xa6, 0xb5, 0x71, - 0x64, 0x20, 0xd9, 0x7d, 0xd4, 0x18, 0xba, 0xfb, 0x5a, 0x40, 0x0a, 0xa4, 0x21, 0x0b, 0x30, 0xb2, - 0x5e, 0xdd, 0xac, 0x35, 0xdd, 0x60, 0x8e, 0x84, 0x77, 0x1a, 0xd2, 0x71, 0x1e, 0x5a, 0x7e, 0xd3, - 0xd5, 0x93, 0x00, 0x48, 0x44, 0x36, 0x7d, 0xcb, 0xb6, 0xd7, 0x38, 0xb0, 0x3d, 0xf4, 0x00, 0x9b, - 0xd1, 0xaa, 0x55, 0x4a, 0xf8, 0xf4, 0xed, 0x09, 0x40, 0xcc, 0x2d, 0x4c, 0x65, 0x21, 0xb4, 0x01, - 0xd3, 0x62, 0x99, 0x88, 0xae, 0xdd, 0xbf, 0x5d, 0x32, 0xfe, 0xbd, 0x0c, 0x6e, 0x98, 0xe4, 0x65, - 0xf4, 0x59, 0x0f, 0x1f, 0x78, 0x51, 0xaf, 0x69, 0x77, 0x62, 0x21, 0x16, 0x39, 0x0a, 0x79, 0x15, - 0x86, 0x6f, 0xdb, 0x75, 0x1a, 0xc8, 0x87, 0x1d, 0x44, 0xde, 0x41, 0x88, 0xaa, 0x04, 0xe5, 0x38, - 0x4c, 0x96, 0xe3, 0x0b, 0xa9, 0x14, 0x65, 0x5f, 0x2b, 0x97, 0xe4, 0xbb, 0x0e, 0xca, 0x72, 0x62, - 0x01, 0x2a, 0xe9, 0xd9, 0x62, 0x36, 0x90, 0xa9, 0x1c, 0x8c, 0x3f, 0xc9, 0x44, 0x3b, 0x00, 0x79, - 0x09, 0xf2, 0xe6, 0x7a, 0xd8, 0x7e, 0xee, 0x0d, 0x15, 0x6b, 0x3e, 0x22, 0x90, 0x0f, 0xe0, 0x94, - 0xc2, 0x27, 0x61, 0x90, 0xf9, 0x22, 0xba, 0xeb, 0x28, 0x2d, 0x49, 0xb7, 0xca, 0x4c, 0xe7, 0x81, - 0x82, 0x6b, 0x54, 0x50, 0xa1, 0x6d, 0x87, 0xf3, 0x56, 0x3a, 0xab, 0xf2, 0x6e, 0x20, 0x42, 0xbc, - 0xb3, 0x69, 0x1c, 0xb8, 0xc7, 0x8e, 0xf1, 0x9b, 0x19, 0xed, 0xcb, 0x0e, 0xd3, 0x5c, 0x65, 0x8e, - 0x49, 0x73, 0xf5, 0x06, 0x40, 0xa9, 0x1b, 0xb8, 0x4b, 0x6d, 0xcf, 0x6d, 0x72, 0xed, 0x82, 0x88, - 0x32, 0x8a, 0x3a, 0x53, 0x8a, 0x60, 0xcd, 0xb1, 0x20, 0x44, 0x4e, 0xb5, 0x5d, 0xcd, 0x7d, 0x5c, - 0xdb, 0x55, 0xe3, 0xf7, 0x32, 0xda, 0xda, 0x66, 0x12, 0x99, 0xfc, 0x3c, 0x14, 0xd3, 0x82, 0xe4, - 0xe7, 0x11, 0x7d, 0x1c, 0xff, 0x62, 0x06, 0x4e, 0x73, 0x23, 0xd0, 0xd5, 0x6e, 0x6b, 0x9b, 0x7a, - 0x9b, 0x76, 0xd3, 0x69, 0x70, 0x8f, 0x34, 0x2e, 0x6c, 0x5e, 0x49, 0x7e, 0x28, 0xe9, 0xf8, 0xfc, - 0x02, 0xc7, 0x8d, 0x52, 0xad, 0x36, 0x16, 0x5a, 0x0f, 0xc3, 0x52, 0xf5, 0x02, 0x97, 0x4e, 0x6f, - 0xfc, 0x6a, 0x06, 0x9e, 0x3f, 0xb6, 0x16, 0x72, 0x1d, 0x46, 0x64, 0x78, 0xd7, 0x0c, 0x0e, 0x3c, - 0x1a, 0x64, 0x25, 0x43, 0xbb, 0x4a, 0x2c, 0xf2, 0x55, 0x38, 0xa5, 0xb2, 0xda, 0xf0, 0x6c, 0x47, - 0x0d, 0xa2, 0x9a, 0xd2, 0xea, 0x80, 0xa1, 0xc4, 0x25, 0xa3, 0x74, 0x26, 0xc6, 0xff, 0x99, 0x51, - 0x12, 0xdf, 0x3d, 0xa5, 0xf2, 0xf2, 0x2d, 0x4d, 0x5e, 0x96, 0xd1, 0x82, 0xc2, 0x5e, 0xb1, 0xb2, - 0xd4, 0x3b, 0xce, 0x94, 0x62, 0x58, 0x88, 0x80, 0xef, 0x64, 0x61, 0xec, 0x81, 0x4f, 0x3d, 0xfe, - 0xc0, 0xf9, 0xd9, 0x8a, 0x0a, 0x13, 0xf6, 0x6b, 0xa0, 0xb8, 0x1d, 0x7f, 0x94, 0x41, 0xc5, 0xb7, - 0x4a, 0xc1, 0x46, 0x43, 0x49, 0x76, 0x81, 0xa3, 0x81, 0x69, 0x2e, 0x10, 0xca, 0x63, 0x7b, 0xac, - 0xe8, 0x79, 0x6f, 0x30, 0xf9, 0xd1, 0x0a, 0x79, 0x0f, 0x86, 0x1e, 0xa0, 0x1a, 0x4f, 0xf7, 0x3e, - 0x0e, 0xf9, 0x63, 0x21, 0xdf, 0xa4, 0xbb, 0xec, 0x4f, 0xf5, 0x8c, 0xc1, 0x32, 0x52, 0x83, 0x91, - 0xb2, 0x47, 0x31, 0x8d, 0x5d, 0x7e, 0x70, 0x0f, 0xba, 0x3a, 0x27, 0x89, 0x7b, 0xd0, 0x09, 0x4e, - 0xc6, 0xcf, 0x66, 0x81, 0x44, 0x7d, 0xc4, 0xf8, 0xef, 0xfe, 0x53, 0x3b, 0xe9, 0xef, 0x6a, 0x93, - 0x7e, 0x21, 0x31, 0xe9, 0xbc, 0x7b, 0x03, 0xcd, 0xfd, 0x6f, 0x65, 0xe0, 0x74, 0x3a, 0x21, 0xb9, - 0x04, 0xc3, 0x6b, 0x1b, 0xeb, 0xd2, 0x81, 0x5d, 0x74, 0xc5, 0xed, 0xe0, 0xbd, 0xdc, 0x14, 0x45, - 0xe4, 0x35, 0x18, 0xfe, 0xb2, 0x59, 0x66, 0xe7, 0x90, 0x12, 0x6b, 0xf5, 0x9b, 0x9e, 0x55, 0xd7, - 0x8f, 0x22, 0x81, 0xa4, 0xce, 0x6d, 0xee, 0x89, 0xcd, 0xed, 0x4f, 0x65, 0x61, 0xaa, 0x54, 0xaf, - 0x53, 0xdf, 0x67, 0x42, 0x0e, 0xf5, 0x83, 0xa7, 0x76, 0x62, 0xd3, 0x5d, 0xd3, 0xb5, 0xbe, 0x0d, - 0x34, 0xab, 0xbf, 0x93, 0x81, 0x53, 0x92, 0xea, 0xa1, 0x43, 0x0f, 0x36, 0xf6, 0x3c, 0xea, 0xef, - 0xb9, 0xcd, 0xc6, 0xc0, 0x01, 0x9d, 0x99, 0xa0, 0x87, 0x51, 0x1a, 0xd5, 0xd7, 0xee, 0x1d, 0x84, - 0x68, 0x82, 0x1e, 0x8f, 0xe4, 0x78, 0x1d, 0x46, 0x4a, 0x9d, 0x8e, 0xe7, 0x3e, 0xe4, 0x9f, 0xfd, - 0x84, 0x70, 0x28, 0xe4, 0x20, 0xcd, 0x01, 0x91, 0x83, 0x58, 0x33, 0x2a, 0xb4, 0xcd, 0x63, 0xe9, - 0x4c, 0xf0, 0x66, 0x34, 0x68, 0x5b, 0x95, 0x61, 0xb1, 0xdc, 0xa8, 0x01, 0x59, 0xf7, 0xdc, 0x96, - 0x1b, 0xd0, 0x06, 0xef, 0x0f, 0xfa, 0x6d, 0x1e, 0x1b, 0x04, 0x64, 0xc3, 0x09, 0x9a, 0x5a, 0x10, - 0x90, 0x80, 0x01, 0x4c, 0x0e, 0x37, 0xfe, 0xb7, 0x21, 0x18, 0x57, 0x47, 0x87, 0x18, 0x3c, 0x4a, - 0xab, 0xeb, 0xa9, 0xce, 0xc3, 0x36, 0x42, 0x4c, 0x51, 0x12, 0xf9, 0xdc, 0x67, 0x8f, 0xf5, 0xb9, - 0xdf, 0x82, 0x89, 0x75, 0xcf, 0xed, 0xb8, 0x3e, 0x6d, 0xf0, 0xf4, 0xa6, 0x7c, 0x2b, 0x9c, 0x51, - 0xee, 0x78, 0x6c, 0x22, 0xf1, 0x9d, 0x10, 0x35, 0x1c, 0x1d, 0x81, 0x6d, 0xc5, 0x93, 0x9f, 0xea, - 0x7c, 0xb8, 0x09, 0x82, 0xed, 0x8b, 0x90, 0x59, 0xa1, 0x09, 0x02, 0x83, 0xe8, 0x26, 0x08, 0x0c, - 0xa2, 0x7e, 0x6b, 0x43, 0x4f, 0xea, 0x5b, 0x23, 0x3f, 0x9b, 0x81, 0xb1, 0x52, 0xbb, 0x2d, 0x7c, - 0xf9, 0x8f, 0x71, 0x66, 0xfc, 0xaa, 0xb0, 0x42, 0x78, 0xf3, 0x63, 0x59, 0x21, 0xa0, 0xdc, 0xe2, - 0xa3, 0xa4, 0x1a, 0x55, 0xa8, 0xde, 0x72, 0x94, 0x76, 0x90, 0x37, 0xa1, 0x18, 0x2e, 0xf2, 0x6a, - 0xbb, 0x41, 0x1f, 0x51, 0x7f, 0x6e, 0xe4, 0x62, 0xee, 0xca, 0x84, 0x08, 0x96, 0xa7, 0x4a, 0xa6, - 0x71, 0x44, 0xb2, 0x01, 0x60, 0x87, 0xab, 0x2b, 0x96, 0x58, 0x26, 0xb9, 0xfc, 0x84, 0xf4, 0x8c, - 0xbf, 0xf1, 0xa1, 0x47, 0x95, 0x9e, 0x23, 0x3e, 0xa4, 0x05, 0x53, 0x3c, 0xab, 0x0b, 0x66, 0x7b, - 0xc5, 0x98, 0xb0, 0x70, 0xec, 0x3c, 0xbc, 0x24, 0x74, 0x55, 0xcf, 0x8a, 0x5c, 0x31, 0x98, 0x40, - 0xd6, 0x4a, 0x09, 0x10, 0x1b, 0xe7, 0xcd, 0x43, 0x13, 0x9a, 0x67, 0x92, 0xed, 0xe5, 0x8b, 0xfe, - 0xa7, 0x32, 0x70, 0x5a, 0x5d, 0xf4, 0xb5, 0xee, 0x76, 0xcb, 0xc1, 0xbb, 0x20, 0xb9, 0x06, 0xa3, - 0x62, 0x4d, 0x86, 0x97, 0xa8, 0x64, 0x68, 0xdb, 0x08, 0x85, 0x2c, 0xb1, 0x65, 0xc8, 0x78, 0x08, - 0xa9, 0x7b, 0x26, 0xb6, 0x4f, 0xb1, 0xa2, 0x28, 0x63, 0x98, 0x87, 0xbf, 0xf5, 0xf5, 0xc9, 0x20, - 0xc6, 0x3b, 0x30, 0xad, 0xcf, 0x44, 0x8d, 0x06, 0xe4, 0x2a, 0x8c, 0xc8, 0xe9, 0xcb, 0xa4, 0x4f, - 0x9f, 0x2c, 0x37, 0xb6, 0x80, 0x24, 0xe8, 0x7d, 0x34, 0x17, 0xa2, 0x81, 0x34, 0x67, 0x93, 0x8f, - 0x75, 0x09, 0xc4, 0x30, 0x85, 0xf6, 0x98, 0x66, 0xbf, 0xca, 0x48, 0x8d, 0x3f, 0x99, 0x84, 0x99, - 0x94, 0x3d, 0xf7, 0x18, 0x99, 0x68, 0x5e, 0xdf, 0x20, 0x46, 0x43, 0x5f, 0x68, 0xb9, 0x2d, 0xbc, - 0x23, 0xb3, 0x1d, 0xf7, 0xd9, 0x0e, 0xfa, 0xa5, 0x40, 0xfe, 0x34, 0xe4, 0x22, 0x35, 0x5c, 0xc1, - 0xd0, 0x13, 0x0b, 0x57, 0xb0, 0x08, 0x13, 0xa2, 0x57, 0x62, 0xbb, 0x1a, 0x8e, 0xb4, 0xb9, 0x1e, - 0x2f, 0xb0, 0x12, 0xdb, 0x96, 0x4e, 0xc2, 0x79, 0xf8, 0x6e, 0xf3, 0x21, 0x15, 0x3c, 0x46, 0x54, - 0x1e, 0x58, 0x90, 0xca, 0x43, 0x21, 0x21, 0xff, 0x16, 0x26, 0xb9, 0x40, 0x88, 0xba, 0x67, 0x15, - 0xfa, 0xed, 0x59, 0x8d, 0x27, 0xb3, 0x67, 0x5d, 0x90, 0x6d, 0x4c, 0xdf, 0xbb, 0x52, 0x9a, 0x45, - 0x7e, 0x39, 0x03, 0xd3, 0xdc, 0x67, 0x5e, 0x6d, 0x6c, 0x5f, 0x3f, 0xe8, 0xfa, 0x93, 0x69, 0xec, - 0x79, 0x11, 0x9f, 0x3e, 0xbd, 0xad, 0xc9, 0x46, 0x91, 0x1f, 0x00, 0x08, 0xbf, 0x28, 0x7f, 0x0e, - 0xf0, 0x53, 0x3b, 0x9f, 0xb2, 0x0b, 0x84, 0x48, 0x51, 0x2c, 0xdd, 0x20, 0xa4, 0xd3, 0x52, 0x9b, - 0x84, 0x50, 0xf2, 0x43, 0x30, 0xcb, 0xbe, 0x97, 0x10, 0x22, 0x22, 0x7c, 0xcc, 0x8d, 0x61, 0x2d, - 0x9f, 0xef, 0x2d, 0x13, 0x5d, 0x4b, 0x23, 0xe3, 0x91, 0xff, 0xa2, 0x94, 0x6e, 0x81, 0xea, 0x0c, - 0x9c, 0x5a, 0x11, 0x86, 0xcc, 0xc1, 0xd6, 0xf3, 0x78, 0xb7, 0x3d, 0xf6, 0xb7, 0xb3, 0xf2, 0x5b, - 0xe0, 0xfb, 0x9b, 0xaf, 0x3b, 0xb3, 0x21, 0x88, 0x7c, 0x19, 0x48, 0xe8, 0x6c, 0xce, 0x61, 0x54, - 0xc6, 0xc2, 0xe5, 0xaa, 0xdd, 0xc8, 0x69, 0xdd, 0x93, 0xc5, 0xea, 0x22, 0x49, 0x12, 0x13, 0x0a, - 0xb3, 0xa2, 0xd3, 0x0c, 0x2a, 0x93, 0x68, 0xf8, 0x73, 0x93, 0x5a, 0xfc, 0x94, 0xa8, 0x24, 0xca, - 0xfd, 0xa6, 0x64, 0xe2, 0xd0, 0x54, 0x4e, 0x69, 0xec, 0xc8, 0x2d, 0x18, 0x45, 0x8f, 0xb2, 0x65, - 0x69, 0x04, 0x25, 0x0c, 0x32, 0xd0, 0xf7, 0xcc, 0xda, 0xd3, 0x4d, 0x99, 0x22, 0x54, 0x76, 0x1d, - 0xa8, 0x78, 0x87, 0x66, 0xb7, 0x8d, 0x0a, 0x58, 0xa1, 0xef, 0x68, 0x78, 0x87, 0x96, 0xd7, 0xd5, - 0x5d, 0x0e, 0x11, 0x89, 0x7c, 0x03, 0xc6, 0xee, 0xdb, 0x8f, 0xa4, 0xfe, 0x55, 0x28, 0x59, 0x07, - 0xca, 0x5a, 0xde, 0xb2, 0x1f, 0x59, 0x8d, 0x6e, 0x3c, 0xee, 0x20, 0xcf, 0x5a, 0xae, 0xb0, 0x24, - 0x5f, 0x03, 0x50, 0xb4, 0xc2, 0xe4, 0xd8, 0x0a, 0x9e, 0x97, 0x11, 0x81, 0x52, 0xb5, 0xc5, 0xc8, - 0x5f, 0x61, 0x18, 0x93, 0x1c, 0x66, 0x3f, 0x3d, 0xc9, 0xe1, 0xd4, 0xa7, 0x27, 0x39, 0x9c, 0xdb, - 0x86, 0xb3, 0x3d, 0x3f, 0x9d, 0x94, 0x30, 0x8d, 0xd7, 0xf5, 0x30, 0x8d, 0x67, 0x7b, 0x1d, 0xb1, - 0xbe, 0x1e, 0x3e, 0x79, 0xa6, 0x38, 0xdb, 0x5b, 0x3a, 0xf9, 0x7e, 0x36, 0x76, 0xe4, 0x8a, 0x8b, - 0x05, 0x0f, 0xb7, 0xdf, 0x4b, 0x26, 0xc9, 0x62, 0x5e, 0x31, 0x7e, 0x28, 0x67, 0xa3, 0x0b, 0x4d, - 0x2c, 0x7d, 0x2a, 0x3f, 0x9e, 0x3f, 0xe9, 0xe9, 0xfb, 0x16, 0x4c, 0xf2, 0x8c, 0x42, 0xf7, 0xe8, - 0xe1, 0x81, 0xeb, 0x35, 0x64, 0x8e, 0x4c, 0x94, 0xc1, 0x13, 0xb9, 0xf7, 0x62, 0xb8, 0xa4, 0x22, - 0x9d, 0x94, 0x86, 0xb0, 0xf6, 0xb3, 0xa9, 0xbb, 0x18, 0x43, 0xe8, 0xe7, 0xbf, 0x44, 0x5e, 0x0f, - 0x05, 0x35, 0xea, 0xa9, 0x41, 0x94, 0x3d, 0x09, 0x4c, 0x91, 0xd7, 0xa8, 0x67, 0xfc, 0x41, 0x0e, - 0x08, 0xaf, 0xa9, 0x6c, 0x77, 0x6c, 0x74, 0xe1, 0x73, 0x30, 0x14, 0x45, 0x51, 0xe0, 0xd8, 0xdb, - 0x4d, 0xaa, 0xc6, 0x71, 0x11, 0x46, 0xa7, 0x61, 0x99, 0x15, 0xbf, 0xe8, 0x24, 0x08, 0x7b, 0x6c, - 0x75, 0xd9, 0x4f, 0xb2, 0xd5, 0x7d, 0x03, 0x9e, 0x2d, 0x75, 0x30, 0x35, 0x99, 0xac, 0xe5, 0xb6, - 0xeb, 0xc9, 0x4d, 0x4a, 0x73, 0x0e, 0xb1, 0x43, 0xb4, 0x44, 0x4b, 0xfb, 0xb1, 0x50, 0xe4, 0x14, - 0xb6, 0x2e, 0x3b, 0x81, 0xea, 0x6c, 0x2c, 0xe5, 0x94, 0x0e, 0x96, 0xa4, 0xc8, 0x29, 0x9c, 0x44, - 0xf2, 0x70, 0x3c, 0x29, 0xa7, 0x60, 0xda, 0x80, 0x88, 0x87, 0xe3, 0xd1, 0x1e, 0xb2, 0x4e, 0x48, - 0x42, 0xde, 0x82, 0xb1, 0x52, 0x37, 0x70, 0x05, 0x63, 0x61, 0x2d, 0x1d, 0xd9, 0x35, 0x8b, 0xa6, - 0x68, 0x57, 0x9f, 0x08, 0xdd, 0xf8, 0xe3, 0x1c, 0x9c, 0x4d, 0x4e, 0xaf, 0x28, 0x0d, 0xbf, 0x8f, - 0xcc, 0x31, 0xdf, 0x47, 0xda, 0x6a, 0xe0, 0x8f, 0x05, 0x4f, 0x6c, 0x35, 0xf0, 0x0c, 0x67, 0x1f, - 0x73, 0x35, 0xd4, 0x60, 0x4c, 0x3d, 0xef, 0xf2, 0x1f, 0xf7, 0xbc, 0x53, 0xb9, 0xb0, 0x4b, 0x3d, - 0xf7, 0xb1, 0x1e, 0x8a, 0x9e, 0x8e, 0xe2, 0xee, 0xd5, 0x1c, 0x83, 0xfc, 0x0b, 0x70, 0x91, 0xef, - 0x49, 0xf1, 0xce, 0x2e, 0x1e, 0x4a, 0x8e, 0x62, 0xe2, 0x16, 0x1e, 0x1f, 0xcd, 0x5f, 0xe3, 0xaa, - 0x12, 0x2b, 0x31, 0x6c, 0xd6, 0xf6, 0xa1, 0x25, 0x5b, 0xa6, 0x54, 0x72, 0x2c, 0x6f, 0x4c, 0x6b, - 0xa6, 0x64, 0xcd, 0x7a, 0x2d, 0xcd, 0x8d, 0x84, 0x47, 0x22, 0xe5, 0x60, 0xdd, 0x83, 0x44, 0xaa, - 0xc3, 0xb2, 0xa9, 0xea, 0x30, 0xa9, 0x4f, 0xc9, 0xa5, 0xea, 0x53, 0x2a, 0x30, 0x55, 0xeb, 0x6e, - 0xcb, 0xba, 0x11, 0x31, 0xaf, 0x79, 0xc2, 0xa5, 0x75, 0x28, 0x4e, 0x62, 0xfc, 0x78, 0x16, 0xc6, - 0xd7, 0x9b, 0xdd, 0x5d, 0xa7, 0x5d, 0xb1, 0x03, 0xfb, 0xa9, 0xd5, 0xd0, 0xbd, 0xa1, 0x69, 0xe8, - 0x42, 0x6f, 0xa9, 0xb0, 0x63, 0x03, 0xa9, 0xe7, 0xbe, 0x9b, 0x81, 0xa9, 0x88, 0x84, 0x9f, 0xb3, - 0xcb, 0x90, 0x67, 0x3f, 0xc4, 0xbd, 0xf5, 0x62, 0x82, 0x31, 0x4f, 0xd5, 0x12, 0xfe, 0x25, 0x74, - 0x66, 0x7a, 0x1e, 0x04, 0xe4, 0x70, 0xee, 0x0b, 0x30, 0x1a, 0xb1, 0x3d, 0x49, 0x8a, 0x96, 0x5f, - 0xcb, 0x40, 0x31, 0xde, 0x13, 0x72, 0x0f, 0x46, 0x18, 0x27, 0x87, 0xca, 0x2b, 0xf5, 0x0b, 0x3d, - 0xfa, 0x7c, 0x4d, 0xa0, 0xf1, 0xe6, 0xe1, 0xe0, 0x53, 0x0e, 0x31, 0x25, 0x87, 0x73, 0x26, 0x8c, - 0xab, 0x58, 0x29, 0xad, 0x7b, 0x55, 0x17, 0x2e, 0x4e, 0xa7, 0x8f, 0x83, 0x96, 0x58, 0x46, 0x6b, - 0xb5, 0x90, 0x1b, 0x2e, 0x6b, 0x8b, 0x0b, 0xc7, 0x2a, 0xb6, 0x6e, 0xf8, 0x32, 0x5b, 0x88, 0x82, - 0x23, 0xab, 0xeb, 0x2c, 0x65, 0x41, 0x87, 0x78, 0xe4, 0x55, 0x18, 0xe6, 0xf5, 0xa9, 0x09, 0x16, - 0x3a, 0x08, 0x51, 0x45, 0x5c, 0x8e, 0x63, 0xfc, 0xad, 0x1c, 0x9c, 0x8e, 0x9a, 0xf7, 0xa0, 0xd3, - 0xb0, 0x03, 0xba, 0x6e, 0x7b, 0x76, 0xcb, 0x3f, 0xe6, 0x0b, 0xb8, 0x92, 0x68, 0x1a, 0x06, 0xdc, - 0x97, 0x4d, 0x53, 0x1a, 0x64, 0xc4, 0x1a, 0x84, 0xea, 0x4b, 0xde, 0x20, 0xd9, 0x0c, 0x72, 0x0f, - 0x72, 0x35, 0x1a, 0x88, 0x6d, 0xf3, 0x72, 0x62, 0x54, 0xd5, 0x76, 0x5d, 0xab, 0xd1, 0x80, 0x4f, - 0x22, 0x8f, 0xfd, 0x41, 0xb5, 0xd8, 0x8b, 0x35, 0x1a, 0x90, 0x2d, 0x18, 0x5e, 0x7a, 0xd4, 0xa1, - 0xf5, 0x40, 0x24, 0x18, 0xba, 0xda, 0x9f, 0x1f, 0xc7, 0x55, 0xf2, 0x0b, 0x51, 0x04, 0xa8, 0x83, - 0xc5, 0x51, 0xce, 0xdd, 0x82, 0x82, 0xac, 0xfc, 0x24, 0x2b, 0xf7, 0xdc, 0x1b, 0x30, 0xa6, 0x54, - 0x72, 0xa2, 0x45, 0xff, 0x0b, 0x6c, 0x5f, 0x75, 0x9b, 0x32, 0x27, 0xd1, 0x52, 0x42, 0xcc, 0xcb, - 0x44, 0x3e, 0xbb, 0x5c, 0xcc, 0xb3, 0xf6, 0x45, 0x51, 0x1f, 0x79, 0xaf, 0x0a, 0x53, 0xb5, 0x7d, - 0xa7, 0x13, 0x85, 0xc0, 0xd3, 0x0e, 0x53, 0x8c, 0x16, 0x2f, 0xee, 0xdc, 0xf1, 0xc3, 0x34, 0x4e, - 0x67, 0xfc, 0x59, 0x06, 0x86, 0xd9, 0x5f, 0x9b, 0xb7, 0x9e, 0xd2, 0x2d, 0xf3, 0xa6, 0xb6, 0x65, - 0x4e, 0x2b, 0xf1, 0x67, 0x71, 0xe3, 0xb8, 0x75, 0xcc, 0x66, 0x79, 0x24, 0x26, 0x88, 0x23, 0x93, - 0x3b, 0x30, 0x22, 0x2c, 0x6f, 0x84, 0x89, 0xb4, 0x1a, 0xd0, 0x56, 0xda, 0xe4, 0x84, 0x97, 0x73, - 0xb7, 0x13, 0xd7, 0x66, 0x48, 0x6a, 0x26, 0x92, 0xcb, 0x60, 0x84, 0x5a, 0x26, 0x3b, 0x17, 0xfd, - 0xcf, 0x78, 0x40, 0x56, 0x25, 0xf7, 0x64, 0x0f, 0xc7, 0xfe, 0x92, 0x78, 0xc8, 0xc8, 0xf5, 0x63, - 0x72, 0x5a, 0x26, 0xfa, 0x4a, 0x7d, 0xe3, 0xf8, 0xc3, 0x19, 0x1e, 0xca, 0x54, 0x36, 0xec, 0x6d, - 0x18, 0xbf, 0xed, 0x7a, 0x07, 0xb6, 0xc7, 0x03, 0xd4, 0x09, 0xcb, 0x01, 0x76, 0x75, 0x9c, 0xd8, - 0xe1, 0x70, 0x1e, 0xe2, 0xee, 0xa3, 0xa3, 0xf9, 0xfc, 0xa2, 0xeb, 0x36, 0x4d, 0x0d, 0x9d, 0xac, - 0xc1, 0xc4, 0x7d, 0xfb, 0x91, 0x72, 0xe9, 0xe5, 0x0e, 0x25, 0x57, 0xd9, 0x02, 0x66, 0xb7, 0xe6, - 0xe3, 0xcd, 0xa0, 0x74, 0x7a, 0xe2, 0xc0, 0xe4, 0xba, 0xeb, 0x05, 0xa2, 0x12, 0xa7, 0xbd, 0x2b, - 0x3a, 0x9b, 0x34, 0xe4, 0xba, 0x9e, 0x6a, 0xc8, 0x75, 0xb6, 0xe3, 0x7a, 0x81, 0xb5, 0x13, 0x92, - 0x6b, 0x41, 0x73, 0x34, 0xc6, 0xe4, 0x6d, 0x98, 0x56, 0x82, 0x82, 0xdd, 0x76, 0xbd, 0x96, 0x2d, - 0x85, 0x72, 0xd4, 0x03, 0xa3, 0xbd, 0xc9, 0x0e, 0x82, 0xcd, 0x24, 0x26, 0xf9, 0x20, 0xcd, 0x45, - 0x67, 0x28, 0xb2, 0x04, 0x4b, 0x71, 0xd1, 0xe9, 0x65, 0x09, 0x96, 0x74, 0xd6, 0xd9, 0xed, 0x67, - 0x29, 0x5a, 0x58, 0xbc, 0x21, 0xae, 0xdf, 0xc7, 0x5b, 0x82, 0x86, 0xf3, 0xd6, 0xc3, 0x22, 0x74, - 0x01, 0x72, 0x8b, 0xeb, 0xb7, 0xf1, 0xf5, 0x42, 0x1a, 0xda, 0xb4, 0xf7, 0xec, 0x76, 0x1d, 0x85, - 0x65, 0x61, 0x9d, 0xad, 0xee, 0xc8, 0x8b, 0xeb, 0xb7, 0x89, 0x0d, 0x33, 0xeb, 0xd4, 0x6b, 0x39, - 0xc1, 0x57, 0x6e, 0xdc, 0x50, 0x26, 0xaa, 0x80, 0x4d, 0xbb, 0x2e, 0x9a, 0x36, 0xdf, 0x41, 0x14, - 0xeb, 0xd1, 0x8d, 0x1b, 0xa9, 0xd3, 0x11, 0x36, 0x2c, 0x8d, 0x17, 0xdb, 0x19, 0xef, 0xdb, 0x8f, - 0x22, 0xa3, 0x7a, 0x5f, 0x38, 0x3b, 0x5e, 0x90, 0x0b, 0x2b, 0x32, 0xc8, 0xd7, 0x76, 0x46, 0x9d, - 0x88, 0xdd, 0x75, 0xa2, 0xe5, 0xe5, 0x0b, 0x37, 0x91, 0x73, 0x52, 0xa5, 0x23, 0x3d, 0x62, 0x55, - 0x81, 0x5d, 0x41, 0x27, 0x0f, 0xc2, 0x1b, 0x1b, 0xbf, 0xf1, 0x88, 0x34, 0x56, 0xd7, 0xd5, 0x1b, - 0x1b, 0x57, 0xa4, 0x68, 0xdd, 0x9a, 0x0a, 0xaf, 0xf9, 0xdc, 0xcb, 0xc0, 0xd4, 0xb9, 0x24, 0x2f, - 0x82, 0xe3, 0x27, 0xbf, 0x08, 0x52, 0xc8, 0xaf, 0xb8, 0xf5, 0x7d, 0x11, 0xe9, 0xe7, 0xcb, 0xec, - 0x73, 0x6f, 0xba, 0xf5, 0xfd, 0x27, 0x67, 0x01, 0x8b, 0xec, 0xc9, 0x2a, 0x6b, 0x2a, 0x5b, 0x05, - 0x62, 0x4c, 0x84, 0x55, 0xe5, 0x6c, 0x78, 0x13, 0x52, 0xca, 0xb8, 0xe0, 0xc3, 0x17, 0x8d, 0x1c, - 0x5a, 0x53, 0x27, 0x27, 0x14, 0x8a, 0x15, 0xea, 0xef, 0x07, 0x6e, 0xa7, 0xdc, 0x74, 0x3a, 0xdb, - 0xae, 0xed, 0x35, 0x50, 0x77, 0x97, 0xf6, 0x7d, 0xbf, 0x94, 0xfa, 0x7d, 0x4f, 0x37, 0x38, 0xbd, - 0x55, 0x97, 0x0c, 0xcc, 0x04, 0x4b, 0xf2, 0x01, 0x4c, 0xb2, 0xc5, 0xbd, 0xf4, 0x28, 0xa0, 0x6d, - 0x3e, 0xf3, 0xd3, 0x28, 0x3a, 0xcc, 0x2a, 0x81, 0xbf, 0xc3, 0x42, 0xbe, 0xa6, 0xf0, 0x63, 0xa7, - 0x21, 0x81, 0x16, 0x25, 0x49, 0x63, 0x45, 0x1a, 0x30, 0x77, 0xdf, 0x7e, 0xa4, 0x24, 0xdf, 0x52, - 0x16, 0x29, 0xc1, 0x05, 0x86, 0xc9, 0xc6, 0xd9, 0x02, 0x8b, 0x02, 0x74, 0xf6, 0x58, 0xaf, 0x3d, - 0x39, 0x91, 0x1f, 0x84, 0x33, 0xa2, 0x5b, 0x15, 0xcc, 0x86, 0xe1, 0x7a, 0x87, 0xb5, 0x3d, 0x1b, - 0xfd, 0x69, 0x66, 0x4e, 0xb6, 0x21, 0xca, 0x01, 0x6b, 0x48, 0x3e, 0x96, 0xcf, 0x19, 0x99, 0xbd, - 0x6a, 0x20, 0x1f, 0xc2, 0x24, 0x7f, 0xb2, 0x59, 0x76, 0xfd, 0x00, 0x2f, 0xf4, 0xb3, 0x27, 0x33, - 0x13, 0xe7, 0xef, 0x40, 0xdc, 0xb1, 0x22, 0xa6, 0x00, 0x88, 0x71, 0x26, 0x6f, 0xc2, 0xd8, 0xba, - 0xd3, 0xe6, 0x71, 0xcc, 0xaa, 0xeb, 0xa8, 0x7a, 0x14, 0xe7, 0x4f, 0xc7, 0x69, 0x5b, 0xf2, 0x56, - 0xdd, 0x09, 0xb7, 0x0b, 0x15, 0x9b, 0x6c, 0xc1, 0x58, 0xad, 0xb6, 0x7c, 0xdb, 0x61, 0x07, 0x60, - 0xe7, 0x70, 0xee, 0x74, 0x8f, 0x56, 0x5e, 0x4a, 0x6d, 0xe5, 0x84, 0xef, 0xef, 0x61, 0x42, 0x63, - 0xab, 0xee, 0x76, 0x0e, 0x4d, 0x95, 0x53, 0x8a, 0xe9, 0xf4, 0x99, 0x27, 0x6c, 0x3a, 0x5d, 0x85, - 0x29, 0xc5, 0xc0, 0x12, 0x8d, 0x2b, 0xe7, 0xa2, 0xb0, 0x5d, 0xaa, 0xa9, 0x74, 0xdc, 0xad, 0x2f, - 0x4e, 0x27, 0x6d, 0xa6, 0xcf, 0x9e, 0xd4, 0x66, 0xda, 0x81, 0x69, 0x3e, 0x19, 0x62, 0x1d, 0xe0, - 0x4c, 0x9f, 0xeb, 0x31, 0x86, 0x57, 0x53, 0xc7, 0x70, 0x46, 0xcc, 0xb4, 0x5c, 0x64, 0xf8, 0x44, - 0x99, 0xe4, 0x4a, 0x76, 0x80, 0x08, 0xa0, 0x48, 0xa7, 0x8c, 0x75, 0x3d, 0xdb, 0xa3, 0xae, 0x17, - 0x52, 0xeb, 0x9a, 0x94, 0x75, 0x6d, 0xf3, 0x6a, 0x52, 0x38, 0x92, 0xb6, 0xac, 0x47, 0xae, 0x2f, - 0x1c, 0xd8, 0xf3, 0x9a, 0x1e, 0x34, 0x89, 0xc0, 0x83, 0x88, 0xc6, 0x17, 0x6d, 0x7c, 0xdc, 0x53, - 0x38, 0x93, 0x47, 0x70, 0x3a, 0xd9, 0x0a, 0xac, 0xf3, 0x02, 0xd6, 0x79, 0x41, 0xab, 0x33, 0x8e, - 0xc4, 0xd7, 0x8d, 0xde, 0xad, 0x78, 0xad, 0x3d, 0xf8, 0xdf, 0xcd, 0x17, 0x26, 0x8a, 0x93, 0x69, - 0x96, 0xd6, 0xff, 0x30, 0x1b, 0xdb, 0xb4, 0x49, 0x15, 0x46, 0xc4, 0x5c, 0x08, 0x29, 0x36, 0x39, - 0xe2, 0x17, 0x52, 0x47, 0x7c, 0x44, 0x4c, 0xab, 0x29, 0xe9, 0xc9, 0x01, 0x63, 0x85, 0x66, 0xeb, - 0x42, 0xec, 0xff, 0x1a, 0xdf, 0x93, 0x11, 0xa4, 0x9d, 0x3e, 0x95, 0x93, 0x3b, 0xed, 0xe8, 0x3e, - 0x61, 0x78, 0x0c, 0xc9, 0xda, 0xc8, 0x3e, 0xcf, 0x14, 0x90, 0x0b, 0x3d, 0x3f, 0xf4, 0xb4, 0x00, - 0x4f, 0xac, 0x42, 0x56, 0x8b, 0xf1, 0x9b, 0x19, 0x98, 0xd0, 0x76, 0x7d, 0x72, 0x4b, 0x71, 0x6b, - 0x8a, 0xbc, 0x72, 0x35, 0x1c, 0xdc, 0x08, 0xe2, 0x0e, 0x4f, 0xb7, 0x84, 0xdd, 0x74, 0xb6, 0x37, - 0x5d, 0x6a, 0x56, 0xf1, 0xfe, 0x4a, 0xb2, 0x30, 0xf3, 0x50, 0xbe, 0x47, 0xe6, 0xa1, 0x5f, 0x7f, - 0x16, 0x26, 0xf5, 0x6b, 0x01, 0x79, 0x15, 0x86, 0x51, 0xb7, 0x28, 0xef, 0x98, 0x3c, 0xf7, 0x2e, - 0x42, 0xb4, 0xdc, 0xbb, 0x08, 0x21, 0x2f, 0x02, 0x84, 0x06, 0xac, 0x52, 0xb3, 0x3e, 0xf4, 0xf8, - 0x68, 0x3e, 0xf3, 0x9a, 0xa9, 0x14, 0x90, 0xaf, 0x03, 0xac, 0xba, 0x0d, 0x1a, 0x66, 0x47, 0xeb, - 0xf3, 0x7a, 0xfc, 0x52, 0x22, 0x8a, 0xf6, 0xa9, 0xb6, 0xdb, 0xa0, 0xc9, 0x90, 0xd9, 0x0a, 0x47, - 0xf2, 0x25, 0x18, 0x32, 0xbb, 0xec, 0x3e, 0xcb, 0x55, 0x09, 0x63, 0x72, 0xf7, 0xed, 0x36, 0xa9, - 0x92, 0xa8, 0xbf, 0x1b, 0x37, 0x8c, 0x62, 0x00, 0xf2, 0x2e, 0x8f, 0xae, 0x2d, 0x82, 0x61, 0x0d, - 0x45, 0x6f, 0x0d, 0xca, 0xa9, 0x9c, 0x08, 0x87, 0xa5, 0x90, 0x90, 0x35, 0x18, 0x51, 0x95, 0xe4, - 0x8a, 0x7f, 0xac, 0xfa, 0x90, 0xa2, 0xdc, 0xbc, 0x44, 0x5a, 0xb5, 0xb8, 0xfe, 0x5c, 0x72, 0x21, - 0x6f, 0xc1, 0x28, 0x63, 0xcf, 0x3e, 0x61, 0x5f, 0x48, 0xdc, 0xf8, 0xa2, 0xa0, 0x34, 0x88, 0xed, - 0x00, 0x5a, 0xc8, 0xaa, 0x90, 0x80, 0x7c, 0x80, 0x99, 0xc3, 0xc4, 0x50, 0xf7, 0xb5, 0x2a, 0xb8, - 0x9c, 0x18, 0x6a, 0x4c, 0x25, 0x96, 0x4c, 0x2a, 0x1b, 0xf2, 0x23, 0xbb, 0x61, 0x28, 0xa5, 0x41, - 0x22, 0xa2, 0xbf, 0x9c, 0xa8, 0x60, 0x4e, 0x46, 0x07, 0x4a, 0x66, 0xb9, 0xd3, 0xf8, 0x92, 0x0e, - 0x14, 0x23, 0x81, 0x47, 0xd4, 0x05, 0xfd, 0xea, 0x7a, 0x2d, 0x51, 0x97, 0x3a, 0x81, 0x89, 0xea, - 0x12, 0xdc, 0x49, 0x03, 0x26, 0xe5, 0xe6, 0x29, 0xea, 0x1b, 0xeb, 0x57, 0xdf, 0x8b, 0x89, 0xfa, - 0x66, 0x1a, 0xdb, 0xc9, 0x7a, 0x62, 0x3c, 0xc9, 0x5b, 0x30, 0x21, 0x21, 0xf8, 0x7d, 0x88, 0xec, - 0xb5, 0xa8, 0x15, 0x69, 0x6c, 0xa3, 0xc9, 0xbc, 0x9e, 0xfb, 0x4f, 0x45, 0x56, 0xa9, 0xf9, 0xea, - 0x98, 0xd0, 0xa8, 0xe3, 0xab, 0x42, 0x47, 0x26, 0xef, 0xc3, 0x58, 0xb5, 0xc5, 0x3a, 0xe2, 0xb6, - 0xed, 0x80, 0x0a, 0xdf, 0x29, 0x69, 0x21, 0xa1, 0x94, 0x28, 0x4b, 0x95, 0x67, 0xd3, 0x8b, 0x8a, - 0xb4, 0x6c, 0x7a, 0x11, 0x98, 0x0d, 0x1e, 0x7f, 0x15, 0x11, 0x6b, 0x58, 0xfa, 0x55, 0x5d, 0x48, - 0xb1, 0x52, 0x50, 0xd8, 0x8b, 0xa0, 0x73, 0x0c, 0x2a, 0x5f, 0x25, 0x62, 0x41, 0xe7, 0x54, 0x9e, - 0xe4, 0x6d, 0x18, 0x13, 0xc9, 0x22, 0x4a, 0xe6, 0xaa, 0x3f, 0x57, 0xc4, 0xce, 0xa3, 0x37, 0xb8, - 0xcc, 0x2b, 0x61, 0xd9, 0x5e, 0xcc, 0x1c, 0x2f, 0xc2, 0x27, 0x5f, 0x81, 0xd9, 0x2d, 0xa7, 0xdd, - 0x70, 0x0f, 0x7c, 0x71, 0x4c, 0x89, 0x8d, 0x6e, 0x3a, 0x72, 0x86, 0x39, 0xe0, 0xe5, 0xa1, 0x9c, - 0x92, 0xd8, 0xf8, 0x52, 0x39, 0x90, 0xbf, 0x9c, 0xe0, 0xcc, 0x57, 0x10, 0xe9, 0xb7, 0x82, 0x16, - 0x12, 0x2b, 0x28, 0x59, 0x7d, 0x7c, 0x39, 0xa5, 0x56, 0x43, 0x5c, 0x20, 0xfa, 0xf9, 0x7e, 0xd7, - 0x75, 0xda, 0x73, 0x33, 0xb8, 0x17, 0x3e, 0x1b, 0xf7, 0xbf, 0x46, 0xbc, 0x75, 0xb7, 0xe9, 0xd4, - 0x0f, 0x79, 0xe6, 0xfa, 0xb8, 0x3c, 0xfa, 0xa1, 0xab, 0xe9, 0x8c, 0x53, 0x58, 0x93, 0xf7, 0x61, - 0x9c, 0xfd, 0x1f, 0x5e, 0x98, 0x67, 0x35, 0xbb, 0x36, 0x05, 0x53, 0xd4, 0x83, 0x73, 0x84, 0xd9, - 0x2c, 0x52, 0xee, 0xd2, 0x1a, 0x2b, 0xf2, 0x06, 0x00, 0x93, 0x9c, 0xc4, 0x76, 0x7c, 0x2a, 0x8a, - 0xf1, 0x87, 0xf2, 0x56, 0x72, 0x23, 0x8e, 0x90, 0xd9, 0x2d, 0x9e, 0xfd, 0xaa, 0x75, 0x1b, 0x2e, - 0xfb, 0x36, 0x4e, 0x23, 0x2d, 0x77, 0x49, 0x63, 0xb4, 0x3e, 0x87, 0x6b, 0x2e, 0x69, 0x11, 0x3a, - 0x59, 0x86, 0x29, 0x8c, 0xc5, 0x58, 0x6d, 0xd0, 0x76, 0x80, 0xaf, 0x95, 0x73, 0x67, 0x94, 0xd7, - 0x5c, 0x56, 0x64, 0x39, 0x61, 0x99, 0x2a, 0x67, 0xc7, 0xc8, 0x88, 0x0f, 0x33, 0xd1, 0xee, 0x12, - 0xbd, 0x0d, 0xcf, 0xe1, 0x20, 0x49, 0xe9, 0x32, 0x89, 0xc1, 0xf7, 0x63, 0x36, 0x23, 0xca, 0xc6, - 0x25, 0x35, 0xeb, 0x6a, 0x85, 0x69, 0xdc, 0x89, 0x09, 0xe4, 0x4e, 0x79, 0x3d, 0x1e, 0xac, 0xf0, - 0x2c, 0xf6, 0x00, 0xa7, 0x79, 0xb7, 0x1e, 0xe5, 0x6d, 0x4c, 0x09, 0x58, 0x98, 0x42, 0x4d, 0xbe, - 0x05, 0xa7, 0xe4, 0x0e, 0x22, 0x8a, 0xc4, 0xba, 0x3e, 0x77, 0xc2, 0x9d, 0xb8, 0xb1, 0x1d, 0x56, - 0x9d, 0x58, 0xd2, 0xe9, 0x55, 0x10, 0x1b, 0xc6, 0x70, 0x5a, 0x45, 0x8d, 0xcf, 0xf6, 0xab, 0xf1, - 0x4a, 0xa2, 0xc6, 0xd3, 0xb8, 0x50, 0x92, 0x95, 0xa9, 0x3c, 0xc9, 0x22, 0x4c, 0x88, 0xef, 0x48, - 0xac, 0xb6, 0xf3, 0x38, 0x5a, 0xa8, 0x60, 0x91, 0x5f, 0x60, 0x62, 0xc1, 0xe9, 0x24, 0xea, 0x8e, - 0xcc, 0x35, 0xea, 0x17, 0xb4, 0x1d, 0x39, 0xae, 0x48, 0xd7, 0x91, 0xd9, 0x8e, 0x14, 0x49, 0x31, - 0x4b, 0x8f, 0x3a, 0x9e, 0x50, 0x9f, 0x3c, 0x17, 0xc5, 0xf0, 0x57, 0x84, 0x1f, 0x8b, 0x86, 0x18, - 0xea, 0x96, 0x90, 0xc6, 0x81, 0x3c, 0x80, 0x99, 0xf0, 0xd4, 0x56, 0x18, 0xcf, 0x47, 0xb9, 0x10, - 0xa2, 0xa3, 0x3e, 0x9d, 0x6f, 0x1a, 0x3d, 0xb1, 0xe1, 0x8c, 0x76, 0x4e, 0x2b, 0xac, 0x2f, 0x22, - 0x6b, 0xcc, 0x13, 0xaa, 0x1f, 0xf2, 0xe9, 0xec, 0x7b, 0xf1, 0x21, 0x1f, 0xc2, 0xb9, 0xf8, 0xd9, - 0xac, 0xd4, 0xf2, 0x3c, 0xd6, 0xf2, 0xf2, 0xe3, 0xa3, 0xf9, 0xcb, 0x89, 0xe3, 0x3d, 0xbd, 0xa2, - 0x3e, 0xdc, 0xc8, 0xd7, 0x61, 0x4e, 0x3f, 0x9f, 0x95, 0x9a, 0x0c, 0xac, 0x09, 0x3f, 0x9d, 0xf0, - 0x60, 0x4f, 0xaf, 0xa1, 0x27, 0x0f, 0x12, 0xc0, 0x7c, 0xea, 0xea, 0x56, 0xaa, 0xb9, 0x14, 0x75, - 0x28, 0xf1, 0x95, 0xa4, 0x57, 0x77, 0x1c, 0x4b, 0x72, 0x00, 0xcf, 0xa5, 0x1d, 0x13, 0x4a, 0xa5, - 0x2f, 0x84, 0x0a, 0xca, 0x57, 0xd2, 0x8f, 0x9c, 0xf4, 0x9a, 0x8f, 0x61, 0x4b, 0x3e, 0x80, 0x53, - 0xca, 0xf7, 0xa5, 0xd4, 0xf7, 0x22, 0xd6, 0x87, 0xae, 0xac, 0xea, 0x87, 0x99, 0x5e, 0x4b, 0x3a, - 0x0f, 0xd2, 0x82, 0x19, 0xd9, 0x71, 0xd4, 0x04, 0x8b, 0xa3, 0xe7, 0xb2, 0xb6, 0xab, 0x26, 0x31, - 0x94, 0x04, 0xcb, 0xdb, 0x56, 0x27, 0x22, 0x54, 0x57, 0x7a, 0x0a, 0x5f, 0xb2, 0x0c, 0xc3, 0xb5, - 0xf5, 0xea, 0xed, 0xdb, 0x4b, 0x73, 0x2f, 0x61, 0x0d, 0xd2, 0xef, 0x85, 0x03, 0xb5, 0x4b, 0x93, - 0x30, 0xb7, 0xea, 0x38, 0x3b, 0x3b, 0x9a, 0x7b, 0x11, 0x47, 0xbd, 0x9b, 0x2f, 0x5c, 0x29, 0x5e, - 0xbd, 0x9b, 0x2f, 0x5c, 0x2d, 0xbe, 0x6c, 0x9e, 0x4f, 0xcf, 0x8d, 0xcb, 0x3b, 0x6b, 0x5e, 0xee, - 0x57, 0x1a, 0x0d, 0x85, 0xf1, 0x0b, 0x19, 0x98, 0x49, 0x69, 0x07, 0xb9, 0x0c, 0x79, 0x4c, 0x2e, - 0xa0, 0x3c, 0x30, 0xc7, 0x92, 0x0a, 0x60, 0x39, 0xf9, 0x1c, 0x8c, 0x54, 0x56, 0x6b, 0xb5, 0xd2, - 0xaa, 0xbc, 0xb2, 0xf1, 0xed, 0xaa, 0xed, 0x5b, 0xbe, 0xad, 0xbf, 0x4b, 0x09, 0x34, 0xf2, 0x1a, - 0x0c, 0x57, 0xd7, 0x91, 0x80, 0x5b, 0x38, 0xe1, 0x15, 0xc6, 0xe9, 0xc4, 0xf1, 0x05, 0x92, 0xf1, - 0x13, 0x19, 0x20, 0xc9, 0x41, 0x25, 0x37, 0x60, 0x4c, 0x9d, 0x3a, 0x7e, 0xc1, 0xc4, 0x37, 0x14, - 0x65, 0x62, 0x4c, 0x15, 0x87, 0x54, 0x60, 0x08, 0x93, 0x21, 0x85, 0x0f, 0x62, 0xa9, 0x07, 0xc0, - 0x99, 0xc4, 0x01, 0x30, 0x84, 0xa9, 0x96, 0x4c, 0x4e, 0x6c, 0xfc, 0x4e, 0x06, 0x48, 0xf2, 0xd0, - 0x1c, 0xf8, 0x41, 0xfe, 0x75, 0xc5, 0x43, 0x55, 0x0d, 0x1f, 0x1e, 0xe6, 0x7e, 0x50, 0x2f, 0x4b, - 0x91, 0x2f, 0xeb, 0x65, 0xed, 0x72, 0xde, 0xdb, 0xad, 0xe9, 0x2a, 0x0c, 0x6d, 0x52, 0x6f, 0x5b, - 0x1a, 0xef, 0xa1, 0xc1, 0xcf, 0x43, 0x06, 0x50, 0x2f, 0xab, 0x88, 0x61, 0xfc, 0x71, 0x06, 0x66, - 0xd3, 0x24, 0xb9, 0x63, 0xbc, 0x8f, 0x8c, 0x98, 0xe3, 0x14, 0x3e, 0xc6, 0x73, 0x6b, 0xa0, 0xd0, - 0x5d, 0x6a, 0x1e, 0x86, 0x58, 0x67, 0xe5, 0x0c, 0xa3, 0xb2, 0x80, 0x8d, 0x86, 0x6f, 0x72, 0x38, - 0x43, 0xe0, 0x51, 0x8f, 0xf2, 0x18, 0xdc, 0x0a, 0x11, 0x50, 0x50, 0x30, 0x39, 0x9c, 0x21, 0xdc, - 0x77, 0x1b, 0x61, 0x06, 0x50, 0x44, 0x68, 0x31, 0x80, 0xc9, 0xe1, 0xe4, 0x32, 0x8c, 0xac, 0xb5, - 0x57, 0xa8, 0xfd, 0x50, 0xa6, 0xaf, 0x40, 0xe3, 0x01, 0xb7, 0x6d, 0x35, 0x19, 0xcc, 0x94, 0x85, - 0xc6, 0x77, 0x33, 0x30, 0x9d, 0x10, 0x22, 0x8f, 0x77, 0xb0, 0xea, 0xef, 0xe9, 0x30, 0x48, 0xff, - 0x78, 0xf3, 0xf3, 0xe9, 0xcd, 0x37, 0xfe, 0x8f, 0x3c, 0x9c, 0xe9, 0x71, 0xa7, 0x8f, 0x3c, 0xb1, - 0x32, 0xc7, 0x7a, 0x62, 0x7d, 0x95, 0xdd, 0xa1, 0x6d, 0xa7, 0xe5, 0x6f, 0xb8, 0x51, 0x8b, 0x23, - 0x83, 0x6e, 0x2c, 0x93, 0x49, 0x50, 0xa5, 0xe5, 0xef, 0x59, 0x9e, 0x88, 0xda, 0x0a, 0xdc, 0xa4, - 0x48, 0xa1, 0x31, 0x4b, 0xf8, 0x42, 0xe5, 0xfe, 0x82, 0xf8, 0x42, 0xe9, 0xd6, 0xf9, 0xf9, 0x27, - 0x6a, 0x9d, 0x9f, 0x6e, 0xd9, 0x37, 0xf4, 0x49, 0xec, 0x3c, 0xcb, 0x30, 0xc1, 0xad, 0x27, 0x4a, - 0x3e, 0x9f, 0xa4, 0xe1, 0x84, 0xc5, 0x85, 0xed, 0x27, 0xe7, 0x42, 0xa3, 0x21, 0xcb, 0xba, 0x25, - 0xf9, 0x08, 0xbe, 0xfa, 0x5c, 0xee, 0x6d, 0x29, 0xae, 0xbd, 0xf6, 0xaa, 0xa4, 0xc6, 0x77, 0xb3, - 0xba, 0xa3, 0xd4, 0x5f, 0xc4, 0x95, 0x77, 0x15, 0x86, 0xb6, 0xf6, 0xa8, 0x27, 0xf7, 0x3b, 0x6c, - 0xc8, 0x01, 0x03, 0xa8, 0x0d, 0x41, 0x0c, 0x72, 0x1b, 0x26, 0xd7, 0xf9, 0x4c, 0xc8, 0xe1, 0xcd, - 0x47, 0x57, 0xad, 0x8e, 0x50, 0x08, 0xa4, 0x8c, 0x6f, 0x8c, 0xca, 0xb8, 0x03, 0x17, 0xb4, 0x0f, - 0x52, 0x04, 0x76, 0xe0, 0x06, 0xdd, 0xfc, 0x44, 0x9c, 0x8c, 0x4c, 0xd8, 0xa3, 0xdd, 0xc3, 0x8c, - 0x41, 0x8d, 0x1d, 0x78, 0xae, 0x2f, 0x23, 0x76, 0x10, 0x41, 0x27, 0xfc, 0x15, 0xb3, 0x3a, 0xeb, - 0x4b, 0x6a, 0x2a, 0x74, 0xc6, 0x0f, 0xc2, 0xb8, 0x3a, 0xca, 0xb8, 0xa7, 0xb2, 0xdf, 0x62, 0x53, - 0xe3, 0x7b, 0x2a, 0x03, 0x98, 0x1c, 0x7e, 0x6c, 0xf2, 0xf8, 0x68, 0xfa, 0x73, 0xc7, 0x4d, 0x3f, - 0xab, 0x1c, 0x3f, 0x59, 0xa5, 0x72, 0xfc, 0xad, 0x56, 0x8e, 0x91, 0x1b, 0x4c, 0x0e, 0x7f, 0xa2, - 0x95, 0xff, 0xb6, 0x0c, 0xe2, 0x8f, 0xf6, 0xe2, 0xf2, 0x4e, 0x1c, 0xa5, 0xe8, 0x9c, 0x49, 0xbb, - 0xe9, 0x46, 0x98, 0xd1, 0x21, 0x99, 0x3d, 0xee, 0x90, 0x3c, 0xc9, 0x42, 0xbc, 0x0e, 0x23, 0x25, - 0xf1, 0x26, 0x9b, 0x8f, 0x04, 0x1b, 0x3b, 0xf1, 0x00, 0x2b, 0xb1, 0x8c, 0xef, 0x65, 0xe0, 0x54, - 0xaa, 0xaa, 0x8c, 0xd5, 0xca, 0x75, 0x72, 0xca, 0x77, 0x18, 0x57, 0xc8, 0x71, 0x8c, 0x93, 0xb8, - 0xed, 0x0e, 0xde, 0x17, 0xe3, 0x79, 0x18, 0x0d, 0x1f, 0x6a, 0xc8, 0xac, 0x9c, 0x3a, 0x34, 0xd4, - 0x91, 0xfa, 0xfe, 0x1a, 0x00, 0x6b, 0xc1, 0x13, 0x35, 0x2b, 0x33, 0x7e, 0x3b, 0xcb, 0x13, 0x3c, - 0x3d, 0xb5, 0xd1, 0xee, 0xd2, 0x6d, 0xc1, 0x58, 0x97, 0x7a, 0xc7, 0xb8, 0x23, 0x4b, 0x30, 0x5c, - 0x0b, 0xec, 0xa0, 0x2b, 0xbd, 0x8d, 0x67, 0x54, 0x32, 0x2c, 0xd8, 0x5c, 0x88, 0xfc, 0x4d, 0x7d, - 0x84, 0x68, 0x97, 0x03, 0x84, 0x28, 0x26, 0x65, 0x0e, 0x8c, 0xab, 0xb4, 0xe4, 0x7d, 0x98, 0x94, - 0x21, 0xbc, 0xb8, 0x0b, 0xb6, 0x78, 0x54, 0x92, 0xc6, 0x09, 0x32, 0x84, 0x97, 0xea, 0xb2, 0xad, - 0xe1, 0xab, 0x3b, 0x75, 0x47, 0x45, 0x36, 0xfe, 0x64, 0x98, 0xaf, 0x03, 0x11, 0x8b, 0x6f, 0x1b, - 0x26, 0xd7, 0xaa, 0x95, 0xb2, 0xa2, 0xf8, 0xd2, 0xd3, 0x2e, 0x2c, 0x3d, 0x0a, 0xa8, 0xd7, 0xb6, - 0x9b, 0x02, 0xe1, 0x30, 0x3a, 0x1b, 0x5c, 0xa7, 0x51, 0x4f, 0x57, 0x8a, 0xc5, 0x38, 0xb2, 0x3a, - 0xf8, 0xe5, 0x26, 0xac, 0x23, 0x3b, 0x60, 0x1d, 0xbe, 0xdd, 0x6a, 0xf6, 0xa8, 0x43, 0xe7, 0x48, - 0xf6, 0xa0, 0x78, 0x07, 0xe5, 0x18, 0xa5, 0x96, 0x5c, 0xff, 0x5a, 0x2e, 0x89, 0x5a, 0x9e, 0xe5, - 0x02, 0x50, 0x7a, 0x3d, 0x09, 0xae, 0xd1, 0x07, 0x9c, 0x3f, 0xf6, 0x03, 0xfe, 0xab, 0x19, 0x18, - 0xe6, 0x82, 0x92, 0x58, 0x5f, 0x3d, 0x44, 0xb1, 0xad, 0x27, 0x23, 0x8a, 0x15, 0x71, 0x03, 0xd7, - 0x56, 0x1a, 0x2f, 0x23, 0x95, 0xd8, 0x82, 0x95, 0x26, 0x8a, 0xa8, 0xc2, 0xe6, 0x25, 0xc7, 0xaf, - 0x57, 0x52, 0x8d, 0x5c, 0x73, 0x47, 0x8e, 0xf5, 0xfe, 0x92, 0xee, 0xcc, 0x23, 0xc2, 0x35, 0x57, - 0x77, 0xc8, 0x5d, 0x81, 0x51, 0xe1, 0xf0, 0xbb, 0x78, 0x28, 0x1e, 0xaa, 0x8a, 0xda, 0x33, 0x78, - 0x63, 0xf1, 0x30, 0x12, 0x02, 0x85, 0xcb, 0xb0, 0xb5, 0x7d, 0xa8, 0x25, 0xb2, 0x92, 0x88, 0x64, - 0x8d, 0x27, 0x78, 0xe1, 0xd1, 0x0a, 0xf5, 0x50, 0xc2, 0x21, 0x5c, 0x84, 0x12, 0x91, 0x5e, 0x83, - 0x29, 0xc1, 0x09, 0x23, 0x1e, 0x64, 0x05, 0x8a, 0x22, 0xf1, 0x3d, 0xb7, 0xa3, 0xa8, 0x56, 0xb8, - 0x53, 0xa9, 0x30, 0x7f, 0x93, 0x69, 0xf3, 0x85, 0x05, 0x86, 0xee, 0xcf, 0x91, 0xa0, 0x64, 0x17, - 0xb7, 0x62, 0x7c, 0xf5, 0x91, 0xb7, 0x60, 0x2c, 0x8c, 0x16, 0x19, 0x7a, 0x94, 0xa1, 0xc2, 0x3a, - 0x0a, 0x2f, 0xa9, 0xf9, 0x96, 0xa9, 0xe8, 0x64, 0x01, 0x0a, 0xec, 0x23, 0x8e, 0xa7, 0xd0, 0xea, - 0x0a, 0x98, 0x6a, 0x26, 0x2e, 0xf1, 0x48, 0x0d, 0x66, 0xd8, 0x47, 0x53, 0x73, 0xda, 0xbb, 0x4d, - 0xba, 0xe2, 0xee, 0xba, 0xdd, 0xe0, 0x81, 0xb9, 0x22, 0x36, 0x57, 0x2e, 0x2a, 0xdb, 0xad, 0xa6, - 0x56, 0xec, 0x69, 0x09, 0x52, 0x53, 0xa8, 0x95, 0x3d, 0xec, 0x0f, 0xb3, 0x30, 0xa6, 0xac, 0x27, - 0x72, 0x15, 0x0a, 0x55, 0x7f, 0xc5, 0xad, 0xef, 0x87, 0xb1, 0xa6, 0x26, 0x1e, 0x1f, 0xcd, 0x8f, - 0x3a, 0xbe, 0xd5, 0x44, 0xa0, 0x19, 0x16, 0x93, 0x45, 0x98, 0xe0, 0x7f, 0xc9, 0x88, 0xdb, 0xd9, - 0xc8, 0xda, 0x8d, 0x23, 0xcb, 0x58, 0xdb, 0xea, 0xbe, 0xa6, 0x91, 0x90, 0xaf, 0x01, 0x70, 0x00, - 0x7a, 0x27, 0xe6, 0x06, 0xf7, 0xab, 0x14, 0x15, 0xa4, 0xf8, 0x25, 0x2a, 0x0c, 0xc9, 0x37, 0x78, - 0x74, 0x49, 0xb9, 0xfe, 0xf3, 0x83, 0x3b, 0x86, 0x32, 0xfe, 0x56, 0xba, 0x7f, 0xba, 0xca, 0x52, - 0x84, 0xc5, 0x3b, 0x67, 0xd2, 0xba, 0xfb, 0x90, 0x7a, 0x87, 0xa5, 0x00, 0x11, 0x15, 0x0c, 0xe3, - 0xbf, 0xcb, 0x28, 0x5f, 0x0d, 0x59, 0xc5, 0xac, 0x6f, 0x7c, 0x45, 0x08, 0x9b, 0x8d, 0x50, 0x98, - 0x97, 0x70, 0x93, 0xee, 0x2c, 0x3e, 0x2b, 0x8c, 0x2d, 0x67, 0xc2, 0x75, 0x15, 0xcb, 0x06, 0xc7, - 0x81, 0xe4, 0x3d, 0xc8, 0xe3, 0xd0, 0x65, 0x8f, 0xed, 0x9a, 0x3c, 0x4f, 0xf3, 0x6c, 0xcc, 0xb0, - 0x23, 0x48, 0x49, 0x3e, 0x27, 0x3c, 0xbb, 0xf8, 0xe0, 0x4f, 0x2a, 0x87, 0x22, 0x6b, 0x47, 0x78, - 0x90, 0x46, 0x21, 0x0a, 0x94, 0xd5, 0xf3, 0xaf, 0x64, 0xa1, 0x18, 0xff, 0x56, 0xc9, 0xbb, 0x30, - 0x2e, 0x4f, 0x3a, 0x4c, 0x0b, 0xcc, 0x7a, 0x39, 0x2e, 0x42, 0x40, 0xcb, 0xe3, 0x2e, 0x9e, 0x15, - 0x58, 0x25, 0x60, 0x52, 0xc7, 0x86, 0x08, 0x19, 0xa4, 0x7c, 0x25, 0x81, 0x1b, 0x74, 0x62, 0x01, - 0x0a, 0x25, 0x1a, 0x79, 0x1d, 0x72, 0xf7, 0x6f, 0x97, 0x84, 0x1b, 0x81, 0xdc, 0x92, 0xee, 0xdf, - 0x2e, 0xf1, 0xaf, 0x99, 0x9b, 0x49, 0xe9, 0x46, 0x5b, 0x0c, 0x9f, 0xac, 0x28, 0xf1, 0x3f, 0x87, - 0xb5, 0x1c, 0x3d, 0x12, 0x1c, 0x76, 0xee, 0xf8, 0x40, 0xa0, 0x3c, 0xdf, 0xb0, 0x88, 0xb2, 0xf7, - 0x6f, 0xe4, 0x60, 0x34, 0xac, 0x9f, 0x10, 0x40, 0xa1, 0x4a, 0xdc, 0x64, 0xf0, 0x6f, 0x72, 0x16, - 0x0a, 0x52, 0x8e, 0x12, 0xde, 0x04, 0x23, 0xbe, 0x90, 0xa1, 0xe6, 0x40, 0x0a, 0x4c, 0xfc, 0x33, - 0x37, 0xe5, 0x4f, 0x72, 0x03, 0x42, 0x69, 0xa8, 0x97, 0xd8, 0x94, 0x67, 0x13, 0x66, 0x86, 0x68, - 0x64, 0x12, 0xb2, 0x0e, 0x8f, 0xdc, 0x32, 0x6a, 0x66, 0x9d, 0x06, 0x79, 0x17, 0x0a, 0x76, 0xa3, - 0x41, 0x1b, 0x96, 0x2d, 0x8d, 0x1f, 0xfa, 0x2d, 0x9a, 0x02, 0xe3, 0xc6, 0x0f, 0x01, 0xa4, 0x2a, - 0x05, 0xa4, 0x04, 0xa3, 0x4d, 0x9b, 0x1b, 0x52, 0x35, 0x06, 0x38, 0x51, 0x22, 0x0e, 0x05, 0x46, - 0xf6, 0xc0, 0xa7, 0x0d, 0xf2, 0x12, 0xe4, 0xd9, 0x6c, 0x8a, 0x23, 0x44, 0x8a, 0x6f, 0x6c, 0x32, - 0xf9, 0x80, 0x2d, 0x3f, 0x63, 0x22, 0x02, 0x79, 0x01, 0x72, 0xdd, 0x85, 0x1d, 0x71, 0x38, 0x14, - 0xa3, 0x58, 0xbc, 0x21, 0x1a, 0x2b, 0x26, 0x37, 0xa1, 0x70, 0xa0, 0x87, 0x71, 0x3d, 0x15, 0x9b, - 0xc6, 0x10, 0x3f, 0x44, 0x5c, 0x2c, 0xc0, 0x30, 0x3f, 0x08, 0x8c, 0xe7, 0x00, 0xa2, 0xaa, 0x93, - 0x4e, 0x1f, 0xc6, 0xd7, 0x60, 0x34, 0xac, 0x92, 0x5c, 0x00, 0xd8, 0xa7, 0x87, 0xd6, 0x9e, 0xdd, - 0x6e, 0x34, 0xb9, 0x7c, 0x37, 0x6e, 0x8e, 0xee, 0xd3, 0xc3, 0x65, 0x04, 0x90, 0x33, 0x30, 0xd2, - 0x61, 0xb3, 0x2a, 0x96, 0xee, 0xb8, 0x39, 0xdc, 0xe9, 0x6e, 0xb3, 0x15, 0x3a, 0x07, 0x23, 0xa8, - 0x79, 0x13, 0x1f, 0xda, 0x84, 0x29, 0x7f, 0x1a, 0xff, 0x71, 0x16, 0xd3, 0x0d, 0x28, 0xed, 0x24, - 0x97, 0x60, 0xa2, 0xee, 0x51, 0x3c, 0x73, 0x6c, 0x26, 0x49, 0x89, 0x7a, 0xc6, 0x23, 0x60, 0xb5, - 0x41, 0x2e, 0xc3, 0x94, 0x48, 0xb1, 0xcd, 0x1a, 0x54, 0xdf, 0x16, 0x31, 0x97, 0xc7, 0xcd, 0x09, - 0x0e, 0xbe, 0x47, 0x0f, 0xcb, 0xdb, 0x18, 0x71, 0xa8, 0xa8, 0x06, 0x8c, 0x0c, 0xc2, 0xcc, 0x88, - 0xe6, 0x94, 0x02, 0x47, 0x9b, 0xa6, 0xd3, 0x30, 0x6c, 0xdb, 0xbb, 0x5d, 0x87, 0x47, 0x06, 0x19, - 0x37, 0xc5, 0x2f, 0xf2, 0x0a, 0x4c, 0xfb, 0xce, 0x6e, 0xdb, 0x0e, 0xba, 0x9e, 0xc8, 0xf7, 0x40, - 0x3d, 0x5c, 0x52, 0x13, 0x66, 0x31, 0x2c, 0x28, 0x73, 0x38, 0x79, 0x0d, 0x88, 0x5a, 0x9f, 0xbb, - 0xfd, 0x21, 0xad, 0xf3, 0xa5, 0x36, 0x6e, 0x4e, 0x2b, 0x25, 0x6b, 0x58, 0x40, 0x9e, 0x87, 0x71, - 0x8f, 0xfa, 0x28, 0xc5, 0xe1, 0xb0, 0x61, 0x36, 0x1e, 0x73, 0x4c, 0xc2, 0xd8, 0xd8, 0x5d, 0x81, - 0xa2, 0x32, 0x1c, 0x18, 0x93, 0x93, 0x07, 0x1c, 0x36, 0x27, 0x23, 0xb8, 0xd9, 0xa9, 0x36, 0x8c, - 0x45, 0x98, 0x4e, 0x7c, 0xb9, 0x4a, 0x36, 0x5b, 0xbe, 0x13, 0xf5, 0xcf, 0x66, 0x6b, 0xb4, 0x61, - 0x5c, 0xdd, 0x89, 0x8f, 0x89, 0x7b, 0x7d, 0x1a, 0x3d, 0xcb, 0xf9, 0x36, 0x35, 0xfc, 0xf8, 0x68, - 0x3e, 0xeb, 0x34, 0xd0, 0x9f, 0xfc, 0x0a, 0x14, 0xa4, 0xd0, 0x20, 0xce, 0x6a, 0xd4, 0x9c, 0x0a, - 0x69, 0xf5, 0xd0, 0x0c, 0x4b, 0x8d, 0x97, 0x60, 0x44, 0x6c, 0xb6, 0xfd, 0xf5, 0xa5, 0xc6, 0x8f, - 0x65, 0x61, 0xca, 0xa4, 0x6c, 0x2b, 0xa0, 0x3c, 0xd8, 0xfd, 0x53, 0x7b, 0x7d, 0x4b, 0x8f, 0x4f, - 0xa6, 0xf5, 0xad, 0x4f, 0x98, 0xf9, 0xbf, 0x97, 0x81, 0x99, 0x14, 0xdc, 0x8f, 0x95, 0x12, 0xed, - 0x16, 0x8c, 0x56, 0x1c, 0xbb, 0x59, 0x6a, 0x34, 0x42, 0x37, 0x73, 0x14, 0x35, 0x1b, 0x6c, 0xa5, - 0xd9, 0x0c, 0xaa, 0x1e, 0xbb, 0x21, 0x2a, 0x79, 0x59, 0x2c, 0x8a, 0x28, 0x1d, 0x35, 0x2e, 0x8a, - 0x8f, 0x8e, 0xe6, 0x81, 0xb7, 0x29, 0x4a, 0xbb, 0x89, 0x31, 0x03, 0x39, 0x30, 0x32, 0x03, 0x7f, - 0x6a, 0xa7, 0x2e, 0x3d, 0x66, 0x60, 0xbc, 0x7b, 0x03, 0x45, 0x9a, 0xff, 0xc9, 0x2c, 0x9c, 0x4e, - 0x27, 0xfc, 0xb8, 0xd9, 0xed, 0x30, 0xc6, 0xbf, 0x12, 0xe7, 0x14, 0xb3, 0xdb, 0xf1, 0x84, 0x00, - 0x88, 0x1f, 0x21, 0x90, 0x1d, 0x98, 0x58, 0xb1, 0xfd, 0x60, 0x99, 0xda, 0x5e, 0xb0, 0x4d, 0xed, - 0x60, 0x00, 0xd9, 0xf3, 0x05, 0xf9, 0x2c, 0x89, 0xc7, 0xdf, 0x9e, 0xa4, 0x8c, 0x49, 0x87, 0x3a, - 0xdb, 0x70, 0xa1, 0xe4, 0x07, 0x58, 0x28, 0xdf, 0x84, 0xa9, 0x1a, 0x6d, 0xd9, 0x9d, 0x3d, 0xd7, - 0x93, 0x7e, 0x84, 0xd7, 0x60, 0x22, 0x04, 0xa5, 0xae, 0x16, 0xbd, 0x58, 0xc3, 0x57, 0x06, 0x22, - 0xda, 0x4a, 0xf4, 0x62, 0xe3, 0x6f, 0x66, 0xe1, 0x4c, 0xa9, 0x2e, 0xac, 0x85, 0x44, 0x81, 0x34, - 0x6a, 0xfc, 0x94, 0xeb, 0x26, 0xd7, 0x61, 0xf4, 0xbe, 0xfd, 0x68, 0x85, 0xda, 0x3e, 0xf5, 0x45, - 0x6e, 0x21, 0x2e, 0xa8, 0xd9, 0x8f, 0x22, 0x23, 0x1a, 0x33, 0xc2, 0x51, 0x6f, 0xb2, 0xf9, 0x4f, - 0x78, 0x93, 0x35, 0x60, 0x78, 0xd9, 0x6d, 0x36, 0xc4, 0x31, 0x26, 0x9e, 0xd7, 0xf6, 0x10, 0x62, - 0x8a, 0x12, 0x76, 0x01, 0x9c, 0x0c, 0x5b, 0x8c, 0x4d, 0xf8, 0xd4, 0x87, 0xe4, 0x32, 0x8c, 0x60, - 0x45, 0xd5, 0x8a, 0x7a, 0x68, 0x34, 0x29, 0x66, 0x88, 0x69, 0x98, 0xb2, 0x50, 0x1d, 0x89, 0xa1, - 0x4f, 0x36, 0x12, 0xc6, 0xbf, 0x89, 0x2f, 0x77, 0x6a, 0x2f, 0xd9, 0x49, 0xa4, 0x34, 0x24, 0x33, - 0x60, 0x43, 0xb2, 0x4f, 0x6c, 0x4a, 0x72, 0x3d, 0xa7, 0xe4, 0x3b, 0x59, 0x18, 0x0b, 0x1b, 0xfb, - 0x19, 0x0b, 0xb6, 0x1b, 0xf6, 0x6b, 0x20, 0xdf, 0xff, 0x9a, 0xb2, 0x57, 0x08, 0x17, 0xfb, 0xf7, - 0x60, 0x58, 0x7c, 0x4c, 0x99, 0x98, 0x71, 0x5f, 0x6c, 0x76, 0x17, 0x27, 0x05, 0xeb, 0x61, 0x9c, - 0x50, 0xdf, 0x14, 0x74, 0x18, 0x5c, 0x61, 0x8b, 0x6e, 0x8b, 0x87, 0xdc, 0xa7, 0xf6, 0x8c, 0x4a, - 0x0f, 0xae, 0x10, 0x75, 0x6c, 0xa0, 0xd3, 0xe9, 0xe7, 0x0b, 0x50, 0x8c, 0x93, 0x1c, 0x1f, 0xce, - 0x78, 0xbd, 0xbb, 0xcd, 0xa5, 0x70, 0x1e, 0xce, 0xb8, 0xd3, 0xdd, 0x36, 0x19, 0x0c, 0xed, 0x3c, - 0x3c, 0xe7, 0x21, 0xf6, 0x7a, 0x5c, 0xd8, 0x79, 0x78, 0xce, 0x43, 0xcd, 0xce, 0xc3, 0x73, 0x1e, - 0xe2, 0xd5, 0x77, 0xa5, 0x86, 0xfe, 0xa0, 0x28, 0x82, 0x8b, 0xab, 0x6f, 0xd3, 0x8f, 0xa7, 0x01, - 0x91, 0x68, 0xec, 0xa8, 0x5c, 0xa4, 0xb6, 0x27, 0x42, 0xef, 0x8a, 0xed, 0x0c, 0x8f, 0xca, 0x6d, - 0x04, 0xf3, 0x0c, 0xbb, 0xa6, 0x8a, 0x44, 0x9a, 0x40, 0x94, 0x9f, 0xf2, 0x03, 0x3e, 0xfe, 0x36, - 0x28, 0x0d, 0x73, 0x66, 0x55, 0xd6, 0x96, 0xfa, 0x35, 0xa7, 0xf0, 0x7d, 0x92, 0x0a, 0xc8, 0x75, - 0x11, 0x4f, 0x0c, 0x55, 0x1e, 0x85, 0x63, 0x99, 0x49, 0x87, 0x69, 0xe0, 0xf1, 0xc6, 0x42, 0xc5, - 0x47, 0xc4, 0x84, 0xbc, 0x03, 0x63, 0xaa, 0x97, 0x2f, 0xf7, 0x45, 0x3d, 0xcf, 0x43, 0x44, 0xf5, - 0x48, 0xf2, 0xa6, 0x12, 0x90, 0x6d, 0x38, 0x53, 0x76, 0xdb, 0x7e, 0xb7, 0x25, 0x83, 0x51, 0x45, - 0x21, 0x30, 0x21, 0x4c, 0xd2, 0xfe, 0x42, 0x5d, 0xa0, 0x08, 0xa7, 0x52, 0x69, 0x39, 0xad, 0x5f, - 0x40, 0x7a, 0x31, 0x22, 0x1b, 0x30, 0x86, 0x4a, 0x3c, 0x61, 0x9a, 0x35, 0xa6, 0x6f, 0x1b, 0x51, - 0x49, 0x85, 0x7d, 0x18, 0x3c, 0x9a, 0x8a, 0xdd, 0x6a, 0x4a, 0xc3, 0x5d, 0x55, 0x19, 0xa9, 0x20, - 0x93, 0xaf, 0xc1, 0x24, 0xbf, 0x6e, 0x6e, 0xd1, 0x6d, 0xbe, 0x76, 0xc6, 0xb5, 0xbb, 0xb3, 0x5e, - 0xc8, 0x1f, 0x7a, 0x85, 0xea, 0xf4, 0x80, 0x6e, 0xf3, 0xb9, 0xd7, 0xcc, 0xe6, 0x35, 0x7c, 0xf2, - 0x00, 0x66, 0x96, 0x6d, 0x9f, 0x03, 0x15, 0x77, 0xcd, 0x09, 0xd4, 0x29, 0xa2, 0x39, 0xe3, 0x9e, - 0xed, 0x4b, 0x5d, 0x6c, 0xaa, 0x7b, 0x66, 0x1a, 0x3d, 0xf9, 0xb1, 0x0c, 0xcc, 0x69, 0xaa, 0x5a, - 0x61, 0x54, 0xd3, 0xa2, 0xed, 0x00, 0xed, 0xe3, 0x27, 0xc3, 0xdc, 0xbe, 0xbd, 0xd0, 0xf8, 0x94, - 0xc4, 0xb4, 0xc1, 0x5e, 0x54, 0xae, 0xda, 0x09, 0xf6, 0xe2, 0x61, 0xdc, 0x8a, 0x8f, 0x9e, 0x50, - 0xb4, 0x64, 0x42, 0x45, 0xcb, 0x2c, 0x0c, 0xe1, 0x18, 0xc9, 0x58, 0x11, 0xf8, 0xc3, 0xf8, 0x9c, - 0xba, 0xab, 0x08, 0x21, 0xaf, 0xef, 0xae, 0x62, 0xfc, 0x57, 0xc3, 0x30, 0x15, 0x9b, 0x64, 0x71, - 0xeb, 0xcc, 0x24, 0x6e, 0x9d, 0x35, 0x00, 0xae, 0x6a, 0x1c, 0x50, 0x27, 0x28, 0x3d, 0x6d, 0xc6, - 0x84, 0xa7, 0x5a, 0xf8, 0x85, 0x28, 0x6c, 0x18, 0x53, 0xfe, 0xfd, 0x0d, 0xa8, 0xa3, 0x0d, 0x99, - 0xf2, 0x4f, 0x58, 0x61, 0x1a, 0xb1, 0x21, 0xf3, 0x30, 0x84, 0x01, 0xde, 0x54, 0x47, 0x27, 0x87, - 0x01, 0x4c, 0x0e, 0x27, 0x97, 0x60, 0x98, 0x89, 0x44, 0xd5, 0x8a, 0xd8, 0xd2, 0xf0, 0xa4, 0x60, - 0x32, 0x13, 0x93, 0x3f, 0x44, 0x11, 0xb9, 0x05, 0xe3, 0xfc, 0x2f, 0xe1, 0xe3, 0x3f, 0xac, 0xdb, - 0x6d, 0x59, 0x4e, 0x43, 0xba, 0xf9, 0x6b, 0x78, 0xec, 0xae, 0x50, 0xeb, 0x6e, 0xf3, 0x4c, 0xf3, - 0x22, 0x22, 0x28, 0xde, 0x15, 0x7c, 0x0e, 0xc4, 0x4c, 0xd8, 0x21, 0x02, 0x93, 0x4c, 0x84, 0xb9, - 0x71, 0x01, 0x6f, 0x88, 0x28, 0x99, 0x70, 0x33, 0x63, 0x53, 0x94, 0x90, 0xab, 0x5c, 0xb5, 0x8f, - 0x42, 0x1e, 0x4f, 0x62, 0x84, 0x7a, 0x73, 0x54, 0x33, 0xa0, 0xa4, 0x17, 0x16, 0xb3, 0xca, 0xd9, - 0xdf, 0x4b, 0x2d, 0xdb, 0x69, 0x8a, 0x4d, 0x02, 0x2b, 0x47, 0x5c, 0xca, 0xa0, 0x66, 0x84, 0x40, - 0xde, 0x82, 0x49, 0xf6, 0xa3, 0xec, 0xb6, 0x5a, 0x6e, 0x1b, 0xd9, 0x8f, 0x45, 0xe1, 0x62, 0x90, - 0xa4, 0x8e, 0x45, 0xbc, 0x96, 0x18, 0x2e, 0x3b, 0x1d, 0xf0, 0xd9, 0xb0, 0xcb, 0x1f, 0x1d, 0xc6, - 0xa3, 0xd3, 0x01, 0x49, 0x7d, 0x0e, 0x37, 0x55, 0x24, 0xf2, 0x06, 0x4c, 0xb0, 0x9f, 0x77, 0x9c, - 0x87, 0x94, 0x57, 0x38, 0x11, 0x3d, 0x64, 0x23, 0xd5, 0x2e, 0x2b, 0xe1, 0xf5, 0xe9, 0x98, 0xe4, - 0xcb, 0x70, 0x0a, 0x39, 0xd5, 0xdd, 0x0e, 0x6d, 0x94, 0x76, 0x76, 0x9c, 0xa6, 0xc3, 0x0d, 0x69, - 0xb8, 0x37, 0x3b, 0xea, 0x80, 0x79, 0xc5, 0x88, 0x61, 0xd9, 0x11, 0x8a, 0x99, 0x4e, 0x49, 0xb6, - 0xa0, 0x58, 0xee, 0xfa, 0x81, 0xdb, 0x2a, 0x05, 0x81, 0xe7, 0x6c, 0x77, 0x03, 0xea, 0xcf, 0x4d, - 0x69, 0x3e, 0xdf, 0xec, 0xe3, 0x08, 0x0b, 0xb9, 0x76, 0xa7, 0x8e, 0x14, 0x96, 0x1d, 0x92, 0x98, - 0x09, 0x26, 0xc6, 0x7f, 0x99, 0x81, 0x09, 0x8d, 0x94, 0xbc, 0x0e, 0xe3, 0xb7, 0x3d, 0x87, 0xb6, - 0x1b, 0xcd, 0x43, 0xe5, 0xda, 0x89, 0x77, 0x92, 0x1d, 0x01, 0xe7, 0xbd, 0xd6, 0xd0, 0x42, 0xad, - 0x4d, 0x36, 0xd5, 0xca, 0xed, 0x3a, 0xf7, 0xb7, 0x13, 0x0b, 0x34, 0x17, 0x05, 0xa1, 0xc0, 0x05, - 0x2a, 0x56, 0xa7, 0x82, 0x42, 0xde, 0x86, 0x61, 0xfe, 0xc0, 0x28, 0x4c, 0xae, 0xce, 0xa6, 0x75, - 0x93, 0xfb, 0x76, 0xe2, 0x42, 0x44, 0xf3, 0x0e, 0xdf, 0x14, 0x44, 0xc6, 0xcf, 0x66, 0x80, 0x24, - 0x51, 0x8f, 0xd1, 0x62, 0x1d, 0x6b, 0x36, 0xf2, 0x5e, 0xf8, 0x35, 0xe6, 0x34, 0x9d, 0x2d, 0xab, - 0x89, 0x17, 0xf0, 0x81, 0x17, 0x5f, 0x9d, 0xaa, 0x56, 0xe3, 0xc5, 0xc6, 0x5f, 0xc9, 0x02, 0x44, - 0xd8, 0xe4, 0x8b, 0x3c, 0x8f, 0xc6, 0x97, 0xbb, 0x76, 0xd3, 0xd9, 0x71, 0xf4, 0xc0, 0x72, 0xc8, - 0xe4, 0x9b, 0xb2, 0xc4, 0xd4, 0x11, 0xc9, 0xbb, 0x30, 0x55, 0x5b, 0xd7, 0x69, 0x95, 0x9c, 0x01, - 0x7e, 0xc7, 0x8a, 0x91, 0xc7, 0xb1, 0xd1, 0xb4, 0x52, 0x9d, 0x0d, 0x6e, 0x5a, 0xc9, 0x27, 0x42, - 0x94, 0xb0, 0x8d, 0xa5, 0xb6, 0x2e, 0xac, 0x79, 0x1b, 0xd5, 0x8a, 0xd8, 0xa5, 0xb0, 0x75, 0x7e, - 0xc7, 0xea, 0x08, 0x33, 0x5f, 0xb6, 0x4f, 0x68, 0x78, 0xd1, 0x40, 0x0e, 0xf5, 0xf0, 0xdf, 0xfc, - 0x39, 0x54, 0xe2, 0xb5, 0xdc, 0x80, 0x0a, 0xdd, 0xc5, 0x53, 0x7b, 0x8b, 0x89, 0x5e, 0xa7, 0x87, - 0x34, 0xb7, 0x34, 0xad, 0x77, 0xc2, 0x36, 0xe2, 0x66, 0x74, 0xe5, 0xe0, 0xef, 0xd4, 0x29, 0xd6, - 0x14, 0x7f, 0x27, 0x03, 0xa7, 0x52, 0x69, 0xc9, 0x35, 0x80, 0x48, 0x43, 0x24, 0x46, 0x09, 0x77, - 0xcc, 0x28, 0xf4, 0x82, 0xa9, 0x60, 0x90, 0xaf, 0xc6, 0x75, 0x3b, 0xc7, 0x1f, 0x84, 0xe7, 0x64, - 0x68, 0x1d, 0x5d, 0xb7, 0x93, 0xa2, 0xd1, 0x31, 0xfe, 0x5e, 0x0e, 0xa6, 0x95, 0xc8, 0x0e, 0xbc, - 0xad, 0xc7, 0x98, 0xba, 0xee, 0xc3, 0x38, 0xeb, 0x8d, 0x53, 0x17, 0xbe, 0x31, 0xdc, 0x92, 0xe2, - 0xe5, 0x84, 0x63, 0x91, 0xe0, 0x76, 0x4d, 0x45, 0xe6, 0x01, 0xaf, 0x70, 0xeb, 0x44, 0xcd, 0x79, - 0x3d, 0xe9, 0x23, 0xa3, 0x31, 0x27, 0x3e, 0x4c, 0x54, 0x0e, 0xdb, 0x76, 0x2b, 0xac, 0x8d, 0x5b, - 0x54, 0xbc, 0xd2, 0xb3, 0x36, 0x0d, 0x9b, 0x57, 0x17, 0x99, 0xe0, 0xf3, 0xb2, 0x14, 0xef, 0x4f, - 0x8d, 0xea, 0xdc, 0xbb, 0x30, 0x9d, 0x68, 0xf4, 0x89, 0x62, 0x6f, 0x6d, 0x01, 0x49, 0xb6, 0x23, - 0x85, 0xc3, 0x2b, 0x7a, 0x64, 0xb7, 0x53, 0xe1, 0xe3, 0x29, 0x66, 0xe0, 0xe5, 0xf6, 0x19, 0x0b, - 0x6a, 0x64, 0xae, 0x9f, 0xcb, 0xaa, 0xce, 0x5d, 0x4f, 0xfb, 0x57, 0xf7, 0x9e, 0x76, 0xb7, 0x7d, - 0xae, 0xd7, 0x9c, 0x0e, 0xa4, 0x43, 0xf8, 0x7e, 0x0e, 0xce, 0xf4, 0xa0, 0x24, 0x87, 0xf1, 0x45, - 0xc4, 0x75, 0x0a, 0x37, 0xfa, 0x57, 0xf8, 0x24, 0x96, 0x12, 0xf9, 0x22, 0x77, 0xef, 0xae, 0x63, - 0xe6, 0x58, 0x71, 0x9b, 0xe6, 0x49, 0xc7, 0x43, 0x68, 0xdc, 0xaf, 0x9b, 0x43, 0xc9, 0xbb, 0x30, - 0x84, 0x9e, 0x7d, 0xb1, 0xc8, 0x52, 0x0c, 0x03, 0xe1, 0x4a, 0x18, 0x2e, 0xf6, 0x53, 0x0b, 0xc3, - 0xc5, 0x00, 0xe4, 0x0b, 0x90, 0x2b, 0x6d, 0xd5, 0xc4, 0xbc, 0x4c, 0xaa, 0xe4, 0x5b, 0xb5, 0x28, - 0xfa, 0xb7, 0xad, 0x85, 0xe9, 0x66, 0x14, 0x8c, 0xf0, 0x4e, 0x79, 0x5d, 0xcc, 0x8a, 0x4a, 0x78, - 0xa7, 0xbc, 0x1e, 0x11, 0xee, 0xd6, 0xb5, 0x48, 0x1d, 0x77, 0xca, 0xeb, 0x9f, 0xde, 0xb2, 0xff, - 0xeb, 0x59, 0xee, 0x93, 0xce, 0x3b, 0xf6, 0x2e, 0x8c, 0x6b, 0x91, 0x37, 0x33, 0x91, 0x3c, 0x16, - 0x06, 0x38, 0x8d, 0x99, 0xa0, 0x68, 0x04, 0x32, 0x8e, 0x3e, 0xfb, 0x8d, 0x12, 0xaf, 0x6a, 0xec, - 0x11, 0x72, 0x40, 0x99, 0x38, 0x1e, 0x47, 0x3f, 0x24, 0x21, 0x37, 0xa1, 0xb0, 0x41, 0xdb, 0x76, - 0x3b, 0x08, 0xd5, 0x9b, 0x68, 0x46, 0x1a, 0x20, 0x4c, 0x97, 0x1a, 0x42, 0x44, 0x34, 0x79, 0xec, - 0x6e, 0xfb, 0x75, 0xcf, 0xc1, 0xd8, 0x15, 0xe1, 0x59, 0xcc, 0x4d, 0x1e, 0x95, 0x12, 0x9d, 0x41, - 0x8c, 0xc8, 0xf8, 0xb9, 0x0c, 0x8c, 0x88, 0x89, 0xe4, 0xf9, 0x4f, 0x76, 0xa3, 0xb3, 0x44, 0xe4, - 0x3f, 0xd9, 0x75, 0xe2, 0xf9, 0x4f, 0x76, 0x79, 0x80, 0x88, 0x51, 0xe1, 0x5e, 0x19, 0x3e, 0xf4, - 0xf1, 0x74, 0xd9, 0x1c, 0xa8, 0x57, 0x1b, 0xa1, 0x0e, 0xea, 0x4b, 0x62, 0xfc, 0x2d, 0xd1, 0xb2, - 0x3b, 0xe5, 0x75, 0xb2, 0x00, 0x85, 0x15, 0xb7, 0x6e, 0x2b, 0xe7, 0x1c, 0x6e, 0x3b, 0x4d, 0x01, - 0x53, 0x07, 0x48, 0xe2, 0xb1, 0xf6, 0xad, 0x7b, 0xae, 0xb8, 0xcb, 0x28, 0xed, 0xeb, 0x70, 0x60, - 0xac, 0x7d, 0x21, 0xea, 0xc0, 0xed, 0xa3, 0x29, 0x9b, 0xc4, 0xe6, 0x4d, 0x0c, 0x30, 0x7e, 0x57, - 0xf5, 0xd1, 0x11, 0x45, 0x72, 0xa7, 0x38, 0xd7, 0x6b, 0xa7, 0xd8, 0xbc, 0x69, 0xa6, 0x50, 0xe1, - 0x2b, 0x59, 0x04, 0xae, 0x51, 0xef, 0xe1, 0x53, 0xbc, 0x4b, 0xa7, 0xbf, 0x92, 0xc5, 0xbb, 0x37, - 0xd0, 0x26, 0xfd, 0x9f, 0x65, 0xe1, 0x74, 0x3a, 0xa1, 0xda, 0x97, 0x4c, 0x9f, 0xbe, 0x5c, 0x81, - 0xc2, 0xb2, 0xeb, 0x07, 0x8a, 0xd5, 0x19, 0x2a, 0xf3, 0xf7, 0x04, 0xcc, 0x0c, 0x4b, 0xd9, 0x9d, - 0x9b, 0xfd, 0x1d, 0x7e, 0x9e, 0xc8, 0x0f, 0x3d, 0xb1, 0xd9, 0x9d, 0x9b, 0x17, 0x91, 0x3b, 0x50, - 0x30, 0x85, 0x8f, 0x48, 0x6c, 0x68, 0x24, 0x38, 0x94, 0xa6, 0x88, 0x27, 0x20, 0x5a, 0x00, 0x54, - 0x01, 0x23, 0x25, 0x18, 0x11, 0xb3, 0x1f, 0x7b, 0x08, 0x4e, 0x59, 0x32, 0x7a, 0x4c, 0x62, 0x49, - 0xc7, 0x76, 0x14, 0x7c, 0xd2, 0xab, 0x56, 0xa4, 0xbb, 0x07, 0xee, 0x28, 0xfc, 0xc9, 0x4f, 0x37, - 0xf0, 0x0b, 0x11, 0x8d, 0x1f, 0xcb, 0x02, 0x48, 0xad, 0xcd, 0x53, 0xbb, 0xc2, 0xbe, 0xa0, 0xad, - 0x30, 0xc5, 0xde, 0x65, 0xf0, 0x7c, 0x7d, 0x6b, 0x68, 0x77, 0x32, 0x78, 0xb6, 0xbe, 0x79, 0x18, - 0xda, 0x88, 0x14, 0x5a, 0xc2, 0xf9, 0x00, 0x95, 0xcb, 0x1c, 0x6e, 0x6c, 0xc3, 0xec, 0x1d, 0x1a, - 0x44, 0xea, 0x2d, 0xf9, 0x90, 0xd8, 0x9f, 0xed, 0xab, 0x30, 0x2a, 0xf0, 0xc3, 0xfd, 0x8b, 0xeb, - 0x62, 0x44, 0x70, 0x03, 0xd4, 0xc5, 0x48, 0x04, 0xb6, 0x1b, 0x55, 0x68, 0x93, 0x06, 0xf4, 0xd3, - 0xad, 0xa6, 0x06, 0x84, 0x77, 0x05, 0x7b, 0x36, 0x58, 0x0d, 0xc7, 0x8e, 0xcf, 0x26, 0x9c, 0x0a, - 0xdb, 0xfe, 0x24, 0xf9, 0x5e, 0x67, 0x57, 0x4a, 0x11, 0xce, 0x37, 0xe2, 0xd8, 0xc7, 0x92, 0xe4, - 0x11, 0x9c, 0x93, 0x04, 0x5b, 0x4e, 0x68, 0xb8, 0x37, 0x10, 0x2d, 0x79, 0x0b, 0xc6, 0x14, 0x1a, - 0x11, 0x8e, 0x16, 0x95, 0xce, 0x07, 0x4e, 0xb0, 0x67, 0xf9, 0x1c, 0xae, 0x2a, 0x9d, 0x15, 0x74, - 0xe3, 0x03, 0x78, 0x36, 0x74, 0x10, 0x49, 0xa9, 0x3a, 0xc6, 0x3c, 0x73, 0x32, 0xe6, 0xab, 0x51, - 0xb7, 0xaa, 0xed, 0xd0, 0xa9, 0x53, 0xf2, 0x26, 0x6a, 0xb7, 0x44, 0x67, 0xce, 0x27, 0xdc, 0x44, - 0x15, 0x6f, 0x50, 0xe3, 0x4d, 0xa5, 0xb1, 0x29, 0x0c, 0x35, 0xe2, 0x4c, 0x9c, 0xf8, 0xc7, 0xb2, - 0x30, 0xb5, 0x56, 0xad, 0x94, 0x43, 0x5b, 0xa2, 0xcf, 0x58, 0x36, 0x41, 0xad, 0x6f, 0xbd, 0xf7, - 0x1b, 0xe3, 0x01, 0xcc, 0xc4, 0x86, 0x01, 0x45, 0x87, 0x77, 0xb8, 0x07, 0x43, 0x08, 0x96, 0x62, - 0xc3, 0xe9, 0x34, 0xf6, 0x9b, 0x37, 0xcd, 0x18, 0xb6, 0xf1, 0x8f, 0x47, 0x63, 0x7c, 0xc5, 0x16, - 0xf6, 0x2a, 0x8c, 0x56, 0x7d, 0xbf, 0x4b, 0xbd, 0x07, 0xe6, 0x8a, 0xaa, 0x2a, 0x70, 0x10, 0x68, - 0x75, 0xbd, 0xa6, 0x19, 0x21, 0x90, 0xab, 0x50, 0x10, 0x11, 0x5a, 0xe5, 0x9e, 0x80, 0x5a, 0xdb, - 0x30, 0xc0, 0xab, 0x19, 0x16, 0x93, 0xd7, 0x61, 0x9c, 0xff, 0xcd, 0x57, 0x9b, 0x18, 0x70, 0x54, - 0x0e, 0x0a, 0x74, 0xbe, 0x3a, 0x4d, 0x0d, 0x8d, 0xbc, 0x0c, 0xb9, 0x52, 0xd9, 0x14, 0xea, 0x20, - 0x21, 0x37, 0x62, 0x8e, 0xe0, 0x2e, 0xd5, 0x2f, 0x11, 0x65, 0x93, 0x49, 0x7f, 0xd2, 0x81, 0x5c, - 0x68, 0xb2, 0x79, 0x2a, 0x63, 0x01, 0x8b, 0x1d, 0x66, 0x08, 0x23, 0xd7, 0x61, 0xa4, 0xe2, 0xf8, - 0x9d, 0xa6, 0x7d, 0x28, 0xf4, 0xd8, 0x3c, 0x55, 0x0e, 0x07, 0x69, 0x7e, 0xe1, 0x1c, 0x44, 0xae, - 0xca, 0x14, 0x22, 0x85, 0xc8, 0x11, 0xa2, 0x47, 0x9e, 0x90, 0x57, 0x61, 0x58, 0xc4, 0x31, 0x1d, - 0x55, 0x22, 0x94, 0xc7, 0xe3, 0x97, 0x0a, 0x9c, 0xa4, 0xab, 0x22, 0x3c, 0x49, 0x57, 0xc5, 0x6d, - 0x38, 0x73, 0x07, 0xb5, 0x37, 0x7a, 0xc4, 0x93, 0x07, 0x66, 0x55, 0xe8, 0xc3, 0xf1, 0x51, 0x87, - 0x2b, 0x78, 0xe2, 0x41, 0x53, 0xac, 0xae, 0xa7, 0x66, 0x7e, 0xeb, 0xc5, 0x88, 0x7c, 0x05, 0x66, - 0xd3, 0x8a, 0x84, 0xd6, 0x1c, 0x63, 0x7b, 0xa4, 0x57, 0xa0, 0xc6, 0xf6, 0x48, 0xe3, 0x40, 0x56, - 0xa0, 0xc8, 0xe1, 0xa5, 0x46, 0xcb, 0x69, 0x73, 0xcd, 0x3f, 0xd7, 0xaa, 0xa3, 0x67, 0x82, 0xe0, - 0x6a, 0xb3, 0x42, 0xfe, 0x02, 0xa0, 0xf9, 0xb2, 0xc4, 0x28, 0xc9, 0x4f, 0x67, 0xd8, 0x6d, 0x8e, - 0x47, 0xfd, 0x7c, 0x60, 0xae, 0xf8, 0x22, 0x2e, 0xd4, 0xe9, 0xc8, 0x4d, 0xa5, 0x16, 0x78, 0x4e, - 0x7b, 0x57, 0xf8, 0xa9, 0x6c, 0x08, 0x3f, 0x95, 0xb7, 0x3e, 0x96, 0x9f, 0x0a, 0x67, 0xe5, 0x3f, - 0x3e, 0x9a, 0x1f, 0xf7, 0x44, 0x9d, 0xf8, 0x15, 0x69, 0x2d, 0xc0, 0xac, 0xe5, 0xcd, 0xa6, 0x7b, - 0xf0, 0xa0, 0xfd, 0x90, 0x7a, 0xce, 0x8e, 0x43, 0x1b, 0xbc, 0x93, 0x53, 0xb8, 0x83, 0xf3, 0xac, - 0xe5, 0x98, 0x87, 0xbf, 0x1b, 0x22, 0x24, 0x3a, 0x9a, 0xca, 0x81, 0x5d, 0x3c, 0xa5, 0x2f, 0x04, - 0xf7, 0xbb, 0x2c, 0x46, 0x17, 0x4f, 0xe9, 0x38, 0x61, 0xe1, 0x32, 0x52, 0x17, 0x8f, 0x46, 0x42, - 0xae, 0xc3, 0xf0, 0x7d, 0xfb, 0x51, 0x69, 0x97, 0x8a, 0xd4, 0x50, 0x13, 0x72, 0xfb, 0x43, 0xe0, - 0x62, 0xe1, 0xf7, 0xb9, 0xad, 0xfd, 0x33, 0xa6, 0x40, 0x23, 0xdf, 0xce, 0xc0, 0x69, 0xfe, 0x19, - 0xcb, 0x5e, 0xd6, 0x68, 0x10, 0xb0, 0x71, 0x10, 0x01, 0xa2, 0x64, 0x62, 0x85, 0x5a, 0x6d, 0x2d, - 0x1d, 0x8f, 0xe7, 0xd8, 0x16, 0x3b, 0x43, 0x38, 0x70, 0xbe, 0x28, 0xd5, 0xa2, 0x40, 0xa6, 0xd2, - 0x0b, 0x3b, 0xf2, 0x2f, 0xc8, 0x96, 0x93, 0xd7, 0x54, 0xf7, 0xc0, 0x1c, 0xca, 0xb9, 0x23, 0x2d, - 0xfb, 0x91, 0x65, 0xef, 0x52, 0xed, 0x75, 0x3a, 0xf4, 0x1b, 0x3c, 0xdb, 0xb3, 0x6d, 0xe4, 0x16, - 0x9c, 0x91, 0xd9, 0xd6, 0xf7, 0x82, 0xa0, 0xe3, 0x5b, 0xf2, 0x2e, 0x20, 0xfc, 0x09, 0xcd, 0x53, - 0xa2, 0x78, 0x99, 0x95, 0xca, 0xeb, 0x81, 0x6f, 0xfc, 0xd1, 0x28, 0x3f, 0xd3, 0x4a, 0xdd, 0x60, - 0x4f, 0x9e, 0x82, 0x0b, 0x69, 0x1e, 0x31, 0xdc, 0x54, 0x4f, 0xf1, 0x88, 0xd1, 0xfd, 0x60, 0xe4, - 0x63, 0x44, 0x36, 0xf5, 0x31, 0xe2, 0x55, 0x18, 0x2d, 0xef, 0xd1, 0xfa, 0x7e, 0xe8, 0x95, 0x50, - 0x10, 0xda, 0x5e, 0x06, 0xe4, 0x01, 0x42, 0x23, 0x04, 0x72, 0x1d, 0x00, 0x5d, 0xe4, 0xb8, 0x88, - 0xa4, 0x04, 0xf9, 0x46, 0x8f, 0x3a, 0x61, 0xfd, 0xa0, 0xa0, 0x20, 0xfb, 0x9a, 0x79, 0x5b, 0x35, - 0x97, 0xe0, 0xec, 0x7d, 0x6f, 0x47, 0xa0, 0x47, 0x08, 0xac, 0x7b, 0xca, 0x42, 0x17, 0xdb, 0x72, - 0x31, 0xf1, 0x35, 0xa8, 0x48, 0x68, 0x89, 0x28, 0x4d, 0xb0, 0x71, 0x57, 0x1e, 0x17, 0x96, 0x88, - 0xa1, 0xb9, 0xb6, 0x19, 0x21, 0x90, 0x2f, 0xc0, 0x48, 0x99, 0x7a, 0xc1, 0xc6, 0xc6, 0x0a, 0x5a, - 0x34, 0xf0, 0x48, 0xd8, 0x05, 0x8c, 0x5a, 0x1c, 0x04, 0xcd, 0x8f, 0x8e, 0xe6, 0x27, 0x02, 0xa7, - 0x45, 0xaf, 0x85, 0x13, 0x2c, 0xb1, 0xc9, 0x22, 0x14, 0xf9, 0x2b, 0x6d, 0x24, 0x0a, 0xe3, 0x46, - 0x5d, 0xe0, 0xc7, 0x86, 0x78, 0xd2, 0x3d, 0xa0, 0xdb, 0x61, 0xcc, 0xe6, 0x04, 0x3e, 0x59, 0x92, - 0xa1, 0xce, 0xd5, 0x4e, 0x42, 0xa4, 0x9b, 0x89, 0x2f, 0x60, 0xd6, 0xd7, 0x24, 0x05, 0x29, 0xc1, - 0x44, 0xd9, 0x6d, 0x75, 0xec, 0xc0, 0xc1, 0xbc, 0x41, 0x87, 0x62, 0x4f, 0x46, 0xfd, 0x52, 0x5d, - 0x2d, 0xd0, 0x36, 0x78, 0xb5, 0x80, 0xdc, 0x86, 0x49, 0xd3, 0xed, 0xb2, 0x49, 0x92, 0x97, 0x42, - 0xbe, 0xed, 0xa2, 0xdd, 0x81, 0xc7, 0x4a, 0xd8, 0x29, 0x21, 0x6e, 0x80, 0x5a, 0xc4, 0x39, 0x8d, - 0x8a, 0xac, 0xa6, 0x68, 0xe7, 0xd5, 0xbd, 0x56, 0x8d, 0xdc, 0x9c, 0x60, 0x96, 0xa2, 0xd8, 0xbf, - 0x09, 0x63, 0xb5, 0xda, 0xda, 0x06, 0xf5, 0x83, 0xdb, 0x4d, 0xf7, 0x00, 0xb7, 0xda, 0x82, 0xc8, - 0x68, 0xe1, 0xbb, 0x56, 0x40, 0xfd, 0xc0, 0xda, 0x69, 0xba, 0x07, 0xa6, 0x8a, 0x45, 0xbe, 0xce, - 0xc6, 0x43, 0x11, 0x4c, 0x44, 0x6c, 0xbd, 0x7e, 0xb2, 0x13, 0x6e, 0x68, 0xd1, 0x27, 0xc3, 0x24, - 0x28, 0x7d, 0xb0, 0x14, 0x74, 0x74, 0xb1, 0x61, 0xd7, 0xd9, 0x52, 0xa3, 0xe1, 0x51, 0xdf, 0x17, - 0x7b, 0x22, 0x77, 0xb1, 0xc1, 0xbb, 0xaf, 0xcd, 0x0b, 0x34, 0x17, 0x1b, 0x85, 0x80, 0x7c, 0x27, - 0x03, 0xa7, 0x54, 0x2b, 0x7d, 0xfc, 0x58, 0xd0, 0x86, 0x82, 0xef, 0x90, 0xaf, 0x5d, 0x93, 0x67, - 0xc2, 0x35, 0x05, 0xed, 0xda, 0xc3, 0x1b, 0xd7, 0x4a, 0xd1, 0xcf, 0x9a, 0x24, 0x12, 0xe1, 0xa9, - 0xd2, 0xf8, 0xa9, 0xfb, 0xbb, 0x9d, 0x42, 0x4a, 0xca, 0x4c, 0x6c, 0x60, 0xeb, 0x09, 0x6d, 0x72, - 0xaa, 0xeb, 0xb8, 0xc1, 0x0a, 0xf5, 0x9e, 0x58, 0x7d, 0xdc, 0x7a, 0xc7, 0xe9, 0xe8, 0xd2, 0x81, - 0x42, 0x43, 0xaa, 0x30, 0xc5, 0x01, 0x6c, 0x4b, 0xe0, 0xe9, 0x0e, 0x66, 0xa2, 0x90, 0xcb, 0x82, - 0x0d, 0x3e, 0x3c, 0x63, 0xca, 0x03, 0x35, 0x14, 0x5c, 0x8c, 0x0e, 0xe5, 0xf6, 0x5a, 0xe9, 0xfe, - 0x4a, 0x24, 0x7c, 0x7e, 0xb6, 0xac, 0xec, 0xb5, 0xbe, 0xf5, 0xb1, 0xb2, 0x7f, 0xc0, 0xfd, 0x0e, - 0x95, 0x61, 0x90, 0x72, 0xbb, 0x06, 0x8e, 0xcb, 0xed, 0x31, 0x1a, 0x33, 0x86, 0x6d, 0x7c, 0x54, - 0x88, 0xf1, 0x15, 0x96, 0x75, 0x06, 0x0c, 0x73, 0xb1, 0x5c, 0xcd, 0x9d, 0xcd, 0x85, 0x76, 0x53, - 0x94, 0x90, 0xb3, 0x90, 0xab, 0xd5, 0xd6, 0xc4, 0x20, 0xa3, 0x7d, 0x9d, 0xef, 0xbb, 0x26, 0x83, - 0xb1, 0x19, 0x42, 0xa3, 0x39, 0x25, 0xaa, 0x2e, 0xdb, 0x41, 0x4d, 0x84, 0xb2, 0xf1, 0x96, 0x42, - 0x72, 0x3e, 0x1a, 0x6f, 0x21, 0x24, 0x47, 0xa2, 0x71, 0x19, 0xe6, 0x4a, 0xbe, 0x4f, 0x3d, 0xb6, - 0x40, 0x85, 0x2d, 0x96, 0x27, 0x04, 0x39, 0x71, 0x50, 0x60, 0xa5, 0x76, 0xdd, 0x37, 0x7b, 0x22, - 0x92, 0x2b, 0x50, 0x28, 0x75, 0x1b, 0x0e, 0x6d, 0xd7, 0xb5, 0x90, 0x39, 0xb6, 0x80, 0x99, 0x61, - 0x29, 0xf9, 0x32, 0x9c, 0x8a, 0x85, 0x8d, 0x12, 0x23, 0x30, 0x12, 0x7d, 0xcd, 0x52, 0xd0, 0x8c, - 0x5e, 0x9c, 0xf9, 0x90, 0xa4, 0x53, 0x92, 0x12, 0x14, 0x97, 0xd0, 0xab, 0xa4, 0x42, 0xb9, 0xf2, - 0xdb, 0xf5, 0xb8, 0xa7, 0x0c, 0xbf, 0x16, 0x70, 0x8f, 0x13, 0xab, 0x11, 0x16, 0x9a, 0x09, 0x74, - 0x72, 0x0f, 0x66, 0xe2, 0x30, 0x76, 0x26, 0xf0, 0x1b, 0x00, 0x86, 0x75, 0x4c, 0x70, 0xc1, 0x53, - 0x21, 0x8d, 0x8a, 0x6c, 0xc3, 0x74, 0x64, 0x71, 0xa1, 0xdf, 0x0b, 0xa4, 0x59, 0x66, 0x58, 0x2e, - 0xef, 0x06, 0xcf, 0x8a, 0xc5, 0x38, 0x13, 0x59, 0x6f, 0x84, 0xf7, 0x03, 0x33, 0xc9, 0x8e, 0x34, - 0x60, 0xb2, 0xe6, 0xec, 0xb6, 0x9d, 0xf6, 0xee, 0x3d, 0x7a, 0xb8, 0x6e, 0x3b, 0x9e, 0x30, 0x90, - 0x93, 0xe6, 0xaf, 0x25, 0xff, 0xb0, 0xd5, 0xa2, 0x81, 0x87, 0xa7, 0x2d, 0x2b, 0x47, 0x27, 0x4f, - 0x26, 0xef, 0x9d, 0xf3, 0x39, 0x1d, 0x3a, 0x50, 0x75, 0x6c, 0x47, 0x3b, 0x56, 0x74, 0x9e, 0xda, - 0xdd, 0x6c, 0x7c, 0xc0, 0xbb, 0x59, 0x13, 0xa6, 0x97, 0xda, 0x75, 0xef, 0x10, 0xdf, 0x20, 0x64, - 0xe3, 0x26, 0x8e, 0x69, 0xdc, 0x0b, 0xa2, 0x71, 0xe7, 0x6d, 0xb9, 0xc2, 0xd2, 0x9a, 0x97, 0x64, - 0x4c, 0x6a, 0x30, 0x8d, 0x02, 0x74, 0xb5, 0xb2, 0x5e, 0x6d, 0x3b, 0x81, 0x83, 0x19, 0x9e, 0xf9, - 0x71, 0xf5, 0xa2, 0xe0, 0x79, 0x81, 0xcb, 0xe0, 0x4e, 0xa3, 0x63, 0x39, 0x12, 0x45, 0x65, 0x9a, - 0xa0, 0xef, 0x27, 0x08, 0x4f, 0xfd, 0xf3, 0x11, 0x84, 0x31, 0x07, 0x52, 0xcc, 0xf9, 0xb9, 0x18, - 0xed, 0xed, 0x3e, 0x16, 0xb1, 0x23, 0xc2, 0xed, 0xa2, 0x78, 0xa2, 0xe5, 0x40, 0xd2, 0xe9, 0x8c, - 0xef, 0x8c, 0xf2, 0xbd, 0x5d, 0x95, 0x5f, 0x7b, 0x99, 0xd2, 0xc5, 0xe4, 0xda, 0xec, 0x49, 0xe4, - 0xda, 0xdc, 0xf1, 0x72, 0x6d, 0xfe, 0x38, 0xb9, 0x36, 0x26, 0x78, 0x0e, 0x9d, 0x58, 0xf0, 0x1c, - 0x3e, 0x81, 0xe0, 0x39, 0x72, 0x22, 0xc1, 0x53, 0x93, 0xa0, 0x0b, 0xc7, 0x49, 0xd0, 0xff, 0xbf, - 0x98, 0xfa, 0xb4, 0x8a, 0xa9, 0x69, 0xa2, 0xc2, 0x89, 0xc4, 0xd4, 0xde, 0x52, 0x66, 0xf1, 0xcf, - 0x5b, 0xca, 0x9c, 0x7e, 0x32, 0x52, 0x26, 0xf9, 0x98, 0x52, 0xe6, 0x5f, 0x82, 0x62, 0xfc, 0xe0, - 0x3b, 0x3e, 0x5a, 0xde, 0x13, 0x8b, 0xec, 0xc4, 0x8e, 0xe5, 0xf8, 0xc1, 0xc3, 0x2e, 0xd2, 0xeb, - 0x9e, 0xf3, 0xd0, 0x0e, 0xe8, 0x3d, 0x69, 0x7a, 0x20, 0x22, 0x3d, 0x72, 0x28, 0x6e, 0x1f, 0x0a, - 0x4a, 0x28, 0x73, 0x65, 0xd3, 0x64, 0x2e, 0xe3, 0xc7, 0xb3, 0x30, 0xcd, 0xa3, 0xb0, 0x3c, 0xfd, - 0x1a, 0xf0, 0x77, 0x34, 0x49, 0x5a, 0x1a, 0xba, 0xc5, 0x7a, 0xd7, 0x47, 0x07, 0xfe, 0x35, 0x38, - 0x95, 0x18, 0x0a, 0x94, 0xa6, 0x2b, 0x32, 0xfe, 0x4d, 0x42, 0x9e, 0x9e, 0x4b, 0xaf, 0x64, 0xf3, - 0xa6, 0x99, 0xa0, 0x30, 0xfe, 0x69, 0x3e, 0xc1, 0x5f, 0x68, 0xc3, 0x55, 0xfd, 0x76, 0xe6, 0x64, - 0xfa, 0xed, 0xec, 0x60, 0xfa, 0xed, 0xd8, 0x31, 0x95, 0x1b, 0xe4, 0x98, 0xfa, 0x32, 0x4c, 0x6c, - 0x50, 0xbb, 0xe5, 0x6f, 0xb8, 0x22, 0x9c, 0x3b, 0x37, 0x74, 0x95, 0xe1, 0x6d, 0x58, 0x99, 0x14, - 0x06, 0x43, 0x83, 0x9d, 0x80, 0x11, 0xb0, 0xad, 0x95, 0xc7, 0x77, 0x37, 0x75, 0x0e, 0xaa, 0x84, - 0x3f, 0xd4, 0x47, 0xc2, 0xaf, 0xc1, 0xb8, 0xa0, 0x8b, 0x42, 0x04, 0x46, 0xa2, 0x28, 0x2b, 0x42, - 0xb8, 0xac, 0x3d, 0x4c, 0xb8, 0x17, 0xd6, 0xce, 0xa5, 0x50, 0x8d, 0x09, 0x1b, 0x82, 0xa5, 0x76, - 0xa3, 0xe3, 0x3a, 0x6d, 0x1c, 0x82, 0x91, 0x68, 0x08, 0xa8, 0x00, 0xf3, 0x21, 0x50, 0x90, 0xc8, - 0x5b, 0x30, 0x59, 0x5a, 0xaf, 0xaa, 0x64, 0x85, 0x48, 0xc5, 0x6e, 0x77, 0x1c, 0x4b, 0x23, 0x8d, - 0xe1, 0xf6, 0x93, 0xca, 0x46, 0xff, 0xf9, 0x48, 0x65, 0xc6, 0xb7, 0x47, 0xe5, 0xe7, 0xfd, 0xe9, - 0x2a, 0x03, 0x75, 0xf5, 0x5e, 0xee, 0x84, 0xea, 0xbd, 0xfc, 0x71, 0xc2, 0x89, 0x26, 0x31, 0x0d, - 0x9d, 0x40, 0x62, 0x1a, 0xfe, 0xc4, 0xaa, 0xba, 0x91, 0x13, 0xca, 0x40, 0xb1, 0x2f, 0xad, 0x30, - 0xc8, 0x97, 0x96, 0x2a, 0x37, 0x8d, 0x7e, 0x72, 0xb9, 0x09, 0x4e, 0x2c, 0x37, 0xd5, 0x22, 0x27, - 0xb0, 0xb1, 0x63, 0xad, 0x71, 0x2f, 0x88, 0xfb, 0xca, 0x74, 0x7a, 0x00, 0x9e, 0xd0, 0x1d, 0xec, - 0x33, 0x25, 0x8c, 0x7d, 0x23, 0x5d, 0x18, 0xeb, 0x7f, 0xda, 0xfc, 0x7f, 0x58, 0x1c, 0x33, 0x3c, - 0x1c, 0xe5, 0x2d, 0xdb, 0x6b, 0xe3, 0x3d, 0xf1, 0x3a, 0x8c, 0xc8, 0x40, 0x54, 0x99, 0x48, 0xe5, - 0x91, 0x8c, 0x40, 0x25, 0xb1, 0xd8, 0x95, 0x5e, 0x12, 0xab, 0x41, 0xb5, 0x0f, 0x04, 0x4c, 0x8b, - 0xf1, 0x23, 0x60, 0xc6, 0xdf, 0xcd, 0xcb, 0x2f, 0x99, 0xc9, 0x72, 0x22, 0x01, 0xf3, 0xa2, 0x32, - 0x73, 0x8a, 0x04, 0x17, 0x9b, 0x9b, 0x98, 0x71, 0x9d, 0x4e, 0xf2, 0xb1, 0x42, 0x83, 0x45, 0x89, - 0x9f, 0x72, 0x03, 0x24, 0x7e, 0x7a, 0x43, 0xcb, 0x9a, 0x94, 0x8f, 0xd2, 0x74, 0xb0, 0xd5, 0xdd, - 0x3f, 0x5f, 0xd2, 0x2d, 0x35, 0xbd, 0xd1, 0x50, 0x14, 0x25, 0x03, 0x29, 0xfb, 0x24, 0x36, 0x0a, - 0x45, 0xd2, 0xe1, 0x93, 0x04, 0xdd, 0x1b, 0xf9, 0x73, 0x0d, 0xba, 0xb7, 0x04, 0xa0, 0x24, 0xbd, - 0xe5, 0x2f, 0x32, 0x2f, 0xb2, 0x61, 0x3a, 0x3e, 0xe1, 0xad, 0x42, 0x68, 0xfc, 0x1e, 0x81, 0xe9, - 0x5a, 0x6d, 0xad, 0xe2, 0xd8, 0xbb, 0x6d, 0xd7, 0x0f, 0x9c, 0x7a, 0xb5, 0xbd, 0xe3, 0x32, 0x79, - 0x2c, 0xdc, 0x15, 0x94, 0xe8, 0x6a, 0xd1, 0x8e, 0x10, 0x16, 0x33, 0x79, 0x7f, 0xc9, 0xf3, 0x5c, - 0x4f, 0x95, 0xf7, 0x29, 0x03, 0x98, 0x1c, 0xce, 0x44, 0x9e, 0x5a, 0x97, 0x67, 0x2f, 0xe5, 0x8f, - 0x64, 0x28, 0xf2, 0xf8, 0x1c, 0x64, 0xca, 0x32, 0x42, 0x93, 0x0b, 0x56, 0x88, 0xc0, 0x67, 0xb4, - 0xd0, 0x7d, 0x51, 0x31, 0xdf, 0xf3, 0xc4, 0x99, 0x84, 0xd7, 0x99, 0x0e, 0xc2, 0xd5, 0x37, 0xe9, - 0xc4, 0x37, 0x70, 0x08, 0xa7, 0x34, 0xaf, 0xa3, 0x41, 0xb5, 0x7d, 0x2f, 0x0b, 0x11, 0xcb, 0x40, - 0x97, 0xd5, 0x14, 0x95, 0x9f, 0x9a, 0x66, 0x20, 0xb5, 0x06, 0xf2, 0xe3, 0x19, 0xb8, 0x90, 0x5a, - 0x12, 0x7e, 0xdd, 0x63, 0x5a, 0xf8, 0x44, 0x65, 0xd3, 0xe0, 0x09, 0x15, 0x7a, 0x55, 0x6d, 0xa5, - 0x6c, 0x05, 0xfd, 0x6b, 0x22, 0xbf, 0x91, 0x81, 0x33, 0x1a, 0x46, 0xb8, 0xe7, 0xf9, 0xa1, 0x7b, - 0x6d, 0xea, 0xba, 0xfe, 0xf0, 0xc9, 0xac, 0xeb, 0x4b, 0x7a, 0x5f, 0xa2, 0x2d, 0x59, 0xed, 0x43, - 0xaf, 0x16, 0x92, 0x87, 0x30, 0x8d, 0x45, 0x52, 0xf3, 0xc8, 0xd6, 0xac, 0x50, 0x58, 0xce, 0x46, - 0xcd, 0xe6, 0x9e, 0x74, 0x98, 0x14, 0x6f, 0xe1, 0xfb, 0x47, 0xf3, 0x13, 0x1a, 0xba, 0x0c, 0x48, - 0x68, 0x45, 0xea, 0x4b, 0xa7, 0xbd, 0xe3, 0xaa, 0xe7, 0x65, 0xa2, 0x0a, 0xf2, 0x1f, 0x64, 0x60, - 0x8e, 0x41, 0x79, 0x37, 0x6e, 0x7b, 0x6e, 0x2b, 0x2c, 0x97, 0xc6, 0x0d, 0x3d, 0x86, 0xad, 0xf9, - 0x64, 0x86, 0xed, 0x45, 0x6c, 0x32, 0xdf, 0x13, 0xac, 0x1d, 0xcf, 0x6d, 0x45, 0xcd, 0xd7, 0x92, - 0xba, 0xf6, 0x6a, 0x24, 0xf9, 0xe1, 0x0c, 0x9c, 0xd5, 0xd4, 0x25, 0x6a, 0xd8, 0x66, 0xe1, 0xaf, - 0x38, 0x13, 0xfa, 0x25, 0x47, 0x45, 0x8b, 0xd7, 0xc4, 0xfa, 0xbf, 0x8c, 0x2d, 0x88, 0x4e, 0x0b, - 0x6c, 0x8b, 0xd5, 0xe2, 0x58, 0x4a, 0x13, 0x7a, 0xd7, 0x42, 0x1c, 0x98, 0xc6, 0x87, 0x45, 0xcd, - 0x08, 0x67, 0xb6, 0xb7, 0x11, 0x4e, 0x98, 0xbc, 0x08, 0x63, 0xc2, 0xf6, 0xb6, 0xc4, 0x49, 0x72, - 0x25, 0x7f, 0x19, 0xce, 0x26, 0x80, 0xe1, 0xd7, 0x76, 0xaa, 0xe7, 0xd7, 0xf6, 0xca, 0xe3, 0xa3, - 0xf9, 0x97, 0xd2, 0x6a, 0x4b, 0xfb, 0xd2, 0x7a, 0xd7, 0x40, 0x6c, 0x80, 0xa8, 0x50, 0xe4, 0x86, - 0x4d, 0x5f, 0xa0, 0xaf, 0x88, 0xf5, 0xa1, 0xe0, 0xb3, 0xbd, 0x5c, 0x69, 0x83, 0x7a, 0xe4, 0x45, - 0x48, 0x84, 0xc2, 0xb8, 0x12, 0x0f, 0xf7, 0x10, 0x93, 0xc4, 0xf6, 0xac, 0xe4, 0xfb, 0x47, 0xf3, - 0x1a, 0x36, 0x93, 0x8b, 0xd5, 0x40, 0xbb, 0xaa, 0x5c, 0xac, 0x21, 0x92, 0x5f, 0xcb, 0xc0, 0x2c, - 0x03, 0x44, 0x8b, 0x4a, 0x74, 0x6a, 0xae, 0xdf, 0xaa, 0xdf, 0x7b, 0x32, 0xab, 0xfe, 0x79, 0x6c, - 0xa3, 0xba, 0xea, 0x13, 0x43, 0x92, 0xda, 0x38, 0x5c, 0xed, 0xda, 0x1b, 0xb6, 0xb6, 0xda, 0xcf, - 0x0e, 0xb0, 0xda, 0xf9, 0x04, 0x1c, 0xbf, 0xda, 0x7b, 0xd6, 0x42, 0x36, 0x60, 0x5c, 0x88, 0xc4, - 0x7c, 0xc0, 0x9e, 0xd3, 0x62, 0x69, 0xaa, 0x45, 0xfc, 0x9e, 0x22, 0xc2, 0x05, 0x27, 0x7a, 0xa8, - 0x71, 0x21, 0x6d, 0x98, 0xe1, 0xbf, 0x75, 0x05, 0xc5, 0x7c, 0x4f, 0x05, 0xc5, 0x15, 0xd1, 0xa3, - 0x8b, 0x82, 0x7f, 0x4c, 0x4f, 0xa1, 0x86, 0x33, 0x48, 0x61, 0x4c, 0x3a, 0x40, 0x34, 0x30, 0xff, - 0x68, 0x2f, 0xf6, 0x57, 0x4b, 0xbc, 0x24, 0xea, 0x9c, 0x8f, 0xd7, 0x19, 0xff, 0x72, 0x53, 0x78, - 0x13, 0x1b, 0xa6, 0x04, 0x94, 0x5d, 0x80, 0x71, 0x87, 0x7f, 0x5e, 0x0b, 0x28, 0x11, 0x2b, 0xe5, - 0xca, 0x4d, 0x59, 0x13, 0x06, 0xfc, 0x88, 0x6d, 0xe8, 0x71, 0x7e, 0x64, 0x0d, 0xa6, 0x4b, 0x9d, - 0x4e, 0xd3, 0xa1, 0x0d, 0xec, 0x25, 0xcf, 0xf3, 0x69, 0x44, 0xb9, 0x1d, 0x6c, 0x5e, 0x28, 0x44, - 0xfc, 0x78, 0x92, 0xcf, 0x24, 0xad, 0xf1, 0x9d, 0x4c, 0xa2, 0xd1, 0xec, 0xe6, 0x8e, 0x3f, 0x14, - 0xaf, 0x66, 0xbc, 0xb9, 0xf3, 0x26, 0xa2, 0x06, 0x21, 0x42, 0x60, 0xc2, 0x92, 0x1a, 0xa7, 0x28, - 0xc7, 0x85, 0x25, 0x71, 0xbd, 0x8c, 0x2e, 0x94, 0xf3, 0xd2, 0x38, 0x32, 0x17, 0x09, 0x5d, 0x68, - 0x1c, 0x29, 0x4c, 0x22, 0x8d, 0x1f, 0xce, 0xea, 0xcb, 0x8e, 0x5c, 0x51, 0xe4, 0x76, 0x25, 0x52, - 0x92, 0x94, 0xdb, 0x15, 0x69, 0xfd, 0xef, 0x64, 0x60, 0x66, 0xcd, 0xdb, 0xb5, 0xdb, 0xce, 0xb7, - 0x78, 0xc4, 0x45, 0x17, 0xe7, 0xa5, 0x7f, 0x9a, 0x9c, 0x27, 0x95, 0xee, 0xc3, 0x55, 0x2a, 0x66, - 0x2b, 0x05, 0x97, 0x8c, 0x99, 0xd6, 0x1e, 0x34, 0x37, 0xc7, 0x86, 0x29, 0x59, 0x57, 0x38, 0x3a, - 0x87, 0x1b, 0x3f, 0x99, 0x85, 0x31, 0xe5, 0x13, 0x20, 0x9f, 0x87, 0x71, 0x95, 0x8f, 0xaa, 0xf5, - 0x51, 0xab, 0x35, 0x35, 0x2c, 0x54, 0xfb, 0x50, 0xbb, 0xa5, 0xa9, 0x7d, 0xd8, 0x42, 0x47, 0xe8, - 0x09, 0xaf, 0x36, 0xef, 0xa6, 0x5c, 0x6d, 0x4e, 0x94, 0x10, 0xf6, 0xad, 0xe4, 0x05, 0x67, 0xf0, - 0xfc, 0xad, 0xc6, 0xcf, 0x64, 0xa0, 0x18, 0xff, 0x48, 0x3f, 0x95, 0x51, 0x39, 0x81, 0x8a, 0xff, - 0x27, 0xb2, 0x61, 0x30, 0x6c, 0xe9, 0x44, 0xf3, 0xb4, 0xda, 0xb1, 0xbc, 0xad, 0x69, 0xdf, 0x9f, - 0xd5, 0xa3, 0xbb, 0xa8, 0xee, 0xa7, 0xe9, 0x21, 0x9d, 0xf2, 0xdf, 0xfb, 0xc5, 0xf9, 0x67, 0x8c, - 0xf7, 0x61, 0x36, 0x3e, 0x1c, 0xa8, 0x81, 0x2f, 0xc1, 0x94, 0x0e, 0x8f, 0x87, 0xd2, 0x8f, 0x53, - 0x99, 0x71, 0x7c, 0xe3, 0xf7, 0xb3, 0x71, 0xde, 0xc2, 0xa6, 0x85, 0x6d, 0x3a, 0x6d, 0x7b, 0xbb, - 0x19, 0x86, 0xd2, 0xe6, 0x9b, 0x0e, 0x07, 0x99, 0xb2, 0xec, 0x24, 0xb9, 0x25, 0x42, 0x57, 0x90, - 0x5c, 0xba, 0x2b, 0x08, 0xb9, 0x15, 0x33, 0x0c, 0x53, 0xe2, 0x16, 0x1c, 0xd0, 0x6d, 0x2b, 0x32, - 0x0e, 0x8b, 0xd9, 0x83, 0x95, 0x61, 0x56, 0x0b, 0xa9, 0x29, 0xe9, 0x87, 0x22, 0x85, 0x6b, 0x80, - 0x05, 0x9c, 0x38, 0x15, 0x99, 0x2c, 0xc3, 0x08, 0x6b, 0xe6, 0x7d, 0xbb, 0x23, 0x14, 0xeb, 0x24, - 0x74, 0x0c, 0x6b, 0x86, 0x17, 0x3e, 0xc5, 0x37, 0xac, 0x49, 0xd9, 0x91, 0xaf, 0xe5, 0x53, 0xe6, - 0x88, 0xc6, 0x9f, 0x66, 0xd8, 0xf7, 0x5f, 0xdf, 0xff, 0x8c, 0x25, 0xa8, 0x60, 0x5d, 0xea, 0x63, - 0x72, 0xf5, 0x47, 0x59, 0x1e, 0x0d, 0x5d, 0x2c, 0x9f, 0x37, 0x60, 0x78, 0xc3, 0xf6, 0x76, 0x69, - 0x20, 0xe2, 0x84, 0xab, 0x5c, 0x78, 0x41, 0x14, 0x55, 0x21, 0xc0, 0xdf, 0xa6, 0x20, 0x50, 0x75, - 0x61, 0xd9, 0x81, 0x74, 0x61, 0x8a, 0x7a, 0x36, 0xf7, 0xc4, 0xd4, 0xb3, 0x3f, 0x10, 0x06, 0x3e, - 0x2f, 0x05, 0x03, 0x44, 0x6c, 0xbc, 0x18, 0x4f, 0x1c, 0x90, 0x88, 0xad, 0x19, 0xb1, 0x23, 0xb7, - 0xd4, 0x54, 0x04, 0x8a, 0x77, 0xc5, 0x31, 0x49, 0x07, 0x8c, 0x3f, 0xca, 0xf1, 0x31, 0x16, 0x03, - 0x75, 0x59, 0xf3, 0xbc, 0xc2, 0xef, 0x84, 0x6d, 0xf4, 0xaa, 0x13, 0x2c, 0x5a, 0x63, 0x5c, 0x86, - 0x3c, 0x5b, 0x9b, 0x62, 0x34, 0x11, 0x8f, 0xad, 0x5f, 0x15, 0x8f, 0x95, 0xb3, 0x6f, 0x19, 0xcf, - 0x24, 0x35, 0xf9, 0x0b, 0x1e, 0x5b, 0xea, 0xb7, 0x8c, 0x18, 0xe4, 0x0a, 0xe4, 0x57, 0xdd, 0x86, - 0x8c, 0x0c, 0x3a, 0x8b, 0xfe, 0xb7, 0x6e, 0x43, 0x61, 0x39, 0x97, 0x31, 0x11, 0x83, 0xf5, 0x35, - 0x8c, 0x25, 0xae, 0xf6, 0xb5, 0xb5, 0x63, 0x8b, 0xf0, 0x55, 0x6a, 0x5f, 0xa3, 0xb0, 0xe3, 0x4b, - 0x30, 0xa9, 0xa7, 0x7f, 0x14, 0x06, 0x69, 0xa8, 0x66, 0x8d, 0x65, 0x91, 0x54, 0xb5, 0xe3, 0x3a, - 0x11, 0x59, 0x84, 0x09, 0x2d, 0x22, 0x99, 0x78, 0xe1, 0x42, 0xf5, 0xa6, 0x1e, 0xcf, 0x4c, 0x55, - 0x6f, 0x6a, 0x24, 0xec, 0x3c, 0x17, 0xed, 0x57, 0xde, 0xb9, 0x12, 0x6d, 0x17, 0x38, 0xe4, 0x26, - 0x14, 0xb8, 0xa3, 0x6b, 0xb5, 0xa2, 0xbe, 0x56, 0xf8, 0x08, 0x8b, 0x39, 0x8a, 0x4b, 0x44, 0xc5, - 0xb1, 0xf1, 0x73, 0x50, 0x14, 0x5b, 0x52, 0x94, 0x68, 0xf1, 0x3c, 0xe4, 0xcb, 0xd5, 0x8a, 0xa9, - 0x6e, 0x23, 0x75, 0xa7, 0xe1, 0x99, 0x08, 0x35, 0xbe, 0x9b, 0x81, 0xb3, 0xab, 0x34, 0x38, 0x70, - 0xbd, 0x7d, 0x93, 0xfa, 0x81, 0xe7, 0xf0, 0xdc, 0x41, 0xf8, 0x21, 0x7e, 0x9e, 0xbc, 0x05, 0x43, - 0x68, 0x19, 0x15, 0x3b, 0x19, 0xe2, 0x75, 0x2c, 0x4e, 0x88, 0x05, 0x3c, 0x84, 0x66, 0x56, 0x26, - 0x27, 0x22, 0x6f, 0x40, 0xbe, 0x42, 0xdb, 0x87, 0xb1, 0xec, 0x29, 0x09, 0xe2, 0x70, 0x43, 0x68, - 0xd0, 0xf6, 0xa1, 0x89, 0x24, 0xc6, 0xcf, 0x64, 0xe1, 0x54, 0x4a, 0xb3, 0x36, 0x3f, 0xff, 0x94, - 0xee, 0x8a, 0x8b, 0xda, 0xae, 0x28, 0x1f, 0x29, 0x7b, 0x0e, 0x7c, 0xea, 0x26, 0xf9, 0xf3, 0x19, - 0x38, 0xa3, 0x2f, 0x50, 0x61, 0x0a, 0xb9, 0x79, 0x93, 0xbc, 0x09, 0xc3, 0xcb, 0xd4, 0x6e, 0x50, - 0x99, 0x59, 0xe1, 0x54, 0x18, 0x92, 0x86, 0x7b, 0xf1, 0xf1, 0x42, 0xce, 0x36, 0xf2, 0xf9, 0xe0, - 0x50, 0x52, 0x11, 0x8d, 0xe3, 0xf2, 0xb8, 0x21, 0x3d, 0x6a, 0xd3, 0xaa, 0xea, 0xf3, 0xd4, 0xff, - 0xfd, 0x0c, 0x3c, 0xdb, 0x87, 0x86, 0x4d, 0x1c, 0x9b, 0x7a, 0x75, 0xe2, 0xf0, 0x44, 0x45, 0x28, - 0x79, 0x07, 0xa6, 0x36, 0x84, 0x3c, 0x2f, 0xa7, 0x23, 0x1b, 0x7d, 0x2f, 0x52, 0xd4, 0xb7, 0xe4, - 0xbc, 0xc4, 0x91, 0x35, 0x57, 0xef, 0x5c, 0x5f, 0x57, 0x6f, 0xd5, 0x73, 0x3a, 0x3f, 0xa8, 0xe7, - 0xf4, 0xfb, 0xf1, 0xa4, 0xe9, 0x22, 0x80, 0x5d, 0xe4, 0x37, 0x9e, 0xe9, 0xed, 0x37, 0xde, 0x37, - 0x4c, 0x96, 0xf1, 0x93, 0x19, 0x28, 0xea, 0xbc, 0x3f, 0xe9, 0x7c, 0xbe, 0xad, 0xcd, 0xe7, 0xb3, - 0xe9, 0xf3, 0xd9, 0x7b, 0x22, 0xff, 0x97, 0x4c, 0xbc, 0xb3, 0x03, 0xcd, 0xa0, 0x01, 0xc3, 0x15, - 0xb7, 0x65, 0x3b, 0x6d, 0x35, 0x6f, 0x67, 0x03, 0x21, 0xa6, 0x28, 0x19, 0xcc, 0xcd, 0xfe, 0x22, - 0x0c, 0xad, 0xba, 0xed, 0x52, 0x45, 0x58, 0x0a, 0x22, 0x9f, 0xb6, 0xdb, 0xb6, 0xec, 0x86, 0xc9, - 0x0b, 0xc8, 0x0a, 0x40, 0xad, 0xee, 0x51, 0xda, 0xae, 0x39, 0xdf, 0xa2, 0x31, 0x49, 0x83, 0x8d, - 0x50, 0xb3, 0x8b, 0x1b, 0x0b, 0xbe, 0xf1, 0xf8, 0x88, 0x68, 0xf9, 0xce, 0xb7, 0xd4, 0xfd, 0x56, - 0xa1, 0x37, 0x28, 0x40, 0x44, 0x84, 0x49, 0xcc, 0x9c, 0x86, 0x48, 0x4c, 0x3b, 0x21, 0x92, 0x98, - 0x31, 0x80, 0x96, 0xc4, 0x8c, 0x01, 0xd8, 0xd6, 0xbe, 0x4c, 0x9d, 0xdd, 0x3d, 0x6e, 0x32, 0x32, - 0xc1, 0x97, 0xea, 0x1e, 0x42, 0xd4, 0xad, 0x9d, 0xe3, 0x18, 0x3f, 0x3e, 0x04, 0x67, 0x4d, 0xba, - 0xeb, 0x30, 0x31, 0xf9, 0x81, 0xef, 0xb4, 0x77, 0x35, 0x47, 0x68, 0x23, 0xb6, 0x90, 0x44, 0x0c, - 0x60, 0x06, 0x09, 0x07, 0xe6, 0x2a, 0x14, 0xd8, 0xa9, 0xa8, 0xac, 0x25, 0x7c, 0x43, 0xc1, 0xac, - 0xdb, 0x7c, 0x91, 0xcb, 0x62, 0xf2, 0xb2, 0x38, 0xb5, 0x95, 0x28, 0xed, 0xec, 0xd4, 0xfe, 0xe8, - 0x68, 0x1e, 0x6a, 0x87, 0x7e, 0x40, 0xf1, 0xc6, 0x26, 0x4e, 0xee, 0x50, 0xb4, 0xce, 0xf7, 0x10, - 0xad, 0xef, 0xc3, 0x6c, 0xa9, 0xc1, 0x37, 0x6b, 0xbb, 0xb9, 0xee, 0x39, 0xed, 0xba, 0xd3, 0xb1, - 0x9b, 0xf2, 0xba, 0x88, 0xa3, 0x6c, 0x87, 0xe5, 0x56, 0x27, 0x44, 0x30, 0x53, 0xc9, 0x58, 0x37, - 0x2a, 0xab, 0x35, 0xf4, 0x17, 0x16, 0xcf, 0x63, 0xd8, 0x8d, 0x46, 0xdb, 0xc7, 0x5e, 0xf8, 0x66, - 0x58, 0x8c, 0x42, 0x3d, 0xda, 0x20, 0x6c, 0xac, 0xd4, 0x22, 0x97, 0x22, 0x1e, 0x44, 0x96, 0xdb, - 0x29, 0x04, 0x4d, 0x1f, 0x6d, 0x15, 0x34, 0xbc, 0x88, 0xae, 0x56, 0x5b, 0x66, 0x74, 0x85, 0x04, - 0x9d, 0xef, 0xef, 0xa9, 0x74, 0x1c, 0x8f, 0x5c, 0x67, 0x4b, 0xa1, 0xe5, 0x06, 0x14, 0xd7, 0xf9, - 0x68, 0x74, 0x05, 0xf0, 0x10, 0xca, 0xaf, 0x00, 0x0a, 0x0a, 0x79, 0x0b, 0x66, 0x96, 0xca, 0x0b, - 0x52, 0xa9, 0x59, 0x71, 0xeb, 0x5d, 0x7c, 0x55, 0x06, 0xac, 0x0f, 0xe7, 0x90, 0xd6, 0x17, 0xd8, - 0xe2, 0x4e, 0x43, 0x23, 0x97, 0x61, 0xa4, 0x5a, 0xe1, 0x63, 0x3f, 0xa6, 0x66, 0x4a, 0x10, 0xd6, - 0x1a, 0xb2, 0x90, 0xac, 0x45, 0x32, 0xea, 0xf8, 0xb1, 0xc2, 0xe4, 0xd9, 0xe3, 0xe5, 0x53, 0x91, - 0x50, 0x81, 0x27, 0xee, 0x29, 0xbb, 0x0d, 0xea, 0x6f, 0xde, 0xf8, 0x8c, 0x25, 0x54, 0x50, 0xfa, - 0x86, 0xbb, 0xd7, 0x8d, 0xd4, 0xad, 0xee, 0x5f, 0xc5, 0x84, 0x0a, 0x09, 0x5c, 0xf2, 0x45, 0x18, - 0xc2, 0x9f, 0x42, 0xee, 0x99, 0x49, 0x61, 0x1b, 0xc9, 0x3c, 0x75, 0x9e, 0x77, 0x17, 0x09, 0x48, - 0x15, 0x46, 0x84, 0xc8, 0x7d, 0x92, 0xb0, 0xe0, 0x42, 0x76, 0xe7, 0x93, 0x24, 0xe8, 0x8d, 0x06, - 0x8c, 0xab, 0x15, 0xb2, 0xc5, 0xb9, 0x6c, 0xfb, 0x7b, 0xb4, 0xc1, 0x7e, 0x89, 0x8c, 0x1e, 0xb8, - 0x38, 0xf7, 0x10, 0x6a, 0xb1, 0x76, 0x98, 0x0a, 0x0a, 0xdb, 0x6d, 0xab, 0xfe, 0x03, 0x5f, 0x34, - 0x45, 0x5c, 0xc2, 0x1d, 0x54, 0xe8, 0x34, 0x4c, 0x51, 0x64, 0xfc, 0x00, 0xcc, 0xae, 0x76, 0x9b, - 0x4d, 0x76, 0x21, 0x97, 0x11, 0x9f, 0x03, 0x3b, 0xa0, 0x64, 0x11, 0x86, 0x6a, 0x4a, 0x26, 0xbf, - 0x99, 0x30, 0xa4, 0x76, 0x84, 0x83, 0x36, 0x6a, 0x19, 0x74, 0xa3, 0x8e, 0xe5, 0xf0, 0xe3, 0xa4, - 0xc6, 0xef, 0x46, 0x19, 0xa0, 0x37, 0x3c, 0xbb, 0xbe, 0x1f, 0x66, 0x73, 0x1c, 0x34, 0x99, 0xf5, - 0x5d, 0xd9, 0x08, 0xfd, 0x28, 0x4b, 0x6b, 0xf0, 0x71, 0x8d, 0x21, 0x6f, 0xc1, 0x98, 0x38, 0xce, - 0x94, 0xe0, 0x3f, 0x18, 0x61, 0x41, 0xa6, 0x93, 0x8f, 0x99, 0x1b, 0xa8, 0xe8, 0x78, 0x4a, 0xeb, - 0x5d, 0xd9, 0xbc, 0xf1, 0x69, 0x9c, 0xd2, 0x7a, 0x1d, 0x7d, 0x96, 0xee, 0x3f, 0x1c, 0x8b, 0x8f, - 0xad, 0x58, 0xbb, 0xb7, 0xd4, 0x70, 0x1f, 0x99, 0xe8, 0xce, 0x14, 0x85, 0xfb, 0x50, 0xef, 0x4c, - 0x21, 0x6a, 0x38, 0x27, 0xd9, 0x63, 0xe6, 0xe4, 0x1d, 0x39, 0x27, 0xb9, 0xde, 0x0b, 0x63, 0xa6, - 0xcf, 0x3c, 0xd4, 0xa2, 0x2f, 0x24, 0x3f, 0xd0, 0x85, 0xfb, 0x19, 0x8c, 0x6b, 0xca, 0x49, 0xe2, - 0x1b, 0x9a, 0xe0, 0xa4, 0xde, 0xe2, 0x87, 0x06, 0x67, 0x7a, 0xcc, 0x2d, 0xfe, 0x4b, 0x30, 0x5e, - 0x0a, 0x02, 0xbb, 0xbe, 0x47, 0x1b, 0x15, 0xb6, 0x3d, 0x29, 0x91, 0x09, 0x6c, 0x01, 0x57, 0x9f, - 0x53, 0x54, 0x5c, 0x1e, 0x69, 0xcb, 0xf6, 0x85, 0xb5, 0x5b, 0x18, 0x69, 0x8b, 0x41, 0xf4, 0x48, - 0x5b, 0x0c, 0x42, 0xae, 0xc3, 0x48, 0xb5, 0xfd, 0xd0, 0x61, 0x63, 0x52, 0x50, 0x72, 0xd6, 0x73, - 0x90, 0xba, 0xb9, 0x0a, 0x2c, 0xf2, 0x86, 0x22, 0xee, 0x8e, 0x46, 0x57, 0x5b, 0xae, 0x0c, 0x09, - 0x9d, 0x9a, 0x55, 0x51, 0x36, 0x94, 0x7f, 0x6f, 0xc1, 0x88, 0xd4, 0x71, 0x41, 0x74, 0x9d, 0x15, - 0x94, 0x49, 0xef, 0x49, 0x89, 0x8c, 0x09, 0x00, 0x95, 0xcc, 0x24, 0x63, 0x4a, 0x02, 0x40, 0x25, - 0x33, 0x89, 0x96, 0x00, 0x50, 0xc9, 0x51, 0x12, 0xaa, 0x07, 0xc6, 0x8f, 0x55, 0x0f, 0x6c, 0xc2, - 0xf8, 0xba, 0xed, 0x05, 0x0e, 0x13, 0x17, 0xda, 0x81, 0x3f, 0x37, 0xa1, 0x69, 0xd4, 0x94, 0xa2, - 0xc5, 0xe7, 0x64, 0xce, 0xba, 0x8e, 0x82, 0xaf, 0x27, 0x57, 0x8b, 0xe0, 0xe9, 0xb6, 0x6e, 0x93, - 0x9f, 0xc4, 0xd6, 0x0d, 0x07, 0x15, 0xb5, 0x28, 0x53, 0xd1, 0x5d, 0x1d, 0xc5, 0xd9, 0x98, 0x2a, - 0x25, 0x44, 0x24, 0x5f, 0x85, 0x71, 0xf6, 0x37, 0xa6, 0x89, 0x77, 0xa8, 0x3f, 0x57, 0xc4, 0xce, - 0x3d, 0x97, 0xfa, 0xf5, 0xf3, 0x5c, 0xf2, 0x35, 0x1a, 0xf0, 0x0f, 0x18, 0x19, 0xc7, 0xd5, 0xa3, - 0x1a, 0x37, 0xf2, 0x2e, 0x8c, 0xb3, 0xd5, 0xb7, 0x6d, 0xfb, 0x5c, 0x4a, 0x9c, 0x8e, 0xac, 0x15, - 0x1b, 0x02, 0x9e, 0x08, 0x76, 0xa7, 0x12, 0xb0, 0x63, 0xbe, 0xd4, 0xe1, 0x1b, 0x24, 0x51, 0x56, - 0x7b, 0x27, 0xb1, 0x39, 0x4a, 0x34, 0xf2, 0x1e, 0x8c, 0x97, 0x3a, 0x9d, 0x68, 0xc7, 0x99, 0x51, - 0x54, 0x24, 0x9d, 0x8e, 0x95, 0xba, 0xeb, 0x68, 0x14, 0xf1, 0x8d, 0x79, 0xf6, 0x44, 0x1b, 0x33, - 0x79, 0x2d, 0x14, 0x9c, 0x4f, 0x45, 0xfa, 0x3e, 0x71, 0xa5, 0xd0, 0xa4, 0x70, 0x2e, 0x43, 0x97, - 0x61, 0x82, 0x2b, 0xc0, 0xa4, 0x34, 0x73, 0x3a, 0xf1, 0xf5, 0xa4, 0x08, 0x35, 0x3a, 0x0d, 0x59, - 0x82, 0x49, 0xee, 0x28, 0xd6, 0x14, 0x51, 0x08, 0xe7, 0xce, 0x44, 0xc9, 0x88, 0xb9, 0x7f, 0x59, - 0x13, 0x83, 0x53, 0xdb, 0x1a, 0x97, 0x18, 0x91, 0xf1, 0xc7, 0x19, 0x38, 0xd3, 0x63, 0xc6, 0xc3, - 0x18, 0x75, 0x99, 0xfe, 0x31, 0xea, 0xd8, 0xce, 0xa1, 0xdf, 0x97, 0xb1, 0xff, 0x42, 0xca, 0x52, - 0xe7, 0x4b, 0xca, 0x5b, 0x2e, 0x10, 0x11, 0xcd, 0x5d, 0x54, 0x7d, 0xd7, 0x45, 0xa5, 0x5d, 0x2e, - 0x79, 0x08, 0x09, 0x3c, 0xde, 0xa8, 0x45, 0xe3, 0xf1, 0xd1, 0xfc, 0x73, 0x22, 0x58, 0x7c, 0x38, - 0xad, 0x1f, 0xba, 0xda, 0x17, 0x9c, 0xc2, 0xda, 0x38, 0xca, 0xc0, 0x98, 0xf2, 0x1d, 0x92, 0x8b, - 0x8a, 0xdb, 0x59, 0x91, 0xa7, 0x1b, 0x50, 0x38, 0x64, 0xf9, 0x49, 0x84, 0x1f, 0x55, 0xf6, 0x78, - 0xd5, 0xe4, 0x7d, 0x26, 0x0a, 0x29, 0x71, 0xfc, 0x5a, 0x9a, 0x1e, 0xd1, 0xc4, 0x72, 0x4c, 0xb5, - 0x69, 0xfb, 0x41, 0xa9, 0x1e, 0x38, 0x0f, 0xe9, 0x00, 0x87, 0x4e, 0x94, 0x6a, 0xd3, 0xf6, 0x03, - 0xcb, 0x46, 0xb2, 0x44, 0xaa, 0xcd, 0x90, 0xa1, 0xf1, 0x23, 0x19, 0x80, 0x07, 0xd5, 0x32, 0x06, - 0xe2, 0xfc, 0xa4, 0x42, 0x41, 0x7a, 0x70, 0x33, 0xc9, 0xbd, 0x8f, 0x38, 0xf0, 0x5f, 0x67, 0x60, - 0x52, 0x47, 0x23, 0xef, 0xc0, 0x54, 0xad, 0xee, 0xb9, 0xcd, 0xe6, 0xb6, 0x5d, 0xdf, 0x5f, 0x71, - 0xda, 0x94, 0x87, 0x95, 0x1a, 0xe2, 0x67, 0x91, 0x1f, 0x16, 0x59, 0x4d, 0x56, 0x66, 0xc6, 0x91, - 0xc9, 0x8f, 0x66, 0x60, 0xa2, 0xb6, 0xe7, 0x1e, 0x44, 0x19, 0xd0, 0xf9, 0x84, 0x7c, 0x8d, 0x7d, - 0xdb, 0xfe, 0x9e, 0x7b, 0x60, 0xa5, 0xa4, 0x41, 0xff, 0xe8, 0x68, 0xfe, 0xed, 0xc1, 0x5e, 0x6c, - 0xeb, 0x6e, 0xdb, 0x0f, 0xd8, 0xc6, 0x7c, 0x4d, 0xab, 0xc4, 0xd4, 0xeb, 0x34, 0xfe, 0x2c, 0x03, - 0x63, 0x55, 0x86, 0xd9, 0x6c, 0xa2, 0xcc, 0xf5, 0x59, 0x4a, 0x7c, 0x13, 0xf6, 0xab, 0xcf, 0xc4, - 0xbe, 0x0e, 0x53, 0x31, 0x34, 0x62, 0xc0, 0x70, 0x0d, 0x5d, 0x8d, 0x55, 0x5d, 0x01, 0x77, 0x3e, - 0x36, 0x45, 0x89, 0xb1, 0xa4, 0x90, 0x6d, 0xde, 0xc0, 0x07, 0xbf, 0x05, 0x00, 0x47, 0x82, 0xe4, - 0xcd, 0x86, 0xc4, 0x5b, 0xb2, 0x79, 0xc3, 0x54, 0xb0, 0x8c, 0x55, 0x18, 0xae, 0xb9, 0x5e, 0xb0, - 0x78, 0xc8, 0x2f, 0x13, 0x15, 0xea, 0xd7, 0xd5, 0x17, 0x3d, 0x07, 0xb5, 0xe8, 0x75, 0x53, 0x14, - 0x91, 0x79, 0x18, 0xba, 0xed, 0xd0, 0x66, 0x43, 0x35, 0xdd, 0xdc, 0x61, 0x00, 0x93, 0xc3, 0xd9, - 0x85, 0xeb, 0x74, 0x14, 0xaf, 0x3a, 0xb2, 0x11, 0xfd, 0xa4, 0xdf, 0x4d, 0x59, 0x1b, 0xdf, 0xe7, - 0xf5, 0xbc, 0xb2, 0x5a, 0x4d, 0x7d, 0x86, 0xfa, 0xdf, 0xc9, 0xc0, 0xb9, 0xde, 0x24, 0xaa, 0xd9, - 0x69, 0xa6, 0x8f, 0xd9, 0xe9, 0x8b, 0xf1, 0x17, 0x28, 0x44, 0x13, 0x2f, 0x50, 0xd1, 0xbb, 0x53, - 0x05, 0xad, 0x7e, 0xeb, 0x61, 0xda, 0xef, 0x8b, 0x7d, 0xda, 0x8c, 0x88, 0x7c, 0x9a, 0x03, 0xa4, - 0x31, 0x05, 0xad, 0xf1, 0x9b, 0x79, 0x38, 0xdb, 0x93, 0x82, 0x2c, 0x2b, 0xa1, 0xef, 0x27, 0xc3, - 0xa0, 0xdb, 0x3d, 0xf1, 0xaf, 0xe1, 0xbf, 0x68, 0xd8, 0x15, 0x77, 0x46, 0x59, 0x0b, 0x43, 0x9e, - 0x67, 0x91, 0xd7, 0x2b, 0xc7, 0xf2, 0xe2, 0xe8, 0xc8, 0x0c, 0x92, 0xd1, 0xcf, 0xd1, 0x6d, 0x89, - 0x06, 0xb6, 0xd3, 0xf4, 0xd5, 0xcf, 0xae, 0xc1, 0x41, 0xa6, 0x2c, 0x8b, 0x6c, 0x81, 0xf3, 0xe9, - 0xb6, 0xc0, 0xc6, 0xff, 0x9d, 0x81, 0xd1, 0xb0, 0xd9, 0xe4, 0x1c, 0x9c, 0xde, 0x30, 0x4b, 0xe5, - 0x25, 0x6b, 0xe3, 0xfd, 0xf5, 0x25, 0xeb, 0xc1, 0x6a, 0x6d, 0x7d, 0xa9, 0x5c, 0xbd, 0x5d, 0x5d, - 0xaa, 0x14, 0x9f, 0x21, 0xd3, 0x30, 0xf1, 0x60, 0xf5, 0xde, 0xea, 0xda, 0xd6, 0xaa, 0xb5, 0x64, - 0x9a, 0x6b, 0x66, 0x31, 0x43, 0x26, 0x60, 0xd4, 0x5c, 0x2c, 0x95, 0xad, 0xd5, 0xb5, 0xca, 0x52, - 0x31, 0x4b, 0x8a, 0x30, 0x5e, 0x5e, 0x5b, 0x5d, 0x5d, 0x2a, 0x6f, 0x54, 0x37, 0xab, 0x1b, 0xef, - 0x17, 0x73, 0x84, 0xc0, 0x24, 0x22, 0xac, 0x9b, 0xd5, 0xd5, 0x72, 0x75, 0xbd, 0xb4, 0x52, 0xcc, - 0x33, 0x18, 0xc3, 0x57, 0x60, 0x43, 0x21, 0xa3, 0x7b, 0x0f, 0x16, 0x97, 0x8a, 0xc3, 0x0c, 0x85, - 0xfd, 0xa5, 0xa0, 0x8c, 0xb0, 0xea, 0x11, 0xa5, 0x52, 0xda, 0x28, 0x2d, 0x96, 0x6a, 0x4b, 0xc5, - 0x02, 0x39, 0x03, 0x33, 0x1a, 0xc8, 0x5a, 0x59, 0xbb, 0x53, 0x5d, 0x2d, 0x8e, 0x92, 0x59, 0x28, - 0x86, 0xb0, 0xca, 0xa2, 0xf5, 0xa0, 0xb6, 0x64, 0x16, 0x21, 0x0e, 0x5d, 0x2d, 0xdd, 0x5f, 0x2a, - 0x8e, 0x19, 0x6f, 0x73, 0x37, 0x21, 0x3e, 0xd4, 0xe4, 0x34, 0x90, 0xda, 0x46, 0x69, 0xe3, 0x41, - 0x2d, 0xd6, 0xf9, 0x31, 0x18, 0xa9, 0x3d, 0x28, 0x97, 0x97, 0x6a, 0xb5, 0x62, 0x86, 0x00, 0x0c, - 0xdf, 0x2e, 0x55, 0x57, 0x96, 0x2a, 0xc5, 0xac, 0xf1, 0xd3, 0x19, 0x98, 0x96, 0x12, 0xa0, 0x7c, - 0x4e, 0xf8, 0x84, 0xdf, 0xe2, 0x3b, 0xda, 0xc5, 0x56, 0x7a, 0x71, 0xc4, 0x2a, 0xe9, 0xf3, 0x19, - 0x7a, 0x70, 0x2a, 0x15, 0x99, 0xbc, 0x0f, 0x45, 0xd9, 0x80, 0xfb, 0x76, 0x50, 0xdf, 0x8b, 0xb6, - 0xb1, 0xe7, 0x62, 0x95, 0xc4, 0xd0, 0xb8, 0x82, 0x31, 0xca, 0xac, 0x97, 0x60, 0x63, 0x7c, 0x2f, - 0x03, 0x67, 0x7a, 0x10, 0x93, 0x32, 0x0c, 0x87, 0x91, 0xc0, 0xfb, 0x18, 0x2c, 0xcd, 0x7e, 0xff, - 0x68, 0x5e, 0x20, 0x62, 0x82, 0x31, 0xfc, 0xcb, 0x1c, 0x0e, 0x43, 0x7b, 0x63, 0x7c, 0x6d, 0x3e, - 0x26, 0x67, 0x63, 0xc3, 0x29, 0x6a, 0x2a, 0x6d, 0xd5, 0x16, 0xc7, 0xc4, 0x80, 0xe4, 0xec, 0x03, - 0x1f, 0x03, 0x6c, 0x1b, 0xdf, 0xcd, 0x30, 0x89, 0x2d, 0x8e, 0xc8, 0x04, 0xd9, 0x92, 0xef, 0x77, - 0x5b, 0xd4, 0x74, 0x9b, 0xb4, 0x64, 0xae, 0x8a, 0xb3, 0x00, 0x45, 0x50, 0x1b, 0x0b, 0xf0, 0xae, - 0x60, 0xd9, 0x5e, 0x5b, 0x7b, 0x9c, 0x54, 0x69, 0xc8, 0x1b, 0x00, 0x61, 0xa2, 0x77, 0xe9, 0xe9, - 0xcf, 0x23, 0x5d, 0x08, 0xa8, 0x2e, 0x44, 0x2b, 0xc8, 0xc6, 0x5f, 0xcd, 0xc0, 0xb8, 0xb8, 0x09, - 0x95, 0x9a, 0xd4, 0x0b, 0x3e, 0xd9, 0x9a, 0x79, 0x43, 0x5b, 0x33, 0xa1, 0x7d, 0xbe, 0xc2, 0x9f, - 0x15, 0xa7, 0x2e, 0x97, 0xff, 0x34, 0x03, 0xc5, 0x38, 0x22, 0x79, 0x07, 0x0a, 0x35, 0xfa, 0x90, - 0x7a, 0x4e, 0x70, 0x28, 0x76, 0x3f, 0x99, 0x33, 0x85, 0xe3, 0x88, 0x32, 0xae, 0x70, 0xf5, 0xc5, - 0x2f, 0x33, 0xa4, 0x19, 0x74, 0x13, 0x57, 0x74, 0x19, 0xb9, 0x27, 0xa5, 0xcb, 0x30, 0xfe, 0x87, - 0x2c, 0x9c, 0xb9, 0x43, 0x03, 0xb5, 0x4f, 0xe1, 0x6b, 0xf2, 0xe7, 0x06, 0xeb, 0x97, 0xd2, 0x93, - 0x39, 0x18, 0xc1, 0x22, 0x39, 0xbf, 0xa6, 0xfc, 0x49, 0x16, 0xc3, 0x75, 0x9d, 0xd3, 0x92, 0x32, - 0xf4, 0xa8, 0xfb, 0x9a, 0x12, 0xa6, 0x3d, 0x5c, 0xd6, 0x97, 0x61, 0x12, 0xe3, 0x90, 0x76, 0xd9, - 0xe7, 0x40, 0x1b, 0x42, 0xa7, 0x53, 0x30, 0x63, 0x50, 0xf2, 0x32, 0x14, 0x19, 0xa4, 0x54, 0xdf, - 0x6f, 0xbb, 0x07, 0x4d, 0xda, 0xd8, 0xa5, 0x3c, 0x33, 0x77, 0xc1, 0x4c, 0xc0, 0x25, 0xcf, 0x07, - 0x6d, 0x7e, 0x1f, 0xa3, 0x0d, 0x54, 0xbc, 0x08, 0x9e, 0x11, 0xf4, 0xdc, 0x1b, 0x30, 0xf6, 0x31, - 0x53, 0x2e, 0x18, 0xff, 0x7d, 0x06, 0x66, 0xb1, 0x73, 0x4a, 0xc5, 0xa8, 0x91, 0xff, 0x5c, 0x34, - 0x5a, 0x4a, 0x14, 0x72, 0x9b, 0x81, 0xf4, 0x4f, 0x21, 0x1c, 0xc5, 0x48, 0xd1, 0x93, 0x1d, 0x40, - 0xd1, 0x53, 0x3b, 0x49, 0x22, 0xcf, 0x01, 0xf5, 0x54, 0x3c, 0xfd, 0x7a, 0x34, 0xe5, 0xc6, 0x8f, - 0x66, 0x61, 0xc4, 0xa4, 0x98, 0xe1, 0x90, 0x5c, 0x86, 0x91, 0x55, 0x37, 0xa0, 0xfe, 0x7d, 0x2d, - 0x9d, 0x65, 0x9b, 0x81, 0xac, 0x56, 0xc3, 0x94, 0x85, 0x6c, 0xc1, 0xaf, 0x7b, 0x6e, 0xa3, 0x5b, - 0x0f, 0xd4, 0x05, 0xdf, 0xe1, 0x20, 0x53, 0x96, 0x91, 0x57, 0x61, 0x54, 0x70, 0x0e, 0xdf, 0xf0, - 0xd0, 0xf6, 0xd4, 0xa3, 0x61, 0x86, 0xcc, 0x08, 0x01, 0x05, 0x55, 0x2e, 0x35, 0xe4, 0x15, 0x41, - 0x35, 0x21, 0x08, 0x48, 0xf9, 0x7b, 0xa8, 0x8f, 0xfc, 0xfd, 0x39, 0x18, 0x2e, 0xf9, 0x3e, 0x0d, - 0xa4, 0xe7, 0xf2, 0x78, 0x18, 0x46, 0xc6, 0xa7, 0x01, 0x67, 0x6c, 0x63, 0xb9, 0x29, 0xf0, 0x8c, - 0x3f, 0xcd, 0xc2, 0x10, 0xfe, 0x89, 0xef, 0x96, 0x5e, 0x7d, 0x4f, 0x7b, 0xb7, 0xf4, 0xea, 0x7b, - 0x26, 0x42, 0xc9, 0x0d, 0x54, 0x3f, 0xc8, 0x80, 0xf9, 0xa2, 0xf7, 0xa8, 0x57, 0x6f, 0x44, 0x60, - 0x53, 0xc5, 0x09, 0x1f, 0x74, 0x73, 0xa9, 0xf1, 0x0a, 0x4e, 0x43, 0x76, 0xad, 0x26, 0x7a, 0x8c, - 0x71, 0x55, 0x5c, 0xdf, 0xcc, 0xae, 0xd5, 0x70, 0x34, 0x96, 0x4b, 0x0b, 0xaf, 0xdf, 0x52, 0x33, - 0xaf, 0xfa, 0x7b, 0xf6, 0xc2, 0xeb, 0xb7, 0x4c, 0x51, 0xc2, 0xc6, 0x17, 0xdb, 0x8c, 0x0f, 0x9b, - 0xdc, 0xd3, 0x16, 0xc7, 0x17, 0xfb, 0x86, 0x8f, 0x98, 0x66, 0x84, 0x40, 0x16, 0x60, 0x4c, 0xf8, - 0x77, 0x23, 0xbe, 0xe2, 0x7f, 0x2d, 0xfc, 0xbf, 0x39, 0x85, 0x8a, 0xc4, 0x9f, 0xb8, 0xc4, 0x04, - 0xc9, 0xb4, 0x5e, 0xe2, 0x89, 0x4b, 0x4e, 0xa1, 0x6f, 0x2a, 0x28, 0x91, 0xa3, 0x70, 0xe4, 0x41, - 0xab, 0x3a, 0x0a, 0x63, 0x5c, 0xd9, 0x10, 0xc1, 0xf8, 0xe5, 0x2c, 0x14, 0xd6, 0x9b, 0xdd, 0x5d, - 0xa7, 0xbd, 0x79, 0xe3, 0xcf, 0x35, 0xfb, 0xff, 0x6b, 0x80, 0x87, 0x84, 0xb8, 0x11, 0x48, 0x2d, - 0x35, 0x6f, 0x9a, 0x10, 0x3e, 0x38, 0x09, 0xa2, 0x91, 0x9b, 0x20, 0x16, 0xa6, 0x48, 0x06, 0x79, - 0x4a, 0x27, 0xe0, 0x09, 0x79, 0x24, 0x89, 0x40, 0x25, 0x6f, 0xc1, 0x58, 0x94, 0x86, 0x3d, 0xca, - 0xf1, 0xa8, 0x52, 0x96, 0xa3, 0xf2, 0xcd, 0x1b, 0xa6, 0x8a, 0x6e, 0xfc, 0x47, 0xc3, 0x30, 0xae, - 0xb6, 0x87, 0x98, 0x30, 0xe3, 0x37, 0xd9, 0x85, 0x5c, 0xd8, 0x16, 0x75, 0xb0, 0x50, 0x1c, 0xa7, - 0x17, 0xf5, 0x06, 0x31, 0x3c, 0x6e, 0x68, 0x24, 0x1d, 0xd3, 0x97, 0x9f, 0x31, 0xa7, 0xfd, 0x08, - 0xcc, 0xf1, 0x48, 0x09, 0x0a, 0x6e, 0xc7, 0xdf, 0xa5, 0x6d, 0x47, 0x3e, 0xa2, 0x5c, 0xd2, 0x18, - 0xad, 0x89, 0xc2, 0x04, 0xaf, 0x90, 0x8c, 0xbc, 0x0e, 0xc3, 0x6e, 0x87, 0xb6, 0x6d, 0x47, 0x9c, - 0x71, 0xcf, 0xc6, 0x18, 0xd0, 0x76, 0xa9, 0xaa, 0x10, 0x0a, 0x64, 0x72, 0x1d, 0xf2, 0xee, 0x7e, - 0x38, 0x5f, 0x67, 0x75, 0xa2, 0xfd, 0xc0, 0x56, 0x48, 0x10, 0x91, 0x11, 0x7c, 0x68, 0xb7, 0x76, - 0xc4, 0x8c, 0xe9, 0x04, 0x77, 0xed, 0xd6, 0x8e, 0x4a, 0xc0, 0x10, 0xc9, 0xbb, 0x00, 0x1d, 0x7b, - 0x97, 0x7a, 0x56, 0xa3, 0x1b, 0x1c, 0x8a, 0x79, 0x7b, 0x4e, 0x23, 0x5b, 0x67, 0xc5, 0x95, 0x6e, - 0x70, 0xa8, 0xd0, 0x8e, 0x76, 0x24, 0x90, 0x94, 0x00, 0x5a, 0x76, 0x10, 0x50, 0xaf, 0xe5, 0x0a, - 0xe3, 0xae, 0xb1, 0x30, 0x87, 0x22, 0x67, 0x70, 0x3f, 0x2c, 0x56, 0x38, 0x28, 0x44, 0xd8, 0x68, - 0xc7, 0xb3, 0x45, 0x4a, 0xce, 0x58, 0xa3, 0x1d, 0x4f, 0xeb, 0x25, 0x43, 0x24, 0x5f, 0x84, 0x91, - 0x86, 0xe3, 0xd7, 0x5d, 0xaf, 0x21, 0x22, 0x16, 0x9c, 0xd7, 0x68, 0x2a, 0xbc, 0x4c, 0x21, 0x93, - 0xe8, 0xac, 0xb5, 0x22, 0x28, 0xda, 0xaa, 0x7b, 0x80, 0xba, 0xfb, 0x78, 0x6b, 0x6b, 0x61, 0xb1, - 0xda, 0xda, 0x88, 0x88, 0x4d, 0xe5, 0xae, 0x13, 0x34, 0xed, 0x6d, 0xf1, 0x8e, 0xac, 0x4f, 0xe5, - 0x1d, 0x2c, 0x52, 0xa7, 0x92, 0x23, 0x93, 0x37, 0xa0, 0x40, 0xdb, 0x81, 0x67, 0x5b, 0x4e, 0x43, - 0x38, 0xc5, 0xe9, 0x8d, 0x66, 0x07, 0xb0, 0x5d, 0xad, 0xa8, 0x8d, 0x46, 0xfc, 0x6a, 0x83, 0x8d, - 0x8f, 0x5f, 0x77, 0x5a, 0xc2, 0x97, 0x4d, 0x1f, 0x9f, 0x5a, 0xb9, 0x7a, 0x5f, 0x1d, 0x1f, 0x86, - 0x48, 0x9e, 0x03, 0xd8, 0xa5, 0x6d, 0xca, 0x1d, 0x4b, 0xf9, 0x2b, 0x83, 0xa9, 0x40, 0xbe, 0x94, - 0xff, 0x9f, 0x7e, 0x71, 0x3e, 0xb3, 0x08, 0x50, 0x90, 0x21, 0x1b, 0x8c, 0x15, 0x38, 0xdb, 0xf3, - 0xa3, 0x20, 0x57, 0xa1, 0xb8, 0x63, 0x0b, 0x3d, 0x57, 0x7d, 0xcf, 0x6e, 0xb7, 0x69, 0x53, 0x6c, - 0x47, 0x53, 0x12, 0x5e, 0xe6, 0x60, 0xce, 0xd9, 0x78, 0x17, 0x66, 0xd3, 0x46, 0x83, 0x3c, 0x0f, - 0xe3, 0x6a, 0x74, 0x0a, 0xc1, 0x64, 0xcc, 0xee, 0x38, 0x32, 0x3e, 0x85, 0x60, 0xf0, 0x1b, 0x19, - 0x38, 0xdf, 0xef, 0xdb, 0x22, 0xe7, 0xa0, 0xd0, 0xf1, 0x1c, 0x17, 0x65, 0x38, 0xbe, 0x03, 0x86, - 0xbf, 0xc9, 0x05, 0x00, 0x2e, 0x6c, 0x04, 0xf6, 0xae, 0x30, 0x76, 0x37, 0x47, 0x11, 0xb2, 0x61, - 0xef, 0xfa, 0xe4, 0x15, 0x98, 0x6e, 0xd0, 0x1d, 0xbb, 0xdb, 0x0c, 0x2c, 0xbf, 0xbe, 0x47, 0x1b, - 0xe8, 0x5f, 0x82, 0x46, 0x4c, 0x66, 0x51, 0x14, 0xd4, 0x24, 0x3c, 0xd1, 0xe2, 0xa1, 0x1e, 0x2d, - 0xbe, 0x9b, 0x2f, 0x64, 0x8a, 0x59, 0x13, 0x6d, 0x79, 0x8c, 0x6f, 0x67, 0x61, 0xae, 0xd7, 0x62, - 0x22, 0x6f, 0xa7, 0x8d, 0x01, 0x57, 0xd5, 0xab, 0x70, 0x55, 0x55, 0xaf, 0xd4, 0x46, 0x16, 0x20, - 0xf4, 0x0e, 0x39, 0xce, 0xd3, 0x5b, 0xc2, 0x18, 0x4d, 0xc7, 0xf6, 0xfd, 0x03, 0xf6, 0xbd, 0xe4, - 0x94, 0xe8, 0x73, 0x02, 0xa6, 0xd2, 0x48, 0x18, 0xf9, 0x02, 0x40, 0xbd, 0xe9, 0xfa, 0x14, 0x5f, - 0xc4, 0xc5, 0x41, 0xcc, 0x4d, 0x64, 0x43, 0xa8, 0xfa, 0x04, 0x8a, 0xd0, 0xb2, 0xdb, 0xa0, 0x62, - 0x02, 0x6d, 0x38, 0xd3, 0x63, 0xf7, 0x60, 0xd3, 0x13, 0xe5, 0xaa, 0x94, 0x91, 0xef, 0xbb, 0x61, - 0xc6, 0xca, 0xf8, 0x88, 0x67, 0x7b, 0xad, 0x91, 0x43, 0x20, 0xc9, 0x2d, 0x82, 0x71, 0x17, 0x86, - 0x9e, 0x5d, 0x2f, 0xe4, 0xce, 0x21, 0x0f, 0xbc, 0x26, 0x99, 0x87, 0x31, 0x99, 0xd9, 0x86, 0x09, - 0xba, 0x9c, 0x39, 0x08, 0xd0, 0x3d, 0x8a, 0x8b, 0x07, 0x83, 0x24, 0xa2, 0x0f, 0x90, 0x38, 0x42, - 0x47, 0x11, 0xb2, 0x71, 0xd8, 0x91, 0xbd, 0x3b, 0x2f, 0xd7, 0xb7, 0xbe, 0x71, 0x8b, 0xd2, 0x9f, - 0xcd, 0xc8, 0xe9, 0x4f, 0xee, 0x7c, 0xc7, 0xb5, 0x8f, 0x00, 0x7a, 0x6c, 0x88, 0x86, 0xe1, 0xdf, - 0xec, 0x48, 0x97, 0x5f, 0x9d, 0x38, 0xd2, 0xc5, 0x4f, 0x72, 0x19, 0xa6, 0x3c, 0x6e, 0xd3, 0x17, - 0xb8, 0x62, 0x3c, 0x71, 0xa6, 0xcc, 0x09, 0x0e, 0xde, 0x70, 0x71, 0x4c, 0x45, 0xbb, 0xee, 0x86, - 0x03, 0xa6, 0x1c, 0x04, 0xe4, 0x1a, 0x8c, 0xb2, 0x83, 0x00, 0x83, 0x3f, 0xc4, 0x4c, 0xc5, 0x11, - 0x0f, 0x8f, 0x55, 0xb3, 0xf0, 0xa1, 0xf8, 0x5b, 0xf0, 0xfa, 0x4f, 0x32, 0x92, 0x99, 0x7a, 0x0c, - 0x91, 0x33, 0x30, 0xe2, 0x7a, 0xbb, 0x4a, 0xd7, 0x86, 0x5d, 0x6f, 0x97, 0xf5, 0xeb, 0x0a, 0x14, - 0xb9, 0xe7, 0x02, 0x77, 0x09, 0xf7, 0x0f, 0xdb, 0xfc, 0x9e, 0x5a, 0x30, 0x27, 0x39, 0x1c, 0xd3, - 0x77, 0x1e, 0xb6, 0xeb, 0x0c, 0xd3, 0xf7, 0x5d, 0x4b, 0x8d, 0xf8, 0x22, 0xba, 0x3d, 0xe9, 0xfb, - 0x6e, 0x14, 0xfa, 0xa5, 0x41, 0x16, 0x61, 0x82, 0xf1, 0x09, 0xe3, 0xce, 0x88, 0x53, 0xf2, 0x42, - 0xf2, 0x94, 0x3c, 0x6c, 0xd7, 0x65, 0x13, 0xcd, 0x71, 0x5f, 0xf9, 0x25, 0x7a, 0xf3, 0x73, 0x59, - 0x38, 0x9d, 0x8e, 0x8e, 0xf3, 0xc5, 0x2a, 0x41, 0x07, 0x1e, 0xae, 0xb3, 0x34, 0x47, 0x19, 0x84, - 0xc7, 0x28, 0x48, 0x6b, 0x6d, 0x36, 0xb5, 0xb5, 0x2f, 0xc3, 0x34, 0x32, 0x12, 0x72, 0x49, 0xd3, - 0xf1, 0x03, 0xe1, 0x7a, 0x6f, 0x4e, 0xb1, 0x02, 0xbe, 0xc1, 0xad, 0x30, 0x30, 0x79, 0x11, 0x26, - 0xe5, 0x16, 0xe5, 0x1e, 0xb4, 0x59, 0xc5, 0x7c, 0x7f, 0x9a, 0x10, 0xd0, 0x35, 0x04, 0x92, 0x53, - 0x30, 0x6c, 0x77, 0x3a, 0xac, 0x4a, 0xbe, 0x2d, 0x0d, 0xd9, 0x9d, 0x4e, 0xb5, 0x41, 0x2e, 0xc1, - 0x04, 0xba, 0x2b, 0x59, 0x3b, 0x68, 0x28, 0x22, 0x0c, 0xc4, 0xcc, 0x71, 0x04, 0x72, 0xe3, 0x11, - 0x9f, 0x7d, 0x08, 0x8c, 0x56, 0xa2, 0x8c, 0x20, 0x0a, 0xd8, 0x1d, 0x89, 0x20, 0x46, 0xe6, 0x8b, - 0x30, 0x25, 0x4e, 0x53, 0xb1, 0xc3, 0x23, 0xa5, 0x58, 0x7f, 0x4c, 0xcc, 0x15, 0x21, 0xbf, 0x41, - 0x80, 0xaa, 0x0d, 0x49, 0xf9, 0x07, 0x19, 0x38, 0x95, 0x7a, 0x1c, 0x93, 0x6f, 0x00, 0xf7, 0xde, - 0x08, 0x5c, 0xcb, 0xa3, 0x75, 0xa7, 0xe3, 0xa0, 0x7f, 0x3b, 0x57, 0x42, 0x2d, 0xf4, 0x3b, 0xc8, - 0xd1, 0x13, 0x64, 0xc3, 0x35, 0x43, 0x22, 0x7e, 0x8f, 0x2e, 0x7a, 0x31, 0xf0, 0xb9, 0x0f, 0xe0, - 0x54, 0x2a, 0x6a, 0xca, 0xfd, 0xf6, 0x55, 0x3d, 0x33, 0x9a, 0x7c, 0x55, 0x88, 0x75, 0x5a, 0xb9, - 0xf7, 0x8a, 0xee, 0xfd, 0x56, 0xd8, 0xbd, 0xd8, 0xc1, 0x4d, 0x96, 0xe2, 0xcb, 0x32, 0x4d, 0xf6, - 0x94, 0x44, 0x3d, 0x57, 0x26, 0xf9, 0x00, 0x4e, 0x89, 0xa5, 0xb2, 0xeb, 0xd9, 0x9d, 0xbd, 0x88, - 0x1d, 0x6f, 0xe8, 0x4b, 0x69, 0xec, 0xf8, 0x1a, 0xba, 0xc3, 0xf0, 0x43, 0xae, 0x33, 0x76, 0x12, - 0x28, 0xfa, 0xe0, 0xc9, 0x43, 0x3f, 0xa5, 0x35, 0x29, 0x6b, 0x30, 0x93, 0xb6, 0x06, 0x07, 0xfe, - 0x00, 0x44, 0x9d, 0x3f, 0x9c, 0x81, 0x8b, 0xc7, 0xb5, 0x99, 0x6c, 0xc1, 0x69, 0x7c, 0xf7, 0xf6, - 0xdd, 0xb0, 0xdb, 0x56, 0xdd, 0xae, 0xef, 0x51, 0xb1, 0x4a, 0x8c, 0xd4, 0xce, 0x77, 0x3a, 0xb5, - 0xda, 0x9a, 0xd2, 0xef, 0x4e, 0xa7, 0xe6, 0xbb, 0xf2, 0x77, 0x99, 0x91, 0x8b, 0x36, 0x34, 0xe0, - 0xd9, 0x3e, 0x94, 0xca, 0x67, 0x95, 0x51, 0x3f, 0xab, 0x2b, 0x50, 0xdc, 0xa1, 0x0d, 0x26, 0x42, - 0xd1, 0x06, 0x36, 0xed, 0xe1, 0x02, 0x4f, 0x2f, 0x68, 0x4e, 0x86, 0xf0, 0x9a, 0xef, 0x6e, 0x2e, - 0x88, 0x5a, 0x5a, 0x72, 0x87, 0x54, 0x45, 0x34, 0x72, 0x0d, 0x66, 0x62, 0xbe, 0xfa, 0x91, 0xf3, - 0xa7, 0x39, 0xcd, 0x8a, 0xf4, 0xc8, 0x2e, 0xcf, 0xc3, 0xb8, 0x9c, 0x06, 0x2f, 0x74, 0x21, 0x31, - 0xc7, 0x04, 0x8c, 0xad, 0x72, 0x51, 0xdd, 0xdf, 0xcd, 0x4a, 0x91, 0x69, 0xd1, 0x75, 0x03, 0x3f, - 0xf0, 0xec, 0x8e, 0x76, 0x6f, 0x22, 0x2d, 0x38, 0xeb, 0xda, 0xdd, 0x60, 0x6f, 0xc1, 0x62, 0xff, - 0xba, 0x9e, 0xf4, 0xe7, 0xac, 0x4b, 0x4b, 0xb8, 0xb1, 0x85, 0xeb, 0xfa, 0xd6, 0x59, 0x62, 0xd8, - 0x25, 0x15, 0x99, 0x9d, 0xf0, 0x0a, 0xd7, 0xe5, 0x67, 0xcc, 0x33, 0x9c, 0x67, 0x02, 0x8b, 0x2c, - 0xc3, 0xb8, 0x9a, 0xe7, 0x3f, 0xf5, 0xe2, 0xa4, 0xa4, 0xfb, 0xd7, 0xb9, 0x8e, 0x6d, 0x47, 0x25, - 0xe4, 0x1d, 0x18, 0x75, 0x1a, 0x22, 0x7e, 0x9c, 0xb8, 0x3e, 0xe9, 0x22, 0x7b, 0xb5, 0xc1, 0xc3, - 0xc9, 0x45, 0x3c, 0xd8, 0xdd, 0xcb, 0x11, 0xd0, 0xc5, 0x09, 0xed, 0x86, 0x69, 0x2c, 0xca, 0xd3, - 0x39, 0x49, 0x96, 0xc8, 0xc2, 0x7e, 0x1a, 0x86, 0x7d, 0x25, 0xa0, 0x9d, 0x29, 0x7e, 0x19, 0x7f, - 0x09, 0xae, 0x0c, 0x3a, 0x46, 0xe4, 0x35, 0x20, 0x3d, 0x06, 0x7c, 0xd4, 0x9c, 0xb6, 0x13, 0xe3, - 0xf6, 0x3c, 0xa8, 0x11, 0xb9, 0x1c, 0x39, 0xe1, 0x12, 0xf6, 0xc0, 0x73, 0x8c, 0xff, 0x3c, 0x0b, - 0x93, 0xfa, 0x9d, 0x9a, 0xbc, 0x02, 0xf9, 0x90, 0xed, 0x64, 0xa8, 0xfb, 0x55, 0x91, 0x18, 0x73, - 0x13, 0x91, 0xd8, 0x01, 0x81, 0xef, 0x3f, 0x56, 0x4b, 0x55, 0xcf, 0x9a, 0xe3, 0x08, 0x94, 0x6a, - 0xd9, 0xbb, 0xc0, 0xb3, 0xd9, 0xe2, 0x5e, 0x16, 0x0c, 0x96, 0xbb, 0xbd, 0xc0, 0x6e, 0xf6, 0xa8, - 0x57, 0x1b, 0x67, 0xb4, 0x6c, 0x3f, 0xc1, 0x74, 0xed, 0xd1, 0x95, 0x29, 0xdf, 0xfb, 0xca, 0x24, - 0xba, 0xd2, 0xe3, 0xca, 0x34, 0xd4, 0xe7, 0xca, 0x14, 0x51, 0x86, 0x57, 0xa6, 0x17, 0x44, 0xeb, - 0x3d, 0xfb, 0xc0, 0xc2, 0x6e, 0x71, 0xc3, 0x33, 0xde, 0x2e, 0xd3, 0x3e, 0xc0, 0x87, 0xaf, 0xc5, - 0x51, 0x90, 0xaf, 0x65, 0xc6, 0xdf, 0xc8, 0xc4, 0xee, 0x2c, 0x72, 0x64, 0x5f, 0x84, 0x49, 0xa7, - 0xc5, 0x84, 0x29, 0xda, 0x50, 0x84, 0x80, 0x09, 0x73, 0x42, 0x42, 0xb9, 0x20, 0xf0, 0x12, 0x4c, - 0x85, 0x68, 0xdc, 0x59, 0x98, 0x1b, 0xb4, 0x9b, 0x21, 0xb5, 0x70, 0x16, 0x7e, 0x05, 0xa6, 0x43, - 0x44, 0x21, 0x77, 0x72, 0x39, 0x60, 0xc2, 0x2c, 0xca, 0x02, 0x91, 0x66, 0xd1, 0x37, 0x76, 0xe3, - 0x87, 0xcc, 0xa7, 0xd4, 0x2a, 0xe3, 0x9f, 0x64, 0x61, 0x26, 0x45, 0xd9, 0x42, 0x3e, 0x80, 0x19, - 0xb9, 0x69, 0xf0, 0xc3, 0x88, 0x7f, 0xcc, 0x7c, 0xbb, 0xb8, 0x9a, 0xb6, 0x5d, 0x20, 0x5a, 0xca, - 0x27, 0x3d, 0x2d, 0x36, 0x8a, 0xa8, 0xfc, 0x2f, 0xce, 0x16, 0x41, 0xde, 0x87, 0xd3, 0x22, 0x3b, - 0xb2, 0xb2, 0x53, 0x58, 0x1e, 0xdd, 0x11, 0x0b, 0xf6, 0xf9, 0xc4, 0x07, 0xe5, 0xd4, 0x95, 0xe6, - 0x98, 0x74, 0x67, 0xf9, 0x19, 0x73, 0xd6, 0x4f, 0x81, 0xc7, 0x77, 0x9f, 0x7f, 0x3b, 0x03, 0xc6, - 0xf1, 0xe3, 0x85, 0xb7, 0xa0, 0xf8, 0x80, 0xb3, 0x5b, 0x90, 0x32, 0x7a, 0x97, 0x60, 0xc2, 0xa3, - 0x3b, 0x1e, 0xf5, 0xf7, 0x94, 0xe1, 0x1b, 0x35, 0xc7, 0x05, 0x50, 0x0e, 0x8c, 0x0c, 0x53, 0x70, - 0xa2, 0xcf, 0x57, 0x12, 0x19, 0xb7, 0xc3, 0x43, 0x25, 0x75, 0x1e, 0xc8, 0x2c, 0x0c, 0xa9, 0x0d, - 0xe4, 0x3f, 0xee, 0xe6, 0x0b, 0xd9, 0x62, 0xce, 0x14, 0xc1, 0x14, 0x76, 0x9c, 0x26, 0x35, 0x7e, - 0x3d, 0x03, 0xe7, 0x7a, 0x0f, 0x1e, 0xf9, 0x40, 0x79, 0x1e, 0xcc, 0xf1, 0x58, 0x72, 0xc7, 0x8c, - 0xb7, 0xfa, 0x92, 0x22, 0xfc, 0xfb, 0xe3, 0x89, 0x81, 0x05, 0xcb, 0x4f, 0xf2, 0xc6, 0xf1, 0x86, - 0xd4, 0x2e, 0x32, 0xb9, 0x7c, 0xf3, 0x06, 0xb9, 0x0a, 0x23, 0x5c, 0xa1, 0x28, 0x1b, 0x3a, 0xa5, - 0x35, 0x74, 0xf3, 0x86, 0x29, 0xcb, 0x8d, 0xef, 0x65, 0x42, 0x95, 0x4a, 0xbc, 0xf9, 0x9b, 0x37, - 0xc8, 0x17, 0x06, 0x7b, 0xe8, 0x2b, 0xc8, 0x87, 0xbe, 0xf0, 0x91, 0xef, 0x8b, 0xda, 0x23, 0xdf, - 0x0b, 0xfd, 0xc7, 0x49, 0x5c, 0xde, 0xe2, 0xa9, 0x1b, 0xff, 0x59, 0x06, 0x2e, 0xf4, 0xa5, 0x20, - 0xe7, 0xa1, 0x50, 0x5a, 0xaf, 0x6e, 0x44, 0x33, 0xcb, 0xbe, 0x16, 0x09, 0x21, 0x77, 0x60, 0x74, - 0xd1, 0xf6, 0x9d, 0x3a, 0x5b, 0xc0, 0xa9, 0xe2, 0x68, 0x82, 0x6d, 0x88, 0xbe, 0xfc, 0x8c, 0x19, - 0xd1, 0x12, 0x0b, 0xa6, 0xf1, 0x2b, 0x48, 0xa4, 0x46, 0x8b, 0x8b, 0x22, 0x09, 0x86, 0x09, 0x32, - 0xb6, 0xc3, 0x24, 0x80, 0xf1, 0x8f, 0xef, 0xa1, 0x94, 0x3d, 0x7b, 0x37, 0xf0, 0x04, 0x21, 0x39, - 0xae, 0x40, 0x61, 0x5d, 0xaa, 0x55, 0x94, 0xcc, 0xa8, 0x52, 0x85, 0x62, 0x86, 0xa5, 0xc6, 0x5f, - 0xcf, 0x48, 0x79, 0xe1, 0xf8, 0x8e, 0x28, 0x51, 0x77, 0x1b, 0xfd, 0xa3, 0xee, 0x36, 0x3e, 0x66, - 0xd4, 0x5d, 0xe3, 0x97, 0x45, 0xc0, 0xac, 0x6a, 0x63, 0x3d, 0x96, 0x08, 0xe2, 0x93, 0x9a, 0x2d, - 0x2c, 0x69, 0xab, 0xf3, 0x92, 0x12, 0x09, 0x3c, 0x59, 0x57, 0x6f, 0xeb, 0x05, 0x65, 0xa9, 0xfe, - 0x93, 0x2c, 0x9c, 0xef, 0x47, 0x9e, 0x9a, 0xb3, 0x22, 0x73, 0xb2, 0x9c, 0x15, 0x57, 0xa1, 0xc0, - 0x61, 0x7a, 0x1a, 0x3f, 0x41, 0xca, 0x06, 0x5c, 0x16, 0x93, 0x4b, 0x30, 0x5c, 0x2a, 0xd7, 0xa2, - 0x50, 0xc5, 0xf8, 0xce, 0x66, 0xd7, 0x7d, 0x7c, 0xc1, 0x11, 0x45, 0xe4, 0xeb, 0xc9, 0xe8, 0xdc, - 0x22, 0x46, 0xf1, 0xb3, 0xca, 0x80, 0x24, 0x62, 0xd9, 0x61, 0x7b, 0xa3, 0xd8, 0x6b, 0x22, 0x9c, - 0x91, 0x99, 0x8c, 0xf4, 0x6d, 0xc0, 0xf0, 0xba, 0x47, 0x7d, 0x1a, 0xa8, 0x6f, 0x60, 0x1d, 0x84, - 0x98, 0xa2, 0x44, 0xbc, 0x50, 0xd9, 0x87, 0xdc, 0xcb, 0x60, 0x58, 0x75, 0xc2, 0xc2, 0x27, 0x2d, - 0x06, 0x36, 0x15, 0x14, 0xe3, 0x3b, 0x19, 0x98, 0x4d, 0x6b, 0x16, 0x39, 0x0f, 0xf9, 0x76, 0x6a, - 0x5c, 0xf1, 0x36, 0xb7, 0x75, 0x1e, 0xc3, 0x14, 0x6a, 0x3b, 0xae, 0xd7, 0xb2, 0x03, 0xf5, 0xe1, - 0x4f, 0x01, 0x9b, 0xc0, 0x7e, 0xdc, 0xc6, 0xbf, 0xc9, 0xbc, 0xdc, 0x6c, 0x73, 0x89, 0x48, 0xe4, - 0xf8, 0x9f, 0x51, 0x02, 0xa8, 0x36, 0xd6, 0xd7, 0x3a, 0x3c, 0x34, 0xda, 0x4d, 0xc8, 0xb3, 0x66, - 0xc5, 0x16, 0x23, 0x5b, 0x0e, 0xa5, 0xfb, 0x2b, 0x02, 0x89, 0xb7, 0x8a, 0xdd, 0x9d, 0x4c, 0x44, - 0x36, 0xb6, 0x60, 0x52, 0xc7, 0x20, 0x4b, 0x7a, 0x30, 0x8d, 0x28, 0xbb, 0xfb, 0xa2, 0xeb, 0x72, - 0xe3, 0x93, 0xc5, 0xb3, 0xdf, 0x3f, 0x9a, 0x07, 0xf6, 0x93, 0xd3, 0xa4, 0x05, 0xdb, 0x30, 0x7e, - 0x2a, 0x0b, 0xb3, 0x91, 0x11, 0xbb, 0xfc, 0x24, 0x9e, 0x5a, 0x8b, 0xca, 0x92, 0x66, 0xf1, 0x37, - 0x9f, 0x48, 0xa0, 0x2c, 0x3b, 0xd8, 0xc7, 0xd0, 0xe8, 0x0e, 0xcc, 0xf5, 0xc2, 0x27, 0xaf, 0x24, - 0x52, 0x9c, 0x0a, 0x67, 0xcb, 0x30, 0x17, 0xaa, 0x92, 0xf1, 0xf4, 0x1f, 0x65, 0xe0, 0x9c, 0x30, - 0x99, 0xb8, 0x6f, 0x3b, 0x6d, 0x4c, 0xeb, 0x5e, 0xa7, 0x4f, 0xc6, 0x22, 0xf8, 0x8e, 0xb6, 0x2d, - 0xbd, 0xa8, 0x5b, 0xc6, 0x24, 0x6a, 0xeb, 0xdd, 0x5b, 0x72, 0x15, 0xdd, 0x6a, 0xeb, 0x7c, 0xf1, - 0xe6, 0xb9, 0x07, 0x46, 0x9b, 0x01, 0x54, 0x0f, 0x0c, 0xc4, 0x30, 0x7e, 0x08, 0x9e, 0xeb, 0x5f, - 0x01, 0xf9, 0x1a, 0x4c, 0x60, 0x38, 0xff, 0x07, 0x9d, 0x5d, 0xcf, 0x6e, 0x50, 0xa9, 0x28, 0x92, - 0xef, 0x3b, 0x6a, 0x19, 0x77, 0x25, 0x16, 0x1e, 0x01, 0xbb, 0x98, 0x28, 0x40, 0x10, 0x69, 0x76, - 0x49, 0x2a, 0x37, 0xe3, 0xdb, 0x19, 0x20, 0x49, 0x1e, 0xe4, 0x16, 0x8c, 0x3f, 0xd8, 0x28, 0xd7, - 0x02, 0xdb, 0x0b, 0x96, 0xdd, 0xae, 0x27, 0x5c, 0x74, 0xb9, 0x81, 0x78, 0x50, 0x67, 0x3b, 0x83, - 0x17, 0x58, 0x7b, 0x6e, 0xd7, 0x33, 0x35, 0x3c, 0x8c, 0x77, 0x4b, 0xe9, 0x7e, 0xc3, 0x3e, 0xd4, - 0xe3, 0xdd, 0x0a, 0x98, 0x16, 0xef, 0x56, 0xc0, 0x8c, 0xbf, 0x9d, 0x81, 0x67, 0xe5, 0x5b, 0x4a, - 0x23, 0xa5, 0x2d, 0x65, 0x74, 0x83, 0xf2, 0x64, 0x88, 0x92, 0x7e, 0xb2, 0xe9, 0xb4, 0xf4, 0x14, - 0xc4, 0x06, 0xa2, 0x90, 0xca, 0x69, 0xc9, 0x7b, 0x90, 0xaf, 0x05, 0x6e, 0x67, 0x00, 0x57, 0xc1, - 0x62, 0x38, 0xa3, 0x81, 0xdb, 0x41, 0x16, 0x48, 0x69, 0x50, 0x98, 0x55, 0x1b, 0x27, 0x5b, 0x4c, - 0xee, 0xc3, 0x88, 0xf0, 0xe1, 0x8e, 0xe9, 0x9d, 0xfa, 0xf4, 0x69, 0x71, 0x4a, 0xfa, 0x23, 0x8a, - 0x10, 0x19, 0xa6, 0xe4, 0x61, 0xfc, 0x64, 0x06, 0xc6, 0x98, 0xf0, 0x80, 0x57, 0xae, 0x4f, 0xba, - 0xa4, 0x75, 0x39, 0x50, 0xaa, 0x2d, 0x43, 0xf6, 0x03, 0x1d, 0xae, 0xaf, 0xc3, 0x54, 0x8c, 0x80, - 0x18, 0xe8, 0x89, 0xd2, 0x74, 0xea, 0x36, 0x0f, 0x9f, 0xc9, 0x75, 0x7e, 0x1a, 0xcc, 0xf8, 0x97, - 0x32, 0x30, 0xbb, 0xb6, 0x1f, 0xd8, 0x55, 0xbc, 0x42, 0x9a, 0xdd, 0xa6, 0xfc, 0xde, 0x99, 0x40, - 0x24, 0x1f, 0xe5, 0xb8, 0x95, 0x3c, 0x17, 0x88, 0x04, 0xcc, 0x0c, 0x4b, 0xc9, 0x32, 0x14, 0xc4, - 0xf9, 0xe2, 0x8b, 0xc8, 0x16, 0xf2, 0xcd, 0x59, 0x67, 0x2c, 0x90, 0x58, 0x4f, 0x70, 0x0b, 0x13, - 0x34, 0x66, 0x48, 0x6d, 0xfc, 0x69, 0x06, 0xce, 0xf4, 0xa0, 0x21, 0x6f, 0xc3, 0x10, 0x1a, 0xfb, - 0x89, 0xd9, 0x3b, 0xdf, 0xa3, 0x8a, 0xa0, 0xbe, 0xb7, 0x79, 0x83, 0x1f, 0x44, 0x2d, 0xf6, 0xc3, - 0xe4, 0x54, 0xe4, 0x03, 0x18, 0x2d, 0x35, 0x1a, 0xe2, 0x5e, 0x92, 0xd5, 0xee, 0x25, 0x3d, 0x6a, - 0xbc, 0x16, 0xe2, 0xf3, 0x7b, 0x09, 0x37, 0x3b, 0x69, 0x34, 0x2c, 0x61, 0xc8, 0x18, 0xf1, 0x3b, - 0xf7, 0x16, 0x4c, 0xea, 0xc8, 0x27, 0xba, 0x97, 0x7c, 0x2f, 0x03, 0x45, 0xbd, 0x0d, 0x9f, 0x8e, - 0x27, 0x65, 0xda, 0x34, 0x1f, 0xb3, 0xa8, 0x7e, 0x26, 0x0b, 0xa7, 0x52, 0x47, 0x98, 0xbc, 0x06, - 0xc3, 0xa5, 0x4e, 0xa7, 0x5a, 0x11, 0xab, 0x4a, 0x08, 0x3c, 0xa8, 0x69, 0xd5, 0xae, 0x6d, 0x1c, - 0x89, 0xdc, 0x84, 0x02, 0xae, 0x4c, 0x46, 0x90, 0x8d, 0x62, 0x4c, 0xf0, 0xa7, 0x8d, 0x58, 0x8c, - 0x09, 0x89, 0x48, 0x6e, 0xc3, 0xa4, 0x70, 0xaa, 0x32, 0xe9, 0x2e, 0x7d, 0x14, 0x06, 0x3b, 0xc3, - 0x78, 0x6c, 0xd2, 0x05, 0xcb, 0xf2, 0x78, 0x99, 0xea, 0x56, 0xa4, 0x53, 0x61, 0xca, 0x5d, 0xc6, - 0x53, 0xe5, 0xc4, 0x03, 0x5d, 0xf0, 0x94, 0xbb, 0xd8, 0x88, 0x1e, 0xbc, 0x12, 0x94, 0xe1, 0x74, - 0x95, 0x7c, 0xdf, 0xd9, 0x6d, 0xb7, 0x68, 0x3b, 0xf8, 0xf4, 0xa6, 0x2b, 0xaa, 0x63, 0xa0, 0xe9, - 0xfa, 0x6e, 0x9e, 0x7f, 0xcc, 0x71, 0xb2, 0x63, 0xb2, 0xca, 0x57, 0x60, 0x84, 0xbb, 0x73, 0xc9, - 0x2f, 0xe3, 0x42, 0x6a, 0x13, 0x38, 0xce, 0xe6, 0x0d, 0x2e, 0xbe, 0x70, 0xab, 0x43, 0xdf, 0x94, - 0xa4, 0x64, 0x13, 0xc6, 0xca, 0x4d, 0x6a, 0xb7, 0xbb, 0x9d, 0x8d, 0xc1, 0x14, 0x8c, 0x73, 0xa2, - 0x2f, 0xe3, 0x75, 0x4e, 0x86, 0x8a, 0x49, 0xdc, 0xc9, 0x55, 0x46, 0x64, 0x23, 0x34, 0x44, 0xca, - 0xa3, 0x3e, 0xf4, 0x73, 0x7d, 0xc6, 0x27, 0x0e, 0x44, 0x3a, 0xdd, 0xca, 0x4e, 0x58, 0x2a, 0x59, - 0x30, 0xb9, 0x62, 0xfb, 0xc1, 0x86, 0x67, 0xb7, 0x7d, 0x8c, 0xc8, 0x30, 0x80, 0x9b, 0xac, 0x4c, - 0x47, 0x37, 0x85, 0xda, 0xc8, 0x20, 0x24, 0xc5, 0x36, 0xc7, 0xd8, 0x31, 0x79, 0xe9, 0xb6, 0xd3, - 0xb6, 0x9b, 0xce, 0xb7, 0xa4, 0xbd, 0x26, 0x97, 0x97, 0x76, 0x24, 0xd0, 0x8c, 0xca, 0x8d, 0xaf, - 0x26, 0xe6, 0x8d, 0xb7, 0x72, 0xec, 0xff, 0xa5, 0xee, 0x7a, 0x7e, 0xdc, 0x36, 0xae, 0xff, 0x92, - 0xd2, 0xae, 0x77, 0x9f, 0xf6, 0x07, 0x77, 0xe2, 0xac, 0xf7, 0xbb, 0xb6, 0xd7, 0xfe, 0xaa, 0xae, - 0x53, 0x33, 0x8d, 0xd3, 0xc4, 0x4d, 0x13, 0xbb, 0x48, 0x5d, 0xae, 0x34, 0x5a, 0xd1, 0x2b, 0x91, - 0x34, 0x49, 0x79, 0x63, 0xf7, 0x07, 0x21, 0xef, 0xd2, 0x6b, 0xb5, 0x32, 0xa5, 0xe8, 0x87, 0x5d, - 0xe7, 0xd6, 0x4b, 0x2e, 0x45, 0x80, 0x22, 0xd7, 0x16, 0x28, 0x0a, 0xe4, 0xbf, 0xe8, 0x3f, 0x10, - 0x20, 0x28, 0x90, 0x43, 0x6f, 0x05, 0x82, 0xd6, 0x40, 0x2f, 0xbd, 0xf7, 0x92, 0x53, 0x31, 0xbf, - 0xc8, 0x21, 0x29, 0x29, 0xbb, 0xb6, 0xd1, 0xa2, 0x37, 0xf1, 0xcd, 0x9b, 0xd1, 0x90, 0x33, 0xf3, - 0x66, 0xde, 0xbc, 0xf7, 0x3e, 0x0f, 0x4e, 0x71, 0x17, 0x7d, 0xe6, 0xb2, 0xee, 0x60, 0xab, 0x6a, - 0x5a, 0xbb, 0x9a, 0x82, 0x56, 0x01, 0x1c, 0xd7, 0xae, 0x60, 0xcf, 0x23, 0xcf, 0x2a, 0x79, 0xe6, - 0xfe, 0xec, 0xb5, 0x56, 0x43, 0x2b, 0x48, 0x2e, 0xed, 0xc5, 0xf2, 0x17, 0x0a, 0x6c, 0x4c, 0x1e, - 0x4a, 0xe4, 0x03, 0x0d, 0x6a, 0xe0, 0x57, 0xcd, 0x3f, 0x98, 0x39, 0xee, 0x13, 0xc9, 0xd9, 0xe0, - 0x88, 0x11, 0x73, 0xba, 0x57, 0x85, 0xe5, 0x28, 0x49, 0xa4, 0xd6, 0x39, 0x2c, 0x57, 0x60, 0x73, - 0x5a, 0x1b, 0xe9, 0x57, 0x5d, 0x83, 0x92, 0xe1, 0x38, 0x0d, 0xb3, 0x62, 0xf8, 0xa6, 0x6d, 0x69, - 0x0a, 0x5a, 0x82, 0xf9, 0x5d, 0xd7, 0x6e, 0x39, 0x9a, 0x5a, 0xfe, 0x54, 0x81, 0x15, 0x33, 0x1a, - 0x85, 0x47, 0xcc, 0xff, 0xe5, 0x45, 0x17, 0xdf, 0x8d, 0xd4, 0xe2, 0xdb, 0x8c, 0xc3, 0x7f, 0xe2, - 0x3f, 0x38, 0xd6, 0xca, 0xfb, 0x8b, 0x02, 0xeb, 0xb9, 0x3a, 0xc8, 0x83, 0x53, 0xc6, 0xbe, 0x67, - 0x9b, 0xd5, 0x0a, 0xef, 0x99, 0x38, 0x95, 0x73, 0x6a, 0xfe, 0x5f, 0x98, 0x77, 0xed, 0x93, 0x61, - 0xd0, 0xeb, 0x1c, 0x4a, 0xe9, 0x1b, 0xea, 0x73, 0xae, 0x68, 0x89, 0xee, 0x64, 0x1f, 0x8d, 0x07, - 0x21, 0x6d, 0x56, 0x4d, 0xdd, 0x68, 0xc6, 0xf4, 0x7c, 0xc3, 0x2c, 0xdf, 0x3c, 0x29, 0xcf, 0x37, - 0x9d, 0xb4, 0xb7, 0xb3, 0x02, 0x25, 0xae, 0xb5, 0x50, 0x85, 0xe0, 0x13, 0x05, 0x36, 0xa7, 0xf5, - 0x95, 0x28, 0x42, 0x69, 0x57, 0xfb, 0x8d, 0x18, 0xcb, 0x2f, 0xed, 0x63, 0x2f, 0xd8, 0xd0, 0x4d, - 0x28, 0xb1, 0xec, 0x94, 0xde, 0xb5, 0x96, 0x6b, 0xf2, 0x09, 0x72, 0xfe, 0x9f, 0x5f, 0x5d, 0x38, - 0xc3, 0x73, 0xf2, 0x0f, 0xaf, 0xa5, 0x13, 0xb4, 0x6f, 0x2a, 0xae, 0x5c, 0xa3, 0xfc, 0xb1, 0x02, - 0x5b, 0xd3, 0x5f, 0x92, 0xec, 0x32, 0x3e, 0x39, 0x9b, 0x27, 0xde, 0xca, 0x74, 0x97, 0xa1, 0xe7, - 0xf5, 0x8c, 0xbb, 0x72, 0xcc, 0x48, 0x2a, 0x65, 0x12, 0xff, 0xcb, 0xf9, 0x50, 0xd2, 0x95, 0x04, - 0x63, 0xf9, 0x77, 0x2a, 0x6c, 0x90, 0x09, 0xd4, 0x0d, 0x87, 0x43, 0x63, 0x3c, 0x7a, 0x18, 0x46, - 0x23, 0x7e, 0xa4, 0x42, 0xef, 0xc2, 0xc2, 0xc3, 0x93, 0xdd, 0x06, 0x32, 0x76, 0x84, 0x80, 0x0a, - 0x65, 0xe1, 0x2e, 0x42, 0x7e, 0xa3, 0xf3, 0x20, 0xe5, 0x9f, 0xa1, 0x32, 0x75, 0xd9, 0x5d, 0xea, - 0xc7, 0x59, 0x68, 0xde, 0x83, 0x79, 0xaa, 0xfd, 0x73, 0xd1, 0x28, 0x8e, 0xb4, 0x93, 0x7b, 0x46, - 0xef, 0x06, 0x5c, 0x56, 0x01, 0xbd, 0x09, 0x90, 0x60, 0xc6, 0x71, 0xd9, 0x27, 0xd4, 0xe8, 0x18, - 0x36, 0xce, 0x5d, 0x7a, 0xf4, 0xa0, 0xcd, 0x81, 0xd8, 0x74, 0x58, 0x17, 0x9f, 0xa4, 0x2f, 0xa2, - 0xe2, 0xb9, 0x1d, 0x66, 0x8d, 0x15, 0x98, 0x7d, 0x1e, 0x19, 0x5f, 0xfe, 0x87, 0x0a, 0x4b, 0xfb, - 0xe4, 0xa0, 0x40, 0xd5, 0xdf, 0xd9, 0xea, 0xf4, 0xdb, 0x50, 0x6a, 0xf4, 0xda, 0xfc, 0xee, 0x7e, - 0xc8, 0x81, 0x39, 0xa8, 0xcb, 0x6e, 0xb7, 0xd7, 0x16, 0x66, 0x80, 0xa1, 0x2b, 0x33, 0x7d, 0x83, - 0xbb, 0xf1, 0x2d, 0x58, 0x60, 0x7e, 0x0f, 0xfc, 0xa2, 0x46, 0x1c, 0x15, 0xe3, 0x1e, 0x5d, 0x65, - 0xc5, 0xd2, 0x75, 0x33, 0xf3, 0x9c, 0x90, 0xcf, 0x2d, 0x1c, 0x97, 0x43, 0x52, 0xf6, 0xe7, 0x8f, - 0xa7, 0xec, 0x4b, 0xf1, 0xc7, 0x0b, 0xc7, 0x89, 0x3f, 0xde, 0xba, 0x0e, 0x25, 0xa9, 0x3f, 0x27, - 0x3a, 0x39, 0xfe, 0x5a, 0x85, 0x15, 0xfa, 0x56, 0xb1, 0x29, 0xe9, 0x7f, 0xf3, 0xea, 0xe2, 0x46, - 0xea, 0xea, 0x62, 0x53, 0x1e, 0x2f, 0xf6, 0x66, 0x33, 0xee, 0x2c, 0x6e, 0xc1, 0x7a, 0x8e, 0x11, - 0xbd, 0x03, 0xf3, 0xa4, 0xfb, 0x42, 0xd5, 0xd3, 0xb2, 0x33, 0x20, 0xc1, 0xaa, 0x21, 0x2f, 0x3e, - 0x74, 0x19, 0x77, 0xf9, 0x5f, 0x0a, 0x2c, 0x73, 0x10, 0xc1, 0xe8, 0x41, 0xef, 0x1b, 0x3f, 0xe7, - 0xe5, 0xec, 0xe7, 0x64, 0xc1, 0x33, 0xfc, 0x73, 0xfe, 0xa7, 0x3f, 0xe2, 0xf5, 0xd4, 0x47, 0x3c, - 0x13, 0x47, 0xae, 0x8b, 0xd7, 0x99, 0xf1, 0x0d, 0xff, 0x44, 0xb1, 0x5c, 0xd2, 0x8c, 0xe8, 0xe7, - 0xb0, 0x64, 0x85, 0x4f, 0x52, 0x1a, 0xd3, 0xe5, 0x29, 0x8d, 0x5e, 0x8d, 0x19, 0xd9, 0x9a, 0xa2, - 0x9b, 0x4d, 0x14, 0x3e, 0x09, 0x72, 0x66, 0x9c, 0xa4, 0x49, 0xa2, 0x34, 0xa5, 0xab, 0x9d, 0x64, - 0xea, 0x73, 0x17, 0x4d, 0x1a, 0x0f, 0xf6, 0xc7, 0x22, 0x40, 0xe2, 0xdd, 0x46, 0x16, 0x60, 0x98, - 0x82, 0xda, 0xe5, 0x77, 0xc7, 0x94, 0x24, 0xcf, 0x71, 0x4e, 0x42, 0x97, 0xf9, 0xa5, 0xa8, 0x3a, - 0x1d, 0x59, 0x80, 0x5e, 0x8f, 0x56, 0xb8, 0xf7, 0xd8, 0x61, 0xd8, 0x6d, 0x33, 0x59, 0x5c, 0xd8, - 0xb9, 0x44, 0x81, 0x64, 0x62, 0xea, 0x94, 0x6c, 0x30, 0xd4, 0xc7, 0xac, 0x4a, 0x18, 0x72, 0x1e, - 0xa3, 0xc5, 0xe7, 0xf7, 0x18, 0x9d, 0x7f, 0x0e, 0x8f, 0xd1, 0x85, 0x63, 0x7a, 0x8c, 0x3a, 0xb0, - 0xd4, 0x89, 0x1e, 0x87, 0xd1, 0xa8, 0x37, 0x78, 0x4a, 0xfd, 0xc9, 0x92, 0xab, 0x2c, 0xf2, 0xa9, - 0x4d, 0x51, 0xc6, 0xc6, 0x9b, 0x6e, 0x98, 0x31, 0xbf, 0x3c, 0xdc, 0x31, 0x11, 0x7d, 0x1f, 0x12, - 0xab, 0x07, 0x47, 0xfe, 0x9c, 0xbe, 0xcf, 0x1e, 0x08, 0xa3, 0xc8, 0x8f, 0x21, 0x6d, 0xfc, 0xe0, - 0xf1, 0x16, 0x2c, 0xdd, 0x98, 0x5c, 0x20, 0x83, 0x69, 0x1c, 0x48, 0xf6, 0x11, 0xee, 0x50, 0xf3, - 0xb5, 0x0a, 0x28, 0xdf, 0x71, 0x74, 0x03, 0x4a, 0x4c, 0xf4, 0x07, 0x83, 0xe1, 0x87, 0xdc, 0xcd, - 0x91, 0xc5, 0xfb, 0x49, 0x64, 0x39, 0xde, 0x8f, 0x91, 0xdd, 0xe1, 0x87, 0x5d, 0xf4, 0x33, 0x78, - 0x85, 0x0e, 0x7c, 0x3f, 0x1c, 0x74, 0x7a, 0x87, 0x01, 0x45, 0x5c, 0x69, 0x77, 0x39, 0xa6, 0xfc, - 0x1b, 0x34, 0xf9, 0x49, 0xbe, 0x78, 0xca, 0x04, 0xa1, 0xde, 0x84, 0x0e, 0xe5, 0x74, 0x18, 0x23, - 0xf2, 0x41, 0x93, 0xeb, 0x3f, 0x18, 0x77, 0xbb, 0x7c, 0xce, 0xe9, 0x34, 0x5f, 0x75, 0xa6, 0x6c, - 0x4a, 0xc3, 0xab, 0x49, 0xc3, 0xb5, 0x71, 0xb7, 0x8b, 0xde, 0x05, 0xe8, 0x45, 0xc1, 0xa3, 0xce, - 0x70, 0xc8, 0x0c, 0x19, 0xb1, 0x27, 0x70, 0x42, 0x95, 0x87, 0xaf, 0x17, 0x35, 0x19, 0x91, 0x0c, - 0x5f, 0xbf, 0x7d, 0x14, 0xd2, 0xf8, 0x19, 0x3a, 0xf3, 0xe6, 0x39, 0x4a, 0xa4, 0x20, 0xa6, 0xa7, - 0xd1, 0x51, 0xe8, 0x75, 0x3e, 0x12, 0xde, 0x4c, 0xf7, 0x60, 0x9d, 0x3b, 0xa2, 0xec, 0x77, 0x46, - 0x0f, 0xf9, 0xb9, 0xfb, 0x45, 0x0e, 0xed, 0xd2, 0xc1, 0xfb, 0xaf, 0x45, 0x00, 0x63, 0xdf, 0x13, - 0xa1, 0xa9, 0x57, 0x60, 0x9e, 0x68, 0x13, 0xe2, 0x56, 0x82, 0xde, 0xe9, 0xd2, 0x76, 0xe5, 0x3b, - 0x5d, 0xca, 0x41, 0xe4, 0x84, 0x1b, 0x1e, 0xd1, 0x8b, 0x31, 0x35, 0xb9, 0xc2, 0x18, 0x30, 0x52, - 0xea, 0xf4, 0xca, 0x48, 0xa8, 0x01, 0x90, 0x04, 0x8b, 0x72, 0xfd, 0x76, 0x3d, 0x89, 0xba, 0xe2, - 0x05, 0x1c, 0xfe, 0x2f, 0x09, 0x38, 0x95, 0xa7, 0x4f, 0xc2, 0x86, 0xf6, 0xa0, 0xe8, 0xb7, 0x63, - 0x3f, 0xd7, 0x29, 0x21, 0xb4, 0x17, 0x39, 0xe6, 0x7f, 0x12, 0x46, 0xbb, 0x3a, 0x6a, 0xa7, 0x52, - 0xa3, 0xd0, 0x46, 0x10, 0x86, 0x05, 0x9e, 0xcf, 0x69, 0x0a, 0x9e, 0x02, 0x4f, 0xe7, 0xc4, 0x51, - 0x94, 0x28, 0x51, 0x3e, 0xed, 0xf0, 0xcc, 0x4d, 0x6f, 0x43, 0xc1, 0xf3, 0x9a, 0x3c, 0x70, 0x64, - 0x25, 0xd1, 0x55, 0x3c, 0xaf, 0x29, 0x72, 0xd6, 0x3d, 0x92, 0xaa, 0x11, 0x66, 0xf4, 0x43, 0x28, - 0x49, 0x07, 0x71, 0x1e, 0x72, 0x45, 0xbf, 0x41, 0x27, 0x21, 0xcb, 0xe2, 0x4c, 0xe2, 0x46, 0x0d, - 0xd0, 0xf6, 0xc6, 0xf7, 0x43, 0xa3, 0xdf, 0xa7, 0x3e, 0x9a, 0x8f, 0xc3, 0x01, 0x83, 0x26, 0x5c, - 0x4c, 0x00, 0x88, 0x82, 0x76, 0xbf, 0x1f, 0x1c, 0x8a, 0x52, 0xf9, 0x66, 0x26, 0x5b, 0x13, 0x39, - 0xb0, 0xee, 0x85, 0xa3, 0x71, 0x9f, 0xb9, 0x61, 0xd4, 0x7a, 0x03, 0xa2, 0x9a, 0x30, 0x81, 0x41, - 0xb1, 0x5a, 0x86, 0xa4, 0x50, 0xf8, 0xbe, 0x3c, 0xe8, 0x0d, 0x32, 0x6a, 0x4a, 0xbe, 0x72, 0x39, - 0x94, 0x87, 0x9c, 0xec, 0xf7, 0x69, 0x85, 0x87, 0xee, 0xf7, 0x42, 0xe1, 0x49, 0xd4, 0x9c, 0x37, - 0x27, 0x04, 0x11, 0x53, 0x33, 0x9a, 0x14, 0x44, 0x9c, 0x0a, 0x1d, 0xfe, 0xac, 0x28, 0x81, 0x53, - 0xf0, 0xb1, 0x78, 0x1f, 0xe0, 0x56, 0xaf, 0x13, 0x35, 0xc3, 0xd1, 0xc3, 0xde, 0xa1, 0x14, 0xcb, - 0x5c, 0xfa, 0x45, 0xaf, 0x13, 0x05, 0x8f, 0x28, 0xf9, 0xeb, 0xaf, 0x2e, 0x48, 0x4c, 0xae, 0xf4, - 0x1b, 0x7d, 0x17, 0x96, 0xc8, 0x93, 0x9f, 0x38, 0x93, 0xb0, 0x0b, 0x4c, 0x5a, 0x9b, 0xe7, 0xbe, - 0x8c, 0x19, 0xd0, 0x75, 0x8a, 0x1f, 0xda, 0xe9, 0x8f, 0xa4, 0x63, 0xb5, 0x00, 0x0b, 0xed, 0xf4, - 0x47, 0x59, 0xbc, 0x21, 0x89, 0x19, 0xd5, 0xe3, 0xae, 0x0b, 0x04, 0x5a, 0x0e, 0x53, 0x4a, 0x6f, - 0xe9, 0xf8, 0x5c, 0x0b, 0x04, 0xd0, 0x89, 0x9c, 0x2b, 0x24, 0x53, 0x8d, 0x76, 0xc2, 0xab, 0x57, - 0x99, 0x59, 0x85, 0xef, 0x6e, 0xac, 0x13, 0xc3, 0x87, 0x87, 0xc1, 0x01, 0x25, 0xa7, 0x3a, 0x11, - 0x33, 0xa3, 0x1d, 0x58, 0x63, 0x11, 0x77, 0x31, 0x92, 0x3d, 0xdf, 0xe9, 0xa8, 0x6c, 0x4b, 0xa0, - 0xee, 0xe5, 0xbf, 0xcf, 0x54, 0x40, 0x35, 0x98, 0xa7, 0xaa, 0x25, 0x0f, 0x7b, 0x3a, 0x2b, 0xeb, - 0xd4, 0xd9, 0x75, 0x44, 0xe5, 0x0a, 0xd5, 0xa6, 0x65, 0xb9, 0x42, 0x59, 0xd1, 0x07, 0x00, 0x38, - 0x1a, 0xf4, 0xba, 0x5d, 0x0a, 0xc5, 0xb3, 0x48, 0x15, 0xb3, 0xf3, 0xe9, 0xf5, 0x48, 0x5b, 0x49, - 0x98, 0x78, 0x84, 0x39, 0x7d, 0x0e, 0x32, 0x80, 0x3d, 0x52, 0x5b, 0x65, 0x13, 0x16, 0xd8, 0x62, - 0xa4, 0xb0, 0x56, 0x1c, 0x33, 0x53, 0x02, 0x45, 0x62, 0xb0, 0x56, 0x9c, 0x9e, 0x87, 0xb5, 0x92, - 0x2a, 0x94, 0xf7, 0xe0, 0xf4, 0xa4, 0x17, 0x4b, 0x29, 0xc3, 0xca, 0x71, 0x95, 0xe1, 0x3f, 0x14, - 0x60, 0x99, 0xb6, 0x26, 0xa4, 0xb0, 0x01, 0x2b, 0xde, 0xf8, 0x7e, 0x1c, 0x1e, 0x2a, 0xa4, 0x31, - 0xed, 0xdf, 0x50, 0x2e, 0x90, 0x0d, 0x5e, 0xa9, 0x1a, 0x08, 0xc3, 0xaa, 0xd8, 0x09, 0x76, 0x85, - 0xaf, 0x5b, 0x8c, 0x28, 0x25, 0x80, 0x0b, 0xf2, 0x99, 0x3c, 0x32, 0x95, 0x92, 0xfd, 0xa0, 0x70, - 0x92, 0xfd, 0xa0, 0x78, 0xac, 0xfd, 0xe0, 0x27, 0xb0, 0x2c, 0xfe, 0x8d, 0x4a, 0xf2, 0xf9, 0x17, - 0x93, 0xe4, 0xa9, 0xc6, 0x50, 0x23, 0x96, 0xe8, 0x0b, 0x33, 0x25, 0x3a, 0xb5, 0x22, 0x8a, 0x55, - 0x96, 0x4b, 0xce, 0xc7, 0xdb, 0xa0, 0x50, 0xf7, 0xbb, 0x15, 0xe7, 0x39, 0x76, 0xc9, 0x77, 0x60, - 0xa9, 0xd1, 0x13, 0x06, 0x24, 0xe9, 0xe6, 0xbe, 0x2b, 0x88, 0xf2, 0x71, 0x21, 0xe6, 0x8c, 0x77, - 0xb7, 0xc2, 0xcb, 0xd8, 0xdd, 0xae, 0x03, 0x70, 0x27, 0xca, 0x04, 0xa2, 0x9a, 0x2e, 0x19, 0x11, - 0xfd, 0x93, 0x36, 0x20, 0x48, 0xcc, 0x44, 0x3a, 0x71, 0x57, 0x13, 0xe3, 0xe0, 0xa0, 0x37, 0x8e, - 0x46, 0xa9, 0x9c, 0x2e, 0x3c, 0x10, 0x90, 0x6c, 0x09, 0xb4, 0x4c, 0x16, 0x0f, 0x99, 0x6a, 0x2f, - 0x77, 0x40, 0xd0, 0xed, 0xd8, 0x47, 0x6e, 0x66, 0x8a, 0xcb, 0x72, 0xee, 0x0b, 0x4d, 0xf5, 0x8c, - 0x2b, 0x7f, 0xa1, 0xc8, 0x70, 0x7e, 0xcf, 0x31, 0xd4, 0xef, 0x01, 0xc4, 0x16, 0x7c, 0x31, 0xd6, - 0x4c, 0x93, 0x8b, 0xa9, 0xf2, 0x57, 0x4e, 0x78, 0xa5, 0xb7, 0x29, 0xbc, 0xac, 0xb7, 0xf1, 0xa1, - 0x64, 0xff, 0x72, 0xd4, 0x4e, 0x5c, 0x3e, 0xc0, 0x8b, 0x4f, 0xb2, 0x54, 0x32, 0x89, 0x54, 0x9c, - 0xc9, 0x39, 0x78, 0x6a, 0x2a, 0xce, 0xb8, 0x62, 0xf9, 0x36, 0xac, 0xc9, 0x21, 0x0a, 0x4f, 0xa3, - 0x03, 0xf4, 0x23, 0x86, 0x43, 0xa2, 0xa4, 0x74, 0x1c, 0x89, 0x89, 0x48, 0xdc, 0xa7, 0xd1, 0x01, - 0x3b, 0xff, 0xb4, 0x9f, 0xc8, 0x7d, 0xa5, 0xda, 0xe7, 0x97, 0x0a, 0xa0, 0x3c, 0xbb, 0x2c, 0x4d, - 0x94, 0xff, 0xc2, 0xe9, 0x32, 0x73, 0x2a, 0x2b, 0x9e, 0xe4, 0x54, 0xa6, 0xff, 0x56, 0x81, 0x35, - 0xd3, 0x68, 0x72, 0xec, 0x3d, 0x66, 0x89, 0xf8, 0x7f, 0x38, 0x6f, 0x1a, 0xcd, 0xc0, 0xb1, 0x1b, - 0x66, 0xe5, 0x6e, 0x30, 0x11, 0x52, 0xe7, 0x3c, 0xfc, 0x5f, 0x9e, 0x25, 0xb1, 0x58, 0x9c, 0x83, - 0xcd, 0x7c, 0xb1, 0x80, 0xdd, 0x99, 0x5c, 0x59, 0x20, 0xf4, 0x14, 0xf4, 0x9b, 0xb0, 0x26, 0xd0, - 0x68, 0xfc, 0x86, 0x47, 0x41, 0xec, 0xd6, 0xa0, 0x74, 0x07, 0xbb, 0x66, 0xed, 0x6e, 0x50, 0x6b, - 0x35, 0x1a, 0xda, 0x1c, 0x5a, 0x81, 0x25, 0x4e, 0xa8, 0x18, 0x9a, 0x82, 0x96, 0x61, 0xd1, 0xb4, - 0x3c, 0x5c, 0x69, 0xb9, 0x58, 0x53, 0xf5, 0x9b, 0xb0, 0xea, 0x0c, 0x3a, 0x8f, 0xdb, 0xa3, 0x70, - 0x2f, 0x7c, 0x4a, 0x0d, 0x0e, 0xa7, 0xa0, 0xe0, 0x1a, 0xfb, 0xda, 0x1c, 0x02, 0x58, 0x70, 0xf6, - 0x2a, 0xde, 0x5b, 0x6f, 0x69, 0x0a, 0x2a, 0xc1, 0xa9, 0xdd, 0x8a, 0x13, 0xec, 0x35, 0x3d, 0x4d, - 0x25, 0x0f, 0xc6, 0xbe, 0x47, 0x1f, 0x0a, 0xfa, 0xf7, 0x60, 0x9d, 0x9e, 0x15, 0x1a, 0x9d, 0xe1, - 0x28, 0x8c, 0xc2, 0x01, 0xed, 0xc3, 0x32, 0x2c, 0x7a, 0x21, 0x59, 0xe4, 0xa3, 0x90, 0x75, 0xa0, - 0x39, 0xee, 0x8e, 0x3a, 0xfd, 0x6e, 0xf8, 0x2b, 0x4d, 0xd1, 0xaf, 0xc3, 0x9a, 0xdb, 0x1b, 0x8f, - 0x3a, 0xd1, 0x91, 0x37, 0x22, 0x1c, 0x47, 0x4f, 0xd1, 0xab, 0xb0, 0xde, 0xb2, 0x8c, 0xe6, 0x8e, - 0xb9, 0xdb, 0xb2, 0x5b, 0x5e, 0xd0, 0x34, 0xfc, 0x4a, 0x9d, 0x99, 0x3b, 0x9a, 0xb6, 0xe7, 0x07, - 0x2e, 0xae, 0x60, 0xcb, 0xd7, 0x14, 0xfd, 0x37, 0x0a, 0xac, 0xb6, 0x86, 0xdc, 0x45, 0xb7, 0x45, - 0x5d, 0xf8, 0x2f, 0xc2, 0xb9, 0x96, 0x87, 0xdd, 0xc0, 0xb7, 0xf7, 0xb0, 0x15, 0xb4, 0x3c, 0x63, - 0x37, 0x8b, 0xe7, 0x74, 0x01, 0xce, 0x4a, 0x1c, 0x2e, 0xae, 0xd8, 0x77, 0xb0, 0x1b, 0x38, 0x86, - 0xe7, 0xed, 0xdb, 0x6e, 0x55, 0x53, 0xd0, 0x16, 0x6c, 0x4c, 0x60, 0x68, 0xd6, 0x0c, 0x4d, 0xcd, - 0x95, 0x59, 0x78, 0xdf, 0x68, 0x04, 0x3b, 0xb6, 0xaf, 0x15, 0xf4, 0x26, 0xd9, 0xe8, 0x28, 0xe4, - 0x09, 0x03, 0xac, 0x5d, 0x84, 0xa2, 0x65, 0x5b, 0x38, 0x6b, 0x92, 0x5a, 0x86, 0x45, 0xc3, 0x71, - 0x5c, 0xfb, 0x0e, 0x1d, 0x50, 0x80, 0x85, 0x2a, 0xb6, 0x48, 0xcf, 0x0a, 0xa4, 0xc4, 0x71, 0xed, - 0xa6, 0xed, 0xe3, 0xaa, 0x56, 0xd4, 0x5d, 0xb1, 0x60, 0x44, 0xa3, 0x07, 0x3d, 0x66, 0xff, 0xa9, - 0xe2, 0x9a, 0xd1, 0x6a, 0xf8, 0xfc, 0x83, 0xdc, 0x0d, 0x5c, 0x7c, 0xbb, 0x85, 0x3d, 0xdf, 0xd3, - 0x14, 0xa4, 0xc1, 0xb2, 0x85, 0x71, 0xd5, 0x0b, 0x5c, 0x7c, 0xc7, 0xc4, 0xfb, 0x9a, 0x4a, 0xda, - 0x64, 0xbf, 0xc9, 0x3f, 0xe8, 0x9f, 0x29, 0x80, 0x18, 0x5c, 0x8c, 0x00, 0x16, 0xa5, 0xe3, 0xb3, - 0x0d, 0x5b, 0x75, 0xf2, 0x61, 0xe9, 0xab, 0x35, 0xed, 0x6a, 0xf6, 0x93, 0x6d, 0x00, 0xca, 0x94, - 0xdb, 0xb5, 0x9a, 0xa6, 0xa0, 0xb3, 0xf0, 0x4a, 0x86, 0x5e, 0x75, 0x6d, 0x47, 0x53, 0xb7, 0xd4, - 0x45, 0x05, 0x9d, 0xc9, 0x15, 0xee, 0x61, 0xec, 0x68, 0x05, 0x32, 0x44, 0x99, 0x02, 0x31, 0x01, - 0x59, 0xf5, 0xa2, 0xfe, 0xb1, 0x02, 0x1b, 0xac, 0x9b, 0x62, 0x36, 0xc7, 0x5d, 0x3d, 0x07, 0x9b, - 0x1c, 0xd9, 0x6a, 0x52, 0x47, 0x4f, 0x83, 0x96, 0x2a, 0x65, 0xdd, 0x7c, 0x15, 0xd6, 0x53, 0x54, - 0xda, 0x0f, 0x95, 0xac, 0xd5, 0x14, 0x79, 0x07, 0x7b, 0x7e, 0x80, 0x6b, 0x35, 0xdb, 0xf5, 0x59, - 0x47, 0x0a, 0x7a, 0x19, 0xd6, 0x2b, 0xe1, 0x60, 0x44, 0x74, 0x90, 0x68, 0xd8, 0xe9, 0x45, 0xb4, - 0x0b, 0x2b, 0xb0, 0x84, 0x3f, 0xf0, 0xb1, 0xe5, 0x99, 0xb6, 0xa5, 0xcd, 0xe9, 0xe7, 0x32, 0x3c, - 0x62, 0xd5, 0x78, 0x5e, 0x5d, 0x9b, 0xd3, 0xdb, 0xb0, 0x22, 0x5c, 0x62, 0xd9, 0xac, 0xd8, 0x86, - 0x2d, 0x31, 0xd7, 0xe8, 0xfa, 0xcd, 0xbe, 0xc2, 0x26, 0x9c, 0xce, 0x97, 0x63, 0x5f, 0x53, 0xc8, - 0x28, 0x64, 0x4a, 0x08, 0x5d, 0xd5, 0x7f, 0xaf, 0xc0, 0x26, 0xcf, 0xa6, 0xc5, 0xed, 0x11, 0x0c, - 0x4c, 0x93, 0x02, 0xd3, 0xe8, 0x70, 0xd9, 0x77, 0x5b, 0x9e, 0x8f, 0xab, 0x41, 0x15, 0xdf, 0x31, - 0x2b, 0x98, 0x4e, 0x17, 0xd3, 0xc5, 0x4d, 0x6c, 0xf9, 0x99, 0xbf, 0x7e, 0x1d, 0x5e, 0x9b, 0xc1, - 0x6b, 0xd9, 0xbe, 0x78, 0x26, 0xab, 0xe4, 0x35, 0xf8, 0xd6, 0x0c, 0xe6, 0x98, 0x51, 0xd5, 0x7f, - 0x0a, 0xcb, 0x29, 0x80, 0xf0, 0x33, 0xf0, 0x8a, 0xfc, 0xec, 0x84, 0xd1, 0x61, 0x27, 0x3a, 0xd2, - 0xe6, 0xb2, 0x05, 0xee, 0x38, 0x8a, 0x48, 0x01, 0x5d, 0x90, 0x72, 0x81, 0x1f, 0x0e, 0x1e, 0x75, - 0xa2, 0xf6, 0x28, 0x3c, 0xd4, 0x54, 0xfd, 0x2a, 0xac, 0xa4, 0x10, 0x8c, 0xc8, 0x97, 0x6f, 0xd8, - 0x5c, 0x5e, 0x35, 0x71, 0xd5, 0x6c, 0x35, 0xb5, 0x79, 0xb2, 0x14, 0xeb, 0xe6, 0x6e, 0x5d, 0x03, - 0xfd, 0x53, 0x85, 0x9c, 0x98, 0xe9, 0xf7, 0x69, 0xd6, 0x0c, 0x31, 0x56, 0x64, 0x9e, 0x30, 0xb0, - 0x33, 0xec, 0x79, 0xcc, 0x94, 0x7a, 0x0e, 0x36, 0xf9, 0x43, 0x60, 0x58, 0xd5, 0xa0, 0x6e, 0xb8, - 0xd5, 0x7d, 0xc3, 0x25, 0x93, 0xe7, 0xae, 0xa6, 0xd2, 0x15, 0x21, 0x51, 0x02, 0xdf, 0x6e, 0x55, - 0xea, 0x5a, 0x81, 0x4c, 0xc0, 0x14, 0xdd, 0x31, 0x2d, 0xad, 0x48, 0xd7, 0x57, 0x8e, 0x9b, 0x36, - 0x4b, 0xca, 0xe7, 0xf5, 0x0e, 0x68, 0xd9, 0xb0, 0xa5, 0x9c, 0x4d, 0xdb, 0x6d, 0x59, 0x16, 0x13, - 0x20, 0x6b, 0x50, 0xb2, 0xfd, 0x3a, 0x76, 0x39, 0x1c, 0x1d, 0xc5, 0x9f, 0x6b, 0x59, 0x46, 0xcb, - 0xaf, 0xdb, 0xae, 0x79, 0x8f, 0x4a, 0x92, 0x4d, 0x38, 0xed, 0x35, 0x8c, 0xca, 0x1e, 0x1d, 0x34, - 0xd3, 0x0a, 0x2a, 0x75, 0xc3, 0xb2, 0x70, 0x43, 0x03, 0xfd, 0xcf, 0x0a, 0x9c, 0x9d, 0x61, 0xf7, - 0x42, 0x6f, 0xc0, 0x95, 0x3a, 0x36, 0xaa, 0x0d, 0xec, 0x79, 0x01, 0x69, 0x12, 0x5b, 0x3e, 0x37, - 0x2f, 0x4f, 0x9c, 0xad, 0x57, 0xe0, 0xdb, 0xb3, 0xd9, 0x13, 0xb9, 0xf7, 0x1d, 0xb8, 0x34, 0x9b, - 0x95, 0xcb, 0x41, 0x95, 0xcc, 0xd9, 0xd9, 0x9c, 0xb1, 0xfc, 0x2c, 0xe8, 0x9f, 0x28, 0xb0, 0x31, - 0x59, 0x5d, 0x24, 0x7d, 0x33, 0x2d, 0xcf, 0x37, 0x1a, 0x8d, 0xc0, 0x31, 0x5c, 0xa3, 0x19, 0x60, - 0xcb, 0xb5, 0x1b, 0x8d, 0x49, 0x72, 0xe3, 0x12, 0x5c, 0x9c, 0xce, 0xea, 0x55, 0x5c, 0xd3, 0x21, - 0x0b, 0xb0, 0x0c, 0xdb, 0xd3, 0xb9, 0xb0, 0x59, 0xc1, 0x9a, 0xba, 0xf3, 0xfe, 0xe7, 0x7f, 0xdf, - 0x9e, 0xfb, 0xfc, 0xd9, 0xb6, 0xf2, 0xe5, 0xb3, 0x6d, 0xe5, 0x6f, 0xcf, 0xb6, 0x95, 0x7b, 0xaf, - 0x9f, 0x20, 0x11, 0xe5, 0xfd, 0x05, 0xea, 0x4f, 0x71, 0xed, 0xdf, 0x01, 0x00, 0x00, 0xff, 0xff, - 0xc0, 0x23, 0xcc, 0xa0, 0xb0, 0x85, 0x01, 0x00, + // 26463 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xfd, 0x7d, 0x70, 0x1c, 0x49, + 0x76, 0x20, 0x86, 0x4f, 0x7f, 0x00, 0x68, 0x3c, 0x7c, 0x35, 0x12, 0x20, 0x09, 0x62, 0x86, 0x03, + 0x4e, 0x71, 0x86, 0x43, 0xce, 0x07, 0xb9, 0x04, 0x77, 0xb8, 0x3b, 0x3b, 0x9f, 0x8d, 0x6e, 0x90, + 0x68, 0x12, 0x04, 0xb0, 0xd5, 0x20, 0xb0, 0xa3, 0xd9, 0xdd, 0xda, 0x42, 0x77, 0x02, 0xa8, 0x41, + 0x77, 0x57, 0x6f, 0x55, 0x35, 0x41, 0xac, 0xee, 0x7e, 0xa7, 0x8f, 0xd3, 0xed, 0x4f, 0xbe, 0xd3, + 0x97, 0x6f, 0x65, 0xed, 0x39, 0x74, 0x0a, 0x85, 0x7c, 0x77, 0x96, 0x3f, 0x4e, 0xe1, 0x90, 0x74, + 0xe1, 0x73, 0x28, 0x2c, 0x9f, 0x1c, 0xb2, 0x42, 0xd6, 0xc5, 0xd9, 0x72, 0xf8, 0x7b, 0xad, 0x80, + 0x2c, 0xeb, 0xe2, 0xc2, 0xc1, 0xb0, 0x1d, 0x3a, 0xcb, 0x71, 0x61, 0x8f, 0x43, 0xb6, 0x23, 0x5f, + 0x66, 0x56, 0x65, 0x56, 0x55, 0x37, 0x1a, 0x33, 0x9c, 0x3b, 0x71, 0xe3, 0xfe, 0x21, 0xd1, 0x2f, + 0xdf, 0x7b, 0x99, 0x95, 0x1f, 0x2f, 0x5f, 0xbe, 0x7c, 0xef, 0x25, 0xbc, 0x10, 0xd0, 0x26, 0xed, + 0xb8, 0x5e, 0x70, 0xbd, 0x49, 0xf7, 0xec, 0xfa, 0xd1, 0xf5, 0xe0, 0xa8, 0x43, 0x7d, 0xfe, 0xef, + 0xb5, 0x8e, 0xe7, 0x06, 0x2e, 0x19, 0xc2, 0x1f, 0xf3, 0xb3, 0x7b, 0xee, 0x9e, 0x8b, 0x90, 0xeb, + 0xec, 0x2f, 0x5e, 0x38, 0xbf, 0xb0, 0xe7, 0xba, 0x7b, 0x4d, 0x7a, 0x1d, 0x7f, 0xed, 0x74, 0x77, + 0xaf, 0x07, 0x4e, 0x8b, 0xfa, 0x81, 0xdd, 0xea, 0x08, 0x84, 0xab, 0x61, 0x05, 0x76, 0x10, 0xb0, + 0x92, 0xc0, 0x71, 0xdb, 0xd7, 0x1f, 0xde, 0x50, 0x7f, 0x0a, 0xd4, 0xd7, 0xd3, 0xdb, 0x72, 0xe8, + 0xd9, 0x9d, 0x0e, 0xf5, 0xa2, 0x3f, 0x38, 0xba, 0xf1, 0x0b, 0x39, 0x18, 0xbd, 0x47, 0x69, 0xa7, + 0xd4, 0x74, 0x1e, 0x52, 0x72, 0x09, 0xf2, 0x6b, 0x76, 0x8b, 0xce, 0x65, 0x2e, 0x66, 0xae, 0x8c, + 0x2e, 0x4d, 0x3d, 0x3e, 0x5e, 0x18, 0xf3, 0xa9, 0xf7, 0x90, 0x7a, 0x56, 0xdb, 0x6e, 0x51, 0x13, + 0x0b, 0xc9, 0xab, 0x30, 0xca, 0xfe, 0xf7, 0x3b, 0x76, 0x9d, 0xce, 0x65, 0x11, 0x73, 0xe2, 0xf1, + 0xf1, 0xc2, 0x68, 0x5b, 0x02, 0xcd, 0xa8, 0x9c, 0x54, 0x61, 0x64, 0xf9, 0x51, 0xc7, 0xf1, 0xa8, + 0x3f, 0x97, 0xbf, 0x98, 0xb9, 0x32, 0xb6, 0x38, 0x7f, 0x8d, 0x7f, 0xec, 0x35, 0xf9, 0xb1, 0xd7, + 0x36, 0xe5, 0xc7, 0x2e, 0xcd, 0xfc, 0xee, 0xf1, 0xc2, 0x33, 0x8f, 0x8f, 0x17, 0x46, 0x28, 0x27, + 0xf9, 0xe9, 0x3f, 0x5c, 0xc8, 0x98, 0x92, 0x9e, 0xbc, 0x0d, 0xf9, 0xcd, 0xa3, 0x0e, 0x9d, 0x1b, + 0xbd, 0x98, 0xb9, 0x32, 0xb9, 0xf8, 0xfc, 0x35, 0xde, 0xbd, 0x61, 0xe3, 0xa3, 0xbf, 0x18, 0xd6, + 0x52, 0xe1, 0xf1, 0xf1, 0x42, 0x9e, 0xa1, 0x98, 0x48, 0x45, 0x5e, 0x87, 0xe1, 0x15, 0xd7, 0x0f, + 0xaa, 0x95, 0x39, 0xc0, 0x26, 0x9f, 0x79, 0x7c, 0xbc, 0x30, 0xbd, 0xef, 0xfa, 0x81, 0xe5, 0x34, + 0x5e, 0x73, 0x5b, 0x4e, 0x40, 0x5b, 0x9d, 0xe0, 0xc8, 0x14, 0x48, 0xc6, 0x23, 0x98, 0xd0, 0xf8, + 0x91, 0x31, 0x18, 0x79, 0xb0, 0x76, 0x6f, 0x6d, 0x7d, 0x7b, 0xad, 0xf8, 0x0c, 0x29, 0x40, 0x7e, + 0x6d, 0xbd, 0xb2, 0x5c, 0xcc, 0x90, 0x11, 0xc8, 0x95, 0x36, 0x36, 0x8a, 0x59, 0x32, 0x0e, 0x85, + 0x4a, 0x69, 0xb3, 0xb4, 0x54, 0xaa, 0x2d, 0x17, 0x73, 0x64, 0x06, 0xa6, 0xb6, 0xab, 0x6b, 0x95, + 0xf5, 0xed, 0x9a, 0x55, 0x59, 0xae, 0xdd, 0xdb, 0x5c, 0xdf, 0x28, 0xe6, 0xc9, 0x24, 0xc0, 0xbd, + 0x07, 0x4b, 0xcb, 0xe6, 0xda, 0xf2, 0xe6, 0x72, 0xad, 0x38, 0x44, 0x66, 0xa1, 0x28, 0x49, 0xac, + 0xda, 0xb2, 0xb9, 0x55, 0x2d, 0x2f, 0x17, 0x87, 0xef, 0xe6, 0x0b, 0xb9, 0x62, 0xde, 0x1c, 0x59, + 0xa5, 0xb6, 0x4f, 0xab, 0x15, 0xe3, 0xdf, 0xc8, 0x41, 0xe1, 0x3e, 0x0d, 0xec, 0x86, 0x1d, 0xd8, + 0xe4, 0x39, 0x6d, 0x7c, 0xf0, 0x13, 0x95, 0x81, 0xb9, 0x94, 0x1c, 0x98, 0xa1, 0xc7, 0xc7, 0x0b, + 0x99, 0xd7, 0xd5, 0x01, 0x79, 0x0b, 0xc6, 0x2a, 0xd4, 0xaf, 0x7b, 0x4e, 0x87, 0x4d, 0x9a, 0xb9, + 0x1c, 0xa2, 0x9d, 0x7f, 0x7c, 0xbc, 0x70, 0xa6, 0x11, 0x81, 0x95, 0x0e, 0x51, 0xb1, 0x49, 0x15, + 0x86, 0x57, 0xed, 0x1d, 0xda, 0xf4, 0xe7, 0x86, 0x2e, 0xe6, 0xae, 0x8c, 0x2d, 0x3e, 0x2b, 0x06, + 0x41, 0x36, 0xf0, 0x1a, 0x2f, 0x5d, 0x6e, 0x07, 0xde, 0xd1, 0xd2, 0xec, 0xe3, 0xe3, 0x85, 0x62, + 0x13, 0x01, 0x6a, 0x07, 0x73, 0x14, 0x52, 0x8b, 0x26, 0xc6, 0xf0, 0x89, 0x13, 0xe3, 0xc2, 0xef, + 0x1e, 0x2f, 0x64, 0xd8, 0x80, 0x89, 0x89, 0x11, 0xf1, 0xd3, 0xa7, 0xc8, 0x22, 0x14, 0x4c, 0xfa, + 0xd0, 0xf1, 0xd9, 0x97, 0x15, 0xf0, 0xcb, 0xce, 0x3e, 0x3e, 0x5e, 0x20, 0x9e, 0x80, 0x29, 0xcd, + 0x08, 0xf1, 0xe6, 0xdf, 0x84, 0x31, 0xa5, 0xd5, 0xa4, 0x08, 0xb9, 0x03, 0x7a, 0xc4, 0x7b, 0xd8, + 0x64, 0x7f, 0x92, 0x59, 0x18, 0x7a, 0x68, 0x37, 0xbb, 0xa2, 0x4b, 0x4d, 0xfe, 0xe3, 0x4b, 0xd9, + 0x2f, 0x66, 0xee, 0xe6, 0x0b, 0x23, 0xc5, 0x82, 0x99, 0xad, 0x56, 0x8c, 0x7f, 0x35, 0x0f, 0x05, + 0xd3, 0xe5, 0x0b, 0x91, 0x5c, 0x85, 0xa1, 0x5a, 0x60, 0x07, 0x72, 0x98, 0x66, 0x1e, 0x1f, 0x2f, + 0x4c, 0xb1, 0x45, 0x4a, 0x95, 0xfa, 0x39, 0x06, 0x43, 0xdd, 0xd8, 0xb7, 0x7d, 0x39, 0x5c, 0x88, + 0xda, 0x61, 0x00, 0x15, 0x15, 0x31, 0xc8, 0x65, 0xc8, 0xdf, 0x77, 0x1b, 0x54, 0x8c, 0x18, 0x79, + 0x7c, 0xbc, 0x30, 0xd9, 0x72, 0x1b, 0x2a, 0x22, 0x96, 0x93, 0xd7, 0x60, 0xb4, 0xdc, 0xf5, 0x3c, + 0xda, 0x66, 0x73, 0x3d, 0x8f, 0xc8, 0x93, 0x8f, 0x8f, 0x17, 0xa0, 0xce, 0x81, 0x96, 0xd3, 0x30, + 0x23, 0x04, 0x36, 0x0c, 0xb5, 0xc0, 0xf6, 0x02, 0xda, 0x98, 0x1b, 0x1a, 0x68, 0x18, 0xd8, 0xfa, + 0x9c, 0xf6, 0x39, 0x49, 0x7c, 0x18, 0x04, 0x27, 0xb2, 0x02, 0x63, 0x77, 0x3c, 0xbb, 0x4e, 0x37, + 0xa8, 0xe7, 0xb8, 0x0d, 0x1c, 0xdf, 0xdc, 0xd2, 0xe5, 0xc7, 0xc7, 0x0b, 0x67, 0xf7, 0x18, 0xd8, + 0xea, 0x20, 0x3c, 0xa2, 0xfe, 0xf8, 0x78, 0xa1, 0x50, 0xe9, 0x7a, 0xd8, 0x7b, 0xa6, 0x4a, 0x4a, + 0xbe, 0xc1, 0x06, 0xc7, 0x0f, 0xb0, 0x6b, 0x69, 0x63, 0x6e, 0xe4, 0xc4, 0x26, 0x1a, 0xa2, 0x89, + 0x67, 0x9b, 0xb6, 0x1f, 0x58, 0x1e, 0xa7, 0x8b, 0xb5, 0x53, 0x65, 0x49, 0xd6, 0xa1, 0x50, 0xab, + 0xef, 0xd3, 0x46, 0xb7, 0x49, 0x71, 0xca, 0x8c, 0x2d, 0x9e, 0x13, 0x93, 0x5a, 0x8e, 0xa7, 0x2c, + 0x5e, 0x9a, 0x17, 0xbc, 0x89, 0x2f, 0x20, 0xea, 0x7c, 0x92, 0x58, 0x5f, 0x2a, 0x7c, 0xf7, 0x17, + 0x17, 0x9e, 0xf9, 0xa1, 0x3f, 0xb8, 0xf8, 0x8c, 0xf1, 0xef, 0x67, 0xa1, 0x18, 0x67, 0x42, 0x76, + 0x61, 0xe2, 0x41, 0xa7, 0x61, 0x07, 0xb4, 0xdc, 0x74, 0x68, 0x3b, 0xf0, 0x71, 0x92, 0xf4, 0xff, + 0xa6, 0x17, 0x45, 0xbd, 0x73, 0x5d, 0x24, 0xb4, 0xea, 0x9c, 0x32, 0xf6, 0x55, 0x3a, 0xdb, 0xa8, + 0x9e, 0x1a, 0x0a, 0x70, 0x1f, 0x67, 0xd8, 0xe9, 0xea, 0xe1, 0xa2, 0xbf, 0x47, 0x3d, 0x82, 0xad, + 0x98, 0x40, 0xed, 0xc6, 0xce, 0x11, 0xce, 0xcc, 0xc1, 0x27, 0x10, 0x23, 0x49, 0x99, 0x40, 0x0c, + 0x6c, 0xfc, 0xe3, 0x0c, 0x4c, 0x9a, 0xd4, 0x77, 0xbb, 0x5e, 0x9d, 0xae, 0x50, 0xbb, 0x41, 0x3d, + 0x36, 0xfd, 0xef, 0x39, 0xed, 0x86, 0x58, 0x53, 0x38, 0xfd, 0x0f, 0x9c, 0xb6, 0x2a, 0xba, 0xb1, + 0x9c, 0x7c, 0x0e, 0x46, 0x6a, 0xdd, 0x1d, 0x44, 0xcd, 0x46, 0x12, 0xc0, 0xef, 0xee, 0x58, 0x31, + 0x74, 0x89, 0x46, 0xae, 0xc3, 0xc8, 0x16, 0xf5, 0xfc, 0x48, 0x1a, 0xe2, 0xd6, 0xf0, 0x90, 0x83, + 0x54, 0x02, 0x81, 0x45, 0xee, 0x44, 0x12, 0x59, 0x6c, 0x6a, 0x53, 0x31, 0x39, 0x18, 0x4d, 0x95, + 0x96, 0x80, 0xa8, 0x53, 0x45, 0x62, 0x19, 0x3f, 0x93, 0x85, 0x62, 0xc5, 0x0e, 0xec, 0x1d, 0xdb, + 0x17, 0xfd, 0xb9, 0x75, 0x93, 0xc9, 0x78, 0xe5, 0x43, 0x51, 0xc6, 0xb3, 0x96, 0x7f, 0xe2, 0xcf, + 0x7b, 0x29, 0xfe, 0x79, 0x63, 0x6c, 0x87, 0x15, 0x9f, 0x17, 0x7d, 0xd4, 0x3b, 0x27, 0x7f, 0x54, + 0x51, 0x7c, 0x54, 0x41, 0x7e, 0x54, 0xf4, 0x29, 0xe4, 0x1d, 0xc8, 0xd7, 0x3a, 0xb4, 0x2e, 0x84, + 0x88, 0xdc, 0x17, 0xf4, 0x8f, 0x63, 0x08, 0x5b, 0x37, 0x97, 0xc6, 0x05, 0x9b, 0xbc, 0xdf, 0xa1, + 0x75, 0x13, 0xc9, 0x94, 0x45, 0xf3, 0xf7, 0x73, 0x30, 0x9b, 0x46, 0xa6, 0x7e, 0xc7, 0x70, 0x9f, + 0xef, 0xb8, 0x02, 0x05, 0xb6, 0x85, 0xb3, 0x6d, 0x11, 0xc5, 0xc5, 0xe8, 0xd2, 0x38, 0x6b, 0xf2, + 0xbe, 0x80, 0x99, 0x61, 0x29, 0xb9, 0x14, 0x6a, 0x04, 0x85, 0x88, 0x9f, 0xd0, 0x08, 0xa4, 0x1e, + 0xc0, 0xc6, 0x5a, 0x2e, 0x61, 0x54, 0x1c, 0xa2, 0x6e, 0x91, 0xe0, 0x68, 0xac, 0x3d, 0x01, 0xd1, + 0xb6, 0x19, 0xb9, 0x29, 0x2c, 0x43, 0x41, 0x7e, 0xd6, 0xdc, 0x38, 0x32, 0x9a, 0x8e, 0x75, 0xd2, + 0xd6, 0x4d, 0x3e, 0x98, 0x0d, 0xf1, 0x5b, 0x65, 0x23, 0x71, 0xc8, 0x4d, 0x28, 0x6c, 0x78, 0xee, + 0xa3, 0xa3, 0x6a, 0xc5, 0x9f, 0x9b, 0xb8, 0x98, 0xbb, 0x32, 0xba, 0x74, 0xee, 0xf1, 0xf1, 0xc2, + 0x4c, 0x87, 0xc1, 0x2c, 0xa7, 0xa1, 0xee, 0xb4, 0x21, 0xe2, 0xdd, 0x7c, 0x21, 0x53, 0xcc, 0xde, + 0xcd, 0x17, 0xb2, 0xc5, 0x1c, 0x57, 0x2f, 0xee, 0xe6, 0x0b, 0xf9, 0xe2, 0xd0, 0xdd, 0x7c, 0x61, + 0x08, 0x15, 0x8e, 0xd1, 0x22, 0xdc, 0xcd, 0x17, 0xc6, 0x8a, 0xe3, 0xda, 0x6e, 0x8f, 0x0c, 0x02, + 0xb7, 0xee, 0x36, 0xcd, 0xdc, 0x03, 0xb3, 0x6a, 0x0e, 0x97, 0x4b, 0x65, 0xea, 0x05, 0x66, 0xae, + 0xb4, 0x5d, 0x33, 0x27, 0x2a, 0x47, 0x6d, 0xbb, 0xe5, 0xd4, 0xf9, 0xd6, 0x69, 0xe6, 0xee, 0x94, + 0x37, 0x8c, 0x12, 0x4c, 0x46, 0xdf, 0xb2, 0xea, 0xf8, 0x01, 0xb9, 0x0e, 0xa3, 0x12, 0xc2, 0x04, + 0x5d, 0x2e, 0xf5, 0xab, 0xcd, 0x08, 0xc7, 0xf8, 0x9d, 0x2c, 0x40, 0x54, 0xf2, 0x94, 0xae, 0x85, + 0x2f, 0x68, 0x6b, 0xe1, 0x4c, 0x7c, 0x2d, 0xf4, 0x5c, 0x05, 0xe4, 0x3d, 0x18, 0x66, 0x6a, 0x41, + 0x57, 0xaa, 0x44, 0xe7, 0xe2, 0xa4, 0x58, 0xb8, 0x75, 0x73, 0x69, 0x52, 0x10, 0x0f, 0xfb, 0x08, + 0x31, 0x05, 0x99, 0xb2, 0x8c, 0x7e, 0x61, 0x24, 0x1a, 0x0c, 0xb1, 0x80, 0xae, 0x40, 0x38, 0xa0, + 0xa2, 0x43, 0x71, 0x65, 0x74, 0xe4, 0x20, 0x87, 0xa5, 0xe4, 0x3c, 0xb0, 0x01, 0x17, 0x9d, 0x3a, + 0xf2, 0xf8, 0x78, 0x21, 0xd7, 0xf5, 0x1c, 0x9c, 0x04, 0xe4, 0x3a, 0x88, 0x69, 0x20, 0x3a, 0x90, + 0xcd, 0xbe, 0xe9, 0xba, 0x6d, 0xd5, 0xa9, 0x17, 0x44, 0x3d, 0x3e, 0x97, 0x91, 0xb3, 0x85, 0x74, + 0x40, 0x9f, 0x2a, 0x73, 0x79, 0x9c, 0x06, 0x57, 0x52, 0x7b, 0xe5, 0x9a, 0x86, 0xca, 0xd5, 0xc8, + 0x8b, 0x72, 0x57, 0x6a, 0xf0, 0x32, 0x2b, 0xa1, 0x52, 0xea, 0x15, 0x90, 0x9b, 0xc0, 0x66, 0xa8, + 0xe8, 0x7d, 0x10, 0xf5, 0x94, 0xb6, 0x6b, 0x4b, 0x67, 0x04, 0xa7, 0x09, 0xfb, 0x50, 0x25, 0x67, + 0xd8, 0xe4, 0x2d, 0x60, 0x53, 0x58, 0xf4, 0x3b, 0x11, 0x44, 0x77, 0xca, 0x1b, 0xe5, 0xa6, 0xdb, + 0x6d, 0xd4, 0xbe, 0xbc, 0x1a, 0x11, 0xef, 0xd5, 0x3b, 0x2a, 0xf1, 0x9d, 0xf2, 0x06, 0x79, 0x0b, + 0x86, 0x4a, 0xdf, 0xea, 0x7a, 0x54, 0xe8, 0x27, 0xe3, 0xb2, 0x4e, 0x06, 0x5b, 0x3a, 0x27, 0x08, + 0xa7, 0x6c, 0xf6, 0x53, 0xd5, 0xeb, 0xb0, 0x9c, 0xd5, 0xbc, 0xb9, 0x5a, 0x13, 0xba, 0x07, 0x89, + 0x75, 0xcb, 0xe6, 0xaa, 0xd2, 0xec, 0x40, 0xfb, 0x6a, 0x46, 0x45, 0xae, 0x43, 0xb6, 0x54, 0xc1, + 0x13, 0xd1, 0xd8, 0xe2, 0xa8, 0xac, 0xb6, 0xb2, 0x34, 0x2b, 0x48, 0xc6, 0x6d, 0x75, 0x19, 0x64, + 0x4b, 0x15, 0xb2, 0x04, 0x43, 0xf7, 0x8f, 0x6a, 0x5f, 0x5e, 0x15, 0xc2, 0x6c, 0x46, 0xce, 0x6b, + 0x06, 0x5b, 0xc7, 0x65, 0xef, 0x47, 0x2d, 0x6e, 0x1d, 0xf9, 0xdf, 0x6c, 0xaa, 0x2d, 0x46, 0x34, + 0xb2, 0x01, 0xa3, 0xa5, 0x46, 0xcb, 0x69, 0x3f, 0xf0, 0xa9, 0x37, 0x37, 0x86, 0x7c, 0xe6, 0x62, + 0xed, 0x0e, 0xcb, 0x97, 0xe6, 0x1e, 0x1f, 0x2f, 0xcc, 0xda, 0xec, 0xa7, 0xd5, 0xf5, 0xa9, 0xa7, + 0x70, 0x8b, 0x98, 0x90, 0x0d, 0x80, 0xfb, 0x6e, 0x7b, 0xcf, 0x2d, 0x05, 0x4d, 0xdb, 0x8f, 0x89, + 0xc7, 0xa8, 0x20, 0x54, 0x1f, 0xce, 0xb4, 0x18, 0xcc, 0xb2, 0x19, 0x50, 0x61, 0xa8, 0xf0, 0x20, + 0xb7, 0x61, 0x78, 0xdd, 0xb3, 0xeb, 0x4d, 0x3a, 0x37, 0x81, 0xdc, 0x66, 0x05, 0x37, 0x0e, 0x94, + 0x5f, 0x3a, 0x27, 0x18, 0x16, 0x5d, 0x04, 0xab, 0xc7, 0x14, 0x8e, 0x38, 0xbf, 0x0d, 0x24, 0x39, + 0x27, 0x53, 0x0e, 0x09, 0xaf, 0xaa, 0x87, 0x84, 0x68, 0xd1, 0x97, 0xdd, 0x56, 0xcb, 0x6e, 0x37, + 0x90, 0x76, 0x6b, 0x51, 0x39, 0x3b, 0x18, 0xdf, 0x84, 0xe9, 0x44, 0x67, 0x9d, 0x70, 0xbe, 0x7b, + 0x17, 0xa6, 0x2a, 0x74, 0xd7, 0xee, 0x36, 0x83, 0x70, 0x27, 0xe1, 0x4b, 0x14, 0x4f, 0x5a, 0x0d, + 0x5e, 0x64, 0xc9, 0xed, 0xc3, 0x8c, 0x23, 0x1b, 0xef, 0xc0, 0x84, 0xf6, 0xf9, 0xec, 0xa8, 0x50, + 0xea, 0x36, 0x9c, 0x00, 0x07, 0x32, 0x13, 0x1d, 0x15, 0x6c, 0x06, 0xc4, 0xe1, 0x32, 0x23, 0x04, + 0xe3, 0x6f, 0xa9, 0xda, 0x8a, 0x90, 0x44, 0xec, 0x58, 0x2d, 0xe4, 0x41, 0x26, 0xd2, 0x9d, 0x12, + 0xf2, 0x20, 0x94, 0x06, 0x57, 0xf9, 0xda, 0xcc, 0x26, 0xd6, 0xe6, 0x98, 0x18, 0x89, 0x9c, 0x7d, + 0xe8, 0xf3, 0x15, 0x19, 0xce, 0xd4, 0xdc, 0x27, 0x9f, 0xa9, 0xef, 0xc1, 0xf8, 0x7d, 0xbb, 0x6d, + 0xef, 0xd1, 0x06, 0xfb, 0x02, 0x2e, 0x7b, 0x46, 0x97, 0x9e, 0x7d, 0x7c, 0xbc, 0x70, 0xae, 0xc5, + 0xe1, 0xf8, 0x95, 0xea, 0x24, 0xd2, 0x08, 0xc8, 0x0d, 0xb9, 0xb2, 0x87, 0x52, 0x56, 0xf6, 0x84, + 0xa8, 0x7d, 0x08, 0x57, 0xb6, 0x58, 0xcf, 0xc6, 0xff, 0x51, 0xc0, 0x6f, 0x24, 0xaf, 0xc1, 0xb0, + 0x49, 0xf7, 0xd8, 0x56, 0x93, 0x89, 0x06, 0xc9, 0x43, 0x88, 0xda, 0x31, 0x1c, 0x07, 0xf5, 0x0c, + 0xda, 0xf0, 0xf7, 0x9d, 0xdd, 0x40, 0xf4, 0x4e, 0xa8, 0x67, 0x08, 0xb0, 0xa2, 0x67, 0x08, 0x88, + 0x7e, 0x9c, 0xe5, 0x30, 0x26, 0xfd, 0xcc, 0x4a, 0x4d, 0x74, 0x9a, 0xec, 0x61, 0xb3, 0xa2, 0x88, + 0x11, 0x4f, 0xd3, 0x12, 0x18, 0x36, 0xb9, 0x05, 0xa3, 0xa5, 0x7a, 0xdd, 0xed, 0x2a, 0x67, 0x46, + 0xbe, 0x6e, 0x39, 0x50, 0x37, 0x91, 0x44, 0xa8, 0xa4, 0x06, 0x63, 0xcb, 0xec, 0xa0, 0xe5, 0x94, + 0xed, 0xfa, 0xbe, 0xec, 0x24, 0x29, 0xc3, 0x94, 0x92, 0x68, 0xe5, 0x52, 0x04, 0xd6, 0x19, 0x50, + 0x35, 0x32, 0x28, 0xb8, 0x64, 0x13, 0xc6, 0x6a, 0xb4, 0xee, 0xd1, 0xa0, 0x16, 0xb8, 0x1e, 0x8d, + 0x89, 0x64, 0xa5, 0x64, 0xe9, 0x79, 0x79, 0xd6, 0xf3, 0x11, 0x68, 0xf9, 0x0c, 0xaa, 0x72, 0x55, + 0x90, 0xb9, 0xd2, 0xde, 0x72, 0xbd, 0xa3, 0xca, 0x92, 0x10, 0xd3, 0xd1, 0x9e, 0xce, 0xc1, 0xaa, + 0xd2, 0xce, 0x20, 0x8d, 0x1d, 0x5d, 0x69, 0xe7, 0x58, 0x38, 0x52, 0x95, 0x1a, 0xea, 0x56, 0x42, + 0x68, 0x4f, 0x45, 0xbd, 0x8c, 0x60, 0x65, 0xa4, 0x1a, 0x3e, 0x6a, 0x66, 0xda, 0x48, 0x09, 0x2c, + 0xd2, 0x01, 0x22, 0x47, 0x8d, 0x2b, 0xba, 0x4d, 0xea, 0xfb, 0x42, 0x96, 0x9f, 0x8f, 0x0d, 0x7e, + 0x84, 0xb0, 0xf4, 0x92, 0x60, 0x7e, 0x41, 0x4e, 0x03, 0x71, 0x4e, 0x63, 0x85, 0x4a, 0x3d, 0x29, + 0xbc, 0xc9, 0x9b, 0x00, 0xcb, 0x8f, 0x02, 0xea, 0xb5, 0xed, 0x66, 0x68, 0x07, 0x43, 0xd3, 0x0f, + 0x15, 0x50, 0x7d, 0xa0, 0x15, 0x64, 0x52, 0x86, 0x89, 0x92, 0xef, 0x77, 0x5b, 0xd4, 0x74, 0x9b, + 0xb4, 0x64, 0xae, 0xa1, 0xdc, 0x1f, 0x5d, 0xba, 0xf0, 0xf8, 0x78, 0xe1, 0xbc, 0x8d, 0x05, 0x96, + 0xe7, 0x36, 0xa9, 0x65, 0x7b, 0xea, 0xec, 0xd6, 0x69, 0xc8, 0x3a, 0xc0, 0x7a, 0x87, 0xb6, 0x6b, + 0xd4, 0xf6, 0xea, 0xfb, 0x31, 0x31, 0x1f, 0x15, 0x2c, 0x3d, 0x27, 0xbe, 0x70, 0xd6, 0xed, 0xd0, + 0xb6, 0x8f, 0x30, 0xb5, 0x55, 0x11, 0x26, 0xd9, 0x86, 0xa9, 0x6a, 0xe9, 0xfe, 0x86, 0xdb, 0x74, + 0xea, 0x47, 0x42, 0x73, 0x9a, 0x44, 0xeb, 0xe0, 0x59, 0xc1, 0x35, 0x56, 0xca, 0xc5, 0x93, 0x63, + 0xb7, 0xac, 0x0e, 0x42, 0x2d, 0xa1, 0x3f, 0xc5, 0xb9, 0x90, 0x0f, 0xd8, 0x1c, 0xf4, 0x99, 0x32, + 0xb8, 0x69, 0xef, 0xf9, 0x73, 0x53, 0x9a, 0xb5, 0xab, 0xb4, 0x5d, 0xbb, 0xa6, 0x94, 0x72, 0x35, + 0x65, 0x9e, 0x4f, 0x44, 0x84, 0x5a, 0x81, 0xbd, 0xe7, 0xeb, 0x13, 0x31, 0xc4, 0x9e, 0x7f, 0x17, + 0x8a, 0x71, 0xe2, 0x53, 0x1a, 0x9d, 0x26, 0x8a, 0x93, 0x4a, 0x8b, 0x97, 0x1f, 0x39, 0x7e, 0xe0, + 0x1b, 0x3f, 0xa8, 0xad, 0x1a, 0xb6, 0xa2, 0xef, 0xd1, 0xa3, 0x0d, 0x8f, 0xee, 0x3a, 0x8f, 0x84, + 0x00, 0xc2, 0x15, 0x7d, 0x40, 0x8f, 0xac, 0x0e, 0x42, 0xd5, 0x15, 0x1d, 0xa2, 0x92, 0xcf, 0x43, + 0xe1, 0xde, 0xfd, 0xda, 0x3d, 0x7a, 0x54, 0xad, 0x88, 0xcd, 0x85, 0x93, 0xb5, 0x7c, 0x8b, 0x91, + 0x6a, 0xf3, 0x23, 0xc4, 0x34, 0x96, 0x22, 0xe9, 0xc5, 0x6a, 0x2e, 0x37, 0xbb, 0x7e, 0x40, 0xbd, + 0x6a, 0x45, 0xad, 0xb9, 0xce, 0x81, 0x31, 0x59, 0x12, 0xa2, 0x1a, 0x7f, 0x3f, 0x8b, 0x92, 0x8b, + 0x4d, 0xd2, 0x6a, 0xdb, 0x0f, 0xec, 0x76, 0x9d, 0x86, 0x0c, 0x70, 0x92, 0x3a, 0x02, 0x1a, 0x9b, + 0xa4, 0x11, 0xb2, 0x5e, 0x75, 0x76, 0xe0, 0xaa, 0x59, 0x95, 0xd2, 0xda, 0x50, 0xad, 0xa8, 0x26, + 0x51, 0x4f, 0x40, 0x63, 0x55, 0x46, 0xc8, 0xe4, 0x32, 0x8c, 0x54, 0x4b, 0xf7, 0x4b, 0xdd, 0x60, + 0x1f, 0xe5, 0x66, 0x81, 0xeb, 0xd4, 0x6c, 0x86, 0xd9, 0xdd, 0x60, 0xdf, 0x94, 0x85, 0xe4, 0x3a, + 0x9e, 0x55, 0xda, 0x34, 0xe0, 0xa6, 0x53, 0xb1, 0x51, 0xfa, 0x1c, 0x14, 0x3b, 0xaa, 0x30, 0x10, + 0x79, 0x05, 0x86, 0xb6, 0x36, 0xca, 0xd5, 0x8a, 0x38, 0xec, 0xe2, 0xee, 0xf1, 0xb0, 0x53, 0xd7, + 0x5b, 0xc2, 0x51, 0x8c, 0xdf, 0xca, 0x44, 0x32, 0x89, 0x5c, 0xd6, 0x74, 0x08, 0x34, 0x94, 0x30, + 0x1d, 0x42, 0x35, 0x94, 0xa0, 0x36, 0x61, 0x02, 0x29, 0x77, 0xfd, 0xc0, 0x6d, 0x2d, 0xb7, 0x1b, + 0x1d, 0xd7, 0x69, 0x07, 0x48, 0xc5, 0x7b, 0xcd, 0x78, 0x7c, 0xbc, 0xf0, 0x7c, 0x1d, 0x4b, 0x2d, + 0x2a, 0x8a, 0xad, 0x18, 0x97, 0x14, 0xea, 0x4f, 0xd1, 0x91, 0xc6, 0xef, 0x65, 0xb5, 0xbd, 0x84, + 0x35, 0xcf, 0xa4, 0x9d, 0xa6, 0x53, 0xc7, 0xe3, 0xf3, 0x1d, 0xcf, 0xed, 0x76, 0xc2, 0xe9, 0x80, + 0xcd, 0xf3, 0xa2, 0x52, 0x6b, 0x8f, 0x15, 0xeb, 0xbc, 0x53, 0xa8, 0xc9, 0xfb, 0x30, 0xce, 0xb6, + 0x75, 0xf1, 0xd3, 0x9f, 0xcb, 0xe2, 0x48, 0x3c, 0x87, 0x26, 0x2f, 0x9f, 0x7a, 0x21, 0x1b, 0x4d, + 0x1f, 0x50, 0x29, 0x48, 0x03, 0xe6, 0x36, 0x3d, 0xbb, 0xed, 0x3b, 0xc1, 0x72, 0xbb, 0xee, 0x1d, + 0xa1, 0x1a, 0xb2, 0xdc, 0xb6, 0x77, 0x9a, 0xb4, 0x81, 0x9f, 0x5b, 0x58, 0xba, 0xf2, 0xf8, 0x78, + 0xe1, 0xc5, 0x80, 0xe3, 0x58, 0x34, 0x44, 0xb2, 0x28, 0xc7, 0x52, 0x38, 0xf7, 0xe4, 0xc4, 0xd4, + 0x16, 0xd9, 0xad, 0x78, 0xe3, 0xc1, 0x77, 0x64, 0x54, 0x5b, 0xc2, 0xd1, 0x60, 0xa2, 0x48, 0x6d, + 0xa6, 0x4a, 0x60, 0xfc, 0xb3, 0x4c, 0xb4, 0xdb, 0x91, 0xb7, 0x61, 0x4c, 0x4c, 0x75, 0x65, 0x5e, + 0xa0, 0xb8, 0x92, 0xeb, 0x22, 0x36, 0xb2, 0x2a, 0x3a, 0x3b, 0x64, 0x97, 0xca, 0xab, 0xca, 0xdc, + 0xc0, 0x43, 0xb6, 0x5d, 0x6f, 0xc6, 0xa9, 0x24, 0x1a, 0x9b, 0x04, 0x9b, 0xab, 0x35, 0xbd, 0x57, + 0x70, 0x12, 0x04, 0x4d, 0x3f, 0xa5, 0x1b, 0x14, 0xe4, 0x4f, 0xff, 0xe1, 0xff, 0x6d, 0x26, 0x6d, + 0x53, 0x25, 0x4b, 0x30, 0xb1, 0xed, 0x7a, 0x07, 0x38, 0xbe, 0x4a, 0x27, 0xe0, 0xc8, 0x1f, 0xca, + 0x82, 0xf8, 0x07, 0xe9, 0x24, 0x6a, 0xdb, 0x94, 0xde, 0xd0, 0xdb, 0x16, 0xe3, 0xa0, 0x11, 0xb0, + 0x71, 0x08, 0x39, 0x86, 0xab, 0x03, 0xc7, 0x21, 0x6a, 0x82, 0x36, 0x85, 0x55, 0x74, 0xe3, 0x3f, + 0xcc, 0xa8, 0x9b, 0x27, 0xeb, 0xe4, 0x8a, 0xdb, 0xb2, 0x9d, 0xb6, 0xf2, 0x39, 0xfc, 0x16, 0x07, + 0xa1, 0xf1, 0x96, 0x28, 0xc8, 0xe4, 0x26, 0x14, 0xf8, 0xaf, 0x50, 0x48, 0xa2, 0x09, 0x49, 0x10, + 0xea, 0x12, 0x5e, 0x22, 0x26, 0x46, 0x26, 0x77, 0xda, 0x91, 0xf9, 0xa1, 0x0c, 0x8c, 0x29, 0xe7, + 0x69, 0x26, 0xab, 0x37, 0x3c, 0xf7, 0x23, 0x5a, 0x0f, 0xf4, 0x6d, 0xa2, 0xc3, 0x81, 0x31, 0x59, + 0x1d, 0xa2, 0xc6, 0xb6, 0x87, 0xec, 0x29, 0xb6, 0x07, 0xe3, 0x9f, 0x66, 0x84, 0x36, 0x3f, 0xb0, + 0x8c, 0xd4, 0xe5, 0x59, 0xf6, 0x34, 0x1b, 0xc3, 0xfb, 0x30, 0x64, 0xd2, 0x86, 0xe3, 0x0b, 0x4d, + 0x7c, 0x5a, 0x3d, 0x39, 0x60, 0x41, 0x74, 0x78, 0xf1, 0xd8, 0x4f, 0x55, 0xaa, 0x63, 0x39, 0x53, + 0xb9, 0xaa, 0xfe, 0xed, 0x26, 0x7d, 0xe4, 0xf0, 0x99, 0x2c, 0x36, 0x18, 0x54, 0xb9, 0x1c, 0xdf, + 0xda, 0x65, 0x25, 0x42, 0xf7, 0x53, 0x67, 0xad, 0x46, 0x63, 0x7c, 0x00, 0x10, 0x55, 0x49, 0xee, + 0x41, 0x51, 0xac, 0x6d, 0xa7, 0xbd, 0xc7, 0xd5, 0x07, 0xd1, 0x07, 0x0b, 0x8f, 0x8f, 0x17, 0x9e, + 0xad, 0x87, 0x65, 0x42, 0x3f, 0x52, 0xf8, 0x26, 0x08, 0x8d, 0x7f, 0x33, 0x0b, 0xd9, 0x12, 0x0e, + 0xc8, 0x3d, 0x7a, 0x14, 0xd8, 0x3b, 0xb7, 0x9d, 0xa6, 0x36, 0x13, 0x0f, 0x10, 0x6a, 0xed, 0x3a, + 0xda, 0xc1, 0x5a, 0x41, 0x66, 0x33, 0xf1, 0x9e, 0xb7, 0xf3, 0x06, 0x12, 0x2a, 0x33, 0xf1, 0xc0, + 0xdb, 0x79, 0x23, 0x4e, 0x16, 0x22, 0x12, 0x03, 0x86, 0xf9, 0xac, 0x14, 0x73, 0x10, 0x1e, 0x1f, + 0x2f, 0x0c, 0xf3, 0xc9, 0x6b, 0x8a, 0x12, 0x72, 0x1e, 0x72, 0xb5, 0x8d, 0x35, 0x21, 0x3e, 0xd0, + 0x80, 0xe5, 0x77, 0xda, 0x26, 0x83, 0xb1, 0x3a, 0x57, 0x2b, 0xa5, 0x0d, 0x3c, 0xb2, 0x0e, 0x45, + 0x75, 0x36, 0x1b, 0x76, 0x27, 0x7e, 0x68, 0x0d, 0x11, 0xc9, 0x3b, 0x30, 0x76, 0xaf, 0x52, 0x5e, + 0x71, 0x7d, 0xbe, 0xf4, 0x87, 0xa3, 0xc9, 0x7f, 0xd0, 0xa8, 0x5b, 0x68, 0x33, 0x8e, 0xcb, 0x50, + 0x05, 0xdf, 0xf8, 0xb1, 0x2c, 0x8c, 0x29, 0x16, 0x1d, 0xf2, 0x79, 0x71, 0x95, 0x97, 0xd1, 0x74, + 0x55, 0x05, 0x83, 0x95, 0xf2, 0xe3, 0x7f, 0xcb, 0x6d, 0x50, 0x71, 0xb1, 0x17, 0x1d, 0xb5, 0xb3, + 0x83, 0x1c, 0xb5, 0xdf, 0x04, 0xe0, 0x73, 0x00, 0x9b, 0xac, 0xec, 0xc5, 0xca, 0x8d, 0xbe, 0x3a, + 0x2e, 0x11, 0x32, 0xd9, 0x82, 0x99, 0x4d, 0xaf, 0xeb, 0x07, 0xb5, 0x23, 0x3f, 0xa0, 0x2d, 0xc6, + 0x6d, 0xc3, 0x75, 0x9b, 0x62, 0xfe, 0xbd, 0xf8, 0xf8, 0x78, 0xe1, 0x62, 0xc0, 0x8a, 0x2d, 0x1f, + 0xcb, 0xb1, 0x01, 0x56, 0xc7, 0x75, 0xd5, 0x03, 0x78, 0x1a, 0x03, 0xc3, 0x84, 0x71, 0xf5, 0xf8, + 0xce, 0xc4, 0xb2, 0xb8, 0xf6, 0x10, 0x46, 0x59, 0x45, 0x2c, 0x8b, 0x56, 0x26, 0xaf, 0x61, 0x74, + 0x12, 0xe3, 0xf3, 0xaa, 0xe9, 0x68, 0xd0, 0x85, 0x6d, 0xfc, 0x48, 0x26, 0x12, 0x23, 0x5b, 0x37, + 0xc8, 0x5b, 0x30, 0xcc, 0xaf, 0x99, 0xc4, 0x6d, 0xdc, 0x99, 0xf0, 0xf8, 0xa5, 0xde, 0x41, 0x71, + 0x9b, 0xed, 0xef, 0xf3, 0xab, 0xe8, 0x67, 0x4c, 0x41, 0x12, 0x9a, 0x7b, 0x75, 0xcb, 0x8f, 0xe4, + 0x8e, 0x86, 0xcd, 0x1b, 0x69, 0xe6, 0x5e, 0xe3, 0xb7, 0xf3, 0x30, 0xa9, 0xa3, 0xa9, 0x77, 0x51, + 0x99, 0x81, 0xee, 0xa2, 0xde, 0x87, 0x02, 0xeb, 0x0f, 0xa7, 0x4e, 0xa5, 0x3a, 0xf3, 0x22, 0x1a, + 0xc1, 0x05, 0x4c, 0xbb, 0x63, 0x05, 0x3e, 0x1c, 0xec, 0x34, 0x66, 0x86, 0x54, 0x64, 0x51, 0xb9, + 0x30, 0xc9, 0x45, 0x3b, 0xbc, 0xbc, 0x30, 0x51, 0xd7, 0x43, 0x78, 0x75, 0xf2, 0x3a, 0x0c, 0x33, + 0xad, 0x36, 0x34, 0x16, 0x60, 0x2b, 0x99, 0xc2, 0x1b, 0x73, 0xa6, 0xe0, 0x48, 0x64, 0x1b, 0x0a, + 0xab, 0xb6, 0x1f, 0xd4, 0x28, 0x6d, 0x0f, 0x70, 0xcb, 0xbc, 0x20, 0xba, 0x6a, 0x06, 0xaf, 0x70, + 0x7d, 0x4a, 0xdb, 0xb1, 0x6b, 0xc2, 0x90, 0x19, 0xf9, 0x1a, 0x40, 0xd9, 0x6d, 0x07, 0x9e, 0xdb, + 0x5c, 0x75, 0xf7, 0xe6, 0x86, 0xf1, 0x94, 0xf6, 0x7c, 0x6c, 0x00, 0x22, 0x04, 0x7e, 0x50, 0x0b, + 0x4d, 0x11, 0x75, 0x5e, 0x60, 0x35, 0xdd, 0x3d, 0x75, 0x1d, 0x44, 0xf8, 0xe4, 0x36, 0x14, 0xe5, + 0x11, 0xf8, 0x41, 0x67, 0xcf, 0xc3, 0x09, 0x32, 0x12, 0x6d, 0xdb, 0xf4, 0x51, 0x60, 0x75, 0x05, + 0x5c, 0x95, 0x94, 0x71, 0x1a, 0xf2, 0x55, 0x38, 0x17, 0x87, 0xc9, 0x51, 0x2e, 0x44, 0x0a, 0xad, + 0xca, 0x2e, 0x65, 0xde, 0xf7, 0x62, 0x61, 0x7c, 0x9c, 0x85, 0x73, 0x3d, 0x3e, 0x96, 0xad, 0x07, + 0xdc, 0xae, 0x95, 0xf5, 0x10, 0xdb, 0xa5, 0xb9, 0x77, 0xcc, 0x45, 0xc8, 0x8a, 0x0d, 0x2e, 0xbf, + 0x54, 0x7c, 0x7c, 0xbc, 0x30, 0xae, 0x8d, 0x63, 0xb6, 0x5a, 0x21, 0x77, 0x21, 0xcf, 0x86, 0x68, + 0x80, 0x4b, 0x5e, 0x69, 0xfd, 0x98, 0x0c, 0x1c, 0x75, 0xfa, 0xe0, 0xd0, 0x21, 0x0f, 0xf2, 0x79, + 0xc8, 0x6d, 0x6e, 0xae, 0xe2, 0xdc, 0xc9, 0xe1, 0xb7, 0x4f, 0x04, 0x41, 0x53, 0x9b, 0xaa, 0x13, + 0x8c, 0xf6, 0x5a, 0xe8, 0x13, 0xc0, 0xd0, 0xc9, 0x57, 0x62, 0xce, 0x27, 0xaf, 0xf4, 0x1f, 0xe8, + 0xc1, 0x7d, 0x51, 0x3e, 0x85, 0x0b, 0x88, 0xf1, 0xf3, 0xd9, 0x68, 0x0d, 0xdf, 0x76, 0x9a, 0x01, + 0xf5, 0xc8, 0x3c, 0x5f, 0x92, 0xd1, 0xf9, 0xd7, 0x0c, 0x7f, 0x93, 0xb9, 0x68, 0x7d, 0x73, 0x56, + 0xe1, 0x42, 0x7e, 0x45, 0x59, 0xc8, 0x39, 0x5c, 0xc8, 0x93, 0x3d, 0x97, 0xec, 0x2b, 0x29, 0xf3, + 0x12, 0x17, 0x62, 0xca, 0xdc, 0x7b, 0x11, 0x26, 0xd6, 0xdc, 0xe5, 0x47, 0x41, 0x88, 0xc8, 0x16, + 0x60, 0xc1, 0xd4, 0x81, 0x8c, 0xe3, 0x7a, 0xb3, 0x41, 0xbd, 0xcd, 0x7d, 0xbb, 0xad, 0xdd, 0xb2, + 0x9a, 0x09, 0x38, 0xc3, 0x5d, 0xa3, 0x87, 0x3a, 0xee, 0x08, 0xc7, 0x8d, 0xc3, 0x8d, 0x1f, 0xce, + 0xca, 0xce, 0xd8, 0x5a, 0x7c, 0x4a, 0x6f, 0xf3, 0xde, 0xd0, 0x6e, 0xf3, 0x66, 0x42, 0x3b, 0x64, + 0x78, 0x35, 0xbd, 0x78, 0xc2, 0x8d, 0xf6, 0x7f, 0x37, 0x04, 0xe3, 0x2a, 0x3a, 0xeb, 0x87, 0x52, + 0xa3, 0xe1, 0xa9, 0xfd, 0x60, 0x37, 0x1a, 0x9e, 0x89, 0x50, 0xed, 0x02, 0x3b, 0xd7, 0xf7, 0x02, + 0xfb, 0xeb, 0x30, 0x5a, 0x6e, 0x35, 0xb4, 0x6b, 0x35, 0x23, 0xa5, 0x79, 0xd7, 0x42, 0x24, 0xbe, + 0x16, 0x42, 0xf3, 0x5a, 0xbd, 0xd5, 0x48, 0x5e, 0xa6, 0x45, 0x2c, 0xb5, 0xbb, 0xef, 0xa1, 0x4f, + 0x73, 0xf7, 0x7d, 0x0b, 0x46, 0x1f, 0xf8, 0x74, 0xb3, 0xdb, 0x6e, 0xd3, 0x26, 0x4e, 0xab, 0x02, + 0xd7, 0xf5, 0xbb, 0x3e, 0xb5, 0x02, 0x84, 0xaa, 0x0d, 0x08, 0x51, 0xd5, 0x01, 0x1e, 0xe9, 0x33, + 0xc0, 0x37, 0xa1, 0xb0, 0x41, 0xa9, 0x87, 0x7d, 0x3a, 0x16, 0xa9, 0x74, 0x1d, 0x4a, 0x3d, 0x8b, + 0x75, 0xac, 0x76, 0x27, 0x2e, 0x10, 0xb5, 0x8b, 0xf4, 0xf1, 0x01, 0x2f, 0xd2, 0xc9, 0x0b, 0x30, + 0xde, 0xe9, 0xee, 0x34, 0x9d, 0x3a, 0xf2, 0x15, 0x37, 0xf0, 0xe6, 0x18, 0x87, 0x31, 0xb6, 0x3e, + 0xf9, 0x0a, 0x4c, 0xe0, 0x19, 0x27, 0x9c, 0x72, 0x93, 0xda, 0xfd, 0x93, 0x56, 0xc6, 0x35, 0x9d, + 0x3a, 0x03, 0x59, 0x29, 0x8e, 0x22, 0x3a, 0xa3, 0xf9, 0x1a, 0x4c, 0xea, 0x23, 0xf9, 0x04, 0xae, + 0xa1, 0x42, 0xa7, 0x80, 0x42, 0x71, 0xf4, 0x6e, 0xbe, 0x00, 0xc5, 0x31, 0xee, 0x0e, 0x60, 0xc2, + 0x46, 0xf8, 0x4d, 0x26, 0xb9, 0xd7, 0xdd, 0xa1, 0x5e, 0x9b, 0x06, 0xd4, 0x17, 0x87, 0x00, 0xdf, + 0xcc, 0x97, 0x3a, 0x1d, 0xdf, 0xf8, 0xf5, 0x2c, 0x8c, 0x94, 0xb6, 0x6b, 0xd5, 0xf6, 0xae, 0x8b, + 0x97, 0x49, 0xe1, 0x1d, 0x82, 0x7a, 0x99, 0x14, 0xde, 0x21, 0xa8, 0x37, 0x07, 0xd7, 0x53, 0x8e, + 0x71, 0xe8, 0x6f, 0xaa, 0x1c, 0xe3, 0x34, 0xdb, 0x5e, 0x74, 0x9d, 0x92, 0x1b, 0xe0, 0x3a, 0x25, + 0xb4, 0x9e, 0xe5, 0x4f, 0xb4, 0x9e, 0x91, 0xb7, 0x60, 0xac, 0xda, 0x0e, 0xe8, 0x9e, 0x17, 0xcd, + 0xf4, 0xf0, 0x48, 0x19, 0x82, 0x55, 0xd5, 0x5e, 0xc1, 0x66, 0xd3, 0x88, 0x5b, 0xec, 0x42, 0x4b, + 0x1d, 0x4e, 0x23, 0x6e, 0xd8, 0x8b, 0x1d, 0xa6, 0x25, 0xa2, 0x51, 0x89, 0xcd, 0x11, 0x79, 0x65, + 0xcd, 0x95, 0xcf, 0xc9, 0xc8, 0xcc, 0xcc, 0x3a, 0x76, 0x69, 0x3a, 0xfd, 0xca, 0xda, 0xf8, 0x76, + 0x16, 0xc6, 0x4a, 0x9d, 0xce, 0x53, 0xee, 0x38, 0xf4, 0x45, 0x4d, 0xbc, 0xca, 0xb3, 0x50, 0xf8, + 0x5d, 0x03, 0xf9, 0x0c, 0xfd, 0x4a, 0x16, 0xa6, 0x62, 0x14, 0x6a, 0xeb, 0x33, 0x03, 0xba, 0x0b, + 0x65, 0x07, 0x74, 0x17, 0xca, 0x0d, 0xe6, 0x2e, 0x94, 0xff, 0x34, 0x22, 0xf3, 0x65, 0xc8, 0x95, + 0x3a, 0x9d, 0xf8, 0xb5, 0x63, 0xa7, 0xb3, 0x75, 0x93, 0x9f, 0x67, 0xed, 0x4e, 0xc7, 0x64, 0x18, + 0x9a, 0x1c, 0x1b, 0x1e, 0x50, 0x8e, 0x19, 0xaf, 0xc3, 0x28, 0xf2, 0x42, 0x27, 0x9d, 0x8b, 0x80, + 0x8b, 0x59, 0xf8, 0xe7, 0x68, 0x75, 0x89, 0x65, 0xfe, 0x7f, 0x67, 0x60, 0x08, 0x7f, 0x3f, 0xa5, + 0x73, 0x6c, 0x51, 0x9b, 0x63, 0x45, 0x65, 0x8e, 0x0d, 0x32, 0xbb, 0xfe, 0xb7, 0x3c, 0xf6, 0x96, + 0x98, 0x57, 0xc2, 0x37, 0x26, 0x93, 0xe2, 0x1b, 0xf3, 0x26, 0x28, 0x52, 0x53, 0xb5, 0x16, 0x29, + 0x7b, 0x86, 0x7a, 0xd2, 0x88, 0x90, 0xc9, 0x41, 0xdc, 0x4b, 0x26, 0x87, 0x83, 0x71, 0x29, 0xde, + 0xd4, 0x27, 0xe2, 0x20, 0xb3, 0x02, 0xa4, 0xda, 0xf6, 0x69, 0xbd, 0xeb, 0xd1, 0xda, 0x81, 0xd3, + 0xd9, 0xa2, 0x9e, 0xb3, 0x7b, 0x24, 0x4e, 0xf7, 0xb8, 0x2f, 0x3b, 0xa2, 0xd4, 0xf2, 0x0f, 0x9c, + 0x0e, 0x3b, 0x8a, 0x38, 0xbb, 0x47, 0x66, 0x0a, 0x0d, 0x79, 0x0f, 0x46, 0x4c, 0x7a, 0xe8, 0x39, + 0x81, 0xbc, 0xfb, 0x9d, 0x0c, 0x0f, 0xce, 0x08, 0xe5, 0x07, 0x43, 0x8f, 0xff, 0x50, 0xc7, 0x5f, + 0x94, 0x93, 0x45, 0x2e, 0xf8, 0xf8, 0x1d, 0xef, 0x44, 0xf4, 0xb5, 0xa5, 0xed, 0x5a, 0x2f, 0xb9, + 0x47, 0xae, 0xc2, 0x10, 0x4a, 0x4f, 0xa1, 0x13, 0xa0, 0xcf, 0x34, 0xee, 0xa1, 0xaa, 0x68, 0x47, + 0x0c, 0xf2, 0x3c, 0x40, 0x68, 0xbe, 0xf7, 0xe7, 0x0a, 0xb8, 0x5b, 0x2b, 0x90, 0xb8, 0xe8, 0x1f, + 0x3d, 0x8d, 0xe8, 0xff, 0xec, 0x5c, 0x43, 0x7e, 0x25, 0x0b, 0x97, 0x42, 0x71, 0xb6, 0xee, 0xd5, + 0x4a, 0xf7, 0x57, 0xab, 0x8d, 0x0d, 0xa1, 0xfd, 0x6f, 0x78, 0xee, 0x43, 0x87, 0x9d, 0xfe, 0x6e, + 0x9c, 0xb0, 0x18, 0x57, 0xf9, 0xac, 0xe5, 0xa6, 0xc3, 0xac, 0x76, 0x89, 0xae, 0xec, 0x1a, 0xe2, + 0x9e, 0xbf, 0xd3, 0x49, 0x58, 0x12, 0x57, 0x9e, 0x31, 0x23, 0x06, 0xe4, 0x47, 0x32, 0x70, 0x36, + 0xbd, 0x21, 0xe2, 0x44, 0xb8, 0x20, 0x35, 0xcf, 0x1e, 0xad, 0x5d, 0x7a, 0xf9, 0xf1, 0xf1, 0xc2, + 0x25, 0xdf, 0x6e, 0x35, 0x2d, 0xa7, 0xc1, 0x6b, 0x73, 0xea, 0xd4, 0xea, 0x08, 0x04, 0xad, 0xde, + 0x1e, 0x35, 0x7d, 0x09, 0xe4, 0x9a, 0x9c, 0xcb, 0x2c, 0x01, 0x14, 0xa4, 0x75, 0xc6, 0xf8, 0x7b, + 0x19, 0x50, 0x66, 0x54, 0xc1, 0xa4, 0x0d, 0xc7, 0xa3, 0xf5, 0x00, 0x25, 0x5a, 0x18, 0x02, 0xc0, + 0x61, 0x31, 0x9f, 0x09, 0x84, 0x91, 0x77, 0x61, 0x84, 0xdb, 0x72, 0xb8, 0x0d, 0x25, 0x9a, 0x89, + 0xc2, 0xee, 0xc3, 0x63, 0x45, 0x38, 0x86, 0x3a, 0x8b, 0x05, 0x11, 0xd3, 0x6f, 0xef, 0x6e, 0x6f, + 0x96, 0x9b, 0xb6, 0xd3, 0xf2, 0x85, 0x1c, 0xc3, 0x6e, 0xfd, 0xe8, 0x30, 0xb0, 0xea, 0x08, 0x55, + 0xf5, 0xdb, 0x10, 0xd5, 0xb8, 0x23, 0xcd, 0x4e, 0x27, 0x38, 0xfe, 0x2c, 0xc0, 0xd0, 0x56, 0x74, + 0xfc, 0x5c, 0x1a, 0x7d, 0x7c, 0xbc, 0xc0, 0xa7, 0x8b, 0xc9, 0xe1, 0xc6, 0x5f, 0xcd, 0xc0, 0xa4, + 0x3e, 0x9f, 0xc8, 0x35, 0x18, 0x16, 0xee, 0xf7, 0x19, 0x3c, 0x66, 0xb3, 0x5e, 0x18, 0xe6, 0x8e, + 0xf7, 0x9a, 0xbb, 0xbd, 0xc0, 0x62, 0x92, 0x58, 0x70, 0x10, 0x76, 0x24, 0x94, 0xc4, 0x75, 0x0e, + 0x32, 0x65, 0x19, 0x31, 0x98, 0x1a, 0xe6, 0x77, 0x9b, 0x81, 0x6a, 0x7d, 0xf5, 0x10, 0x62, 0x8a, + 0x12, 0xa3, 0x0c, 0xc3, 0x7c, 0x09, 0xc7, 0x1c, 0x0e, 0x32, 0xa7, 0x70, 0x38, 0x30, 0x8e, 0x33, + 0x00, 0xb5, 0xda, 0xca, 0x3d, 0x7a, 0xb4, 0x61, 0x3b, 0x1e, 0x5e, 0x17, 0xa0, 0xb8, 0xbc, 0x27, + 0x16, 0xd7, 0xb8, 0xb8, 0x2e, 0xe0, 0xa2, 0xf5, 0x80, 0x1e, 0x69, 0xd7, 0x05, 0x12, 0x15, 0x65, + 0xb2, 0xe7, 0x3c, 0xb4, 0x03, 0xca, 0x08, 0xb3, 0x48, 0xc8, 0x65, 0x32, 0x87, 0xc6, 0x28, 0x15, + 0x64, 0xf2, 0x35, 0x98, 0x8c, 0x7e, 0x85, 0x97, 0x1e, 0x93, 0xe1, 0x02, 0xd6, 0x0b, 0x97, 0x9e, + 0x7f, 0x7c, 0xbc, 0x30, 0xaf, 0x70, 0x8d, 0x5f, 0x87, 0xc4, 0x98, 0x19, 0xbf, 0x94, 0xc1, 0x7b, + 0x32, 0xf9, 0x81, 0x97, 0x21, 0x1f, 0xba, 0x51, 0x8d, 0x73, 0x4b, 0x4d, 0xcc, 0xb0, 0x8b, 0xe5, + 0xe4, 0x12, 0xe4, 0xa2, 0x2f, 0x41, 0x11, 0xa9, 0x7f, 0x01, 0x2b, 0x25, 0x77, 0x60, 0x64, 0xa0, + 0x36, 0xe3, 0xd2, 0x48, 0x69, 0xab, 0xa4, 0xc6, 0x51, 0xb8, 0xbb, 0xbd, 0xf9, 0xfd, 0x3b, 0x0a, + 0x3f, 0x95, 0x85, 0x29, 0xd6, 0xaf, 0xa5, 0x6e, 0xb0, 0xef, 0x7a, 0x4e, 0x70, 0xf4, 0xd4, 0xda, + 0x29, 0xde, 0xd6, 0x94, 0x9c, 0x79, 0xb9, 0xcb, 0xa8, 0xdf, 0x36, 0x90, 0xb9, 0xe2, 0x77, 0x86, + 0x60, 0x26, 0x85, 0x8a, 0xbc, 0xa6, 0x99, 0x12, 0xe7, 0x64, 0x78, 0xdd, 0xc7, 0xc7, 0x0b, 0xe3, + 0x12, 0x7d, 0x33, 0x0a, 0xb7, 0x5b, 0xd4, 0x2f, 0x9d, 0x79, 0x4f, 0xa1, 0x65, 0x51, 0xbd, 0x74, + 0xd6, 0xaf, 0x9a, 0xaf, 0xc2, 0x90, 0xe9, 0x36, 0xa9, 0xf4, 0x90, 0xc0, 0x8d, 0xdd, 0x63, 0x00, + 0xed, 0x6e, 0x8c, 0x01, 0xc8, 0x0a, 0x8c, 0xb0, 0x3f, 0xee, 0xdb, 0x1d, 0x61, 0xf5, 0x25, 0xa1, + 0x9a, 0x8d, 0xd0, 0x8e, 0xd3, 0xde, 0x53, 0x35, 0xed, 0x26, 0xb5, 0x5a, 0x76, 0x47, 0xd3, 0x40, + 0x38, 0xa2, 0xa6, 0xb1, 0x17, 0x7a, 0x6b, 0xec, 0x99, 0x13, 0x35, 0xf6, 0x06, 0x40, 0xcd, 0xd9, + 0x6b, 0x3b, 0xed, 0xbd, 0x52, 0x73, 0x4f, 0x04, 0x29, 0x5e, 0xed, 0x3d, 0x0a, 0xd7, 0x22, 0x64, + 0x9c, 0xb8, 0xfc, 0x6a, 0x86, 0xc3, 0x2c, 0xbb, 0xa9, 0x99, 0xa4, 0x23, 0x54, 0xb2, 0x06, 0x50, + 0xaa, 0x07, 0xce, 0x43, 0x36, 0x81, 0x7d, 0xe1, 0x7c, 0x2b, 0x1b, 0x5c, 0x2e, 0xdd, 0xa3, 0x47, + 0x35, 0x1a, 0x44, 0x26, 0x6e, 0x1b, 0x51, 0xd9, 0x3a, 0xd0, 0xfc, 0x64, 0x23, 0x0e, 0xa4, 0x03, + 0x67, 0x4a, 0x8d, 0x86, 0xc3, 0xbe, 0xc0, 0x6e, 0xe2, 0x9d, 0x0d, 0x6d, 0x20, 0xeb, 0xf1, 0x74, + 0xd6, 0x57, 0x05, 0xeb, 0x17, 0xec, 0x90, 0xca, 0x0a, 0x38, 0x59, 0xbc, 0x9a, 0x74, 0xc6, 0xc6, + 0x3a, 0x4c, 0xea, 0x9f, 0xae, 0x87, 0x56, 0x8e, 0x43, 0xc1, 0xac, 0x95, 0xac, 0xda, 0x4a, 0xe9, + 0x46, 0x31, 0x43, 0x8a, 0x30, 0x2e, 0x7e, 0x2d, 0x5a, 0x8b, 0x6f, 0xdc, 0x2a, 0x66, 0x35, 0xc8, + 0x1b, 0x37, 0x16, 0x13, 0x11, 0x0d, 0x23, 0xc5, 0x02, 0x37, 0x64, 0x18, 0xbf, 0x9a, 0x81, 0x82, + 0x6c, 0x37, 0xb9, 0x05, 0xb9, 0x5a, 0x6d, 0x25, 0x16, 0x83, 0x10, 0xed, 0x2f, 0x5c, 0x92, 0xfa, + 0xbe, 0xea, 0x68, 0xc6, 0x08, 0x18, 0xdd, 0xe6, 0x6a, 0x4d, 0xa8, 0x05, 0x92, 0x2e, 0x12, 0xdb, + 0x9c, 0x2e, 0xc5, 0x31, 0xfb, 0x16, 0xe4, 0xee, 0x6e, 0x6f, 0x0a, 0x35, 0x5e, 0xd2, 0x45, 0x92, + 0x94, 0xd3, 0x7d, 0x74, 0xa8, 0xca, 0x77, 0x46, 0x60, 0x98, 0x30, 0xa6, 0x4c, 0x61, 0xbe, 0xdd, + 0xb6, 0xdc, 0x30, 0x96, 0x50, 0x6c, 0xb7, 0x0c, 0x62, 0x8a, 0x12, 0xa6, 0x1d, 0xac, 0xba, 0x75, + 0xbb, 0x29, 0xf6, 0x6d, 0xd4, 0x0e, 0x9a, 0x0c, 0x60, 0x72, 0xb8, 0xf1, 0x5b, 0x19, 0x28, 0xa2, + 0x0e, 0x85, 0x4e, 0x67, 0xee, 0x01, 0x6d, 0x6f, 0xdd, 0x20, 0xaf, 0xcb, 0xc5, 0x96, 0x09, 0x0f, + 0x8d, 0x43, 0xb8, 0xd8, 0x62, 0x56, 0x67, 0xb1, 0xe0, 0x94, 0x70, 0xcd, 0xec, 0xe0, 0x61, 0x5e, + 0x27, 0x84, 0x6b, 0x2e, 0xc0, 0x10, 0x36, 0x47, 0x88, 0x45, 0x6c, 0x79, 0xc0, 0x00, 0x26, 0x87, + 0x2b, 0x52, 0xe9, 0x67, 0xb2, 0x89, 0x6f, 0x58, 0xfc, 0xbe, 0x0a, 0x95, 0xd2, 0x3f, 0x6e, 0x20, + 0x49, 0xfd, 0x01, 0xcc, 0xc6, 0xbb, 0x04, 0x0f, 0xf4, 0x25, 0x98, 0xd2, 0xe1, 0xf2, 0x6c, 0x7f, + 0x2e, 0xb5, 0xae, 0xad, 0x45, 0x33, 0x8e, 0x6f, 0xfc, 0x4f, 0x19, 0x18, 0xc5, 0x3f, 0xcd, 0x6e, + 0x13, 0xdd, 0x20, 0x4a, 0xdb, 0x35, 0x61, 0xbc, 0x53, 0xd5, 0x38, 0xfb, 0xd0, 0xb7, 0x84, 0x7d, + 0x4f, 0x93, 0x2f, 0x21, 0xb2, 0x20, 0xe5, 0x56, 0x39, 0x79, 0x43, 0x19, 0x92, 0x72, 0xf3, 0x9d, + 0x1f, 0x23, 0x15, 0xc8, 0xe8, 0x79, 0xb4, 0x5d, 0x63, 0xd3, 0x4f, 0xbd, 0x97, 0x44, 0x3a, 0xb7, + 0xa9, 0x7b, 0x1e, 0x71, 0x34, 0xbc, 0x96, 0xdc, 0xae, 0x95, 0xcc, 0x35, 0xed, 0x5a, 0x92, 0xb5, + 0x51, 0xf3, 0x4a, 0x15, 0x48, 0xc6, 0x3f, 0x1a, 0x8d, 0x77, 0xa0, 0xd8, 0xea, 0x4e, 0xb9, 0x36, + 0xde, 0x82, 0xa1, 0x52, 0xb3, 0xe9, 0x1e, 0x0a, 0x29, 0x21, 0xed, 0x0b, 0x61, 0xff, 0xf1, 0x9d, + 0xcc, 0x66, 0x28, 0x5a, 0xf8, 0x07, 0x03, 0x90, 0x32, 0x8c, 0x96, 0xb6, 0x6b, 0xd5, 0x6a, 0x65, + 0x73, 0x93, 0xbb, 0xba, 0xe7, 0x96, 0x5e, 0x92, 0xfd, 0xe3, 0x38, 0x0d, 0x2b, 0x7e, 0x33, 0x16, + 0x69, 0xee, 0x11, 0x1d, 0x79, 0x07, 0xe0, 0xae, 0xeb, 0xb4, 0xef, 0xd3, 0x60, 0xdf, 0x6d, 0x88, + 0x8f, 0xbf, 0xf0, 0xf8, 0x78, 0x61, 0xec, 0x23, 0xd7, 0x69, 0x5b, 0x2d, 0x04, 0xb3, 0xb6, 0x47, + 0x48, 0xa6, 0xf2, 0x37, 0xeb, 0xe9, 0x25, 0x97, 0xbb, 0x36, 0x0c, 0x45, 0x3d, 0xbd, 0xe3, 0x26, + 0xbc, 0x1a, 0x24, 0x1a, 0x69, 0xc1, 0x54, 0xad, 0xbb, 0xb7, 0x47, 0x99, 0x54, 0x17, 0x16, 0x8b, + 0x61, 0x71, 0xba, 0x0d, 0x13, 0x0c, 0xf0, 0x93, 0x08, 0x3b, 0x9f, 0xf8, 0x4b, 0xaf, 0xb1, 0x89, + 0xfc, 0xbd, 0xe3, 0x05, 0x71, 0xe3, 0xc6, 0x94, 0x34, 0x5f, 0xd2, 0x27, 0xed, 0x15, 0x71, 0xde, + 0x64, 0x1d, 0x86, 0xef, 0x38, 0xc1, 0x4a, 0x77, 0x47, 0xb8, 0x6e, 0xbf, 0xd0, 0x67, 0xd1, 0x70, + 0x44, 0x6e, 0xf2, 0xdd, 0x73, 0x82, 0xfd, 0xae, 0xea, 0xc6, 0x2d, 0xd8, 0x90, 0x6d, 0x28, 0x94, + 0x1d, 0xaf, 0xde, 0xa4, 0xe5, 0xaa, 0xd8, 0xf5, 0x2f, 0xf5, 0x61, 0x29, 0x51, 0x79, 0xbf, 0xd4, + 0xf1, 0x57, 0xdd, 0x51, 0xb5, 0x00, 0x89, 0x41, 0xfe, 0x7a, 0x06, 0x9e, 0x0d, 0x5b, 0x5f, 0xda, + 0xa3, 0xed, 0xe0, 0xbe, 0x1d, 0xd4, 0xf7, 0xa9, 0x27, 0x7a, 0x69, 0xb4, 0x5f, 0x2f, 0x7d, 0x29, + 0xd1, 0x4b, 0x57, 0xa2, 0x5e, 0xb2, 0x19, 0x33, 0xab, 0xc5, 0xb9, 0x25, 0xfb, 0xac, 0x5f, 0xad, + 0xc4, 0x02, 0x88, 0x6c, 0xf8, 0x22, 0xf4, 0xe7, 0xa5, 0x3e, 0x1f, 0x1c, 0x21, 0x0b, 0xf7, 0xdf, + 0xf0, 0xb7, 0xe6, 0xc9, 0x13, 0x42, 0xc9, 0x3d, 0x19, 0x27, 0xc1, 0x35, 0x92, 0x8b, 0x7d, 0x78, + 0xf3, 0xd8, 0x89, 0x99, 0x3e, 0x11, 0x51, 0x7c, 0xb4, 0x57, 0xed, 0x1d, 0xa1, 0x84, 0x9c, 0x30, + 0xda, 0xab, 0x76, 0x34, 0xda, 0x4d, 0x3b, 0x3e, 0xda, 0xab, 0xf6, 0x0e, 0x29, 0xf3, 0xe0, 0x2e, + 0x1e, 0x09, 0xf4, 0x7c, 0x3f, 0x6e, 0xe5, 0x0d, 0xbe, 0x33, 0xa7, 0x04, 0x79, 0x7d, 0x08, 0xa3, + 0xb5, 0x8e, 0x5d, 0xa7, 0x4d, 0x67, 0x37, 0x10, 0x97, 0x3a, 0x2f, 0xf6, 0x61, 0x15, 0xe2, 0x8a, + 0x0b, 0x01, 0xf9, 0x53, 0x3d, 0x20, 0x85, 0x38, 0xac, 0x85, 0x9b, 0x1b, 0xf7, 0xe7, 0xa6, 0x4e, + 0x6c, 0xe1, 0xe6, 0xc6, 0x7d, 0xa1, 0x73, 0x74, 0x5a, 0x9a, 0xce, 0xb1, 0x71, 0xdf, 0xf8, 0x8d, + 0x1c, 0x9c, 0xeb, 0x41, 0x43, 0xd6, 0xa4, 0x8c, 0xca, 0x68, 0x86, 0xc5, 0x1e, 0xe8, 0xd7, 0x4e, + 0x14, 0x5b, 0xab, 0x50, 0x5c, 0xbe, 0x87, 0x6a, 0x2d, 0xfb, 0x49, 0x1b, 0xe5, 0x92, 0x94, 0xee, + 0x17, 0x1f, 0x1f, 0x2f, 0x3c, 0x47, 0x0f, 0xd0, 0x29, 0xc8, 0xe6, 0x85, 0x56, 0x5d, 0x8b, 0xd3, + 0x4a, 0x50, 0xce, 0xff, 0x70, 0x16, 0xf2, 0xb8, 0xd3, 0xc4, 0xb2, 0x53, 0x64, 0x4e, 0x95, 0x9d, + 0xe2, 0x7d, 0x18, 0x5f, 0xbe, 0xc7, 0x0f, 0x9d, 0x2b, 0xb6, 0xbf, 0x2f, 0xe4, 0x20, 0xde, 0xb1, + 0xd1, 0x03, 0x4b, 0x9c, 0x51, 0xf7, 0x6d, 0x4d, 0xc9, 0xd3, 0x28, 0xc8, 0x03, 0x98, 0xe1, 0x6d, + 0x73, 0x76, 0x9d, 0x3a, 0x0f, 0x72, 0x77, 0xec, 0xa6, 0x10, 0x8a, 0x97, 0x1e, 0x1f, 0x2f, 0x2c, + 0xd0, 0x03, 0x74, 0x77, 0x12, 0xe5, 0x96, 0x8f, 0x08, 0xaa, 0xdf, 0x53, 0x0a, 0xbd, 0x1a, 0x79, + 0x6b, 0x8e, 0x62, 0x85, 0xac, 0x36, 0x56, 0x37, 0xc3, 0xe5, 0x48, 0xc6, 0xdf, 0x1b, 0x82, 0xf9, + 0xde, 0xf2, 0x8c, 0x7c, 0x59, 0x1f, 0xc0, 0xcb, 0x27, 0x4a, 0xc0, 0x93, 0xc7, 0xf0, 0x2b, 0x30, + 0xbb, 0xdc, 0x0e, 0xa8, 0xd7, 0xf1, 0x1c, 0x19, 0x6b, 0xbd, 0xe2, 0xfa, 0xd2, 0xbd, 0x0c, 0xfd, + 0xbc, 0x68, 0x58, 0x2e, 0xec, 0x83, 0xe8, 0xec, 0xa6, 0xb0, 0x4a, 0xe5, 0x40, 0x96, 0x61, 0x52, + 0x81, 0x37, 0xbb, 0x7b, 0x62, 0x07, 0x47, 0xdf, 0x45, 0x95, 0x67, 0xb3, 0xab, 0x1e, 0x74, 0x62, + 0x44, 0xf3, 0xbf, 0x94, 0x13, 0xd3, 0xe2, 0x12, 0xe4, 0x6a, 0xdd, 0x1d, 0x31, 0x1d, 0xb8, 0xaa, + 0xae, 0x89, 0x75, 0x56, 0x4a, 0xbe, 0x08, 0x60, 0xd2, 0x8e, 0xeb, 0x3b, 0x81, 0xeb, 0x1d, 0xa9, + 0xee, 0xff, 0x5e, 0x08, 0xd5, 0x7d, 0x35, 0x25, 0x94, 0xac, 0xc0, 0x54, 0xf4, 0x6b, 0xfd, 0xb0, + 0x2d, 0x8c, 0x9a, 0xa3, 0xdc, 0x9a, 0x10, 0x91, 0x5b, 0x2e, 0x2b, 0x53, 0x37, 0xaa, 0x18, 0x19, + 0x59, 0x84, 0xc2, 0xb6, 0xeb, 0x1d, 0xec, 0xb2, 0x81, 0xca, 0x47, 0x5b, 0xe9, 0xa1, 0x80, 0xa9, + 0x5b, 0x86, 0xc4, 0x63, 0x73, 0x7e, 0xb9, 0xfd, 0xd0, 0xf1, 0xdc, 0x76, 0x8b, 0xb6, 0x03, 0xf5, + 0xfe, 0x91, 0x46, 0x60, 0x2d, 0x58, 0x2a, 0x02, 0xb3, 0x33, 0x73, 0xa9, 0x1e, 0xb8, 0x9e, 0xb8, + 0x7c, 0xe4, 0xc3, 0xcd, 0x00, 0xda, 0x70, 0x33, 0x00, 0xeb, 0x44, 0x93, 0xee, 0x0a, 0xab, 0x39, + 0x76, 0xa2, 0x47, 0x77, 0xb5, 0x48, 0x30, 0xba, 0xcb, 0x54, 0x01, 0x93, 0xee, 0xe2, 0x41, 0x5f, + 0x4b, 0xa0, 0xb2, 0x9b, 0x30, 0x11, 0x09, 0x34, 0xe3, 0x77, 0x47, 0x7b, 0xce, 0x5b, 0x26, 0x7b, + 0x4f, 0x37, 0x6f, 0x57, 0xed, 0x01, 0xe6, 0xed, 0x6b, 0xa1, 0x07, 0xa8, 0x1a, 0xfe, 0x88, 0x10, + 0x55, 0xf8, 0x73, 0x9c, 0xf9, 0x5f, 0x2e, 0x9c, 0x66, 0x12, 0x89, 0x4e, 0xca, 0x0e, 0xda, 0x49, + 0xb9, 0x81, 0x3a, 0x89, 0x2c, 0xc1, 0x44, 0x98, 0x82, 0x67, 0xc3, 0x0e, 0x34, 0xd9, 0x14, 0xe6, + 0x4d, 0xb2, 0x3a, 0x76, 0xa0, 0xca, 0x26, 0x9d, 0x84, 0xbc, 0x0d, 0x63, 0xc2, 0x0d, 0x1a, 0x39, + 0x0c, 0x45, 0x8e, 0x68, 0xd2, 0x67, 0x3a, 0x46, 0xaf, 0xa2, 0xb3, 0x25, 0xb9, 0xe1, 0x74, 0x68, + 0xd3, 0x69, 0xd3, 0x1a, 0x5a, 0xcd, 0xc5, 0x8c, 0xc1, 0x25, 0xd9, 0x11, 0x25, 0x16, 0x37, 0xa8, + 0x6b, 0xf6, 0x32, 0x8d, 0x28, 0x3e, 0x59, 0x47, 0x4e, 0x35, 0x59, 0xb9, 0x1f, 0x88, 0xb7, 0xea, + 0xee, 0x39, 0xd2, 0xf3, 0x4d, 0xfa, 0x81, 0x78, 0x56, 0x93, 0x41, 0x63, 0x7e, 0x20, 0x1c, 0x95, + 0xe9, 0xf5, 0xec, 0x47, 0xb5, 0x22, 0x6e, 0x68, 0x50, 0xaf, 0x47, 0x22, 0xdd, 0xdd, 0x90, 0x23, + 0xc9, 0x6a, 0x96, 0x5b, 0xb6, 0xd3, 0x14, 0x51, 0x6e, 0x51, 0x35, 0x94, 0x41, 0xe3, 0xd5, 0x20, + 0x2a, 0xa9, 0xc3, 0xb8, 0x49, 0x77, 0x37, 0x3c, 0x37, 0xa0, 0xf5, 0x80, 0x36, 0x84, 0x2e, 0x23, + 0xd5, 0xf9, 0x25, 0xd7, 0xe5, 0x7a, 0xda, 0xd2, 0xeb, 0xbf, 0x7b, 0xbc, 0x90, 0xf9, 0xde, 0xf1, + 0x02, 0x30, 0x10, 0xf7, 0x65, 0x7d, 0x7c, 0xbc, 0x70, 0x8e, 0x8d, 0x7f, 0x47, 0x12, 0xab, 0x5b, + 0x8c, 0xca, 0x94, 0xfc, 0x20, 0x13, 0xba, 0x61, 0x97, 0x44, 0x95, 0x8d, 0xf7, 0xa8, 0xec, 0x8d, + 0xd4, 0xca, 0x16, 0x94, 0xde, 0x4e, 0xad, 0x34, 0xb5, 0x12, 0xf2, 0x0e, 0x8c, 0x95, 0xab, 0x65, + 0xb7, 0xbd, 0xeb, 0xec, 0xd5, 0x56, 0x4a, 0xa8, 0x10, 0x09, 0x3f, 0xe6, 0xba, 0x63, 0xd5, 0x11, + 0x6e, 0xf9, 0xfb, 0xb6, 0x16, 0x0b, 0x12, 0xe1, 0x93, 0x3b, 0x30, 0x29, 0x7f, 0x9a, 0x74, 0xf7, + 0x81, 0x59, 0x45, 0x3d, 0x48, 0x3a, 0x8f, 0x87, 0x1c, 0x58, 0x47, 0x74, 0x3d, 0x55, 0x3f, 0x8e, + 0x91, 0xb1, 0xc9, 0x58, 0xa1, 0x9d, 0xa6, 0x7b, 0xc4, 0x9a, 0xb7, 0xe9, 0x50, 0x0f, 0x35, 0x1f, + 0x31, 0x19, 0x1b, 0x61, 0x89, 0x15, 0x38, 0x9a, 0xb8, 0x8d, 0x11, 0x91, 0x35, 0x98, 0x16, 0x53, + 0x7c, 0xcb, 0xf1, 0x9d, 0x1d, 0xa7, 0xe9, 0x04, 0x47, 0x73, 0x45, 0xe4, 0x84, 0x5a, 0x88, 0x5c, + 0x17, 0x0f, 0xc3, 0x52, 0x85, 0x59, 0x92, 0xd4, 0xf8, 0xd5, 0x2c, 0x3c, 0xd7, 0x4f, 0xff, 0x27, + 0x35, 0x5d, 0x98, 0x5d, 0x19, 0xe0, 0xcc, 0x70, 0xb2, 0x38, 0x5b, 0x86, 0xc9, 0x75, 0x6f, 0xcf, + 0x6e, 0x3b, 0xdf, 0xc2, 0x73, 0x5d, 0xe8, 0x0e, 0x83, 0x9d, 0xe1, 0x2a, 0x25, 0xfa, 0x6c, 0x8f, + 0x11, 0xcd, 0x3f, 0x14, 0x62, 0xee, 0x93, 0x06, 0x56, 0xdc, 0x82, 0xd1, 0xb2, 0xdb, 0x0e, 0xe8, + 0xa3, 0x20, 0x16, 0x3c, 0xc7, 0x81, 0xf1, 0xe0, 0x39, 0x89, 0x6a, 0xfc, 0xbf, 0x59, 0xb8, 0xd0, + 0x57, 0x01, 0x26, 0x9b, 0x7a, 0xaf, 0x5d, 0x1d, 0x44, 0x6b, 0x3e, 0xb9, 0xdb, 0x16, 0x13, 0x9e, + 0x1b, 0x27, 0xfa, 0x2d, 0xcf, 0xff, 0x97, 0x19, 0xd1, 0x49, 0x9f, 0x83, 0x11, 0xac, 0x2a, 0xec, + 0x22, 0x6e, 0x1b, 0x42, 0x29, 0xec, 0xe8, 0xb6, 0x21, 0x8e, 0x46, 0x6e, 0x42, 0xa1, 0x6c, 0x37, + 0x9b, 0x4a, 0x68, 0x21, 0xea, 0xf5, 0x75, 0x84, 0xc5, 0x1c, 0x7d, 0x24, 0x22, 0x79, 0x13, 0x80, + 0xff, 0xad, 0xec, 0x15, 0x28, 0x2c, 0x05, 0x59, 0x6c, 0xbb, 0x50, 0x90, 0x31, 0x89, 0x58, 0xdd, + 0x0d, 0x63, 0xa0, 0x78, 0x12, 0x31, 0x06, 0xd0, 0x92, 0x88, 0x31, 0x80, 0xf1, 0x6b, 0x39, 0x78, + 0xbe, 0xff, 0x29, 0x8e, 0x3c, 0xd0, 0x87, 0xe0, 0x95, 0x81, 0xce, 0x7e, 0x27, 0x8f, 0x81, 0x4c, + 0xc9, 0xc7, 0x3b, 0xe4, 0x4a, 0xd2, 0xbd, 0xf8, 0xe3, 0xe3, 0x05, 0xc5, 0x7b, 0xec, 0xae, 0xeb, + 0xb4, 0x95, 0x3b, 0x82, 0x6f, 0x02, 0xd4, 0x02, 0x3b, 0x70, 0xea, 0x77, 0xb7, 0xef, 0xc9, 0x88, + 0xf5, 0x5b, 0x83, 0xb5, 0x2c, 0xa2, 0xe3, 0x72, 0x45, 0x98, 0xcf, 0x11, 0x6a, 0x7d, 0x74, 0x78, + 0xa0, 0x9d, 0x53, 0x23, 0xe4, 0xf9, 0x2f, 0x41, 0x31, 0x4e, 0x4a, 0x2e, 0x43, 0x1e, 0x1b, 0xa0, + 0xf8, 0x48, 0xc7, 0x38, 0x60, 0xf9, 0xfc, 0x7d, 0x31, 0x77, 0x96, 0x61, 0x52, 0x5c, 0x4c, 0xeb, + 0x16, 0x31, 0x5c, 0xaf, 0xf2, 0x5e, 0x3b, 0x69, 0x15, 0x8b, 0x11, 0x19, 0x7f, 0x96, 0x81, 0xf3, + 0x3d, 0xcf, 0xc7, 0x64, 0x43, 0x1f, 0xb0, 0x97, 0x4e, 0x3a, 0x50, 0x9f, 0x38, 0x56, 0xf3, 0x3f, + 0x21, 0xe7, 0xfe, 0xbb, 0x30, 0x5e, 0xeb, 0xee, 0xc4, 0x0f, 0x59, 0x3c, 0x7e, 0x59, 0x81, 0xab, + 0x3b, 0x98, 0x8a, 0xcf, 0xbe, 0x5f, 0xde, 0xbc, 0x0b, 0xc7, 0x0a, 0x7e, 0xf0, 0xc3, 0xef, 0x0f, + 0x03, 0xa3, 0x30, 0x6e, 0x4d, 0xed, 0xc4, 0x18, 0x91, 0xf1, 0x2b, 0xd9, 0xf4, 0xd3, 0x2a, 0x3b, + 0x6b, 0x9f, 0xe2, 0xb4, 0x7a, 0xa7, 0xbc, 0x71, 0xf2, 0xb7, 0xff, 0xc7, 0xf2, 0xdb, 0xf1, 0x22, + 0x52, 0x48, 0x3c, 0x69, 0xde, 0x13, 0x17, 0x91, 0x52, 0x3a, 0xfa, 0xfa, 0x45, 0xa4, 0x44, 0x26, + 0x6f, 0xc0, 0xe8, 0xaa, 0xcb, 0xe3, 0x49, 0xe5, 0x17, 0xf3, 0xc8, 0x21, 0x09, 0x54, 0xc5, 0x63, + 0x88, 0xc9, 0xce, 0x16, 0xfa, 0xc0, 0x4b, 0xf7, 0x6e, 0x3c, 0x5b, 0xc4, 0xa6, 0x8b, 0x6e, 0x04, + 0xd3, 0xc9, 0x8c, 0x9f, 0xc8, 0xc2, 0x24, 0x9f, 0xbc, 0xdc, 0x48, 0xfb, 0xd4, 0x1a, 0xc0, 0xdf, + 0xd2, 0x0c, 0xe0, 0x32, 0xd5, 0x81, 0xfa, 0x69, 0x03, 0x99, 0xbf, 0xf7, 0x81, 0x24, 0x69, 0x88, + 0x09, 0xe3, 0x2a, 0xb4, 0xbf, 0xe5, 0xfb, 0x46, 0x94, 0x15, 0x43, 0xc8, 0x0e, 0xbc, 0x7e, 0xf0, + 0x4d, 0x8d, 0x87, 0xf1, 0x57, 0xb3, 0x30, 0xa1, 0x5c, 0x54, 0x3e, 0xb5, 0x1d, 0xff, 0x25, 0xad, + 0xe3, 0xe7, 0x42, 0x97, 0xe4, 0xf0, 0xcb, 0x06, 0xea, 0xf7, 0x2e, 0x4c, 0x27, 0x48, 0xe2, 0xf7, + 0xbd, 0x99, 0x41, 0xee, 0x7b, 0x5f, 0x4b, 0x86, 0xeb, 0xf3, 0x4c, 0x95, 0x61, 0xb8, 0xbe, 0x9a, + 0x1f, 0xe0, 0xa7, 0xb2, 0x30, 0x2b, 0x7e, 0x61, 0x4e, 0x1a, 0x2e, 0xbd, 0x9f, 0xda, 0xb1, 0x28, + 0x69, 0x63, 0xb1, 0xa0, 0x8f, 0x85, 0xf2, 0x81, 0xbd, 0x87, 0xc4, 0xf8, 0xcb, 0x00, 0x73, 0xbd, + 0x08, 0x06, 0x8e, 0xfc, 0x89, 0xfc, 0xaa, 0xb3, 0x03, 0xf8, 0x55, 0xaf, 0x42, 0x11, 0xab, 0x12, + 0x19, 0x2c, 0x7c, 0x76, 0x06, 0xc8, 0x45, 0x0a, 0x37, 0x4f, 0x1c, 0x24, 0xb2, 0x60, 0xf8, 0xb1, + 0x43, 0x40, 0x82, 0x92, 0xfc, 0x52, 0x06, 0x26, 0x11, 0xb8, 0xfc, 0x90, 0xb6, 0x03, 0x64, 0x96, + 0x17, 0x6e, 0xc0, 0xa1, 0x7d, 0xbc, 0x16, 0x78, 0x4e, 0x7b, 0x4f, 0x18, 0xc8, 0x77, 0x84, 0x81, + 0xfc, 0x6d, 0x6e, 0xd8, 0xbf, 0x56, 0x77, 0x5b, 0xd7, 0xf7, 0x3c, 0xfb, 0xa1, 0xc3, 0xef, 0xe0, + 0xed, 0xe6, 0xf5, 0x28, 0x51, 0x72, 0xc7, 0x89, 0xa5, 0x3e, 0x16, 0xac, 0xf0, 0xf2, 0x81, 0x37, + 0x94, 0x62, 0xb5, 0xf1, 0xb3, 0x8a, 0xde, 0x22, 0xf2, 0x03, 0x70, 0x8e, 0x87, 0xa7, 0x33, 0x95, + 0xd7, 0x69, 0x77, 0xdd, 0xae, 0xbf, 0x64, 0xd7, 0x0f, 0xd8, 0xbe, 0xc7, 0x43, 0x19, 0xf0, 0xcb, + 0xeb, 0x61, 0xa1, 0xb5, 0xc3, 0x4b, 0xb5, 0xd0, 0xad, 0x74, 0x06, 0x64, 0x05, 0xa6, 0x79, 0x51, + 0xa9, 0x1b, 0xb8, 0xb5, 0xba, 0xdd, 0x74, 0xda, 0x7b, 0x78, 0xa6, 0x2e, 0xf0, 0xfd, 0xd8, 0xee, + 0x06, 0xae, 0xe5, 0x73, 0xb8, 0x7a, 0x74, 0x49, 0x10, 0x91, 0x2a, 0x4c, 0x99, 0xd4, 0x6e, 0xdc, + 0xb7, 0x1f, 0x95, 0xed, 0x8e, 0x5d, 0x67, 0x07, 0xa1, 0x02, 0x5e, 0x26, 0xe1, 0xd9, 0xcc, 0xa3, + 0x76, 0xc3, 0x6a, 0xd9, 0x8f, 0xac, 0xba, 0x28, 0xd4, 0x6d, 0x58, 0x1a, 0x5d, 0xc8, 0xca, 0x69, + 0x87, 0xac, 0x46, 0xe3, 0xac, 0x9c, 0x76, 0x6f, 0x56, 0x11, 0x9d, 0x64, 0xb5, 0x69, 0x7b, 0x7b, + 0x34, 0xe0, 0x2e, 0x6c, 0xec, 0x3c, 0x9e, 0x51, 0x58, 0x05, 0x58, 0x66, 0xa1, 0x3b, 0x5b, 0x9c, + 0x95, 0x42, 0xc7, 0x66, 0xde, 0xb6, 0xe7, 0x04, 0x54, 0xfd, 0xc2, 0x31, 0x6c, 0x16, 0xf6, 0x3f, + 0x3a, 0xff, 0xf5, 0xfa, 0xc4, 0x04, 0x65, 0xc4, 0x4d, 0xf9, 0xc8, 0xf1, 0x04, 0xb7, 0xf4, 0xaf, + 0x4c, 0x50, 0x86, 0xdc, 0xd4, 0xef, 0x9c, 0xc0, 0xef, 0x54, 0xb8, 0xf5, 0xf8, 0xd0, 0x04, 0x25, + 0x59, 0x63, 0x9d, 0x16, 0xd0, 0x36, 0x9b, 0xd1, 0xc2, 0x85, 0x6f, 0x12, 0x9b, 0xf6, 0xa2, 0xf0, + 0x43, 0x29, 0x7a, 0xb2, 0xd8, 0x4a, 0x71, 0xe8, 0x8b, 0x13, 0x93, 0xbf, 0x00, 0x53, 0x0f, 0x7c, + 0x7a, 0xbb, 0xba, 0x51, 0x93, 0x01, 0xf9, 0x78, 0xda, 0x9e, 0x5c, 0xbc, 0x71, 0x82, 0xd0, 0xb9, + 0xa6, 0xd2, 0x60, 0xbe, 0x62, 0x3e, 0x6e, 0x5d, 0x9f, 0x5a, 0xbb, 0x4e, 0xc7, 0x0f, 0x53, 0x83, + 0xa8, 0xe3, 0x16, 0xab, 0xca, 0x58, 0x81, 0xe9, 0x04, 0x1b, 0x32, 0x09, 0xc0, 0x80, 0xd6, 0x83, + 0xb5, 0xda, 0xf2, 0x66, 0xf1, 0x19, 0x52, 0x84, 0x71, 0xfc, 0xbd, 0xbc, 0x56, 0x5a, 0x5a, 0x5d, + 0xae, 0x14, 0x33, 0x64, 0x1a, 0x26, 0x10, 0x52, 0xa9, 0xd6, 0x38, 0x28, 0xcb, 0xb3, 0x55, 0x9a, + 0x45, 0xbe, 0x74, 0x03, 0xb6, 0x00, 0x70, 0x4f, 0x31, 0xfe, 0x46, 0x16, 0xce, 0xcb, 0x6d, 0x85, + 0x06, 0x87, 0xae, 0x77, 0xe0, 0xb4, 0xf7, 0x9e, 0xf2, 0xdd, 0xe1, 0xb6, 0xb6, 0x3b, 0xbc, 0x18, + 0xdb, 0xa9, 0x63, 0x5f, 0xd9, 0x67, 0x8b, 0xf8, 0x5f, 0x0a, 0x70, 0xa1, 0x2f, 0x15, 0xf9, 0x32, + 0xdb, 0xcd, 0x1d, 0xda, 0x0e, 0xaa, 0x8d, 0x26, 0xdd, 0x74, 0x5a, 0xd4, 0xed, 0x06, 0xc2, 0x65, + 0xf4, 0x12, 0x1e, 0x70, 0xb1, 0xd0, 0x72, 0x1a, 0x4d, 0x6a, 0x05, 0xbc, 0x58, 0x9b, 0x6e, 0x49, + 0x6a, 0xc6, 0x32, 0xcc, 0x9d, 0x5e, 0x6d, 0x07, 0xd4, 0x7b, 0x88, 0xce, 0x29, 0x21, 0xcb, 0x03, + 0x4a, 0x3b, 0x96, 0xcd, 0x4a, 0x2d, 0x47, 0x14, 0xeb, 0x2c, 0x13, 0xd4, 0xe4, 0xb6, 0xc2, 0xb2, + 0xcc, 0xd4, 0xe1, 0xfb, 0xf6, 0x23, 0x71, 0x5b, 0x2e, 0xd2, 0x1a, 0x85, 0x2c, 0x79, 0xb4, 0x51, + 0xcb, 0x7e, 0x64, 0x26, 0x49, 0xc8, 0xd7, 0xe0, 0x8c, 0xd8, 0x80, 0x44, 0xb4, 0xa8, 0xfc, 0x62, + 0x1e, 0x8b, 0xfa, 0xf2, 0xe3, 0xe3, 0x85, 0x73, 0x32, 0x89, 0x93, 0x8c, 0x0f, 0x4e, 0xfb, 0xea, + 0x74, 0x2e, 0x64, 0x93, 0x6d, 0xc8, 0xb1, 0xee, 0xb8, 0x4f, 0x7d, 0xdf, 0xde, 0x93, 0x37, 0xeb, + 0xdc, 0xbf, 0x5e, 0xe9, 0x4c, 0xab, 0xc5, 0xcb, 0xcd, 0x9e, 0x94, 0x64, 0x05, 0x26, 0xb7, 0xe9, + 0x8e, 0x3a, 0x3e, 0xc3, 0xa1, 0xa8, 0x2a, 0x1e, 0xd2, 0x9d, 0xde, 0x83, 0x13, 0xa3, 0x23, 0x0e, + 0x1a, 0xcc, 0x1e, 0x1d, 0xad, 0x3a, 0x7e, 0x40, 0xdb, 0xd4, 0xc3, 0x2c, 0x04, 0x23, 0x28, 0x0c, + 0xe6, 0x22, 0x0d, 0x59, 0x2f, 0x5f, 0x7a, 0xe1, 0xf1, 0xf1, 0xc2, 0x05, 0x1e, 0x4f, 0xd2, 0x14, + 0x70, 0x2b, 0x96, 0x79, 0x3c, 0xc9, 0x95, 0x7c, 0x03, 0xa6, 0x4c, 0xb7, 0x1b, 0x38, 0xed, 0xbd, + 0x5a, 0xe0, 0xd9, 0x01, 0xdd, 0xe3, 0x1b, 0x52, 0x94, 0xee, 0x20, 0x56, 0x2a, 0xee, 0x5a, 0x38, + 0xd0, 0xf2, 0x05, 0x54, 0xdb, 0x11, 0x74, 0x02, 0xf2, 0x75, 0x98, 0xe4, 0x71, 0x82, 0x61, 0x05, + 0xa3, 0x5a, 0xd6, 0x54, 0xbd, 0x70, 0xeb, 0x06, 0x3f, 0xa0, 0xf2, 0x78, 0xc3, 0xb4, 0x0a, 0x62, + 0xdc, 0xc8, 0x87, 0xa2, 0xb3, 0x36, 0x9c, 0xf6, 0x5e, 0x38, 0x8d, 0x01, 0x7b, 0xfe, 0xf5, 0xa8, + 0x4b, 0x3a, 0xac, 0xb9, 0x72, 0x1a, 0xf7, 0xf0, 0xd4, 0x48, 0xf2, 0x21, 0x01, 0x5c, 0x28, 0xf9, + 0xbe, 0xe3, 0x07, 0xc2, 0xb1, 0x7a, 0xf9, 0x11, 0xad, 0x77, 0x19, 0xf2, 0xb6, 0xeb, 0x1d, 0x50, + 0x8f, 0xbb, 0xf6, 0x0d, 0x2d, 0x5d, 0x7b, 0x7c, 0xbc, 0xf0, 0x8a, 0x8d, 0x88, 0x96, 0xf0, 0xc5, + 0xb6, 0xa8, 0x44, 0xb5, 0x0e, 0x39, 0xae, 0xf2, 0x0d, 0xfd, 0x99, 0x92, 0xaf, 0xc3, 0xd9, 0xb2, + 0xed, 0xd3, 0x6a, 0xdb, 0xa7, 0x6d, 0xdf, 0x09, 0x9c, 0x87, 0x54, 0x74, 0x2a, 0x6e, 0x7e, 0x05, + 0xcc, 0xd1, 0x6e, 0xd4, 0x6d, 0x9f, 0x2d, 0xcc, 0x10, 0xc5, 0x12, 0x83, 0xa2, 0x54, 0xd3, 0x83, + 0x8b, 0x71, 0x9c, 0x81, 0x62, 0xbc, 0xdb, 0xc9, 0x57, 0x60, 0x94, 0xbb, 0x24, 0x50, 0x7f, 0x5f, + 0x84, 0xb8, 0xc9, 0x1b, 0xee, 0x10, 0xae, 0x13, 0x89, 0xa0, 0x04, 0xee, 0xf0, 0x40, 0xd5, 0xfb, + 0x5a, 0x0c, 0x4a, 0x90, 0x44, 0xa4, 0x01, 0xe3, 0xbc, 0x67, 0x29, 0xe6, 0x25, 0x11, 0x9e, 0x69, + 0x2f, 0xa8, 0x33, 0x59, 0x14, 0xc5, 0xf8, 0xa3, 0xc9, 0x5b, 0x8c, 0x1f, 0x47, 0xd0, 0xaa, 0xd0, + 0xb8, 0x2e, 0x01, 0x14, 0x24, 0xa1, 0x71, 0x1e, 0xce, 0xf5, 0x68, 0xb3, 0xf1, 0x10, 0xaf, 0xc1, + 0x7a, 0xd4, 0x48, 0xbe, 0x02, 0xb3, 0x48, 0x58, 0x76, 0xdb, 0x6d, 0x5a, 0x0f, 0x50, 0x74, 0x48, + 0xd3, 0x51, 0x8e, 0xdf, 0xb5, 0xf2, 0xef, 0xad, 0x87, 0x08, 0x56, 0xdc, 0x82, 0x94, 0xca, 0xc1, + 0xf8, 0xb9, 0x2c, 0xcc, 0x09, 0x69, 0x64, 0xd2, 0xba, 0xeb, 0x35, 0x9e, 0xfe, 0xdd, 0x6f, 0x59, + 0xdb, 0xfd, 0x2e, 0x85, 0x31, 0xcd, 0x69, 0x1f, 0xd9, 0x67, 0xf3, 0xfb, 0x95, 0x0c, 0x3c, 0xd7, + 0x8f, 0x88, 0xf5, 0x4e, 0x98, 0x87, 0x65, 0x34, 0x91, 0x6f, 0xa5, 0x03, 0x33, 0x38, 0xa0, 0xe5, + 0x7d, 0x5a, 0x3f, 0xf0, 0x57, 0x5c, 0x3f, 0x40, 0xc7, 0xd8, 0x6c, 0x8f, 0x8b, 0x9a, 0xd7, 0x52, + 0x2f, 0x6a, 0xce, 0xf2, 0x59, 0x56, 0x47, 0x1e, 0x3c, 0x53, 0xcc, 0x01, 0x3d, 0xf2, 0xcd, 0x34, + 0xd6, 0xe8, 0xe4, 0x58, 0xea, 0x06, 0xfb, 0x1b, 0x1e, 0xdd, 0xa5, 0x1e, 0x6d, 0xd7, 0xe9, 0xf7, + 0x99, 0x93, 0xa3, 0xfe, 0x71, 0x03, 0x59, 0x1b, 0x7e, 0x65, 0x1c, 0x66, 0xd3, 0xc8, 0x58, 0xbf, + 0x28, 0x07, 0xdc, 0xf8, 0x73, 0x2f, 0x3f, 0x9a, 0x81, 0xf1, 0x1a, 0xad, 0xbb, 0xed, 0xc6, 0x6d, + 0xbc, 0x0e, 0x17, 0xbd, 0x63, 0xf1, 0x0d, 0x9e, 0xc1, 0xad, 0xdd, 0xd8, 0x3d, 0xf9, 0xc7, 0xc7, + 0x0b, 0xef, 0x0f, 0x76, 0xae, 0xac, 0xbb, 0x18, 0x97, 0x1c, 0x60, 0x3a, 0xd2, 0xb0, 0x0a, 0xb4, + 0x6c, 0x6b, 0x95, 0x92, 0x25, 0x98, 0x10, 0xcb, 0xd5, 0x55, 0xd3, 0xf0, 0xf0, 0xb0, 0x6f, 0x59, + 0x90, 0xc8, 0x3b, 0xa6, 0x91, 0x90, 0x9b, 0x90, 0x7b, 0xb0, 0x78, 0x5b, 0x8c, 0x81, 0x4c, 0xe8, + 0xfa, 0x60, 0xf1, 0x36, 0x9a, 0xae, 0xd8, 0x71, 0x60, 0xa2, 0xbb, 0xa8, 0xdd, 0x50, 0x3f, 0x58, + 0xbc, 0x4d, 0xfe, 0x12, 0x9c, 0xa9, 0x38, 0xbe, 0xa8, 0x82, 0xbb, 0xdb, 0x36, 0x30, 0xbc, 0x64, + 0xb8, 0xc7, 0xec, 0xfd, 0x42, 0xea, 0xec, 0x7d, 0xa1, 0x11, 0x32, 0xb1, 0xb8, 0x2f, 0x6f, 0x23, + 0x9e, 0x6e, 0x28, 0xbd, 0x1e, 0xf2, 0x11, 0x4c, 0xa2, 0xe9, 0x15, 0x3d, 0x90, 0x31, 0x3d, 0xe2, + 0x48, 0x8f, 0x9a, 0x3f, 0x97, 0x5a, 0xf3, 0x3c, 0x5a, 0x72, 0x2d, 0xf4, 0x63, 0xc6, 0x54, 0x8a, + 0xda, 0x09, 0x5d, 0xe3, 0x4c, 0xee, 0xc2, 0x94, 0x50, 0x95, 0xd6, 0x77, 0x37, 0xf7, 0x69, 0xc5, + 0x3e, 0x12, 0x97, 0xcb, 0x78, 0xfa, 0x12, 0xfa, 0x95, 0xe5, 0xee, 0x5a, 0xc1, 0x3e, 0xb5, 0x1a, + 0xb6, 0xa6, 0x54, 0xc4, 0x08, 0xc9, 0x0f, 0xc2, 0xd8, 0xaa, 0x5b, 0x67, 0x5a, 0x32, 0x4a, 0x06, + 0x7e, 0xdf, 0xfc, 0x01, 0x3e, 0x28, 0xc2, 0xc1, 0x31, 0xd5, 0xe7, 0xe3, 0xe3, 0x85, 0xb7, 0x4e, + 0x3b, 0x69, 0x94, 0x0a, 0x4c, 0xb5, 0x36, 0x52, 0x86, 0xc2, 0x36, 0xdd, 0x61, 0x5f, 0x1b, 0x7f, + 0x6c, 0x40, 0x82, 0x85, 0x3b, 0x89, 0xf8, 0xa5, 0xb9, 0x93, 0x08, 0x18, 0xf1, 0x60, 0x1a, 0xfb, + 0x67, 0xc3, 0xf6, 0xfd, 0x43, 0xd7, 0x6b, 0x60, 0x56, 0xd9, 0x5e, 0x57, 0xd9, 0x8b, 0xa9, 0x9d, + 0xff, 0x1c, 0xef, 0xfc, 0x8e, 0xc2, 0x41, 0x55, 0xf6, 0x12, 0xec, 0xc9, 0x37, 0x60, 0xd2, 0xa4, + 0xdf, 0xec, 0x3a, 0x1e, 0xbd, 0x7f, 0xbb, 0x84, 0xab, 0x72, 0x5c, 0x0b, 0xd2, 0xd1, 0x0b, 0xb9, + 0x46, 0xe9, 0x71, 0x98, 0xb4, 0x16, 0x59, 0xad, 0x5d, 0x5b, 0xbf, 0x2d, 0x50, 0x49, 0xc8, 0x06, + 0x8c, 0x55, 0xe8, 0x43, 0xa7, 0x4e, 0x31, 0x94, 0x40, 0xb8, 0xf2, 0x85, 0xd9, 0xd2, 0xa3, 0x12, + 0x6e, 0x37, 0x69, 0x20, 0x80, 0x07, 0x26, 0xe8, 0xde, 0x62, 0x21, 0x22, 0xb9, 0x05, 0xb9, 0x6a, + 0x65, 0x43, 0x78, 0xf2, 0x49, 0x0f, 0xfd, 0x6a, 0x63, 0x43, 0xe6, 0x96, 0x46, 0xe7, 0x0f, 0xa7, + 0xa1, 0xf9, 0x01, 0x56, 0x2b, 0x1b, 0x64, 0x17, 0x26, 0xb0, 0x03, 0x56, 0xa8, 0xcd, 0xfb, 0x76, + 0xaa, 0x47, 0xdf, 0x5e, 0x4b, 0xed, 0xdb, 0x39, 0xde, 0xb7, 0xfb, 0x82, 0x5a, 0x4b, 0x96, 0xab, + 0xb2, 0x65, 0xea, 0xa7, 0x48, 0xe0, 0x2d, 0xd3, 0xc5, 0x6e, 0xae, 0xe2, 0xe5, 0xb6, 0x50, 0x3f, + 0x65, 0xbe, 0xef, 0x30, 0xe7, 0x6c, 0x4f, 0x47, 0xe1, 0x24, 0x1f, 0xf2, 0x25, 0xc8, 0xaf, 0x1f, + 0x04, 0xf6, 0xdc, 0xb4, 0xd6, 0x8f, 0x0c, 0x24, 0x3f, 0x1f, 0x2d, 0x86, 0xee, 0x81, 0x96, 0x90, + 0x02, 0x69, 0xc8, 0x22, 0x8c, 0x6c, 0x54, 0xb7, 0x6a, 0x4d, 0x37, 0x98, 0x23, 0xe1, 0x99, 0x86, + 0x74, 0x9c, 0x87, 0x96, 0xdf, 0x74, 0xf5, 0x47, 0x00, 0x24, 0x22, 0x1b, 0xbe, 0x15, 0xdb, 0x6b, + 0x1c, 0xda, 0x1e, 0x46, 0x80, 0xcd, 0x68, 0xd5, 0x2a, 0x25, 0x7c, 0xf8, 0xf6, 0x05, 0x20, 0x16, + 0x16, 0xa6, 0xb2, 0x10, 0xd6, 0x80, 0x69, 0x31, 0x4d, 0xc4, 0xa7, 0xdd, 0xbf, 0x5d, 0x32, 0xfe, + 0x83, 0x0c, 0x0a, 0x4c, 0xf2, 0x0a, 0xc6, 0xac, 0x87, 0x17, 0xbc, 0x68, 0xd7, 0xb4, 0x3b, 0xb1, + 0x14, 0x8b, 0x1c, 0x85, 0xbc, 0x06, 0xc3, 0xb7, 0xed, 0x3a, 0x0d, 0xe4, 0xc5, 0x0e, 0x22, 0xef, + 0x22, 0x44, 0x35, 0x82, 0x72, 0x1c, 0xa6, 0xcb, 0xf1, 0x89, 0x54, 0x8a, 0x5e, 0x5f, 0x2b, 0x97, + 0xe4, 0xbd, 0x0e, 0xea, 0x72, 0x62, 0x02, 0x2a, 0xcf, 0xb3, 0xc5, 0x7c, 0x20, 0x53, 0x39, 0x18, + 0x7f, 0x92, 0x89, 0x24, 0x00, 0x79, 0x19, 0xf2, 0xe6, 0x46, 0xd8, 0x7e, 0x1e, 0x0d, 0x15, 0x6b, + 0x3e, 0x22, 0x90, 0x0f, 0xe1, 0x8c, 0xc2, 0x27, 0xe1, 0x90, 0xf9, 0x12, 0x86, 0xeb, 0x28, 0x2d, + 0x49, 0xf7, 0xca, 0x4c, 0xe7, 0x81, 0x8a, 0x6b, 0x54, 0x50, 0xa1, 0x6d, 0x87, 0xf3, 0x56, 0x3e, + 0x56, 0xe5, 0xdd, 0x40, 0x84, 0xf8, 0xc7, 0xa6, 0x71, 0xe0, 0x11, 0x3b, 0xc6, 0x6f, 0x66, 0xb4, + 0x95, 0x1d, 0x3e, 0x73, 0x95, 0x39, 0xe1, 0x99, 0xab, 0x37, 0x01, 0x4a, 0xdd, 0xc0, 0x5d, 0x6e, + 0x7b, 0x6e, 0x93, 0x5b, 0x17, 0x44, 0x96, 0x51, 0xb4, 0x99, 0x52, 0x04, 0x6b, 0x81, 0x05, 0x21, + 0x72, 0xaa, 0xef, 0x6a, 0xee, 0x93, 0xfa, 0xae, 0x1a, 0xbf, 0x97, 0xd1, 0xe6, 0x36, 0xd3, 0xc8, + 0xe4, 0xf2, 0x50, 0x5c, 0x0b, 0x92, 0xcb, 0x23, 0x5a, 0x1c, 0xff, 0xff, 0x0c, 0x9c, 0xe5, 0x4e, + 0xa0, 0x6b, 0xdd, 0xd6, 0x0e, 0xf5, 0xb6, 0xec, 0xa6, 0xd3, 0xe0, 0x11, 0x69, 0x5c, 0xd9, 0xbc, + 0x92, 0x5c, 0x28, 0xe9, 0xf8, 0xfc, 0x00, 0xc7, 0x9d, 0x52, 0xad, 0x36, 0x16, 0x5a, 0x0f, 0xc3, + 0x52, 0xf5, 0x00, 0x97, 0x4e, 0x6f, 0xfc, 0x6a, 0x06, 0x5e, 0x38, 0xb1, 0x16, 0x72, 0x1d, 0x46, + 0x64, 0x7a, 0xd7, 0x0c, 0x76, 0x3c, 0x3a, 0x64, 0x25, 0x53, 0xbb, 0x4a, 0x2c, 0xf2, 0x55, 0x38, + 0xa3, 0xb2, 0xda, 0xf4, 0x6c, 0x47, 0x4d, 0xa2, 0x9a, 0xd2, 0xea, 0x80, 0xa1, 0xc4, 0x35, 0xa3, + 0x74, 0x26, 0xc6, 0xff, 0x95, 0x51, 0x1e, 0xbe, 0x7b, 0x4a, 0xf5, 0xe5, 0x5b, 0x9a, 0xbe, 0x2c, + 0xb3, 0x05, 0x85, 0x5f, 0xc5, 0xca, 0x52, 0xcf, 0x38, 0x53, 0x8a, 0x63, 0x21, 0x02, 0xbe, 0x9d, + 0x85, 0xb1, 0x07, 0x3e, 0xf5, 0xf8, 0x05, 0xe7, 0xf7, 0x57, 0x56, 0x98, 0xf0, 0xbb, 0x06, 0xca, + 0xdb, 0xf1, 0x47, 0x19, 0x34, 0x7c, 0xab, 0x14, 0xac, 0x37, 0x94, 0xc7, 0x2e, 0xb0, 0x37, 0xf0, + 0x99, 0x0b, 0x84, 0xf2, 0xdc, 0x1e, 0xab, 0xfa, 0xbb, 0x37, 0xf8, 0xf8, 0xd1, 0x2a, 0x79, 0x1f, + 0x86, 0x1e, 0xa0, 0x19, 0x4f, 0x8f, 0x3e, 0x0e, 0xf9, 0x63, 0x21, 0x17, 0xd2, 0x5d, 0xf6, 0xa7, + 0xba, 0xc7, 0x60, 0x19, 0xa9, 0xc1, 0x48, 0xd9, 0xa3, 0xf8, 0x8c, 0x5d, 0x7e, 0xf0, 0x08, 0xba, + 0x3a, 0x27, 0x89, 0x47, 0xd0, 0x09, 0x4e, 0xc6, 0xcf, 0x66, 0x81, 0x44, 0xdf, 0x88, 0xf9, 0xdf, + 0xfd, 0xa7, 0x76, 0xd0, 0xdf, 0xd3, 0x06, 0xfd, 0x42, 0x62, 0xd0, 0xf9, 0xe7, 0x0d, 0x34, 0xf6, + 0xbf, 0x95, 0x81, 0xb3, 0xe9, 0x84, 0xe4, 0x12, 0x0c, 0xaf, 0x6f, 0x6e, 0xc8, 0x00, 0x76, 0xf1, + 0x29, 0x6e, 0x07, 0xcf, 0xe5, 0xa6, 0x28, 0x22, 0xaf, 0xc3, 0xf0, 0x97, 0xcd, 0x32, 0xdb, 0x87, + 0x94, 0x5c, 0xab, 0xdf, 0xf4, 0xac, 0xba, 0xbe, 0x15, 0x09, 0x24, 0x75, 0x6c, 0x73, 0x4f, 0x6c, + 0x6c, 0x7f, 0x2a, 0x0b, 0x53, 0xa5, 0x7a, 0x9d, 0xfa, 0x3e, 0x53, 0x72, 0xa8, 0x1f, 0x3c, 0xb5, + 0x03, 0x9b, 0x1e, 0x9a, 0xae, 0x7d, 0xdb, 0x40, 0xa3, 0xfa, 0x3b, 0x19, 0x38, 0x23, 0xa9, 0x1e, + 0x3a, 0xf4, 0x70, 0x73, 0xdf, 0xa3, 0xfe, 0xbe, 0xdb, 0x6c, 0x0c, 0x9c, 0xd0, 0x99, 0x29, 0x7a, + 0x98, 0xa5, 0x51, 0xbd, 0xed, 0xde, 0x45, 0x88, 0xa6, 0xe8, 0xf1, 0x4c, 0x8e, 0xd7, 0x61, 0xa4, + 0xd4, 0xe9, 0x78, 0xee, 0x43, 0xbe, 0xec, 0x27, 0x44, 0x40, 0x21, 0x07, 0x69, 0x01, 0x88, 0x1c, + 0xc4, 0x9a, 0x51, 0xa1, 0x6d, 0x9e, 0x4b, 0x67, 0x82, 0x37, 0xa3, 0x41, 0xdb, 0xaa, 0x0e, 0x8b, + 0xe5, 0x46, 0x0d, 0xc8, 0x86, 0xe7, 0xb6, 0xdc, 0x80, 0x36, 0xf8, 0xf7, 0x60, 0xdc, 0xe6, 0x89, + 0x49, 0x40, 0x36, 0x9d, 0xa0, 0xa9, 0x25, 0x01, 0x09, 0x18, 0xc0, 0xe4, 0x70, 0xe3, 0x7f, 0x1f, + 0x82, 0x71, 0xb5, 0x77, 0x88, 0xc1, 0xb3, 0xb4, 0xba, 0x9e, 0x1a, 0x3c, 0x6c, 0x23, 0xc4, 0x14, + 0x25, 0x51, 0xcc, 0x7d, 0xf6, 0xc4, 0x98, 0xfb, 0x6d, 0x98, 0xd8, 0xf0, 0xdc, 0x8e, 0xeb, 0xd3, + 0x06, 0x7f, 0xde, 0x94, 0x8b, 0xc2, 0x19, 0xe5, 0x8c, 0xc7, 0x06, 0x12, 0xef, 0x09, 0xd1, 0xc2, + 0xd1, 0x11, 0xd8, 0x56, 0xfc, 0xf1, 0x53, 0x9d, 0x0f, 0x77, 0x41, 0xb0, 0x7d, 0x91, 0x32, 0x2b, + 0x74, 0x41, 0x60, 0x10, 0xdd, 0x05, 0x81, 0x41, 0xd4, 0xb5, 0x36, 0xf4, 0xa4, 0xd6, 0x1a, 0xf9, + 0xd9, 0x0c, 0x8c, 0x95, 0xda, 0x6d, 0x11, 0xcb, 0x7f, 0x42, 0x30, 0xe3, 0x57, 0x85, 0x17, 0xc2, + 0x5b, 0x9f, 0xc8, 0x0b, 0x01, 0xf5, 0x16, 0x1f, 0x35, 0xd5, 0xa8, 0x42, 0xf5, 0x94, 0xa3, 0xb4, + 0x83, 0xbc, 0x05, 0xc5, 0x70, 0x92, 0x57, 0xdb, 0x0d, 0xfa, 0x88, 0xfa, 0x73, 0x23, 0x17, 0x73, + 0x57, 0x26, 0x44, 0xb2, 0x3c, 0x55, 0x33, 0x8d, 0x23, 0x92, 0x4d, 0x00, 0x3b, 0x9c, 0x5d, 0xb1, + 0x87, 0x65, 0x92, 0xd3, 0x4f, 0x68, 0xcf, 0xf8, 0x1b, 0x2f, 0x7a, 0x54, 0xed, 0x39, 0xe2, 0x43, + 0x5a, 0x30, 0xc5, 0x5f, 0x75, 0xc1, 0xd7, 0x5e, 0x31, 0x27, 0x2c, 0x9c, 0x38, 0x0e, 0x2f, 0x0b, + 0x5b, 0xd5, 0xb3, 0xe2, 0xad, 0x18, 0x7c, 0x40, 0xd6, 0x4a, 0x49, 0x10, 0x1b, 0xe7, 0xcd, 0x53, + 0x13, 0x9a, 0xe7, 0x92, 0xed, 0xe5, 0x93, 0xfe, 0xa7, 0x32, 0x70, 0x56, 0x9d, 0xf4, 0xb5, 0xee, + 0x4e, 0xcb, 0xc1, 0xb3, 0x20, 0xb9, 0x06, 0xa3, 0x62, 0x4e, 0x86, 0x87, 0xa8, 0x64, 0x6a, 0xdb, + 0x08, 0x85, 0x2c, 0xb3, 0x69, 0xc8, 0x78, 0x08, 0xad, 0x7b, 0x26, 0x26, 0xa7, 0x58, 0x51, 0xf4, + 0x62, 0x98, 0x87, 0xbf, 0xf5, 0xf9, 0xc9, 0x20, 0xc6, 0xbb, 0x30, 0xad, 0x8f, 0x44, 0x8d, 0x06, + 0xe4, 0x2a, 0x8c, 0xc8, 0xe1, 0xcb, 0xa4, 0x0f, 0x9f, 0x2c, 0x37, 0xb6, 0x81, 0x24, 0xe8, 0x7d, + 0x74, 0x17, 0xa2, 0x81, 0x74, 0x67, 0x93, 0x97, 0x75, 0x09, 0xc4, 0xf0, 0x09, 0xed, 0x31, 0xcd, + 0x7f, 0x95, 0x91, 0x1a, 0x7f, 0x32, 0x09, 0x33, 0x29, 0x32, 0xf7, 0x04, 0x9d, 0x68, 0x41, 0x17, + 0x10, 0xa3, 0x61, 0x2c, 0xb4, 0x14, 0x0b, 0xef, 0xca, 0xd7, 0x8e, 0xfb, 0x88, 0x83, 0x7e, 0x4f, + 0x20, 0x7f, 0x16, 0x7a, 0x91, 0x9a, 0xae, 0x60, 0xe8, 0x89, 0xa5, 0x2b, 0x58, 0x82, 0x09, 0xf1, + 0x55, 0x42, 0x5c, 0x0d, 0x47, 0xd6, 0x5c, 0x8f, 0x17, 0x58, 0x09, 0xb1, 0xa5, 0x93, 0x70, 0x1e, + 0xbe, 0xdb, 0x7c, 0x48, 0x05, 0x8f, 0x11, 0x95, 0x07, 0x16, 0xa4, 0xf2, 0x50, 0x48, 0xc8, 0xbf, + 0x83, 0x8f, 0x5c, 0x20, 0x44, 0x95, 0x59, 0x85, 0x7e, 0x32, 0xab, 0xf1, 0x64, 0x64, 0xd6, 0x05, + 0xd9, 0xc6, 0x74, 0xd9, 0x95, 0xd2, 0x2c, 0xf2, 0xcb, 0x19, 0x98, 0xe6, 0x31, 0xf3, 0x6a, 0x63, + 0xfb, 0xc6, 0x41, 0xd7, 0x9f, 0x4c, 0x63, 0x9f, 0x13, 0xf9, 0xe9, 0xd3, 0xdb, 0x9a, 0x6c, 0x14, + 0xf9, 0x01, 0x80, 0x70, 0x45, 0xf9, 0x73, 0x80, 0x4b, 0xed, 0xb9, 0x14, 0x29, 0x10, 0x22, 0x45, + 0xb9, 0x74, 0x83, 0x90, 0x4e, 0x7b, 0xda, 0x24, 0x84, 0x92, 0xbf, 0x04, 0xb3, 0x6c, 0xbd, 0x84, + 0x10, 0x91, 0xe1, 0x63, 0x6e, 0x0c, 0x6b, 0xf9, 0x7c, 0x6f, 0x9d, 0xe8, 0x5a, 0x1a, 0x19, 0xcf, + 0xfc, 0x17, 0x3d, 0xe9, 0x16, 0xa8, 0xc1, 0xc0, 0xa9, 0x15, 0x61, 0xca, 0x1c, 0x6c, 0x3d, 0xcf, + 0x77, 0xdb, 0x43, 0xbe, 0x9d, 0x97, 0x6b, 0x81, 0xcb, 0x37, 0x5f, 0x0f, 0x66, 0x43, 0x10, 0xf9, + 0x32, 0x90, 0x30, 0xd8, 0x9c, 0xc3, 0xa8, 0xcc, 0x85, 0xcb, 0x4d, 0xbb, 0x51, 0xd0, 0xba, 0x27, + 0x8b, 0xd5, 0x49, 0x92, 0x24, 0x26, 0x14, 0x66, 0xc5, 0x47, 0x33, 0xa8, 0x7c, 0x44, 0xc3, 0x9f, + 0x9b, 0xd4, 0xf2, 0xa7, 0x44, 0x25, 0xd1, 0xdb, 0x6f, 0xca, 0x4b, 0x1c, 0x9a, 0xc9, 0x29, 0x8d, + 0x1d, 0xb9, 0x05, 0xa3, 0x18, 0x51, 0xb6, 0x22, 0x9d, 0xa0, 0x84, 0x43, 0x06, 0xc6, 0x9e, 0x59, + 0xfb, 0xba, 0x2b, 0x53, 0x84, 0xca, 0x8e, 0x03, 0x15, 0xef, 0xc8, 0xec, 0xb6, 0xd1, 0x00, 0x2b, + 0xec, 0x1d, 0x0d, 0xef, 0xc8, 0xf2, 0xba, 0x7a, 0xc8, 0x21, 0x22, 0x91, 0x6f, 0xc0, 0xd8, 0x7d, + 0xfb, 0x91, 0xb4, 0xbf, 0x0a, 0x23, 0xeb, 0x40, 0xaf, 0x96, 0xb7, 0xec, 0x47, 0x56, 0xa3, 0x1b, + 0xcf, 0x3b, 0xc8, 0x5f, 0x2d, 0x57, 0x58, 0x92, 0xaf, 0x01, 0x28, 0x56, 0x61, 0x72, 0x62, 0x05, + 0x2f, 0xc8, 0x8c, 0x40, 0xa9, 0xd6, 0x62, 0xe4, 0xaf, 0x30, 0x8c, 0x69, 0x0e, 0xb3, 0x9f, 0x9d, + 0xe6, 0x70, 0xe6, 0xb3, 0xd3, 0x1c, 0xe6, 0x77, 0xe0, 0x7c, 0xcf, 0xa5, 0x93, 0x92, 0xa6, 0xf1, + 0xba, 0x9e, 0xa6, 0xf1, 0x7c, 0xaf, 0x2d, 0xd6, 0xd7, 0xd3, 0x27, 0xcf, 0x14, 0x67, 0x7b, 0x6b, + 0x27, 0xdf, 0xcb, 0xc6, 0xb6, 0x5c, 0x71, 0xb0, 0xe0, 0xe9, 0xf6, 0x7b, 0xe9, 0x24, 0x59, 0x7c, + 0x57, 0x8c, 0x6f, 0xca, 0xd9, 0xe8, 0x40, 0x13, 0x7b, 0x3e, 0x95, 0x6f, 0xcf, 0x9f, 0x76, 0xf7, + 0x7d, 0x1b, 0x26, 0xf9, 0x8b, 0x42, 0xf7, 0xe8, 0xd1, 0xa1, 0xeb, 0x35, 0xe4, 0x1b, 0x99, 0xa8, + 0x83, 0x27, 0xde, 0xde, 0x8b, 0xe1, 0x92, 0x8a, 0x0c, 0x52, 0x1a, 0xc2, 0xda, 0xcf, 0xa7, 0x4a, + 0x31, 0x86, 0xd0, 0x2f, 0x7e, 0x89, 0xbc, 0x11, 0x2a, 0x6a, 0xd4, 0x53, 0x93, 0x28, 0x7b, 0x12, + 0x98, 0xa2, 0xaf, 0x51, 0xcf, 0xf8, 0x83, 0x1c, 0x10, 0x5e, 0x53, 0xd9, 0xee, 0xd8, 0x18, 0xc2, + 0xe7, 0x60, 0x2a, 0x8a, 0xa2, 0xc0, 0xb1, 0x77, 0x9a, 0x54, 0xcd, 0xe3, 0x22, 0x9c, 0x4e, 0xc3, + 0x32, 0x2b, 0x7e, 0xd0, 0x49, 0x10, 0xf6, 0x10, 0x75, 0xd9, 0x4f, 0x23, 0xea, 0xbe, 0x01, 0xcf, + 0x96, 0x3a, 0xf8, 0x34, 0x99, 0xac, 0xe5, 0xb6, 0xeb, 0x49, 0x21, 0xa5, 0x05, 0x87, 0xd8, 0x21, + 0x5a, 0xa2, 0xa5, 0xfd, 0x58, 0x28, 0x7a, 0x0a, 0x9b, 0x97, 0x9d, 0x40, 0x0d, 0x36, 0x96, 0x7a, + 0x4a, 0x07, 0x4b, 0x52, 0xf4, 0x14, 0x4e, 0x22, 0x79, 0x38, 0x9e, 0xd4, 0x53, 0xf0, 0xd9, 0x80, + 0x88, 0x87, 0xe3, 0xd1, 0x1e, 0xba, 0x4e, 0x48, 0x42, 0xde, 0x86, 0xb1, 0x52, 0x37, 0x70, 0x05, + 0x63, 0xe1, 0x2d, 0x1d, 0xf9, 0x35, 0x8b, 0xa6, 0x68, 0x47, 0x9f, 0x08, 0xdd, 0xf8, 0xe3, 0x1c, + 0x9c, 0x4f, 0x0e, 0xaf, 0x28, 0x0d, 0xd7, 0x47, 0xe6, 0x84, 0xf5, 0x91, 0x36, 0x1b, 0xf8, 0x65, + 0xc1, 0x13, 0x9b, 0x0d, 0xfc, 0x85, 0xb3, 0x4f, 0x38, 0x1b, 0x6a, 0x30, 0xa6, 0xee, 0x77, 0xf9, + 0x4f, 0xba, 0xdf, 0xa9, 0x5c, 0xd8, 0xa1, 0x9e, 0xc7, 0x58, 0x0f, 0x45, 0x57, 0x47, 0xf1, 0xf0, + 0x6a, 0x8e, 0x41, 0xfe, 0x7f, 0x70, 0x91, 0xcb, 0xa4, 0xf8, 0xc7, 0x2e, 0x1d, 0x49, 0x8e, 0x62, + 0xe0, 0x16, 0x1f, 0x1f, 0x2f, 0x5c, 0xe3, 0xa6, 0x12, 0x2b, 0xd1, 0x6d, 0xd6, 0xce, 0x91, 0x25, + 0x5b, 0xa6, 0x54, 0x72, 0x22, 0x6f, 0x7c, 0xd6, 0x4c, 0x79, 0x35, 0xeb, 0xf5, 0xb4, 0x30, 0x12, + 0x9e, 0x89, 0x94, 0x83, 0xf5, 0x08, 0x12, 0x69, 0x0e, 0xcb, 0xa6, 0x9a, 0xc3, 0xa4, 0x3d, 0x25, + 0x97, 0x6a, 0x4f, 0xa9, 0xc0, 0x54, 0xad, 0xbb, 0x23, 0xeb, 0x46, 0xc4, 0xbc, 0x16, 0x09, 0x97, + 0xf6, 0x41, 0x71, 0x12, 0xe3, 0xc7, 0xb3, 0x30, 0xbe, 0xd1, 0xec, 0xee, 0x39, 0xed, 0x8a, 0x1d, + 0xd8, 0x4f, 0xad, 0x85, 0xee, 0x4d, 0xcd, 0x42, 0x17, 0x46, 0x4b, 0x85, 0x1f, 0x36, 0x90, 0x79, + 0xee, 0x3b, 0x19, 0x98, 0x8a, 0x48, 0xf8, 0x3e, 0xbb, 0x02, 0x79, 0xf6, 0x43, 0x9c, 0x5b, 0x2f, + 0x26, 0x18, 0xf3, 0xa7, 0x5a, 0xc2, 0xbf, 0x84, 0xcd, 0x4c, 0x7f, 0x07, 0x01, 0x39, 0xcc, 0x7f, + 0x01, 0x46, 0x23, 0xb6, 0xa7, 0x79, 0xa2, 0xe5, 0xd7, 0x32, 0x50, 0x8c, 0x7f, 0x09, 0xb9, 0x07, + 0x23, 0x8c, 0x93, 0x43, 0xe5, 0x91, 0xfa, 0xc5, 0x1e, 0xdf, 0x7c, 0x4d, 0xa0, 0xf1, 0xe6, 0x61, + 0xe7, 0x53, 0x0e, 0x31, 0x25, 0x87, 0x79, 0x13, 0xc6, 0x55, 0xac, 0x94, 0xd6, 0xbd, 0xa6, 0x2b, + 0x17, 0x67, 0xd3, 0xfb, 0x41, 0x7b, 0x58, 0x46, 0x6b, 0xb5, 0xd0, 0x1b, 0x2e, 0x6b, 0x93, 0x0b, + 0xfb, 0x2a, 0x36, 0x6f, 0xf8, 0x34, 0x5b, 0x8c, 0x92, 0x23, 0xab, 0xf3, 0x2c, 0x65, 0x42, 0x87, + 0x78, 0xe4, 0x35, 0x18, 0xe6, 0xf5, 0xa9, 0x0f, 0x2c, 0x74, 0x10, 0xa2, 0xaa, 0xb8, 0x1c, 0xc7, + 0xf8, 0x9b, 0x39, 0x38, 0x1b, 0x35, 0xef, 0x41, 0xa7, 0x61, 0x07, 0x74, 0xc3, 0xf6, 0xec, 0x96, + 0x7f, 0xc2, 0x0a, 0xb8, 0x92, 0x68, 0x1a, 0x26, 0xdc, 0x97, 0x4d, 0x53, 0x1a, 0x64, 0xc4, 0x1a, + 0x84, 0xe6, 0x4b, 0xde, 0x20, 0xd9, 0x0c, 0x72, 0x0f, 0x72, 0x35, 0x1a, 0x08, 0xb1, 0x79, 0x39, + 0xd1, 0xab, 0x6a, 0xbb, 0xae, 0xd5, 0x68, 0xc0, 0x07, 0x91, 0xe7, 0xfe, 0xa0, 0x5a, 0xee, 0xc5, + 0x1a, 0x0d, 0xc8, 0x36, 0x0c, 0x2f, 0x3f, 0xea, 0xd0, 0x7a, 0x20, 0x1e, 0x18, 0xba, 0xda, 0x9f, + 0x1f, 0xc7, 0x55, 0xde, 0x17, 0xa2, 0x08, 0x50, 0x3b, 0x8b, 0xa3, 0xcc, 0xdf, 0x82, 0x82, 0xac, + 0xfc, 0x34, 0x33, 0x77, 0xfe, 0x4d, 0x18, 0x53, 0x2a, 0x39, 0xd5, 0xa4, 0xff, 0x05, 0x26, 0x57, + 0xdd, 0xa6, 0x7c, 0x93, 0x68, 0x39, 0xa1, 0xe6, 0x65, 0xa2, 0x98, 0x5d, 0xae, 0xe6, 0x59, 0x07, + 0xa2, 0xa8, 0x8f, 0xbe, 0x57, 0x85, 0xa9, 0xda, 0x81, 0xd3, 0x89, 0x52, 0xe0, 0x69, 0x9b, 0x29, + 0x66, 0x8b, 0x17, 0x67, 0xee, 0xf8, 0x66, 0x1a, 0xa7, 0x33, 0xfe, 0x2c, 0x03, 0xc3, 0xec, 0xaf, + 0xad, 0x5b, 0x4f, 0xa9, 0xc8, 0xbc, 0xa9, 0x89, 0xcc, 0x69, 0x25, 0xff, 0x2c, 0x0a, 0x8e, 0x5b, + 0x27, 0x08, 0xcb, 0x63, 0x31, 0x40, 0x1c, 0x99, 0xdc, 0x81, 0x11, 0xe1, 0x79, 0x23, 0x5c, 0xa4, + 0xd5, 0x84, 0xb6, 0xd2, 0x27, 0x27, 0x3c, 0x9c, 0xbb, 0x9d, 0xb8, 0x35, 0x43, 0x52, 0x33, 0x95, + 0x5c, 0x26, 0x23, 0xd4, 0x5e, 0xb2, 0x73, 0x31, 0xfe, 0x8c, 0x27, 0x64, 0x55, 0xde, 0x9e, 0xec, + 0x11, 0xd8, 0x5f, 0x12, 0x17, 0x19, 0xb9, 0x7e, 0x4c, 0xce, 0xca, 0x87, 0xbe, 0x52, 0xef, 0x38, + 0xfe, 0x70, 0x86, 0xa7, 0x32, 0x95, 0x0d, 0x7b, 0x07, 0xc6, 0x6f, 0xbb, 0xde, 0xa1, 0xed, 0xf1, + 0x04, 0x75, 0xc2, 0x73, 0x80, 0x1d, 0x1d, 0x27, 0x76, 0x39, 0x9c, 0xa7, 0xb8, 0xfb, 0xf8, 0x78, + 0x21, 0xbf, 0xe4, 0xba, 0x4d, 0x53, 0x43, 0x27, 0xeb, 0x30, 0x71, 0xdf, 0x7e, 0xa4, 0x1c, 0x7a, + 0x79, 0x40, 0xc9, 0x55, 0x36, 0x81, 0xd9, 0xa9, 0xf9, 0x64, 0x37, 0x28, 0x9d, 0x9e, 0x38, 0x30, + 0xb9, 0xe1, 0x7a, 0x81, 0xa8, 0xc4, 0x69, 0xef, 0x89, 0x8f, 0x4d, 0x3a, 0x72, 0x5d, 0x4f, 0x75, + 0xe4, 0x3a, 0xdf, 0x71, 0xbd, 0xc0, 0xda, 0x0d, 0xc9, 0xb5, 0xa4, 0x39, 0x1a, 0x63, 0xf2, 0x0e, + 0x4c, 0x2b, 0x49, 0xc1, 0x6e, 0xbb, 0x5e, 0xcb, 0x96, 0x4a, 0x39, 0xda, 0x81, 0xd1, 0xdf, 0x64, + 0x17, 0xc1, 0x66, 0x12, 0x93, 0x7c, 0x98, 0x16, 0xa2, 0x33, 0x14, 0x79, 0x82, 0xa5, 0x84, 0xe8, + 0xf4, 0xf2, 0x04, 0x4b, 0x06, 0xeb, 0xec, 0xf5, 0xf3, 0x14, 0x2d, 0x2c, 0xdd, 0x10, 0xc7, 0xef, + 0x93, 0x3d, 0x41, 0xc3, 0x71, 0xeb, 0xe1, 0x11, 0xba, 0x08, 0xb9, 0xa5, 0x8d, 0xdb, 0x78, 0x7b, + 0x21, 0x1d, 0x6d, 0xda, 0xfb, 0x76, 0xbb, 0x8e, 0xca, 0xb2, 0xf0, 0xce, 0x56, 0x25, 0xf2, 0xd2, + 0xc6, 0x6d, 0x62, 0xc3, 0xcc, 0x06, 0xf5, 0x5a, 0x4e, 0xf0, 0x95, 0x1b, 0x37, 0x94, 0x81, 0x2a, + 0x60, 0xd3, 0xae, 0x8b, 0xa6, 0x2d, 0x74, 0x10, 0xc5, 0x7a, 0x74, 0xe3, 0x46, 0xea, 0x70, 0x84, + 0x0d, 0x4b, 0xe3, 0xc5, 0x24, 0xe3, 0x7d, 0xfb, 0x51, 0xe4, 0x54, 0xef, 0x8b, 0x60, 0xc7, 0x0b, + 0x72, 0x62, 0x45, 0x0e, 0xf9, 0x9a, 0x64, 0xd4, 0x89, 0xd8, 0x59, 0x27, 0x9a, 0x5e, 0xbe, 0x08, + 0x13, 0x99, 0x97, 0x26, 0x1d, 0x19, 0x11, 0xab, 0x2a, 0xec, 0x0a, 0x3a, 0x79, 0x10, 0x9e, 0xd8, + 0xf8, 0x89, 0x47, 0x3c, 0x63, 0x75, 0x5d, 0x3d, 0xb1, 0x71, 0x43, 0x8a, 0xf6, 0x59, 0x53, 0xe1, + 0x31, 0x9f, 0x47, 0x19, 0x98, 0x3a, 0x97, 0xe4, 0x41, 0x70, 0xfc, 0xf4, 0x07, 0x41, 0x0a, 0xf9, + 0x55, 0xb7, 0x7e, 0x20, 0x32, 0xfd, 0x7c, 0x99, 0x2d, 0xf7, 0xa6, 0x5b, 0x3f, 0x78, 0x72, 0x1e, + 0xb0, 0xc8, 0x9e, 0xac, 0xb1, 0xa6, 0xb2, 0x59, 0x20, 0xfa, 0x44, 0x78, 0x55, 0xce, 0x86, 0x27, + 0x21, 0xa5, 0x8c, 0x2b, 0x3e, 0x7c, 0xd2, 0xc8, 0xae, 0x35, 0x75, 0x72, 0x42, 0xa1, 0x58, 0xa1, + 0xfe, 0x41, 0xe0, 0x76, 0xca, 0x4d, 0xa7, 0xb3, 0xe3, 0xda, 0x5e, 0x03, 0x6d, 0x77, 0x69, 0xeb, + 0xfb, 0xe5, 0xd4, 0xf5, 0x3d, 0xdd, 0xe0, 0xf4, 0x56, 0x5d, 0x32, 0x30, 0x13, 0x2c, 0xc9, 0x87, + 0x30, 0xc9, 0x26, 0xf7, 0xf2, 0xa3, 0x80, 0xb6, 0xf9, 0xc8, 0x4f, 0xa3, 0xea, 0x30, 0xab, 0x24, + 0xfe, 0x0e, 0x0b, 0xf9, 0x9c, 0xc2, 0xc5, 0x4e, 0x43, 0x02, 0x2d, 0x4b, 0x92, 0xc6, 0x8a, 0x34, + 0x60, 0xee, 0xbe, 0xfd, 0x48, 0x79, 0x7c, 0x4b, 0x99, 0xa4, 0x04, 0x27, 0x18, 0x3e, 0x36, 0xce, + 0x26, 0x58, 0x94, 0xa0, 0xb3, 0xc7, 0x7c, 0xed, 0xc9, 0x89, 0xfc, 0x20, 0x9c, 0x13, 0x9f, 0x55, + 0xc1, 0xd7, 0x30, 0x5c, 0xef, 0xa8, 0xb6, 0x6f, 0x63, 0x3c, 0xcd, 0xcc, 0xe9, 0x04, 0xa2, 0xec, + 0xb0, 0x86, 0xe4, 0x63, 0xf9, 0x9c, 0x91, 0xd9, 0xab, 0x06, 0xf2, 0x11, 0x4c, 0xf2, 0x2b, 0x9b, + 0x15, 0xd7, 0x0f, 0xf0, 0x40, 0x3f, 0x7b, 0x3a, 0x37, 0x71, 0x7e, 0x0f, 0xc4, 0x03, 0x2b, 0x62, + 0x06, 0x80, 0x18, 0x67, 0xf2, 0x16, 0x8c, 0x6d, 0x38, 0x6d, 0x9e, 0xc7, 0xac, 0xba, 0x81, 0xa6, + 0x47, 0xb1, 0xff, 0x74, 0x9c, 0xb6, 0x25, 0x4f, 0xd5, 0x9d, 0x50, 0x5c, 0xa8, 0xd8, 0x64, 0x1b, + 0xc6, 0x6a, 0xb5, 0x95, 0xdb, 0x0e, 0xdb, 0x00, 0x3b, 0x47, 0x73, 0x67, 0x7b, 0xb4, 0xf2, 0x52, + 0x6a, 0x2b, 0x27, 0x7c, 0x7f, 0x1f, 0x1f, 0x34, 0xb6, 0xea, 0x6e, 0xe7, 0xc8, 0x54, 0x39, 0xa5, + 0xb8, 0x4e, 0x9f, 0x7b, 0xc2, 0xae, 0xd3, 0x55, 0x98, 0x52, 0x1c, 0x2c, 0xd1, 0xb9, 0x72, 0x2e, + 0x4a, 0xdb, 0xa5, 0xba, 0x4a, 0xc7, 0xc3, 0xfa, 0xe2, 0x74, 0xd2, 0x67, 0xfa, 0xfc, 0x69, 0x7d, + 0xa6, 0x1d, 0x98, 0xe6, 0x83, 0x21, 0xe6, 0x01, 0x8e, 0xf4, 0x7c, 0x8f, 0x3e, 0xbc, 0x9a, 0xda, + 0x87, 0x33, 0x62, 0xa4, 0xe5, 0x24, 0xc3, 0x2b, 0xca, 0x24, 0x57, 0xb2, 0x0b, 0x44, 0x00, 0xc5, + 0x73, 0xca, 0x58, 0xd7, 0xb3, 0x3d, 0xea, 0x7a, 0x31, 0xb5, 0xae, 0x49, 0x59, 0xd7, 0x0e, 0xaf, + 0x26, 0x85, 0x23, 0x69, 0xcb, 0x7a, 0xe4, 0xfc, 0xc2, 0x8e, 0x7d, 0x4e, 0xb3, 0x83, 0x26, 0x11, + 0x78, 0x12, 0xd1, 0xf8, 0xa4, 0x8d, 0xf7, 0x7b, 0x0a, 0x67, 0xf2, 0x08, 0xce, 0x26, 0x5b, 0x81, + 0x75, 0x5e, 0xc0, 0x3a, 0x2f, 0x68, 0x75, 0xc6, 0x91, 0xf8, 0xbc, 0xd1, 0x3f, 0x2b, 0x5e, 0x6b, + 0x0f, 0xfe, 0x77, 0xf3, 0x85, 0x89, 0xe2, 0x64, 0x9a, 0xa7, 0xf5, 0x3f, 0xc8, 0xc6, 0x84, 0x36, + 0xa9, 0xc2, 0x88, 0x18, 0x0b, 0xa1, 0xc5, 0x26, 0x7b, 0xfc, 0x42, 0x6a, 0x8f, 0x8f, 0x88, 0x61, + 0x35, 0x25, 0x3d, 0x39, 0x64, 0xac, 0xd0, 0x6d, 0x5d, 0xa8, 0xfd, 0x5f, 0xe3, 0x32, 0x19, 0x41, + 0xda, 0xee, 0x53, 0x39, 0x7d, 0xd0, 0x8e, 0x1e, 0x13, 0x86, 0xdb, 0x90, 0xac, 0x8d, 0x1c, 0xf0, + 0x97, 0x02, 0x72, 0x61, 0xe4, 0x87, 0xfe, 0x2c, 0xc0, 0x13, 0xab, 0x90, 0xd5, 0x62, 0xfc, 0x66, + 0x06, 0x26, 0x34, 0xa9, 0x4f, 0x6e, 0x29, 0x61, 0x4d, 0x51, 0x54, 0xae, 0x86, 0x83, 0x82, 0x20, + 0x1e, 0xf0, 0x74, 0x4b, 0xf8, 0x4d, 0x67, 0x7b, 0xd3, 0xa5, 0xbe, 0x2a, 0xde, 0xdf, 0x48, 0x16, + 0xbe, 0x3c, 0x94, 0xef, 0xf1, 0xf2, 0xd0, 0xaf, 0x3f, 0x0b, 0x93, 0xfa, 0xb1, 0x80, 0xbc, 0x06, + 0xc3, 0x68, 0x5b, 0x94, 0x67, 0x4c, 0xfe, 0xf6, 0x2e, 0x42, 0xb4, 0xb7, 0x77, 0x11, 0x42, 0x5e, + 0x02, 0x08, 0x1d, 0x58, 0xa5, 0x65, 0x7d, 0xe8, 0xf1, 0xf1, 0x42, 0xe6, 0x75, 0x53, 0x29, 0x20, + 0x5f, 0x07, 0x58, 0x73, 0x1b, 0x34, 0x7c, 0x1d, 0xad, 0xcf, 0xed, 0xf1, 0xcb, 0x89, 0x2c, 0xda, + 0x67, 0xda, 0x6e, 0x83, 0x26, 0x53, 0x66, 0x2b, 0x1c, 0xc9, 0x97, 0x60, 0xc8, 0xec, 0xb2, 0xf3, + 0x2c, 0x37, 0x25, 0x8c, 0x49, 0xe9, 0xdb, 0x6d, 0x52, 0xe5, 0xa1, 0xfe, 0x6e, 0xdc, 0x31, 0x8a, + 0x01, 0xc8, 0x7b, 0x3c, 0xbb, 0xb6, 0x48, 0x86, 0x35, 0x14, 0xdd, 0x35, 0x28, 0xbb, 0x72, 0x22, + 0x1d, 0x96, 0x42, 0x42, 0xd6, 0x61, 0x44, 0x35, 0x92, 0x2b, 0xf1, 0xb1, 0xea, 0x45, 0x8a, 0x72, + 0xf2, 0x12, 0xcf, 0xaa, 0xc5, 0xed, 0xe7, 0x92, 0x0b, 0x79, 0x1b, 0x46, 0x19, 0x7b, 0xb6, 0x84, + 0x7d, 0xa1, 0x71, 0xe3, 0x8d, 0x82, 0xd2, 0x20, 0x26, 0x01, 0xb4, 0x94, 0x55, 0x21, 0x01, 0xf9, + 0x10, 0x5f, 0x0e, 0x13, 0x5d, 0xdd, 0xd7, 0xab, 0xe0, 0x72, 0xa2, 0xab, 0xf1, 0x29, 0xb1, 0xe4, + 0xa3, 0xb2, 0x21, 0x3f, 0xb2, 0x17, 0xa6, 0x52, 0x1a, 0x24, 0x23, 0xfa, 0x2b, 0x89, 0x0a, 0xe6, + 0x64, 0x76, 0xa0, 0xe4, 0x2b, 0x77, 0x1a, 0x5f, 0xd2, 0x81, 0x62, 0xa4, 0xf0, 0x88, 0xba, 0xa0, + 0x5f, 0x5d, 0xaf, 0x27, 0xea, 0x52, 0x07, 0x30, 0x51, 0x5d, 0x82, 0x3b, 0x69, 0xc0, 0xa4, 0x14, + 0x9e, 0xa2, 0xbe, 0xb1, 0x7e, 0xf5, 0xbd, 0x94, 0xa8, 0x6f, 0xa6, 0xb1, 0x93, 0xac, 0x27, 0xc6, + 0x93, 0xbc, 0x0d, 0x13, 0x12, 0x82, 0xeb, 0x43, 0xbc, 0x5e, 0x8b, 0x56, 0x91, 0xc6, 0x0e, 0xba, + 0xcc, 0xeb, 0x6f, 0xff, 0xa9, 0xc8, 0x2a, 0x35, 0x9f, 0x1d, 0x13, 0x1a, 0x75, 0x7c, 0x56, 0xe8, + 0xc8, 0xe4, 0x03, 0x18, 0xab, 0xb6, 0xd8, 0x87, 0xb8, 0x6d, 0x3b, 0xa0, 0x22, 0x76, 0x4a, 0x7a, + 0x48, 0x28, 0x25, 0xca, 0x54, 0xe5, 0xaf, 0xe9, 0x45, 0x45, 0xda, 0x6b, 0x7a, 0x11, 0x98, 0x75, + 0x1e, 0xbf, 0x15, 0x11, 0x73, 0x58, 0xc6, 0x55, 0x5d, 0x48, 0xf1, 0x52, 0x50, 0xd8, 0x8b, 0xa4, + 0x73, 0x0c, 0x2a, 0x6f, 0x25, 0x62, 0x49, 0xe7, 0x54, 0x9e, 0xe4, 0x1d, 0x18, 0x13, 0x8f, 0x45, + 0x94, 0xcc, 0x35, 0x7f, 0xae, 0x88, 0x1f, 0x8f, 0xd1, 0xe0, 0xf2, 0x5d, 0x09, 0xcb, 0xf6, 0x62, + 0xee, 0x78, 0x11, 0x3e, 0xf9, 0x0a, 0xcc, 0x6e, 0x3b, 0xed, 0x86, 0x7b, 0xe8, 0x8b, 0x6d, 0x4a, + 0x08, 0xba, 0xe9, 0x28, 0x18, 0xe6, 0x90, 0x97, 0x87, 0x7a, 0x4a, 0x42, 0xf0, 0xa5, 0x72, 0x20, + 0x7f, 0x31, 0xc1, 0x99, 0xcf, 0x20, 0xd2, 0x6f, 0x06, 0x2d, 0x26, 0x66, 0x50, 0xb2, 0xfa, 0xf8, + 0x74, 0x4a, 0xad, 0x86, 0xb8, 0x40, 0xf4, 0xfd, 0xfd, 0xae, 0xeb, 0xb4, 0xe7, 0x66, 0x50, 0x16, + 0x3e, 0x1b, 0x8f, 0xbf, 0x46, 0xbc, 0x0d, 0xb7, 0xe9, 0xd4, 0x8f, 0xf8, 0xcb, 0xf5, 0x71, 0x7d, + 0xf4, 0x23, 0x57, 0xb3, 0x19, 0xa7, 0xb0, 0x26, 0x1f, 0xc0, 0x38, 0xfb, 0x3f, 0x3c, 0x30, 0xcf, + 0x6a, 0x7e, 0x6d, 0x0a, 0xa6, 0xa8, 0x07, 0xc7, 0x08, 0x5f, 0xb3, 0x48, 0x39, 0x4b, 0x6b, 0xac, + 0xc8, 0x9b, 0x00, 0x4c, 0x73, 0x12, 0xe2, 0xf8, 0x4c, 0x94, 0xe3, 0x0f, 0xf5, 0xad, 0xa4, 0x20, + 0x8e, 0x90, 0xd9, 0x29, 0x9e, 0xfd, 0xaa, 0x75, 0x1b, 0x2e, 0x5b, 0x1b, 0x67, 0x91, 0x96, 0x87, + 0xa4, 0x31, 0x5a, 0x9f, 0xc3, 0xb5, 0x90, 0xb4, 0x08, 0x9d, 0xac, 0xc0, 0x14, 0xe6, 0x62, 0xac, + 0x36, 0x68, 0x3b, 0xc0, 0xdb, 0xca, 0xb9, 0x73, 0xca, 0x6d, 0x2e, 0x2b, 0xb2, 0x9c, 0xb0, 0x4c, + 0xd5, 0xb3, 0x63, 0x64, 0xc4, 0x87, 0x99, 0x48, 0xba, 0x44, 0x77, 0xc3, 0x73, 0xd8, 0x49, 0x52, + 0xbb, 0x4c, 0x62, 0x70, 0x79, 0xcc, 0x46, 0x44, 0x11, 0x5c, 0xd2, 0xb2, 0xae, 0x56, 0x98, 0xc6, + 0x9d, 0x98, 0x40, 0xee, 0x94, 0x37, 0xe2, 0xc9, 0x0a, 0xcf, 0xe3, 0x17, 0xe0, 0x30, 0xef, 0xd5, + 0xa3, 0x77, 0x1b, 0x53, 0x12, 0x16, 0xa6, 0x50, 0x93, 0x6f, 0xc1, 0x19, 0x29, 0x41, 0x44, 0x91, + 0x98, 0xd7, 0xf3, 0xa7, 0x94, 0xc4, 0x8d, 0x9d, 0xb0, 0xea, 0xc4, 0x94, 0x4e, 0xaf, 0x82, 0xd8, + 0x30, 0x86, 0xc3, 0x2a, 0x6a, 0x7c, 0xb6, 0x5f, 0x8d, 0x57, 0x12, 0x35, 0x9e, 0xc5, 0x89, 0x92, + 0xac, 0x4c, 0xe5, 0x49, 0x96, 0x60, 0x42, 0xac, 0x23, 0x31, 0xdb, 0x9e, 0xc3, 0xde, 0x42, 0x03, + 0x8b, 0x5c, 0x81, 0x89, 0x09, 0xa7, 0x93, 0xa8, 0x12, 0x99, 0x5b, 0xd4, 0x2f, 0x68, 0x12, 0x39, + 0x6e, 0x48, 0xd7, 0x91, 0x99, 0x44, 0x8a, 0xb4, 0x98, 0xe5, 0x47, 0x1d, 0x4f, 0x98, 0x4f, 0x9e, + 0x8f, 0x72, 0xf8, 0x2b, 0xca, 0x8f, 0x45, 0x43, 0x0c, 0x55, 0x24, 0xa4, 0x71, 0x20, 0x0f, 0x60, + 0x26, 0xdc, 0xb5, 0x15, 0xc6, 0x0b, 0xd1, 0x5b, 0x08, 0xd1, 0x56, 0x9f, 0xce, 0x37, 0x8d, 0x9e, + 0xd8, 0x70, 0x4e, 0xdb, 0xa7, 0x15, 0xd6, 0x17, 0x91, 0x35, 0xbe, 0x13, 0xaa, 0x6f, 0xf2, 0xe9, + 0xec, 0x7b, 0xf1, 0x21, 0x1f, 0xc1, 0x7c, 0x7c, 0x6f, 0x56, 0x6a, 0x79, 0x01, 0x6b, 0x79, 0xe5, + 0xf1, 0xf1, 0xc2, 0xe5, 0xc4, 0xf6, 0x9e, 0x5e, 0x51, 0x1f, 0x6e, 0xe4, 0xeb, 0x30, 0xa7, 0xef, + 0xcf, 0x4a, 0x4d, 0x06, 0xd6, 0x84, 0x4b, 0x27, 0xdc, 0xd8, 0xd3, 0x6b, 0xe8, 0xc9, 0x83, 0x04, + 0xb0, 0x90, 0x3a, 0xbb, 0x95, 0x6a, 0x2e, 0x45, 0x1f, 0x94, 0x58, 0x25, 0xe9, 0xd5, 0x9d, 0xc4, + 0x92, 0x1c, 0xc2, 0xf3, 0x69, 0xdb, 0x84, 0x52, 0xe9, 0x8b, 0xa1, 0x81, 0xf2, 0xd5, 0xf4, 0x2d, + 0x27, 0xbd, 0xe6, 0x13, 0xd8, 0x92, 0x0f, 0xe1, 0x8c, 0xb2, 0xbe, 0x94, 0xfa, 0x5e, 0xc2, 0xfa, + 0x30, 0x94, 0x55, 0x5d, 0x98, 0xe9, 0xb5, 0xa4, 0xf3, 0x20, 0x2d, 0x98, 0x91, 0x1f, 0x8e, 0x96, + 0x60, 0xb1, 0xf5, 0x5c, 0xd6, 0xa4, 0x6a, 0x12, 0x43, 0x79, 0x60, 0x79, 0xc7, 0xea, 0x44, 0x84, + 0xea, 0x4c, 0x4f, 0xe1, 0x4b, 0x56, 0x60, 0xb8, 0xb6, 0x51, 0xbd, 0x7d, 0x7b, 0x79, 0xee, 0x65, + 0xac, 0x41, 0xc6, 0xbd, 0x70, 0xa0, 0x76, 0x68, 0x12, 0xee, 0x56, 0x1d, 0x67, 0x77, 0x57, 0x0b, + 0x2f, 0xe2, 0xa8, 0x77, 0xf3, 0x85, 0x2b, 0xc5, 0xab, 0x77, 0xf3, 0x85, 0xab, 0xc5, 0x57, 0xcc, + 0xe7, 0xd2, 0xdf, 0xc6, 0xe5, 0x1f, 0x6b, 0x5e, 0xee, 0x57, 0x1a, 0x75, 0x85, 0xf1, 0x0b, 0x19, + 0x98, 0x49, 0x69, 0x07, 0xb9, 0x0c, 0x79, 0x7c, 0x5c, 0x40, 0xb9, 0x60, 0x8e, 0x3d, 0x2a, 0x80, + 0xe5, 0xe4, 0x73, 0x30, 0x52, 0x59, 0xab, 0xd5, 0x4a, 0x6b, 0xf2, 0xc8, 0xc6, 0xc5, 0x55, 0xdb, + 0xb7, 0x7c, 0x5b, 0xbf, 0x97, 0x12, 0x68, 0xe4, 0x75, 0x18, 0xae, 0x6e, 0x20, 0x01, 0xf7, 0x70, + 0xc2, 0x23, 0x8c, 0xd3, 0x89, 0xe3, 0x0b, 0x24, 0xe3, 0x27, 0x32, 0x40, 0x92, 0x9d, 0x4a, 0x6e, + 0xc0, 0x98, 0x3a, 0x74, 0xfc, 0x80, 0x89, 0x77, 0x28, 0xca, 0xc0, 0x98, 0x2a, 0x0e, 0xa9, 0xc0, + 0x10, 0x3e, 0x86, 0x14, 0x5e, 0x88, 0xa5, 0x6e, 0x00, 0xe7, 0x12, 0x1b, 0xc0, 0x10, 0x3e, 0xb5, + 0x64, 0x72, 0x62, 0xe3, 0x77, 0x32, 0x40, 0x92, 0x9b, 0xe6, 0xc0, 0x17, 0xf2, 0x6f, 0x28, 0x11, + 0xaa, 0x6a, 0xfa, 0xf0, 0xf0, 0xed, 0x07, 0xf5, 0xb0, 0x14, 0xc5, 0xb2, 0x5e, 0xd6, 0x0e, 0xe7, + 0xbd, 0xc3, 0x9a, 0xae, 0xc2, 0xd0, 0x16, 0xf5, 0x76, 0xa4, 0xf3, 0x1e, 0x3a, 0xfc, 0x3c, 0x64, + 0x00, 0xf5, 0xb0, 0x8a, 0x18, 0xc6, 0x1f, 0x67, 0x60, 0x36, 0x4d, 0x93, 0x3b, 0x21, 0xfa, 0xc8, + 0x88, 0x05, 0x4e, 0xe1, 0x65, 0x3c, 0xf7, 0x06, 0x0a, 0xc3, 0xa5, 0x16, 0x60, 0x88, 0x7d, 0xac, + 0x1c, 0x61, 0x34, 0x16, 0xb0, 0xde, 0xf0, 0x4d, 0x0e, 0x67, 0x08, 0x3c, 0xeb, 0x51, 0x1e, 0x93, + 0x5b, 0x21, 0x02, 0x2a, 0x0a, 0x26, 0x87, 0x33, 0x84, 0xfb, 0x6e, 0x23, 0x7c, 0x01, 0x14, 0x11, + 0x5a, 0x0c, 0x60, 0x72, 0x38, 0xb9, 0x0c, 0x23, 0xeb, 0xed, 0x55, 0x6a, 0x3f, 0x94, 0xcf, 0x57, + 0xa0, 0xf3, 0x80, 0xdb, 0xb6, 0x9a, 0x0c, 0x66, 0xca, 0x42, 0xe3, 0x3b, 0x19, 0x98, 0x4e, 0x28, + 0x91, 0x27, 0x07, 0x58, 0xf5, 0x8f, 0x74, 0x18, 0xe4, 0xfb, 0x78, 0xf3, 0xf3, 0xe9, 0xcd, 0x37, + 0xfe, 0xcf, 0x3c, 0x9c, 0xeb, 0x71, 0xa6, 0x8f, 0x22, 0xb1, 0x32, 0x27, 0x46, 0x62, 0x7d, 0x95, + 0x9d, 0xa1, 0x6d, 0xa7, 0xe5, 0x6f, 0xba, 0x51, 0x8b, 0x23, 0x87, 0x6e, 0x2c, 0x93, 0x8f, 0xa0, + 0x4a, 0xcf, 0xdf, 0xf3, 0xfc, 0x21, 0x6a, 0x2b, 0x70, 0x93, 0x2a, 0x85, 0xc6, 0x2c, 0x11, 0x0b, + 0x95, 0xfb, 0x73, 0x12, 0x0b, 0xa5, 0x7b, 0xe7, 0xe7, 0x9f, 0xa8, 0x77, 0x7e, 0xba, 0x67, 0xdf, + 0xd0, 0xa7, 0xf1, 0xf3, 0x2c, 0xc3, 0x04, 0xf7, 0x9e, 0x28, 0xf9, 0x7c, 0x90, 0x86, 0x13, 0x1e, + 0x17, 0xb6, 0x9f, 0x1c, 0x0b, 0x8d, 0x86, 0xac, 0xe8, 0x9e, 0xe4, 0x23, 0x78, 0xeb, 0x73, 0xb9, + 0xb7, 0xa7, 0xb8, 0x76, 0xdb, 0xab, 0x92, 0x1a, 0xdf, 0xc9, 0xea, 0x81, 0x52, 0x7f, 0x1e, 0x67, + 0xde, 0x55, 0x18, 0xda, 0xde, 0xa7, 0x9e, 0x94, 0x77, 0xd8, 0x90, 0x43, 0x06, 0x50, 0x1b, 0x82, + 0x18, 0xe4, 0x36, 0x4c, 0x6e, 0xf0, 0x91, 0x90, 0xdd, 0x9b, 0x8f, 0x8e, 0x5a, 0x1d, 0x61, 0x10, + 0x48, 0xe9, 0xdf, 0x18, 0x95, 0x71, 0x07, 0x2e, 0x68, 0x0b, 0x52, 0x24, 0x76, 0xe0, 0x0e, 0xdd, + 0x7c, 0x47, 0x9c, 0x8c, 0x5c, 0xd8, 0x23, 0xe9, 0x61, 0xc6, 0xa0, 0xc6, 0x2e, 0x3c, 0xdf, 0x97, + 0x11, 0xdb, 0x88, 0xa0, 0x13, 0xfe, 0x8a, 0x79, 0x9d, 0xf5, 0x25, 0x35, 0x15, 0x3a, 0xe3, 0x07, + 0x61, 0x5c, 0xed, 0x65, 0x94, 0xa9, 0xec, 0xb7, 0x10, 0x6a, 0x5c, 0xa6, 0x32, 0x80, 0xc9, 0xe1, + 0x27, 0x3e, 0x1e, 0x1f, 0x0d, 0x7f, 0xee, 0xa4, 0xe1, 0x67, 0x95, 0xe3, 0x92, 0x55, 0x2a, 0xc7, + 0xdf, 0x6a, 0xe5, 0x98, 0xb9, 0xc1, 0xe4, 0xf0, 0x27, 0x5a, 0xf9, 0x6f, 0xcb, 0x24, 0xfe, 0xe8, + 0x2f, 0x2e, 0xcf, 0xc4, 0xd1, 0x13, 0x9d, 0x33, 0x69, 0x27, 0xdd, 0x08, 0x33, 0xda, 0x24, 0xb3, + 0x27, 0x6d, 0x92, 0xa7, 0x99, 0x88, 0xd7, 0x61, 0xa4, 0x24, 0xee, 0x64, 0xf3, 0x91, 0x62, 0x63, + 0x27, 0x2e, 0x60, 0x25, 0x96, 0xf1, 0xdd, 0x0c, 0x9c, 0x49, 0x35, 0x95, 0xb1, 0x5a, 0xb9, 0x4d, + 0x4e, 0x59, 0x87, 0x71, 0x83, 0x1c, 0xc7, 0x38, 0x4d, 0xd8, 0xee, 0xe0, 0xdf, 0x62, 0xbc, 0x00, + 0xa3, 0xe1, 0x45, 0x0d, 0x99, 0x95, 0x43, 0x87, 0x8e, 0x3a, 0xd2, 0xde, 0x5f, 0x03, 0x60, 0x2d, + 0x78, 0xa2, 0x6e, 0x65, 0xc6, 0x6f, 0x67, 0xf9, 0x03, 0x4f, 0x4f, 0x6d, 0xb6, 0xbb, 0x74, 0x5f, + 0x30, 0xf6, 0x49, 0xbd, 0x73, 0xdc, 0x91, 0x65, 0x18, 0xae, 0x05, 0x76, 0xd0, 0x95, 0xd1, 0xc6, + 0x33, 0x2a, 0x19, 0x16, 0x6c, 0x2d, 0x46, 0xf1, 0xa6, 0x3e, 0x42, 0xb4, 0xc3, 0x01, 0x42, 0x14, + 0x97, 0x32, 0x07, 0xc6, 0x55, 0x5a, 0xf2, 0x01, 0x4c, 0xca, 0x14, 0x5e, 0x3c, 0x04, 0x5b, 0x5c, + 0x2a, 0x49, 0xe7, 0x04, 0x99, 0xc2, 0x4b, 0x0d, 0xd9, 0xd6, 0xf0, 0x55, 0x49, 0xdd, 0x51, 0x91, + 0x8d, 0x3f, 0x19, 0xe6, 0xf3, 0x40, 0xe4, 0xe2, 0xdb, 0x81, 0xc9, 0xf5, 0x6a, 0xa5, 0xac, 0x18, + 0xbe, 0xf4, 0x67, 0x17, 0x96, 0x1f, 0x05, 0xd4, 0x6b, 0xdb, 0x4d, 0x81, 0x70, 0x14, 0xed, 0x0d, + 0xae, 0xd3, 0xa8, 0xa7, 0x1b, 0xc5, 0x62, 0x1c, 0x59, 0x1d, 0xfc, 0x70, 0x13, 0xd6, 0x91, 0x1d, + 0xb0, 0x0e, 0xdf, 0x6e, 0x35, 0x7b, 0xd4, 0xa1, 0x73, 0x24, 0xfb, 0x50, 0xbc, 0x83, 0x7a, 0x8c, + 0x52, 0x4b, 0xae, 0x7f, 0x2d, 0x97, 0x44, 0x2d, 0xcf, 0x72, 0x05, 0x28, 0xbd, 0x9e, 0x04, 0xd7, + 0x68, 0x01, 0xe7, 0x4f, 0x5c, 0xc0, 0x7f, 0x25, 0x03, 0xc3, 0x5c, 0x51, 0x12, 0xf3, 0xab, 0x87, + 0x2a, 0xb6, 0xfd, 0x64, 0x54, 0xb1, 0x22, 0x0a, 0x70, 0x6d, 0xa6, 0xf1, 0x32, 0x52, 0x89, 0x4d, + 0x58, 0xe9, 0xa2, 0x88, 0x26, 0x6c, 0x5e, 0x72, 0xf2, 0x7c, 0x25, 0xd5, 0x28, 0x34, 0x77, 0xe4, + 0xc4, 0xe8, 0x2f, 0x19, 0xce, 0x3c, 0x22, 0x42, 0x73, 0xf5, 0x80, 0xdc, 0x55, 0x18, 0x15, 0x01, + 0xbf, 0x4b, 0x47, 0xe2, 0xa2, 0xaa, 0xa8, 0x5d, 0x83, 0x37, 0x96, 0x8e, 0x22, 0x25, 0x50, 0x84, + 0x0c, 0x5b, 0x3b, 0x47, 0xda, 0x43, 0x56, 0x12, 0x91, 0xac, 0xf3, 0x07, 0x5e, 0x78, 0xb6, 0x42, + 0x3d, 0x95, 0x70, 0x08, 0x17, 0xa9, 0x44, 0x64, 0xd4, 0x60, 0x4a, 0x72, 0xc2, 0x88, 0x07, 0x59, + 0x85, 0xa2, 0x78, 0xf8, 0x9e, 0xfb, 0x51, 0x54, 0x2b, 0x3c, 0xa8, 0x54, 0xb8, 0xbf, 0xc9, 0x67, + 0xf3, 0x85, 0x07, 0x86, 0x1e, 0xcf, 0x91, 0xa0, 0x64, 0x07, 0xb7, 0x62, 0x7c, 0xf6, 0x91, 0xb7, + 0x61, 0x2c, 0xcc, 0x16, 0x19, 0x46, 0x94, 0xa1, 0xc1, 0x3a, 0x4a, 0x2f, 0xa9, 0xc5, 0x96, 0xa9, + 0xe8, 0x64, 0x11, 0x0a, 0x6c, 0x11, 0xc7, 0x9f, 0xd0, 0xea, 0x0a, 0x98, 0xea, 0x26, 0x2e, 0xf1, + 0x48, 0x0d, 0x66, 0xd8, 0xa2, 0xa9, 0x39, 0xed, 0xbd, 0x26, 0x5d, 0x75, 0xf7, 0xdc, 0x6e, 0xf0, + 0xc0, 0x5c, 0x15, 0xc2, 0x95, 0xab, 0xca, 0x76, 0xab, 0xa9, 0x15, 0x7b, 0xda, 0x03, 0xa9, 0x29, + 0xd4, 0x8a, 0x0c, 0xfb, 0xc3, 0x2c, 0x8c, 0x29, 0xf3, 0x89, 0x5c, 0x85, 0x42, 0xd5, 0x5f, 0x75, + 0xeb, 0x07, 0x61, 0xae, 0xa9, 0x89, 0xc7, 0xc7, 0x0b, 0xa3, 0x8e, 0x6f, 0x35, 0x11, 0x68, 0x86, + 0xc5, 0x64, 0x09, 0x26, 0xf8, 0x5f, 0x32, 0xe3, 0x76, 0x36, 0xf2, 0x76, 0xe3, 0xc8, 0x32, 0xd7, + 0xb6, 0x2a, 0xd7, 0x34, 0x12, 0xf2, 0x35, 0x00, 0x0e, 0xc0, 0xe8, 0xc4, 0xdc, 0xe0, 0x71, 0x95, + 0xa2, 0x82, 0x94, 0xb8, 0x44, 0x85, 0x21, 0xf9, 0x06, 0xcf, 0x2e, 0x29, 0xe7, 0x7f, 0x7e, 0xf0, + 0xc0, 0x50, 0xc6, 0xdf, 0x4a, 0x8f, 0x4f, 0x57, 0x59, 0x8a, 0xb4, 0x78, 0xf3, 0x26, 0xad, 0xbb, + 0x0f, 0xa9, 0x77, 0x54, 0x0a, 0x10, 0x51, 0xc1, 0x30, 0xfe, 0xfb, 0x8c, 0xb2, 0x6a, 0xc8, 0x1a, + 0xbe, 0xfa, 0xc6, 0x67, 0x84, 0xf0, 0xd9, 0x08, 0x95, 0x79, 0x09, 0x37, 0xe9, 0xee, 0xd2, 0xb3, + 0xc2, 0xd9, 0x72, 0x26, 0x9c, 0x57, 0xb1, 0xd7, 0xe0, 0x38, 0x90, 0xbc, 0x0f, 0x79, 0xec, 0xba, + 0xec, 0x89, 0x9f, 0x26, 0xf7, 0xd3, 0x3c, 0xeb, 0x33, 0xfc, 0x10, 0xa4, 0x24, 0x9f, 0x13, 0x91, + 0x5d, 0xbc, 0xf3, 0x27, 0x95, 0x4d, 0x91, 0xb5, 0x23, 0xdc, 0x48, 0xa3, 0x14, 0x05, 0xca, 0xec, + 0xf9, 0xd7, 0xb2, 0x50, 0x8c, 0xaf, 0x55, 0xf2, 0x1e, 0x8c, 0xcb, 0x9d, 0x0e, 0x9f, 0x05, 0x66, + 0x5f, 0x39, 0x2e, 0x52, 0x40, 0xcb, 0xed, 0x2e, 0xfe, 0x2a, 0xb0, 0x4a, 0xc0, 0xb4, 0x8e, 0x4d, + 0x91, 0x32, 0x48, 0x59, 0x25, 0x81, 0x1b, 0x74, 0x62, 0x09, 0x0a, 0x25, 0x1a, 0x79, 0x03, 0x72, + 0xf7, 0x6f, 0x97, 0x44, 0x18, 0x81, 0x14, 0x49, 0xf7, 0x6f, 0x97, 0xf8, 0x6a, 0xe6, 0x6e, 0x52, + 0xba, 0xd3, 0x16, 0xc3, 0x27, 0xab, 0x4a, 0xfe, 0xcf, 0x61, 0xed, 0x8d, 0x1e, 0x09, 0x0e, 0x3f, + 0xee, 0xe4, 0x44, 0xa0, 0xfc, 0xbd, 0x61, 0x91, 0x65, 0xef, 0xdf, 0xca, 0xc1, 0x68, 0x58, 0x3f, + 0x21, 0x80, 0x4a, 0x95, 0x38, 0xc9, 0xe0, 0xdf, 0xe4, 0x3c, 0x14, 0xa4, 0x1e, 0x25, 0xa2, 0x09, + 0x46, 0x7c, 0xa1, 0x43, 0xcd, 0x81, 0x54, 0x98, 0xf8, 0x32, 0x37, 0xe5, 0x4f, 0x72, 0x03, 0x42, + 0x6d, 0xa8, 0x97, 0xda, 0x94, 0x67, 0x03, 0x66, 0x86, 0x68, 0x64, 0x12, 0xb2, 0x0e, 0xcf, 0xdc, + 0x32, 0x6a, 0x66, 0x9d, 0x06, 0x79, 0x0f, 0x0a, 0x76, 0xa3, 0x41, 0x1b, 0x96, 0x2d, 0x9d, 0x1f, + 0xfa, 0x4d, 0x9a, 0x02, 0xe3, 0xc6, 0x37, 0x01, 0xa4, 0x2a, 0x05, 0xa4, 0x04, 0xa3, 0x4d, 0x9b, + 0x3b, 0x52, 0x35, 0x06, 0xd8, 0x51, 0x22, 0x0e, 0x05, 0x46, 0xf6, 0xc0, 0xa7, 0x0d, 0xf2, 0x32, + 0xe4, 0xd9, 0x68, 0x8a, 0x2d, 0x44, 0xaa, 0x6f, 0x6c, 0x30, 0x79, 0x87, 0xad, 0x3c, 0x63, 0x22, + 0x02, 0x79, 0x11, 0x72, 0xdd, 0xc5, 0x5d, 0xb1, 0x39, 0x14, 0xa3, 0x5c, 0xbc, 0x21, 0x1a, 0x2b, + 0x26, 0x37, 0xa1, 0x70, 0xa8, 0xa7, 0x71, 0x3d, 0x13, 0x1b, 0xc6, 0x10, 0x3f, 0x44, 0x5c, 0x2a, + 0xc0, 0x30, 0xdf, 0x08, 0x8c, 0xe7, 0x01, 0xa2, 0xaa, 0x93, 0x41, 0x1f, 0xc6, 0xd7, 0x60, 0x34, + 0xac, 0x92, 0x5c, 0x00, 0x38, 0xa0, 0x47, 0xd6, 0xbe, 0xdd, 0x6e, 0x34, 0xb9, 0x7e, 0x37, 0x6e, + 0x8e, 0x1e, 0xd0, 0xa3, 0x15, 0x04, 0x90, 0x73, 0x30, 0xd2, 0x61, 0xa3, 0x2a, 0xa6, 0xee, 0xb8, + 0x39, 0xdc, 0xe9, 0xee, 0xb0, 0x19, 0x3a, 0x07, 0x23, 0x68, 0x79, 0x13, 0x0b, 0x6d, 0xc2, 0x94, + 0x3f, 0x8d, 0xff, 0x34, 0x8b, 0xcf, 0x0d, 0x28, 0xed, 0x24, 0x97, 0x60, 0xa2, 0xee, 0x51, 0xdc, + 0x73, 0x6c, 0xa6, 0x49, 0x89, 0x7a, 0xc6, 0x23, 0x60, 0xb5, 0x41, 0x2e, 0xc3, 0x94, 0x78, 0x62, + 0x9b, 0x35, 0xa8, 0xbe, 0x23, 0x72, 0x2e, 0x8f, 0x9b, 0x13, 0x1c, 0x7c, 0x8f, 0x1e, 0x95, 0x77, + 0x30, 0xe3, 0x50, 0x51, 0x4d, 0x18, 0x19, 0x84, 0x2f, 0x23, 0x9a, 0x53, 0x0a, 0x1c, 0x7d, 0x9a, + 0xce, 0xc2, 0xb0, 0x6d, 0xef, 0x75, 0x1d, 0x9e, 0x19, 0x64, 0xdc, 0x14, 0xbf, 0xc8, 0xab, 0x30, + 0xed, 0x3b, 0x7b, 0x6d, 0x3b, 0xe8, 0x7a, 0xe2, 0xbd, 0x07, 0xea, 0xe1, 0x94, 0x9a, 0x30, 0x8b, + 0x61, 0x41, 0x99, 0xc3, 0xc9, 0xeb, 0x40, 0xd4, 0xfa, 0xdc, 0x9d, 0x8f, 0x68, 0x9d, 0x4f, 0xb5, + 0x71, 0x73, 0x5a, 0x29, 0x59, 0xc7, 0x02, 0xf2, 0x02, 0x8c, 0x7b, 0xd4, 0x47, 0x2d, 0x0e, 0xbb, + 0x0d, 0x5f, 0xe3, 0x31, 0xc7, 0x24, 0x8c, 0xf5, 0xdd, 0x15, 0x28, 0x2a, 0xdd, 0x81, 0x39, 0x39, + 0x79, 0xc2, 0x61, 0x73, 0x32, 0x82, 0x9b, 0x9d, 0x6a, 0xc3, 0x58, 0x82, 0xe9, 0xc4, 0xca, 0x55, + 0x5e, 0xb3, 0xe5, 0x92, 0xa8, 0xff, 0x6b, 0xb6, 0x46, 0x1b, 0xc6, 0x55, 0x49, 0x7c, 0x42, 0xde, + 0xeb, 0xb3, 0x18, 0x59, 0xce, 0xc5, 0xd4, 0xf0, 0xe3, 0xe3, 0x85, 0xac, 0xd3, 0xc0, 0x78, 0xf2, + 0x2b, 0x50, 0x90, 0x4a, 0x83, 0xd8, 0xab, 0xd1, 0x72, 0x2a, 0xb4, 0xd5, 0x23, 0x33, 0x2c, 0x35, + 0x5e, 0x86, 0x11, 0x21, 0x6c, 0xfb, 0xdb, 0x4b, 0x8d, 0x1f, 0xcb, 0xc2, 0x94, 0x49, 0x99, 0x28, + 0xa0, 0x3c, 0xd9, 0xfd, 0x53, 0x7b, 0x7c, 0x4b, 0xcf, 0x4f, 0xa6, 0x7d, 0x5b, 0x9f, 0x34, 0xf3, + 0x7f, 0x37, 0x03, 0x33, 0x29, 0xb8, 0x9f, 0xe8, 0x49, 0xb4, 0x5b, 0x30, 0x5a, 0x71, 0xec, 0x66, + 0xa9, 0xd1, 0x08, 0xc3, 0xcc, 0x51, 0xd5, 0x6c, 0xb0, 0x99, 0x66, 0x33, 0xa8, 0xba, 0xed, 0x86, + 0xa8, 0xe4, 0x15, 0x31, 0x29, 0xa2, 0xe7, 0xa8, 0x71, 0x52, 0x7c, 0x7c, 0xbc, 0x00, 0xbc, 0x4d, + 0xd1, 0xb3, 0x9b, 0x98, 0x33, 0x90, 0x03, 0x23, 0x37, 0xf0, 0xa7, 0x76, 0xe8, 0xd2, 0x73, 0x06, + 0xc6, 0x3f, 0x6f, 0xa0, 0x4c, 0xf3, 0x3f, 0x99, 0x85, 0xb3, 0xe9, 0x84, 0x9f, 0xf4, 0x75, 0x3b, + 0xcc, 0xf1, 0xaf, 0xe4, 0x39, 0xc5, 0xd7, 0xed, 0xf8, 0x83, 0x00, 0x88, 0x1f, 0x21, 0x90, 0x5d, + 0x98, 0x58, 0xb5, 0xfd, 0x60, 0x85, 0xda, 0x5e, 0xb0, 0x43, 0xed, 0x60, 0x00, 0xdd, 0xf3, 0x45, + 0x79, 0x2d, 0x89, 0xdb, 0xdf, 0xbe, 0xa4, 0x8c, 0x69, 0x87, 0x3a, 0xdb, 0x70, 0xa2, 0xe4, 0x07, + 0x98, 0x28, 0xdf, 0x84, 0xa9, 0x1a, 0x6d, 0xd9, 0x9d, 0x7d, 0xd7, 0x93, 0x71, 0x84, 0xd7, 0x60, + 0x22, 0x04, 0xa5, 0xce, 0x16, 0xbd, 0x58, 0xc3, 0x57, 0x3a, 0x22, 0x12, 0x25, 0x7a, 0xb1, 0xf1, + 0x37, 0xb2, 0x70, 0xae, 0x54, 0x17, 0xde, 0x42, 0xa2, 0x40, 0x3a, 0x35, 0x7e, 0xc6, 0x75, 0x93, + 0xeb, 0x30, 0x7a, 0xdf, 0x7e, 0xb4, 0x4a, 0x6d, 0x9f, 0xfa, 0xe2, 0x6d, 0x21, 0xae, 0xa8, 0xd9, + 0x8f, 0x22, 0x27, 0x1a, 0x33, 0xc2, 0x51, 0x4f, 0xb2, 0xf9, 0x4f, 0x79, 0x92, 0x35, 0x60, 0x78, + 0xc5, 0x6d, 0x36, 0xc4, 0x36, 0x26, 0xae, 0xd7, 0xf6, 0x11, 0x62, 0x8a, 0x12, 0x76, 0x00, 0x9c, + 0x0c, 0x5b, 0x8c, 0x4d, 0xf8, 0xcc, 0xbb, 0xe4, 0x32, 0x8c, 0x60, 0x45, 0xd5, 0x8a, 0xba, 0x69, + 0x34, 0x29, 0xbe, 0x10, 0xd3, 0x30, 0x65, 0xa1, 0xda, 0x13, 0x43, 0x9f, 0xae, 0x27, 0x8c, 0x7f, + 0x1b, 0x6f, 0xee, 0xd4, 0xaf, 0x64, 0x3b, 0x91, 0xd2, 0x90, 0xcc, 0x80, 0x0d, 0xc9, 0x3e, 0xb1, + 0x21, 0xc9, 0xf5, 0x1c, 0x92, 0x6f, 0x67, 0x61, 0x2c, 0x6c, 0xec, 0xf7, 0x59, 0xb2, 0xdd, 0xf0, + 0xbb, 0x06, 0x8a, 0xfd, 0xaf, 0x29, 0xb2, 0x42, 0x84, 0xd8, 0xbf, 0x0f, 0xc3, 0x62, 0x31, 0x65, + 0x62, 0xce, 0x7d, 0xb1, 0xd1, 0x5d, 0x9a, 0x14, 0xac, 0x87, 0x71, 0x40, 0x7d, 0x53, 0xd0, 0x61, + 0x72, 0x85, 0x6d, 0xba, 0x23, 0x2e, 0x72, 0x9f, 0xda, 0x3d, 0x2a, 0x3d, 0xb9, 0x42, 0xf4, 0x61, + 0x03, 0xed, 0x4e, 0x3f, 0x5f, 0x80, 0x62, 0x9c, 0xe4, 0xe4, 0x74, 0xc6, 0x1b, 0xdd, 0x1d, 0xae, + 0x85, 0xf3, 0x74, 0xc6, 0x9d, 0xee, 0x8e, 0xc9, 0x60, 0xe8, 0xe7, 0xe1, 0x39, 0x0f, 0xf1, 0xab, + 0xc7, 0x85, 0x9f, 0x87, 0xe7, 0x3c, 0xd4, 0xfc, 0x3c, 0x3c, 0xe7, 0x21, 0x1e, 0x7d, 0x57, 0x6b, + 0x18, 0x0f, 0x8a, 0x2a, 0xb8, 0x38, 0xfa, 0x36, 0xfd, 0xf8, 0x33, 0x20, 0x12, 0x8d, 0x6d, 0x95, + 0x4b, 0xd4, 0xf6, 0x44, 0xea, 0x5d, 0x21, 0xce, 0x70, 0xab, 0xdc, 0x41, 0x30, 0x7f, 0x61, 0xd7, + 0x54, 0x91, 0x48, 0x13, 0x88, 0xf2, 0x53, 0x2e, 0xe0, 0x93, 0x4f, 0x83, 0xd2, 0x31, 0x67, 0x56, + 0x65, 0x6d, 0xa9, 0xab, 0x39, 0x85, 0xef, 0x93, 0x34, 0x40, 0x6e, 0x88, 0x7c, 0x62, 0x68, 0xf2, + 0x28, 0x9c, 0xc8, 0x4c, 0x06, 0x4c, 0x03, 0xcf, 0x37, 0x16, 0x1a, 0x3e, 0x22, 0x26, 0xe4, 0x5d, + 0x18, 0x53, 0xa3, 0x7c, 0x79, 0x2c, 0xea, 0x73, 0x3c, 0x45, 0x54, 0x8f, 0x47, 0xde, 0x54, 0x02, + 0xb2, 0x03, 0xe7, 0xca, 0x6e, 0xdb, 0xef, 0xb6, 0x64, 0x32, 0xaa, 0x28, 0x05, 0x26, 0x84, 0x8f, + 0xb4, 0xbf, 0x58, 0x17, 0x28, 0x22, 0xa8, 0x54, 0x7a, 0x4e, 0xeb, 0x07, 0x90, 0x5e, 0x8c, 0xc8, + 0x26, 0x8c, 0xa1, 0x11, 0x4f, 0xb8, 0x66, 0x8d, 0xe9, 0x62, 0x23, 0x2a, 0xa9, 0xb0, 0x85, 0xc1, + 0xb3, 0xa9, 0xd8, 0xad, 0xa6, 0x74, 0xdc, 0x55, 0x8d, 0x91, 0x0a, 0x32, 0xf9, 0x1a, 0x4c, 0xf2, + 0xe3, 0xe6, 0x36, 0xdd, 0xe1, 0x73, 0x67, 0x5c, 0x3b, 0x3b, 0xeb, 0x85, 0xfc, 0xa2, 0x57, 0x98, + 0x4e, 0x0f, 0xe9, 0x0e, 0x1f, 0x7b, 0xcd, 0x6d, 0x5e, 0xc3, 0x27, 0x0f, 0x60, 0x66, 0xc5, 0xf6, + 0x39, 0x50, 0x09, 0xd7, 0x9c, 0x40, 0x9b, 0x22, 0xba, 0x33, 0xee, 0xdb, 0xbe, 0xb4, 0xc5, 0xa6, + 0x86, 0x67, 0xa6, 0xd1, 0x93, 0x1f, 0xcb, 0xc0, 0x9c, 0x66, 0xaa, 0x15, 0x4e, 0x35, 0x2d, 0xda, + 0x0e, 0xd0, 0x3f, 0x7e, 0x32, 0x7c, 0xdb, 0xb7, 0x17, 0x1a, 0x1f, 0x92, 0x98, 0x35, 0xd8, 0x8b, + 0xca, 0x55, 0x3f, 0xc1, 0x5e, 0x3c, 0x8c, 0x5b, 0xf1, 0xde, 0x13, 0x86, 0x96, 0x4c, 0x68, 0x68, + 0x99, 0x85, 0x21, 0xec, 0x23, 0x99, 0x2b, 0x02, 0x7f, 0x18, 0x9f, 0x53, 0xa5, 0x8a, 0x50, 0xf2, + 0xfa, 0x4a, 0x15, 0xe3, 0xbf, 0x1e, 0x86, 0xa9, 0xd8, 0x20, 0x8b, 0x53, 0x67, 0x26, 0x71, 0xea, + 0xac, 0x01, 0x70, 0x53, 0xe3, 0x80, 0x36, 0x41, 0x19, 0x69, 0x33, 0x26, 0x22, 0xd5, 0xc2, 0x15, + 0xa2, 0xb0, 0x61, 0x4c, 0xf9, 0xfa, 0x1b, 0xd0, 0x46, 0x1b, 0x32, 0xe5, 0x4b, 0x58, 0x61, 0x1a, + 0xb1, 0x21, 0x0b, 0x30, 0x84, 0x09, 0xde, 0xd4, 0x40, 0x27, 0x87, 0x01, 0x4c, 0x0e, 0x27, 0x97, + 0x60, 0x98, 0xa9, 0x44, 0xd5, 0x8a, 0x10, 0x69, 0xb8, 0x53, 0x30, 0x9d, 0x89, 0xe9, 0x1f, 0xa2, + 0x88, 0xdc, 0x82, 0x71, 0xfe, 0x97, 0x88, 0xf1, 0x1f, 0xd6, 0xfd, 0xb6, 0x2c, 0xa7, 0x21, 0xc3, + 0xfc, 0x35, 0x3c, 0x76, 0x56, 0xa8, 0x75, 0x77, 0xf8, 0x4b, 0xf3, 0x22, 0x23, 0x28, 0x9e, 0x15, + 0x7c, 0x0e, 0xc4, 0x97, 0xb0, 0x43, 0x04, 0xa6, 0x99, 0x08, 0x77, 0xe3, 0x02, 0x9e, 0x10, 0x51, + 0x33, 0xe1, 0x6e, 0xc6, 0xa6, 0x28, 0x21, 0x57, 0xb9, 0x69, 0x1f, 0x95, 0x3c, 0xfe, 0x88, 0x11, + 0xda, 0xcd, 0xd1, 0xcc, 0x80, 0x9a, 0x5e, 0x58, 0xcc, 0x2a, 0x67, 0x7f, 0x2f, 0xb7, 0x6c, 0xa7, + 0x29, 0x84, 0x04, 0x56, 0x8e, 0xb8, 0x94, 0x41, 0xcd, 0x08, 0x81, 0xbc, 0x0d, 0x93, 0xec, 0x47, + 0xd9, 0x6d, 0xb5, 0xdc, 0x36, 0xb2, 0x1f, 0x8b, 0xd2, 0xc5, 0x20, 0x49, 0x1d, 0x8b, 0x78, 0x2d, + 0x31, 0x5c, 0xb6, 0x3b, 0xe0, 0xb5, 0x61, 0x97, 0x5f, 0x3a, 0x8c, 0x47, 0xbb, 0x03, 0x92, 0xfa, + 0x1c, 0x6e, 0xaa, 0x48, 0xe4, 0x4d, 0x98, 0x60, 0x3f, 0xef, 0x38, 0x0f, 0x29, 0xaf, 0x70, 0x22, + 0xba, 0xc8, 0x46, 0xaa, 0x3d, 0x56, 0xc2, 0xeb, 0xd3, 0x31, 0xc9, 0x97, 0xe1, 0x0c, 0x72, 0xaa, + 0xbb, 0x1d, 0xda, 0x28, 0xed, 0xee, 0x3a, 0x4d, 0x87, 0x3b, 0xd2, 0xf0, 0x68, 0x76, 0xb4, 0x01, + 0xf3, 0x8a, 0x11, 0xc3, 0xb2, 0x23, 0x14, 0x33, 0x9d, 0x92, 0x6c, 0x43, 0xb1, 0xdc, 0xf5, 0x03, + 0xb7, 0x55, 0x0a, 0x02, 0xcf, 0xd9, 0xe9, 0x06, 0xd4, 0x9f, 0x9b, 0xd2, 0x62, 0xbe, 0xd9, 0xe2, + 0x08, 0x0b, 0xb9, 0x75, 0xa7, 0x8e, 0x14, 0x96, 0x1d, 0x92, 0x98, 0x09, 0x26, 0xc6, 0x7f, 0x95, + 0x81, 0x09, 0x8d, 0x94, 0xbc, 0x01, 0xe3, 0xb7, 0x3d, 0x87, 0xb6, 0x1b, 0xcd, 0x23, 0xe5, 0xd8, + 0x89, 0x67, 0x92, 0x5d, 0x01, 0xe7, 0x5f, 0xad, 0xa1, 0x85, 0x56, 0x9b, 0x6c, 0xaa, 0x97, 0xdb, + 0x75, 0x1e, 0x6f, 0x27, 0x26, 0x68, 0x2e, 0x4a, 0x42, 0x81, 0x13, 0x54, 0xcc, 0x4e, 0x05, 0x85, + 0xbc, 0x03, 0xc3, 0xfc, 0x82, 0x51, 0xb8, 0x5c, 0x9d, 0x4f, 0xfb, 0x4c, 0x1e, 0xdb, 0x89, 0x13, + 0x11, 0xdd, 0x3b, 0x7c, 0x53, 0x10, 0x19, 0x3f, 0x9b, 0x01, 0x92, 0x44, 0x3d, 0xc1, 0x8a, 0x75, + 0xa2, 0xdb, 0xc8, 0xfb, 0xe1, 0x6a, 0xcc, 0x69, 0x36, 0x5b, 0x56, 0x13, 0x2f, 0xe0, 0x1d, 0x2f, + 0x56, 0x9d, 0x6a, 0x56, 0xe3, 0xc5, 0xc6, 0x5f, 0xce, 0x02, 0x44, 0xd8, 0xe4, 0x8b, 0xfc, 0x1d, + 0x8d, 0x2f, 0x77, 0xed, 0xa6, 0xb3, 0xeb, 0xe8, 0x89, 0xe5, 0x90, 0xc9, 0x37, 0x65, 0x89, 0xa9, + 0x23, 0x92, 0xf7, 0x60, 0xaa, 0xb6, 0xa1, 0xd3, 0x2a, 0x6f, 0x06, 0xf8, 0x1d, 0x2b, 0x46, 0x1e, + 0xc7, 0x46, 0xd7, 0x4a, 0x75, 0x34, 0xb8, 0x6b, 0x25, 0x1f, 0x08, 0x51, 0xc2, 0x04, 0x4b, 0x6d, + 0x43, 0x78, 0xf3, 0x36, 0xaa, 0x15, 0x21, 0xa5, 0xb0, 0x75, 0x7e, 0xc7, 0xea, 0x08, 0x37, 0x5f, + 0x26, 0x27, 0x34, 0xbc, 0xa8, 0x23, 0x87, 0x7a, 0xc4, 0x6f, 0xfe, 0x1c, 0x1a, 0xf1, 0x5a, 0x6e, + 0x40, 0x85, 0xed, 0xe2, 0xa9, 0x3d, 0xc5, 0x44, 0xb7, 0xd3, 0x43, 0x5a, 0x58, 0x9a, 0xf6, 0x75, + 0xc2, 0x37, 0xe2, 0x66, 0x74, 0xe4, 0xe0, 0xf7, 0xd4, 0x29, 0xde, 0x14, 0x7f, 0x3b, 0x03, 0x67, + 0x52, 0x69, 0xc9, 0x35, 0x80, 0xc8, 0x42, 0x24, 0x7a, 0x09, 0x25, 0x66, 0x94, 0x7a, 0xc1, 0x54, + 0x30, 0xc8, 0x57, 0xe3, 0xb6, 0x9d, 0x93, 0x37, 0xc2, 0x79, 0x99, 0x5a, 0x47, 0xb7, 0xed, 0xa4, + 0x58, 0x74, 0x8c, 0xbf, 0x9b, 0x83, 0x69, 0x25, 0xb3, 0x03, 0x6f, 0xeb, 0x09, 0xae, 0xae, 0x07, + 0x30, 0xce, 0xbe, 0xc6, 0xa9, 0x8b, 0xd8, 0x18, 0xee, 0x49, 0xf1, 0x4a, 0x22, 0xb0, 0x48, 0x70, + 0xbb, 0xa6, 0x22, 0xf3, 0x84, 0x57, 0x28, 0x3a, 0xd1, 0x72, 0x5e, 0x4f, 0xc6, 0xc8, 0x68, 0xcc, + 0x89, 0x0f, 0x13, 0x95, 0xa3, 0xb6, 0xdd, 0x0a, 0x6b, 0xe3, 0x1e, 0x15, 0xaf, 0xf6, 0xac, 0x4d, + 0xc3, 0xe6, 0xd5, 0x45, 0x2e, 0xf8, 0xbc, 0x2c, 0x25, 0xfa, 0x53, 0xa3, 0x9a, 0x7f, 0x0f, 0xa6, + 0x13, 0x8d, 0x3e, 0x55, 0xee, 0xad, 0x6d, 0x20, 0xc9, 0x76, 0xa4, 0x70, 0x78, 0x55, 0xcf, 0xec, + 0x76, 0x26, 0xbc, 0x3c, 0xc5, 0x17, 0x78, 0xb9, 0x7f, 0xc6, 0xa2, 0x9a, 0x99, 0xeb, 0xe7, 0xb2, + 0x6a, 0x70, 0xd7, 0xd3, 0xbe, 0xea, 0xde, 0xd7, 0xce, 0xb6, 0xcf, 0xf7, 0x1a, 0xd3, 0x81, 0x6c, + 0x08, 0xdf, 0xcb, 0xc1, 0xb9, 0x1e, 0x94, 0xe4, 0x28, 0x3e, 0x89, 0xb8, 0x4d, 0xe1, 0x46, 0xff, + 0x0a, 0x9f, 0xc4, 0x54, 0x22, 0x5f, 0xe4, 0xe1, 0xdd, 0x75, 0x7c, 0x39, 0x56, 0x9c, 0xa6, 0xf9, + 0xa3, 0xe3, 0x21, 0x34, 0x1e, 0xd7, 0xcd, 0xa1, 0xe4, 0x3d, 0x18, 0xc2, 0xc8, 0xbe, 0x58, 0x66, + 0x29, 0x86, 0x81, 0x70, 0x25, 0x0d, 0x17, 0xfb, 0xa9, 0xa5, 0xe1, 0x62, 0x00, 0xf2, 0x05, 0xc8, + 0x95, 0xb6, 0x6b, 0x62, 0x5c, 0x26, 0x55, 0xf2, 0xed, 0x5a, 0x94, 0xfd, 0xdb, 0xd6, 0xd2, 0x74, + 0x33, 0x0a, 0x46, 0x78, 0xa7, 0xbc, 0x21, 0x46, 0x45, 0x25, 0xbc, 0x53, 0xde, 0x88, 0x08, 0xf7, + 0xea, 0x5a, 0xa6, 0x8e, 0x3b, 0xe5, 0x8d, 0xcf, 0x6e, 0xda, 0xff, 0xb5, 0x2c, 0x8f, 0x49, 0xe7, + 0x1f, 0xf6, 0x1e, 0x8c, 0x6b, 0x99, 0x37, 0x33, 0x91, 0x3e, 0x16, 0x26, 0x38, 0x8d, 0xb9, 0xa0, + 0x68, 0x04, 0x32, 0x8f, 0x3e, 0xfb, 0x8d, 0x1a, 0xaf, 0xea, 0xec, 0x11, 0x72, 0x40, 0x9d, 0x38, + 0x9e, 0x47, 0x3f, 0x24, 0x21, 0x37, 0xa1, 0xb0, 0x49, 0xdb, 0x76, 0x3b, 0x08, 0xcd, 0x9b, 0xe8, + 0x46, 0x1a, 0x20, 0x4c, 0xd7, 0x1a, 0x42, 0x44, 0x74, 0x79, 0xec, 0xee, 0xf8, 0x75, 0xcf, 0xc1, + 0xdc, 0x15, 0xe1, 0x5e, 0xcc, 0x5d, 0x1e, 0x95, 0x12, 0x9d, 0x41, 0x8c, 0xc8, 0xf8, 0xb9, 0x0c, + 0x8c, 0x88, 0x81, 0xe4, 0xef, 0x9f, 0xec, 0x45, 0x7b, 0x89, 0x78, 0xff, 0x64, 0xcf, 0x89, 0xbf, + 0x7f, 0xb2, 0xc7, 0x13, 0x44, 0x8c, 0x8a, 0xf0, 0xca, 0xf0, 0xa2, 0x8f, 0x3f, 0x97, 0xcd, 0x81, + 0x7a, 0xb5, 0x11, 0xea, 0xa0, 0xb1, 0x24, 0xc6, 0xdf, 0x14, 0x2d, 0xbb, 0x53, 0xde, 0x20, 0x8b, + 0x50, 0x58, 0x75, 0xeb, 0xb6, 0xb2, 0xcf, 0xa1, 0xd8, 0x69, 0x0a, 0x98, 0xda, 0x41, 0x12, 0x8f, + 0xb5, 0x6f, 0xc3, 0x73, 0xc5, 0x59, 0x46, 0x69, 0x5f, 0x87, 0x03, 0x63, 0xed, 0x0b, 0x51, 0x07, + 0x6e, 0x1f, 0x4d, 0x11, 0x12, 0x5b, 0x37, 0x31, 0xc1, 0xf8, 0x5d, 0x35, 0x46, 0x47, 0x14, 0x49, + 0x49, 0x31, 0xdf, 0x4b, 0x52, 0x6c, 0xdd, 0x34, 0x53, 0xa8, 0xf0, 0x96, 0x2c, 0x02, 0xd7, 0xa8, + 0xf7, 0xf0, 0x29, 0x96, 0xd2, 0xe9, 0xb7, 0x64, 0xf1, 0xcf, 0x1b, 0x48, 0x48, 0xff, 0xe7, 0x59, + 0x38, 0x9b, 0x4e, 0xa8, 0x7e, 0x4b, 0xa6, 0xcf, 0xb7, 0x5c, 0x81, 0xc2, 0x8a, 0xeb, 0x07, 0x8a, + 0xd7, 0x19, 0x1a, 0xf3, 0xf7, 0x05, 0xcc, 0x0c, 0x4b, 0xd9, 0x99, 0x9b, 0xfd, 0x1d, 0x2e, 0x4f, + 0xe4, 0x87, 0x91, 0xd8, 0xec, 0xcc, 0xcd, 0x8b, 0xc8, 0x1d, 0x28, 0x98, 0x22, 0x46, 0x24, 0xd6, + 0x35, 0x12, 0x1c, 0x6a, 0x53, 0xc4, 0x13, 0x10, 0x2d, 0x01, 0xaa, 0x80, 0x91, 0x12, 0x8c, 0x88, + 0xd1, 0x8f, 0x5d, 0x04, 0xa7, 0x4c, 0x19, 0x3d, 0x27, 0xb1, 0xa4, 0x63, 0x12, 0x05, 0xaf, 0xf4, + 0xaa, 0x15, 0x19, 0xee, 0x81, 0x12, 0x85, 0x5f, 0xf9, 0xe9, 0x0e, 0x7e, 0x21, 0xa2, 0xf1, 0x63, + 0x59, 0x00, 0x69, 0xb5, 0x79, 0x6a, 0x67, 0xd8, 0x17, 0xb4, 0x19, 0xa6, 0xf8, 0xbb, 0x0c, 0xfe, + 0x5e, 0xdf, 0x3a, 0xfa, 0x9d, 0x0c, 0xfe, 0x5a, 0xdf, 0x02, 0x0c, 0x6d, 0x46, 0x06, 0x2d, 0x11, + 0x7c, 0x80, 0xc6, 0x65, 0x0e, 0x37, 0x76, 0x60, 0xf6, 0x0e, 0x0d, 0x22, 0xf3, 0x96, 0xbc, 0x48, + 0xec, 0xcf, 0xf6, 0x35, 0x18, 0x15, 0xf8, 0xa1, 0xfc, 0xe2, 0xb6, 0x18, 0x91, 0xdc, 0x00, 0x6d, + 0x31, 0x12, 0x81, 0x49, 0xa3, 0x0a, 0x6d, 0xd2, 0x80, 0x7e, 0xb6, 0xd5, 0xd4, 0x80, 0xf0, 0x4f, + 0xc1, 0x2f, 0x1b, 0xac, 0x86, 0x13, 0xfb, 0x67, 0x0b, 0xce, 0x84, 0x6d, 0x7f, 0x92, 0x7c, 0xaf, + 0xb3, 0x23, 0xa5, 0x48, 0xe7, 0x1b, 0x71, 0xec, 0xe3, 0x49, 0xf2, 0x08, 0xe6, 0x25, 0xc1, 0xb6, + 0x13, 0x3a, 0xee, 0x0d, 0x44, 0x4b, 0xde, 0x86, 0x31, 0x85, 0x46, 0xa4, 0xa3, 0x45, 0xa3, 0xf3, + 0xa1, 0x13, 0xec, 0x5b, 0x3e, 0x87, 0xab, 0x46, 0x67, 0x05, 0xdd, 0xf8, 0x10, 0x9e, 0x0d, 0x03, + 0x44, 0x52, 0xaa, 0x8e, 0x31, 0xcf, 0x9c, 0x8e, 0xf9, 0x5a, 0xf4, 0x59, 0xd5, 0x76, 0x18, 0xd4, + 0x29, 0x79, 0x13, 0xf5, 0xb3, 0xc4, 0xc7, 0x3c, 0x97, 0x08, 0x13, 0x55, 0xa2, 0x41, 0x8d, 0xb7, + 0x94, 0xc6, 0xa6, 0x30, 0xd4, 0x88, 0x33, 0x71, 0xe2, 0x1f, 0xcb, 0xc2, 0xd4, 0x7a, 0xb5, 0x52, + 0x0e, 0x7d, 0x89, 0xbe, 0xcf, 0x5e, 0x13, 0xd4, 0xbe, 0xad, 0xb7, 0xbc, 0x31, 0x1e, 0xc0, 0x4c, + 0xac, 0x1b, 0x50, 0x75, 0x78, 0x97, 0x47, 0x30, 0x84, 0x60, 0xa9, 0x36, 0x9c, 0x4d, 0x63, 0xbf, + 0x75, 0xd3, 0x8c, 0x61, 0x1b, 0xff, 0x78, 0x34, 0xc6, 0x57, 0x88, 0xb0, 0xd7, 0x60, 0xb4, 0xea, + 0xfb, 0x5d, 0xea, 0x3d, 0x30, 0x57, 0x55, 0x53, 0x81, 0x83, 0x40, 0xab, 0xeb, 0x35, 0xcd, 0x08, + 0x81, 0x5c, 0x85, 0x82, 0xc8, 0xd0, 0x2a, 0x65, 0x02, 0x5a, 0x6d, 0xc3, 0x04, 0xaf, 0x66, 0x58, + 0x4c, 0xde, 0x80, 0x71, 0xfe, 0x37, 0x9f, 0x6d, 0xa2, 0xc3, 0xd1, 0x38, 0x28, 0xd0, 0xf9, 0xec, + 0x34, 0x35, 0x34, 0xf2, 0x0a, 0xe4, 0x4a, 0x65, 0x53, 0x98, 0x83, 0x84, 0xde, 0x88, 0x6f, 0x04, + 0x77, 0xa9, 0x7e, 0x88, 0x28, 0x9b, 0x4c, 0xfb, 0x93, 0x01, 0xe4, 0xc2, 0x92, 0xcd, 0x9f, 0x32, + 0x16, 0xb0, 0xd8, 0x66, 0x86, 0x30, 0x72, 0x1d, 0x46, 0x2a, 0x8e, 0xdf, 0x69, 0xda, 0x47, 0xc2, + 0x8e, 0xcd, 0x9f, 0xca, 0xe1, 0x20, 0x2d, 0x2e, 0x9c, 0x83, 0xc8, 0x55, 0xf9, 0x84, 0x48, 0x21, + 0x0a, 0x84, 0xe8, 0xf1, 0x4e, 0xc8, 0x6b, 0x30, 0x2c, 0xf2, 0x98, 0x8e, 0x2a, 0x19, 0xca, 0xe3, + 0xf9, 0x4b, 0x05, 0x4e, 0x32, 0x54, 0x11, 0x9e, 0x64, 0xa8, 0xe2, 0x0e, 0x9c, 0xbb, 0x83, 0xd6, + 0x1b, 0x3d, 0xe3, 0xc9, 0x03, 0xb3, 0x2a, 0xec, 0xe1, 0x78, 0xa9, 0xc3, 0x0d, 0x3c, 0xf1, 0xa4, + 0x29, 0x56, 0xd7, 0x53, 0x5f, 0x7e, 0xeb, 0xc5, 0x88, 0x7c, 0x05, 0x66, 0xd3, 0x8a, 0x84, 0xd5, + 0x1c, 0x73, 0x7b, 0xa4, 0x57, 0xa0, 0xe6, 0xf6, 0x48, 0xe3, 0x40, 0x56, 0xa1, 0xc8, 0xe1, 0xa5, + 0x46, 0xcb, 0x69, 0x73, 0xcb, 0x3f, 0xb7, 0xaa, 0x63, 0x64, 0x82, 0xe0, 0x6a, 0xb3, 0x42, 0x7e, + 0x03, 0xa0, 0xc5, 0xb2, 0xc4, 0x28, 0xc9, 0x4f, 0x67, 0xd8, 0x69, 0x8e, 0x67, 0xfd, 0x7c, 0x60, + 0xae, 0xfa, 0x22, 0x2f, 0xd4, 0xd9, 0x28, 0x4c, 0xa5, 0x16, 0x78, 0x4e, 0x7b, 0x4f, 0xc4, 0xa9, + 0x6c, 0x8a, 0x38, 0x95, 0xb7, 0x3f, 0x51, 0x9c, 0x0a, 0x67, 0xe5, 0x3f, 0x3e, 0x5e, 0x18, 0xf7, + 0x44, 0x9d, 0xb8, 0x8a, 0xb4, 0x16, 0xe0, 0xab, 0xe5, 0xcd, 0xa6, 0x7b, 0xf8, 0xa0, 0xfd, 0x90, + 0x7a, 0xce, 0xae, 0x43, 0x1b, 0xfc, 0x23, 0xa7, 0x50, 0x82, 0xf3, 0x57, 0xcb, 0xf1, 0x1d, 0xfe, + 0x6e, 0x88, 0x90, 0xf8, 0xd0, 0x54, 0x0e, 0xec, 0xe0, 0x29, 0x63, 0x21, 0x78, 0xdc, 0x65, 0x31, + 0x3a, 0x78, 0xca, 0xc0, 0x09, 0x0b, 0xa7, 0x91, 0x3a, 0x79, 0x34, 0x12, 0x72, 0x1d, 0x86, 0xef, + 0xdb, 0x8f, 0x4a, 0x7b, 0x54, 0x3c, 0x0d, 0x35, 0x21, 0xc5, 0x1f, 0x02, 0x97, 0x0a, 0xbf, 0xcf, + 0x7d, 0xed, 0x9f, 0x31, 0x05, 0x1a, 0xf9, 0xa1, 0x0c, 0x9c, 0xe5, 0xcb, 0x58, 0x7e, 0x65, 0x8d, + 0x06, 0x01, 0xeb, 0x07, 0x91, 0x20, 0x4a, 0x3e, 0xac, 0x50, 0xab, 0xad, 0xa7, 0xe3, 0xf1, 0x37, + 0xb6, 0x85, 0x64, 0x08, 0x3b, 0xce, 0x17, 0xa5, 0x5a, 0x16, 0xc8, 0x54, 0x7a, 0xe1, 0x47, 0xfe, + 0x05, 0xd9, 0x72, 0xf2, 0xba, 0x1a, 0x1e, 0x98, 0x43, 0x3d, 0x77, 0xa4, 0x65, 0x3f, 0xb2, 0xec, + 0x3d, 0xaa, 0xdd, 0x4e, 0x87, 0x71, 0x83, 0xe7, 0x7b, 0xb6, 0x8d, 0xdc, 0x82, 0x73, 0xf2, 0xb5, + 0xf5, 0xfd, 0x20, 0xe8, 0xf8, 0x96, 0x3c, 0x0b, 0x88, 0x78, 0x42, 0xf3, 0x8c, 0x28, 0x5e, 0x61, + 0xa5, 0xf2, 0x78, 0xe0, 0x1b, 0x7f, 0x34, 0xca, 0xf7, 0xb4, 0x52, 0x37, 0xd8, 0x97, 0xbb, 0xe0, + 0x62, 0x5a, 0x44, 0x0c, 0x77, 0xd5, 0x53, 0x22, 0x62, 0xf4, 0x38, 0x18, 0x79, 0x19, 0x91, 0x4d, + 0xbd, 0x8c, 0x78, 0x0d, 0x46, 0xcb, 0xfb, 0xb4, 0x7e, 0x10, 0x46, 0x25, 0x14, 0x84, 0xb5, 0x97, + 0x01, 0x79, 0x82, 0xd0, 0x08, 0x81, 0x5c, 0x07, 0xc0, 0x10, 0x39, 0xae, 0x22, 0x29, 0x49, 0xbe, + 0x31, 0xa2, 0x4e, 0x78, 0x3f, 0x28, 0x28, 0xc8, 0xbe, 0x66, 0xde, 0x56, 0xdd, 0x25, 0x38, 0x7b, + 0xdf, 0xdb, 0x15, 0xe8, 0x11, 0x02, 0xfb, 0x3c, 0x65, 0xa2, 0x0b, 0xb1, 0x5c, 0x4c, 0xac, 0x06, + 0x15, 0x09, 0x3d, 0x11, 0xa5, 0x0b, 0x36, 0x4a, 0xe5, 0x71, 0xe1, 0x89, 0x18, 0xba, 0x6b, 0x9b, + 0x11, 0x02, 0xf9, 0x02, 0x8c, 0x94, 0xa9, 0x17, 0x6c, 0x6e, 0xae, 0xa2, 0x47, 0x03, 0xcf, 0x84, + 0x5d, 0xc0, 0xac, 0xc5, 0x41, 0xd0, 0xfc, 0xf8, 0x78, 0x61, 0x22, 0x70, 0x5a, 0xf4, 0x5a, 0x38, + 0xc0, 0x12, 0x9b, 0x2c, 0x41, 0x91, 0xdf, 0xd2, 0x46, 0xaa, 0x30, 0x0a, 0xea, 0x02, 0xdf, 0x36, + 0xc4, 0x95, 0xee, 0x21, 0xdd, 0x09, 0x73, 0x36, 0x27, 0xf0, 0xc9, 0xb2, 0x4c, 0x75, 0xae, 0x7e, + 0x24, 0x44, 0xb6, 0x99, 0xf8, 0x04, 0x66, 0xdf, 0x9a, 0xa4, 0x20, 0x25, 0x98, 0x28, 0xbb, 0xad, + 0x8e, 0x1d, 0x38, 0xf8, 0x6e, 0xd0, 0x91, 0x90, 0xc9, 0x68, 0x5f, 0xaa, 0xab, 0x05, 0x9a, 0x80, + 0x57, 0x0b, 0xc8, 0x6d, 0x98, 0x34, 0xdd, 0x2e, 0x1b, 0x24, 0x79, 0x28, 0xe4, 0x62, 0x17, 0xfd, + 0x0e, 0x3c, 0x56, 0xc2, 0x76, 0x09, 0x71, 0x02, 0xd4, 0x32, 0xce, 0x69, 0x54, 0x64, 0x2d, 0xc5, + 0x3a, 0xaf, 0xca, 0x5a, 0x35, 0x73, 0x73, 0x82, 0x59, 0x8a, 0x61, 0xff, 0x26, 0x8c, 0xd5, 0x6a, + 0xeb, 0x9b, 0xd4, 0x0f, 0x6e, 0x37, 0xdd, 0x43, 0x14, 0xb5, 0x05, 0xf1, 0xa2, 0x85, 0xef, 0x5a, + 0x01, 0xf5, 0x03, 0x6b, 0xb7, 0xe9, 0x1e, 0x9a, 0x2a, 0x16, 0xf9, 0x3a, 0xeb, 0x0f, 0x45, 0x31, + 0x11, 0xb9, 0xf5, 0xfa, 0xe9, 0x4e, 0x28, 0xd0, 0xa2, 0x25, 0xc3, 0x34, 0x28, 0xbd, 0xb3, 0x14, + 0x74, 0x0c, 0xb1, 0x61, 0xc7, 0xd9, 0x52, 0xa3, 0xe1, 0x51, 0xdf, 0x17, 0x32, 0x91, 0x87, 0xd8, + 0xe0, 0xd9, 0xd7, 0xe6, 0x05, 0x5a, 0x88, 0x8d, 0x42, 0x40, 0xbe, 0x9d, 0x81, 0x33, 0xaa, 0x97, + 0x3e, 0x2e, 0x16, 0xf4, 0xa1, 0xe0, 0x12, 0xf2, 0xf5, 0x6b, 0x72, 0x4f, 0xb8, 0xa6, 0xa0, 0x5d, + 0x7b, 0x78, 0xe3, 0x5a, 0x29, 0xfa, 0x59, 0x93, 0x44, 0x22, 0x3d, 0x55, 0x1a, 0x3f, 0x55, 0xbe, + 0xdb, 0x29, 0xa4, 0xa4, 0xcc, 0xd4, 0x06, 0x36, 0x9f, 0xd0, 0x27, 0xa7, 0xba, 0x81, 0x02, 0x56, + 0x98, 0xf7, 0xc4, 0xec, 0xe3, 0xde, 0x3b, 0x4e, 0x47, 0xd7, 0x0e, 0x14, 0x1a, 0x52, 0x85, 0x29, + 0x0e, 0x60, 0x22, 0x81, 0x3f, 0x77, 0x30, 0x13, 0xa5, 0x5c, 0x16, 0x6c, 0xf0, 0xe2, 0x19, 0x9f, + 0x3c, 0x50, 0x53, 0xc1, 0xc5, 0xe8, 0x50, 0x6f, 0xaf, 0x95, 0xee, 0xaf, 0x46, 0xca, 0xe7, 0xf7, + 0x97, 0x97, 0xbd, 0xf6, 0x6d, 0x7d, 0xbc, 0xec, 0x1f, 0xf0, 0xb8, 0x43, 0xa5, 0x1b, 0xa4, 0xde, + 0xae, 0x81, 0xe3, 0x7a, 0x7b, 0x8c, 0xc6, 0x8c, 0x61, 0x1b, 0x1f, 0x17, 0x62, 0x7c, 0x85, 0x67, + 0x9d, 0x01, 0xc3, 0x5c, 0x2d, 0x57, 0xdf, 0xce, 0xe6, 0x4a, 0xbb, 0x29, 0x4a, 0xc8, 0x79, 0xc8, + 0xd5, 0x6a, 0xeb, 0xa2, 0x93, 0xd1, 0xbf, 0xce, 0xf7, 0x5d, 0x93, 0xc1, 0xd8, 0x08, 0xa1, 0xd3, + 0x9c, 0x92, 0x55, 0x97, 0x49, 0x50, 0x13, 0xa1, 0xac, 0xbf, 0xa5, 0x92, 0x9c, 0x8f, 0xfa, 0x5b, + 0x28, 0xc9, 0x91, 0x6a, 0x5c, 0x86, 0xb9, 0x92, 0xef, 0x53, 0x8f, 0x4d, 0x50, 0xe1, 0x8b, 0xe5, + 0x09, 0x45, 0x4e, 0x6c, 0x14, 0x58, 0xa9, 0x5d, 0xf7, 0xcd, 0x9e, 0x88, 0xe4, 0x0a, 0x14, 0x4a, + 0xdd, 0x86, 0x43, 0xdb, 0x75, 0x2d, 0x65, 0x8e, 0x2d, 0x60, 0x66, 0x58, 0x4a, 0xbe, 0x0c, 0x67, + 0x62, 0x69, 0xa3, 0x44, 0x0f, 0x8c, 0x44, 0xab, 0x59, 0x2a, 0x9a, 0xd1, 0x8d, 0x33, 0xef, 0x92, + 0x74, 0x4a, 0x52, 0x82, 0xe2, 0x32, 0x46, 0x95, 0x54, 0x28, 0x37, 0x7e, 0xbb, 0x1e, 0x8f, 0x94, + 0xe1, 0xc7, 0x02, 0x1e, 0x71, 0x62, 0x35, 0xc2, 0x42, 0x33, 0x81, 0x4e, 0xee, 0xc1, 0x4c, 0x1c, + 0xc6, 0xf6, 0x04, 0x7e, 0x02, 0xc0, 0xb4, 0x8e, 0x09, 0x2e, 0xb8, 0x2b, 0xa4, 0x51, 0x91, 0x1d, + 0x98, 0x8e, 0x3c, 0x2e, 0xf4, 0x73, 0x81, 0x74, 0xcb, 0x0c, 0xcb, 0xe5, 0xd9, 0xe0, 0x59, 0x31, + 0x19, 0x67, 0x22, 0xef, 0x8d, 0xf0, 0x7c, 0x60, 0x26, 0xd9, 0x91, 0x06, 0x4c, 0xd6, 0x9c, 0xbd, + 0xb6, 0xd3, 0xde, 0xbb, 0x47, 0x8f, 0x36, 0x6c, 0xc7, 0x13, 0x0e, 0x72, 0xd2, 0xfd, 0xb5, 0xe4, + 0x1f, 0xb5, 0x5a, 0x34, 0xf0, 0x70, 0xb7, 0x65, 0xe5, 0x18, 0xe4, 0xc9, 0xf4, 0xbd, 0x79, 0x9f, + 0xd3, 0x61, 0x00, 0x55, 0xc7, 0x76, 0xb4, 0x6d, 0x45, 0xe7, 0xa9, 0x9d, 0xcd, 0xc6, 0x07, 0x3c, + 0x9b, 0x35, 0x61, 0x7a, 0xb9, 0x5d, 0xf7, 0x8e, 0xf0, 0x0e, 0x42, 0x36, 0x6e, 0xe2, 0x84, 0xc6, + 0xbd, 0x28, 0x1a, 0xf7, 0x9c, 0x2d, 0x67, 0x58, 0x5a, 0xf3, 0x92, 0x8c, 0x49, 0x0d, 0xa6, 0x51, + 0x81, 0xae, 0x56, 0x36, 0xaa, 0x6d, 0x27, 0x70, 0xf0, 0x85, 0x67, 0xbe, 0x5d, 0xbd, 0x24, 0x78, + 0x5e, 0xe0, 0x3a, 0xb8, 0xd3, 0xe8, 0x58, 0x8e, 0x44, 0x51, 0x99, 0x26, 0xe8, 0xfb, 0x29, 0xc2, + 0x53, 0xff, 0x7c, 0x14, 0x61, 0x7c, 0x03, 0x29, 0x16, 0xfc, 0x5c, 0x8c, 0x64, 0xbb, 0x8f, 0x45, + 0x6c, 0x8b, 0x70, 0xbb, 0xa8, 0x9e, 0x68, 0x6f, 0x20, 0xe9, 0x74, 0xc6, 0xb7, 0x47, 0xb9, 0x6c, + 0x57, 0xf5, 0xd7, 0x5e, 0xae, 0x74, 0x31, 0xbd, 0x36, 0x7b, 0x1a, 0xbd, 0x36, 0x77, 0xb2, 0x5e, + 0x9b, 0x3f, 0x49, 0xaf, 0x8d, 0x29, 0x9e, 0x43, 0xa7, 0x56, 0x3c, 0x87, 0x4f, 0xa1, 0x78, 0x8e, + 0x9c, 0x4a, 0xf1, 0xd4, 0x34, 0xe8, 0xc2, 0x49, 0x1a, 0xf4, 0xbf, 0x54, 0x53, 0x9f, 0x56, 0x35, + 0x35, 0x4d, 0x55, 0x38, 0x95, 0x9a, 0xda, 0x5b, 0xcb, 0x2c, 0xfe, 0x8b, 0xd6, 0x32, 0xa7, 0x9f, + 0x8c, 0x96, 0x49, 0x3e, 0xa1, 0x96, 0xf9, 0x17, 0xa0, 0x18, 0xdf, 0xf8, 0x4e, 0xce, 0x96, 0xf7, + 0xc4, 0x32, 0x3b, 0xb1, 0x6d, 0x39, 0xbe, 0xf1, 0xb0, 0x83, 0xf4, 0x86, 0xe7, 0x3c, 0xb4, 0x03, + 0x7a, 0x4f, 0xba, 0x1e, 0x88, 0x4c, 0x8f, 0x1c, 0x8a, 0xe2, 0x43, 0x41, 0x09, 0x75, 0xae, 0x6c, + 0x9a, 0xce, 0x65, 0xfc, 0x78, 0x16, 0xa6, 0x79, 0x16, 0x96, 0xa7, 0xdf, 0x02, 0xfe, 0xae, 0xa6, + 0x49, 0x4b, 0x47, 0xb7, 0xd8, 0xd7, 0xf5, 0xb1, 0x81, 0x7f, 0x0d, 0xce, 0x24, 0xba, 0x02, 0xb5, + 0xe9, 0x8a, 0xcc, 0x7f, 0x93, 0xd0, 0xa7, 0xe7, 0xd2, 0x2b, 0xd9, 0xba, 0x69, 0x26, 0x28, 0x8c, + 0x7f, 0x9a, 0x4f, 0xf0, 0x17, 0xd6, 0x70, 0xd5, 0xbe, 0x9d, 0x39, 0x9d, 0x7d, 0x3b, 0x3b, 0x98, + 0x7d, 0x3b, 0xb6, 0x4d, 0xe5, 0x06, 0xd9, 0xa6, 0xbe, 0x0c, 0x13, 0x9b, 0xd4, 0x6e, 0xf9, 0x9b, + 0xae, 0x48, 0xe7, 0xce, 0x1d, 0x5d, 0x65, 0x7a, 0x1b, 0x56, 0x26, 0x95, 0xc1, 0xd0, 0x61, 0x27, + 0x60, 0x04, 0x4c, 0xb4, 0xf2, 0xfc, 0xee, 0xa6, 0xce, 0x41, 0xd5, 0xf0, 0x87, 0xfa, 0x68, 0xf8, + 0x35, 0x18, 0x17, 0x74, 0x51, 0x8a, 0xc0, 0x48, 0x15, 0x65, 0x45, 0x08, 0x97, 0xb5, 0x87, 0x0f, + 0xee, 0x85, 0xb5, 0x73, 0x2d, 0x54, 0x63, 0xc2, 0xba, 0x60, 0xb9, 0xdd, 0xe8, 0xb8, 0x4e, 0x1b, + 0xbb, 0x60, 0x24, 0xea, 0x02, 0x2a, 0xc0, 0xbc, 0x0b, 0x14, 0x24, 0xf2, 0x36, 0x4c, 0x96, 0x36, + 0xaa, 0x2a, 0x59, 0x21, 0x32, 0xb1, 0xdb, 0x1d, 0xc7, 0xd2, 0x48, 0x63, 0xb8, 0xfd, 0xb4, 0xb2, + 0xd1, 0x7f, 0x3e, 0x5a, 0x99, 0xf1, 0x0f, 0x47, 0xe5, 0xf2, 0xfe, 0x6c, 0x8d, 0x81, 0xba, 0x79, + 0x2f, 0x77, 0x4a, 0xf3, 0x5e, 0xfe, 0x24, 0xe5, 0x44, 0xd3, 0x98, 0x86, 0x4e, 0xa1, 0x31, 0x0d, + 0x7f, 0x6a, 0x53, 0xdd, 0xc8, 0x29, 0x75, 0xa0, 0xd8, 0x4a, 0x2b, 0x0c, 0xb2, 0xd2, 0x52, 0xf5, + 0xa6, 0xd1, 0x4f, 0xaf, 0x37, 0xc1, 0xa9, 0xf5, 0xa6, 0x5a, 0x14, 0x04, 0x36, 0x76, 0xa2, 0x37, + 0xee, 0x05, 0x71, 0x5e, 0x99, 0x4e, 0x4f, 0xc0, 0x13, 0x86, 0x83, 0x7d, 0x5f, 0x29, 0x63, 0xdf, + 0x48, 0x57, 0xc6, 0xfa, 0xef, 0x36, 0xff, 0x52, 0x1d, 0x7b, 0x22, 0xea, 0x98, 0x87, 0x03, 0xb6, + 0x6d, 0x7b, 0x6d, 0x3c, 0x72, 0x5e, 0x87, 0x11, 0x99, 0xd3, 0x2a, 0x13, 0x59, 0x4f, 0x92, 0xc9, + 0xac, 0x24, 0x16, 0x59, 0x84, 0x82, 0x24, 0x56, 0xf3, 0x73, 0x1f, 0x0a, 0x98, 0x96, 0x2e, 0x48, + 0xc0, 0x8c, 0xbf, 0x93, 0x97, 0x42, 0x81, 0xb5, 0x43, 0xbc, 0xe5, 0xbc, 0xa4, 0x4c, 0x02, 0x45, + 0x19, 0x8c, 0x0d, 0x73, 0xcc, 0x4f, 0x4f, 0x27, 0xf9, 0x44, 0x59, 0xc6, 0xa2, 0x37, 0xa4, 0x72, + 0x03, 0xbc, 0x21, 0xf5, 0xa6, 0xf6, 0x00, 0x53, 0x3e, 0x7a, 0xf1, 0x83, 0x2d, 0x94, 0xfe, 0x4f, + 0x2f, 0xdd, 0x52, 0x5f, 0x4a, 0x1a, 0x8a, 0x12, 0x6e, 0x20, 0x65, 0x9f, 0x37, 0x92, 0x42, 0xed, + 0x76, 0xf8, 0x34, 0xf9, 0xfb, 0x46, 0xfe, 0x85, 0xe6, 0xef, 0x5b, 0x06, 0x50, 0xde, 0xcf, 0xe5, + 0x97, 0x3b, 0x2f, 0xb1, 0x6e, 0x3a, 0xf9, 0xed, 0x5c, 0x85, 0xd0, 0xf8, 0x3d, 0x02, 0xd3, 0xb5, + 0xda, 0x7a, 0xc5, 0xb1, 0xf7, 0xda, 0xae, 0x1f, 0x38, 0xf5, 0x6a, 0x7b, 0xd7, 0x65, 0xaa, 0x5d, + 0x28, 0x60, 0x94, 0x44, 0x6d, 0x91, 0x70, 0x09, 0x8b, 0xd9, 0xd1, 0x61, 0xd9, 0xf3, 0x5c, 0x4f, + 0x3d, 0x3a, 0x50, 0x06, 0x30, 0x39, 0x9c, 0x69, 0x4f, 0xb5, 0x2e, 0x7f, 0x08, 0x95, 0xdf, 0xb7, + 0xa1, 0xf6, 0xe4, 0x73, 0x90, 0x29, 0xcb, 0x08, 0x4d, 0x4e, 0x58, 0xa1, 0x4d, 0x9f, 0xd3, 0xb2, + 0x00, 0x46, 0xc5, 0x5c, 0x7c, 0x8a, 0xed, 0x0d, 0x97, 0x62, 0x07, 0xe1, 0xea, 0xf5, 0x76, 0x62, + 0x0d, 0x1c, 0xc1, 0x19, 0x2d, 0x80, 0x69, 0x50, 0xc3, 0xe1, 0x2b, 0x42, 0x5b, 0x33, 0x30, 0xfa, + 0x35, 0xc5, 0x7a, 0xa8, 0xbe, 0x58, 0x90, 0x5a, 0x03, 0xf9, 0xf1, 0x0c, 0x5c, 0x48, 0x2d, 0x09, + 0x57, 0xf7, 0x98, 0x96, 0x89, 0x51, 0x11, 0x1a, 0xfc, 0x6d, 0x86, 0x5e, 0x55, 0x5b, 0x29, 0xa2, + 0xa0, 0x7f, 0x4d, 0xe4, 0x37, 0x32, 0x70, 0x4e, 0xc3, 0x08, 0xc5, 0xa7, 0x1f, 0x46, 0xea, 0xa6, + 0xce, 0xeb, 0x8f, 0x9e, 0xcc, 0xbc, 0xbe, 0xa4, 0x7f, 0x4b, 0x24, 0xdd, 0xd5, 0x6f, 0xe8, 0xd5, + 0x42, 0xf2, 0x10, 0xa6, 0xb1, 0x48, 0x1a, 0x31, 0xd9, 0x9c, 0x15, 0xb6, 0xcf, 0xd9, 0xa8, 0xd9, + 0x3c, 0x28, 0x0f, 0xdf, 0xd7, 0x5b, 0xfc, 0xde, 0xf1, 0xc2, 0x84, 0x86, 0x2e, 0x73, 0x1b, 0x5a, + 0x91, 0x25, 0xd4, 0x69, 0xef, 0xba, 0xea, 0xd6, 0x9b, 0xa8, 0x82, 0xfc, 0x47, 0x19, 0x98, 0x63, + 0x50, 0xfe, 0x19, 0xb7, 0x3d, 0xb7, 0x15, 0x96, 0x4b, 0x3f, 0x89, 0x1e, 0xdd, 0xd6, 0x7c, 0x32, + 0xdd, 0xf6, 0x12, 0x36, 0x99, 0xcb, 0x04, 0x6b, 0xd7, 0x73, 0x5b, 0x51, 0xf3, 0xb5, 0xf7, 0x61, + 0x7b, 0x35, 0x92, 0xfc, 0x70, 0x06, 0xce, 0x6b, 0x96, 0x17, 0x35, 0x03, 0xb4, 0x08, 0x7d, 0x9c, + 0x09, 0x43, 0x9c, 0xa3, 0xa2, 0xa5, 0x6b, 0x62, 0xfe, 0x5f, 0xc6, 0x16, 0x44, 0xbb, 0x05, 0xb6, + 0xc5, 0x6a, 0x71, 0x2c, 0xa5, 0x09, 0xbd, 0x6b, 0x21, 0x0e, 0x4c, 0xe3, 0x1d, 0xa5, 0xe6, 0xcf, + 0x33, 0xdb, 0xdb, 0x9f, 0x27, 0x7c, 0x07, 0x09, 0xd3, 0xcb, 0xf6, 0x76, 0xea, 0x49, 0x72, 0x25, + 0x7f, 0x11, 0xce, 0x27, 0x80, 0xe1, 0x6a, 0x3b, 0xd3, 0x73, 0xb5, 0xbd, 0xfa, 0xf8, 0x78, 0xe1, + 0xe5, 0xb4, 0xda, 0xd2, 0x56, 0x5a, 0xef, 0x1a, 0x88, 0x0d, 0x10, 0x15, 0x8a, 0x67, 0x66, 0xd3, + 0x27, 0xe8, 0xab, 0x62, 0x7e, 0x28, 0xf8, 0x4c, 0x96, 0x2b, 0x6d, 0x50, 0xb7, 0xbc, 0x08, 0x89, + 0x50, 0x18, 0x57, 0x52, 0xeb, 0x1e, 0xe1, 0x7b, 0xb3, 0x3d, 0x2b, 0xf9, 0xde, 0xf1, 0x82, 0x86, + 0xcd, 0x54, 0x6c, 0x35, 0x67, 0xaf, 0xaa, 0x62, 0x6b, 0x88, 0xe4, 0xd7, 0x32, 0x30, 0xcb, 0x00, + 0xd1, 0xa4, 0x12, 0x1f, 0x35, 0xd7, 0x6f, 0xd6, 0xef, 0x3f, 0x99, 0x59, 0xff, 0x02, 0xb6, 0x51, + 0x9d, 0xf5, 0x89, 0x2e, 0x49, 0x6d, 0x1c, 0xce, 0x76, 0xed, 0x3a, 0x5c, 0x9b, 0xed, 0xe7, 0x07, + 0x98, 0xed, 0x7c, 0x00, 0x4e, 0x9e, 0xed, 0x3d, 0x6b, 0x21, 0x9b, 0x30, 0x2e, 0xb4, 0x6b, 0xde, + 0x61, 0xcf, 0x6b, 0x69, 0x39, 0xd5, 0x22, 0x7e, 0xe4, 0x11, 0x99, 0x87, 0x13, 0x5f, 0xa8, 0x71, + 0x21, 0x6d, 0x98, 0xe1, 0xbf, 0x75, 0x5b, 0xc7, 0x42, 0x4f, 0x5b, 0xc7, 0x15, 0xf1, 0x45, 0x17, + 0x05, 0xff, 0x98, 0xc9, 0x43, 0xcd, 0x8c, 0x90, 0xc2, 0x98, 0x74, 0x80, 0x68, 0x60, 0xbe, 0x68, + 0x2f, 0xf6, 0xb7, 0x70, 0xbc, 0x2c, 0xea, 0x5c, 0x88, 0xd7, 0x19, 0x5f, 0xb9, 0x29, 0xbc, 0x89, + 0x0d, 0x53, 0x02, 0xca, 0xce, 0xd2, 0x28, 0xe1, 0x5f, 0xd0, 0x72, 0x53, 0xc4, 0x4a, 0xb9, 0x62, + 0x2e, 0x6b, 0xc2, 0xdc, 0x21, 0x31, 0x81, 0x1e, 0xe7, 0x47, 0xd6, 0x61, 0xba, 0xd4, 0xe9, 0x34, + 0x1d, 0xda, 0xc0, 0xaf, 0xe4, 0x4f, 0x86, 0x1a, 0xd1, 0x33, 0x11, 0x36, 0x2f, 0x14, 0xa7, 0x85, + 0xf8, 0x7b, 0xa1, 0x49, 0x5a, 0xe3, 0xdb, 0x99, 0x44, 0xa3, 0xc9, 0x6b, 0x30, 0x8a, 0x3f, 0x94, + 0x00, 0x69, 0x34, 0x02, 0xf0, 0x26, 0xa2, 0x31, 0x22, 0x42, 0x60, 0xca, 0x92, 0x9a, 0xf2, 0x28, + 0xc7, 0x95, 0x25, 0x71, 0x52, 0x8d, 0xce, 0xa6, 0x0b, 0xd2, 0xcf, 0x32, 0x17, 0x29, 0x5d, 0xe8, + 0x67, 0x29, 0xbc, 0x2b, 0x8d, 0x1f, 0xce, 0xea, 0xd3, 0x8e, 0x5c, 0x51, 0xf4, 0x76, 0x25, 0xe9, + 0x92, 0xd4, 0xdb, 0x15, 0x6d, 0xfd, 0x6f, 0x67, 0x60, 0x66, 0xdd, 0xdb, 0xb3, 0xdb, 0xce, 0xb7, + 0x78, 0xf2, 0x46, 0x17, 0xc7, 0xa5, 0xff, 0x8b, 0x3b, 0x4f, 0xea, 0xe5, 0x10, 0x57, 0xa9, 0x98, + 0xcd, 0x14, 0x9c, 0x32, 0x66, 0x5a, 0x7b, 0xd0, 0x73, 0x1d, 0x1b, 0xa6, 0x3c, 0xe0, 0xc2, 0xd1, + 0x39, 0xdc, 0xf8, 0xc9, 0x2c, 0x8c, 0x29, 0x4b, 0x80, 0x7c, 0x1e, 0xc6, 0x55, 0x3e, 0xaa, 0x01, + 0x49, 0xad, 0xd6, 0xd4, 0xb0, 0xd0, 0x82, 0x44, 0xed, 0x96, 0x66, 0x41, 0x62, 0x13, 0x1d, 0xa1, + 0xa7, 0x3c, 0xda, 0xbc, 0x97, 0x72, 0xb4, 0x39, 0xd5, 0xdb, 0xb2, 0x6f, 0x27, 0x0f, 0x38, 0x83, + 0x3f, 0x05, 0x6b, 0xfc, 0x4c, 0x06, 0x8a, 0xf1, 0x45, 0xfa, 0x99, 0xf4, 0xca, 0x29, 0x6e, 0x0b, + 0x7e, 0x22, 0x1b, 0xe6, 0xd5, 0x96, 0xf1, 0x38, 0x4f, 0xab, 0x4b, 0xcc, 0x3b, 0x9a, 0x21, 0xff, + 0x59, 0x3d, 0x51, 0x8c, 0x1a, 0xc9, 0x9a, 0x9e, 0x1d, 0x2a, 0xff, 0xdd, 0x5f, 0x5c, 0x78, 0xc6, + 0xf8, 0x00, 0x66, 0xe3, 0xdd, 0x81, 0xc6, 0xfc, 0x12, 0x4c, 0xe9, 0xf0, 0x78, 0x56, 0xfe, 0x38, + 0x95, 0x19, 0xc7, 0x37, 0x7e, 0x3f, 0x1b, 0xe7, 0x2d, 0xdc, 0x63, 0x98, 0xd0, 0x69, 0xdb, 0x3b, + 0xcd, 0x30, 0x2b, 0x37, 0x17, 0x3a, 0x1c, 0x64, 0xca, 0xb2, 0xd3, 0x3c, 0x53, 0x11, 0x46, 0x95, + 0xe4, 0xd2, 0xa3, 0x4a, 0xc8, 0xad, 0x98, 0x8f, 0x99, 0x92, 0x02, 0xe1, 0x90, 0xee, 0x58, 0x91, + 0x9f, 0x59, 0xcc, 0xb5, 0xac, 0x0c, 0xb3, 0x5a, 0x76, 0x4e, 0x49, 0x3f, 0x14, 0xd9, 0x6e, 0x03, + 0x2c, 0xe0, 0xc4, 0xa9, 0xc8, 0x64, 0x05, 0x46, 0x58, 0x33, 0xef, 0xdb, 0x1d, 0x61, 0xa3, 0x27, + 0x61, 0x8c, 0x59, 0x33, 0x3c, 0xf0, 0x29, 0x61, 0x66, 0x4d, 0xca, 0xb6, 0x7c, 0xed, 0x69, 0x66, + 0x8e, 0x68, 0xfc, 0x69, 0x86, 0xad, 0xff, 0xfa, 0xc1, 0xf7, 0xd9, 0x5b, 0x17, 0xec, 0x93, 0xfa, + 0x78, 0x6f, 0xfd, 0x51, 0x96, 0x27, 0x56, 0x17, 0xd3, 0xe7, 0x4d, 0x18, 0xde, 0xb4, 0xbd, 0x3d, + 0x1a, 0x88, 0x94, 0xe3, 0x2a, 0x17, 0x5e, 0x10, 0x25, 0x68, 0x08, 0xf0, 0xb7, 0x29, 0x08, 0x54, + 0x5b, 0x58, 0x76, 0x20, 0x5b, 0x98, 0x62, 0xe9, 0xcd, 0x3d, 0x31, 0x4b, 0xef, 0x0f, 0x84, 0x39, + 0xd4, 0x4b, 0xc1, 0x00, 0xc9, 0x1f, 0x2f, 0xc6, 0xdf, 0x20, 0x48, 0xa4, 0xe9, 0x8c, 0xd8, 0x91, + 0x5b, 0xea, 0xab, 0x06, 0x4a, 0xa0, 0xc6, 0x09, 0xef, 0x17, 0x18, 0x7f, 0x94, 0xe3, 0x7d, 0x2c, + 0x3a, 0xea, 0xb2, 0x16, 0xc4, 0x85, 0xeb, 0x84, 0x09, 0x7a, 0x35, 0x9e, 0x16, 0x1d, 0x3b, 0x2e, + 0x43, 0x9e, 0xcd, 0x4d, 0xd1, 0x9b, 0x88, 0xc7, 0xe6, 0xaf, 0x8a, 0xc7, 0xca, 0xd9, 0x5a, 0xc6, + 0x3d, 0x49, 0x7d, 0x47, 0x06, 0xb7, 0x2d, 0x75, 0x2d, 0x23, 0x06, 0xb9, 0x02, 0xf9, 0x35, 0xb7, + 0x21, 0x93, 0x8c, 0xce, 0x62, 0x28, 0xaf, 0xdb, 0x50, 0x58, 0xce, 0x65, 0x4c, 0xc4, 0x60, 0xdf, + 0x1a, 0xa6, 0x25, 0x57, 0xbf, 0xb5, 0xb5, 0x6b, 0x8b, 0x4c, 0x58, 0xea, 0xb7, 0x46, 0x19, 0xcc, + 0x97, 0x61, 0x52, 0x7f, 0x49, 0x52, 0xf8, 0xb6, 0xa1, 0xc5, 0x36, 0xf6, 0x20, 0xa5, 0x6a, 0x68, + 0xd7, 0x89, 0xc8, 0x12, 0x4c, 0x68, 0xc9, 0xcd, 0xc4, 0x65, 0x19, 0x9a, 0x37, 0xf5, 0xd4, 0x68, + 0xaa, 0x79, 0x53, 0x23, 0x61, 0xfb, 0xb9, 0x68, 0xbf, 0x72, 0x65, 0x96, 0x68, 0xbb, 0xc0, 0x21, + 0x37, 0xa1, 0xc0, 0x63, 0x66, 0xab, 0x15, 0xf5, 0xe2, 0xc3, 0x47, 0x58, 0x2c, 0xe6, 0x5c, 0x22, + 0x2a, 0x31, 0x92, 0x9f, 0x83, 0xa2, 0x10, 0x49, 0xd1, 0x9b, 0x8d, 0xcf, 0x41, 0xbe, 0x5c, 0xad, + 0x98, 0xaa, 0x18, 0xa9, 0x3b, 0x0d, 0xcf, 0x44, 0xa8, 0xf1, 0x9d, 0x0c, 0x9c, 0x5f, 0xa3, 0xc1, + 0xa1, 0xeb, 0x1d, 0x98, 0xd4, 0x0f, 0x3c, 0x87, 0x3f, 0x43, 0x84, 0x0b, 0xf1, 0xf3, 0xe4, 0x6d, + 0x18, 0x42, 0x27, 0xab, 0xd8, 0xce, 0x10, 0xaf, 0x63, 0x69, 0x42, 0x4c, 0xe0, 0x21, 0xf4, 0xd8, + 0x32, 0x39, 0x11, 0x79, 0x13, 0xf2, 0x15, 0xda, 0x3e, 0x8a, 0x3d, 0xc4, 0x92, 0x20, 0x0e, 0x05, + 0x42, 0x83, 0xb6, 0x8f, 0x4c, 0x24, 0x31, 0x7e, 0x26, 0x0b, 0x67, 0x52, 0x9a, 0xb5, 0xf5, 0xf9, + 0xa7, 0x54, 0x2a, 0x2e, 0x69, 0x52, 0x51, 0xde, 0x77, 0xf6, 0xec, 0xf8, 0x54, 0x21, 0xf9, 0xf3, + 0x19, 0x38, 0xa7, 0x4f, 0x50, 0xe1, 0x55, 0xb9, 0x75, 0x93, 0xbc, 0x05, 0xc3, 0x2b, 0xd4, 0x6e, + 0x50, 0xf9, 0x48, 0xc3, 0x99, 0x30, 0xbb, 0x0d, 0x0f, 0x08, 0xe4, 0x85, 0x9c, 0x6d, 0x14, 0x3e, + 0xc2, 0xa1, 0xa4, 0x22, 0x1a, 0xc7, 0xf5, 0x71, 0x43, 0x06, 0xe7, 0xa6, 0x55, 0xd5, 0xc7, 0x6b, + 0xe0, 0x7b, 0x19, 0x78, 0xb6, 0x0f, 0x0d, 0x1b, 0x38, 0x36, 0xf4, 0xea, 0xc0, 0xe1, 0x8e, 0x8a, + 0x50, 0xf2, 0x2e, 0x4c, 0x6d, 0x0a, 0x7d, 0x5e, 0x0e, 0x47, 0x36, 0x5a, 0x2f, 0x52, 0xd5, 0xb7, + 0xe4, 0xb8, 0xc4, 0x91, 0xb5, 0xa8, 0xf1, 0x5c, 0xdf, 0xa8, 0x71, 0x35, 0x08, 0x3b, 0x3f, 0x68, + 0x10, 0xf6, 0x07, 0xf1, 0xf7, 0xd7, 0x45, 0x2e, 0xbc, 0x28, 0x04, 0x3d, 0xd3, 0x3b, 0x04, 0xbd, + 0x6f, 0xc6, 0x2d, 0xe3, 0x27, 0x33, 0x50, 0xd4, 0x79, 0x7f, 0xda, 0xf1, 0x7c, 0x47, 0x1b, 0xcf, + 0x67, 0xd3, 0xc7, 0xb3, 0xf7, 0x40, 0xfe, 0xaf, 0x99, 0xf8, 0xc7, 0x0e, 0x34, 0x82, 0x06, 0x0c, + 0x57, 0xdc, 0x96, 0xed, 0xb4, 0xd5, 0x27, 0x40, 0x1b, 0x08, 0x31, 0x45, 0xc9, 0x60, 0x11, 0xfb, + 0x17, 0x61, 0x68, 0xcd, 0x6d, 0x97, 0x2a, 0xc2, 0xe9, 0x10, 0xf9, 0xb4, 0xdd, 0xb6, 0x65, 0x37, + 0x4c, 0x5e, 0x40, 0x56, 0x01, 0x6a, 0x75, 0x8f, 0xd2, 0x76, 0xcd, 0xf9, 0x16, 0x8d, 0x69, 0x1a, + 0xac, 0x87, 0x9a, 0x5d, 0x14, 0x2c, 0x78, 0xc7, 0xe3, 0x23, 0xa2, 0xe5, 0x3b, 0xdf, 0x52, 0xe5, + 0xad, 0x42, 0x6f, 0x50, 0x80, 0x88, 0x08, 0xdf, 0x43, 0x73, 0x1a, 0xe2, 0x8d, 0xdb, 0x09, 0xf1, + 0x1e, 0x1a, 0x03, 0x68, 0xef, 0xa1, 0x31, 0x00, 0x13, 0xed, 0x2b, 0xd4, 0xd9, 0xdb, 0xe7, 0xde, + 0x27, 0x13, 0x7c, 0xaa, 0xee, 0x23, 0x44, 0x15, 0xed, 0x1c, 0xc7, 0xf8, 0xf1, 0x21, 0x38, 0x6f, + 0xd2, 0x3d, 0x87, 0xa9, 0xc9, 0x0f, 0x7c, 0xa7, 0xbd, 0xa7, 0xc5, 0x54, 0x1b, 0xb1, 0x89, 0x24, + 0xd2, 0x09, 0x33, 0x48, 0xd8, 0x31, 0x57, 0xa1, 0xc0, 0x76, 0x45, 0x65, 0x2e, 0xe1, 0x1d, 0x0a, + 0x3e, 0xe0, 0xcd, 0x27, 0xb9, 0x2c, 0x26, 0xaf, 0x88, 0x5d, 0x5b, 0x49, 0xf8, 0xce, 0x76, 0xed, + 0x8f, 0x8f, 0x17, 0xa0, 0x76, 0xe4, 0x07, 0x14, 0x4f, 0x6c, 0x62, 0xe7, 0x0e, 0x55, 0xeb, 0x7c, + 0x0f, 0xd5, 0xfa, 0x3e, 0xcc, 0x96, 0x1a, 0x5c, 0x58, 0xdb, 0xcd, 0x0d, 0xcf, 0x69, 0xd7, 0x9d, + 0x8e, 0xdd, 0x94, 0xc7, 0x45, 0xec, 0x65, 0x3b, 0x2c, 0xb7, 0x3a, 0x21, 0x82, 0x99, 0x4a, 0xc6, + 0x3e, 0xa3, 0xb2, 0x56, 0xc3, 0xd0, 0x63, 0x71, 0x3d, 0x86, 0x9f, 0xd1, 0x68, 0xfb, 0xf8, 0x15, + 0xbe, 0x19, 0x16, 0xa3, 0x52, 0x8f, 0xee, 0x0c, 0x9b, 0xab, 0xb5, 0x28, 0x3a, 0x89, 0xe7, 0xa3, + 0xe5, 0x2e, 0x0f, 0x41, 0xd3, 0x47, 0xb7, 0x07, 0x0d, 0x2f, 0xa2, 0xab, 0xd5, 0x56, 0x18, 0x5d, + 0x21, 0x41, 0xe7, 0xfb, 0xfb, 0x2a, 0x1d, 0xc7, 0x23, 0xd7, 0xd9, 0x54, 0x68, 0xb9, 0x01, 0xc5, + 0x79, 0x3e, 0x1a, 0x1d, 0x01, 0x3c, 0x84, 0xf2, 0x23, 0x80, 0x82, 0x42, 0xde, 0x86, 0x99, 0xe5, + 0xf2, 0xa2, 0x34, 0x6a, 0x56, 0xdc, 0x7a, 0x17, 0x2f, 0xa8, 0x01, 0xeb, 0xc3, 0x31, 0xa4, 0xf5, + 0x45, 0x36, 0xb9, 0xd3, 0xd0, 0xc8, 0x65, 0x18, 0xa9, 0x56, 0x78, 0xdf, 0x8f, 0xa9, 0x8f, 0x2e, + 0x08, 0xc7, 0x0f, 0x59, 0x48, 0xd6, 0x23, 0x1d, 0x75, 0xfc, 0x44, 0x65, 0xf2, 0xfc, 0xc9, 0xfa, + 0xa9, 0x78, 0x9b, 0x81, 0xbf, 0x01, 0x54, 0x76, 0x1b, 0xd4, 0xdf, 0xba, 0xf1, 0x7d, 0xf6, 0x36, + 0x83, 0xf2, 0x6d, 0x28, 0xbd, 0x6e, 0xa4, 0x8a, 0xba, 0x7f, 0x1d, 0xdf, 0x66, 0x48, 0xe0, 0x92, + 0x2f, 0xc2, 0x10, 0xfe, 0x14, 0x7a, 0xcf, 0x4c, 0x0a, 0xdb, 0x48, 0xe7, 0xa9, 0xf3, 0x27, 0x7c, + 0x91, 0x80, 0x54, 0x61, 0x44, 0xa8, 0xdc, 0xa7, 0xc9, 0x30, 0x2e, 0x74, 0x77, 0x3e, 0x48, 0x82, + 0xde, 0x68, 0xc0, 0xb8, 0x5a, 0x21, 0x9b, 0x9c, 0x2b, 0xb6, 0xbf, 0x4f, 0x1b, 0xec, 0x97, 0x78, + 0x1c, 0x04, 0x27, 0xe7, 0x3e, 0x42, 0x2d, 0xd6, 0x0e, 0x53, 0x41, 0x61, 0xd2, 0xb6, 0xea, 0x3f, + 0xf0, 0x45, 0x53, 0xc4, 0x21, 0xdc, 0x41, 0x83, 0x4e, 0xc3, 0x14, 0x45, 0xc6, 0x0f, 0xc0, 0xec, + 0x5a, 0xb7, 0xd9, 0x64, 0x07, 0x72, 0x99, 0x3c, 0x3a, 0xb0, 0x03, 0x4a, 0x96, 0x60, 0xa8, 0xa6, + 0x3c, 0x0a, 0x38, 0x13, 0x66, 0xe7, 0x8e, 0x70, 0xd0, 0xdd, 0x2d, 0x83, 0x11, 0xd9, 0xb1, 0xe7, + 0x00, 0x39, 0xa9, 0xf1, 0xbb, 0xd1, 0x63, 0xd2, 0x9b, 0x9e, 0x5d, 0x3f, 0x08, 0x1f, 0x86, 0x1c, + 0xf4, 0x5d, 0xec, 0xbb, 0xb2, 0x11, 0xfa, 0x56, 0x96, 0xd6, 0xe0, 0x93, 0x1a, 0x43, 0xde, 0x86, + 0x31, 0xb1, 0x9d, 0x29, 0x79, 0x84, 0x30, 0x59, 0x83, 0x7c, 0x99, 0x3e, 0xe6, 0x6e, 0xa0, 0xa2, + 0xe3, 0x2e, 0xad, 0x7f, 0xca, 0xd6, 0x8d, 0xcf, 0x62, 0x97, 0xd6, 0xeb, 0xe8, 0x33, 0x75, 0xff, + 0xc1, 0x58, 0xbc, 0x6f, 0xc5, 0xdc, 0xbd, 0xa5, 0x66, 0x0e, 0xc9, 0x44, 0x67, 0xa6, 0x28, 0x73, + 0x88, 0x7a, 0x66, 0x0a, 0x51, 0xc3, 0x31, 0xc9, 0x9e, 0x30, 0x26, 0xef, 0xca, 0x31, 0xc9, 0xf5, + 0x9e, 0x18, 0x33, 0x7d, 0xc6, 0xa1, 0x16, 0xad, 0x90, 0xfc, 0x40, 0x07, 0xee, 0x67, 0x30, 0x45, + 0x2a, 0x27, 0x89, 0x0b, 0x34, 0xc1, 0x49, 0x3d, 0xc5, 0x0f, 0x0d, 0xce, 0xf4, 0x84, 0x53, 0xfc, + 0x97, 0x60, 0xbc, 0x14, 0x04, 0x76, 0x7d, 0x9f, 0x36, 0x2a, 0x4c, 0x3c, 0x29, 0x49, 0x0e, 0x6c, + 0x01, 0x57, 0xaf, 0x53, 0x54, 0x5c, 0x9e, 0xb4, 0xcb, 0xf6, 0x85, 0xe3, 0x5c, 0x98, 0xb4, 0x8b, + 0x41, 0xf4, 0xa4, 0x5d, 0x0c, 0x42, 0xae, 0xc3, 0x48, 0xb5, 0xfd, 0xd0, 0x61, 0x7d, 0x52, 0x50, + 0x9e, 0xbf, 0xe7, 0x20, 0x55, 0xb8, 0x0a, 0x2c, 0xf2, 0xa6, 0xa2, 0xee, 0x8e, 0x46, 0x47, 0x5b, + 0x6e, 0x0c, 0x09, 0xe3, 0xa3, 0x55, 0x55, 0x36, 0xd4, 0x7f, 0x6f, 0xc1, 0x88, 0xb4, 0x71, 0x41, + 0x74, 0x9c, 0x15, 0x94, 0xc9, 0x40, 0x4c, 0x89, 0x8c, 0x6f, 0x09, 0x2a, 0x8f, 0x9c, 0x8c, 0x29, + 0x6f, 0x09, 0x2a, 0x8f, 0x9c, 0x68, 0x6f, 0x09, 0x2a, 0xcf, 0x9d, 0x84, 0xe6, 0x81, 0xf1, 0x13, + 0xcd, 0x03, 0x5b, 0x30, 0xbe, 0x61, 0x7b, 0x81, 0xc3, 0xd4, 0x85, 0x76, 0xe0, 0xcf, 0x4d, 0x68, + 0x16, 0x35, 0xa5, 0x68, 0xe9, 0x79, 0xf9, 0xfc, 0x5d, 0x47, 0xc1, 0xd7, 0xdf, 0x69, 0x8b, 0xe0, + 0xe9, 0x6e, 0x73, 0x93, 0x9f, 0xc6, 0x6d, 0x0e, 0x3b, 0x15, 0xad, 0x28, 0x53, 0xd1, 0x59, 0x1d, + 0xd5, 0xd9, 0x98, 0x29, 0x25, 0x44, 0x24, 0x5f, 0x85, 0x71, 0xf6, 0x37, 0xbe, 0x38, 0xef, 0x50, + 0x7f, 0xae, 0x88, 0x1f, 0xf7, 0x7c, 0xea, 0xea, 0xe7, 0xcf, 0xd2, 0xd7, 0x68, 0xc0, 0x17, 0x30, + 0x32, 0x8e, 0x9b, 0x47, 0x35, 0x6e, 0xe4, 0x3d, 0x18, 0x67, 0xb3, 0x6f, 0xc7, 0xf6, 0xb9, 0x96, + 0x38, 0x1d, 0x39, 0x3e, 0x36, 0x04, 0x3c, 0x91, 0x37, 0x4f, 0x25, 0x60, 0xdb, 0x7c, 0xa9, 0xc3, + 0x05, 0x24, 0x51, 0x66, 0x7b, 0x27, 0x21, 0x1c, 0x25, 0x1a, 0x79, 0x1f, 0xc6, 0x4b, 0x9d, 0x4e, + 0x24, 0x71, 0x66, 0x14, 0x13, 0x49, 0xa7, 0x63, 0xa5, 0x4a, 0x1d, 0x8d, 0x22, 0x2e, 0x98, 0x67, + 0x4f, 0x25, 0x98, 0xc9, 0xeb, 0xa1, 0xe2, 0x7c, 0x26, 0xb2, 0xf7, 0x89, 0x23, 0x85, 0xa6, 0x85, + 0x73, 0x1d, 0xba, 0x0c, 0x13, 0xdc, 0x00, 0x26, 0xb5, 0x99, 0xb3, 0x89, 0xd5, 0x93, 0xa2, 0xd4, + 0xe8, 0x34, 0x64, 0x19, 0x26, 0x79, 0xcc, 0x59, 0x53, 0x24, 0x34, 0x9c, 0x3b, 0x17, 0xbd, 0x6b, + 0xcc, 0x43, 0xd5, 0x9a, 0x98, 0xe7, 0xda, 0xd6, 0xb8, 0xc4, 0x88, 0x8c, 0x3f, 0xce, 0xc0, 0xb9, + 0x1e, 0x23, 0x1e, 0xa6, 0xbb, 0xcb, 0xf4, 0x4f, 0x77, 0xc7, 0x24, 0x87, 0x7e, 0x5e, 0xc6, 0xef, + 0x17, 0x5a, 0x96, 0x3a, 0x5e, 0x52, 0xdf, 0x72, 0x81, 0x88, 0xc4, 0xf0, 0xa2, 0xea, 0xbb, 0x2e, + 0x1a, 0xed, 0x72, 0xc9, 0x4d, 0x48, 0xe0, 0xf1, 0x46, 0x2d, 0x19, 0x8f, 0x8f, 0x17, 0x9e, 0x17, + 0x79, 0xe7, 0xc3, 0x61, 0xfd, 0xc8, 0xd5, 0x56, 0x70, 0x0a, 0x6b, 0xe3, 0x38, 0x03, 0x63, 0xca, + 0x3a, 0x24, 0x17, 0x95, 0x08, 0xb6, 0x22, 0x7f, 0xb9, 0x40, 0xe1, 0x90, 0xe5, 0x3b, 0x11, 0x2e, + 0xaa, 0xec, 0xc9, 0xa6, 0xc9, 0xfb, 0x4c, 0x15, 0x52, 0x52, 0x02, 0xb6, 0x34, 0x3b, 0xa2, 0x89, + 0xe5, 0xf8, 0x6a, 0xa7, 0xed, 0x07, 0xa5, 0x7a, 0xe0, 0x3c, 0xa4, 0x03, 0x6c, 0x3a, 0xd1, 0xab, + 0x9d, 0xb6, 0x1f, 0x58, 0x36, 0x92, 0x25, 0x5e, 0xed, 0x0c, 0x19, 0x1a, 0x3f, 0x92, 0x01, 0x78, + 0x50, 0x2d, 0x63, 0x4e, 0xcf, 0x4f, 0xab, 0x14, 0xa4, 0xe7, 0x49, 0x93, 0xdc, 0xfb, 0xa8, 0x03, + 0xff, 0x4d, 0x06, 0x26, 0x75, 0x34, 0xf2, 0x2e, 0x4c, 0xd5, 0xea, 0x9e, 0xdb, 0x6c, 0xee, 0xd8, + 0xf5, 0x83, 0x55, 0xa7, 0x4d, 0x79, 0x86, 0xaa, 0x21, 0xbe, 0x17, 0xf9, 0x61, 0x91, 0xd5, 0x64, + 0x65, 0x66, 0x1c, 0x99, 0xfc, 0x68, 0x06, 0x26, 0x6a, 0xfb, 0xee, 0x61, 0xf4, 0x98, 0x3a, 0x1f, + 0x90, 0xaf, 0xb1, 0xb5, 0xed, 0xef, 0xbb, 0x87, 0x56, 0xca, 0x8b, 0xea, 0x1f, 0x1f, 0x2f, 0xbc, + 0x33, 0xd8, 0x8d, 0x6d, 0xdd, 0x6d, 0xfb, 0x01, 0x13, 0xcc, 0xd7, 0xb4, 0x4a, 0x4c, 0xbd, 0x4e, + 0xe3, 0xcf, 0x32, 0x30, 0x56, 0x65, 0x98, 0xcd, 0x26, 0xea, 0x5c, 0xdf, 0x4f, 0x6f, 0xe8, 0x84, + 0xdf, 0xd5, 0x67, 0x60, 0xdf, 0x80, 0xa9, 0x18, 0x1a, 0x31, 0x60, 0xb8, 0x86, 0x51, 0xcb, 0xaa, + 0xad, 0x80, 0xc7, 0x31, 0x9b, 0xa2, 0xc4, 0x58, 0x56, 0xc8, 0xb6, 0x6e, 0xe0, 0x85, 0xdf, 0x22, + 0x80, 0x23, 0x41, 0xf2, 0x64, 0x43, 0xe2, 0x2d, 0xd9, 0xba, 0x61, 0x2a, 0x58, 0xc6, 0x1a, 0x0c, + 0xd7, 0x5c, 0x2f, 0x58, 0x3a, 0xe2, 0x87, 0x89, 0x0a, 0xf5, 0xeb, 0xea, 0x8d, 0x9e, 0x83, 0x56, + 0xf4, 0xba, 0x29, 0x8a, 0xc8, 0x02, 0x0c, 0xdd, 0x76, 0x68, 0xb3, 0xa1, 0xba, 0x6e, 0xee, 0x32, + 0x80, 0xc9, 0xe1, 0xec, 0xc0, 0x75, 0x36, 0x4a, 0x7d, 0x1d, 0xf9, 0x88, 0x7e, 0xda, 0x75, 0x53, + 0xd6, 0xfa, 0xf7, 0x05, 0xfd, 0x89, 0x5a, 0xad, 0xa6, 0x3e, 0x5d, 0xfd, 0xef, 0x65, 0x60, 0xbe, + 0x37, 0x89, 0xea, 0x76, 0x9a, 0xe9, 0xe3, 0x76, 0xfa, 0x52, 0xfc, 0x06, 0x0a, 0xd1, 0xc4, 0x0d, + 0x54, 0x74, 0xef, 0x54, 0x41, 0xaf, 0xdf, 0x7a, 0xf8, 0x82, 0xf8, 0xc5, 0x3e, 0x6d, 0x46, 0x44, + 0x3e, 0xcc, 0x01, 0xd2, 0x98, 0x82, 0xd6, 0xf8, 0xcd, 0x3c, 0x9c, 0xef, 0x49, 0x41, 0x56, 0x94, + 0x2c, 0xfa, 0x93, 0x61, 0xfe, 0xee, 0x9e, 0xf8, 0xd7, 0xf0, 0x5f, 0x74, 0xec, 0x8a, 0xc7, 0xb5, + 0xac, 0x87, 0xd9, 0xd3, 0xb3, 0xc8, 0xeb, 0xd5, 0x13, 0x79, 0x71, 0x74, 0x64, 0x06, 0xc9, 0x44, + 0xea, 0x18, 0x01, 0x45, 0x03, 0xdb, 0x69, 0xfa, 0xea, 0xb2, 0x6b, 0x70, 0x90, 0x29, 0xcb, 0x22, + 0x5f, 0xe0, 0x7c, 0xba, 0x2f, 0xb0, 0xf1, 0xff, 0x64, 0x60, 0x34, 0x6c, 0x36, 0x99, 0x87, 0xb3, + 0x9b, 0x66, 0xa9, 0xbc, 0x6c, 0x6d, 0x7e, 0xb0, 0xb1, 0x6c, 0x3d, 0x58, 0xab, 0x6d, 0x2c, 0x97, + 0xab, 0xb7, 0xab, 0xcb, 0x95, 0xe2, 0x33, 0x64, 0x1a, 0x26, 0x1e, 0xac, 0xdd, 0x5b, 0x5b, 0xdf, + 0x5e, 0xb3, 0x96, 0x4d, 0x73, 0xdd, 0x2c, 0x66, 0xc8, 0x04, 0x8c, 0x9a, 0x4b, 0xa5, 0xb2, 0xb5, + 0xb6, 0x5e, 0x59, 0x2e, 0x66, 0x49, 0x11, 0xc6, 0xcb, 0xeb, 0x6b, 0x6b, 0xcb, 0xe5, 0xcd, 0xea, + 0x56, 0x75, 0xf3, 0x83, 0x62, 0x8e, 0x10, 0x98, 0x44, 0x84, 0x0d, 0xb3, 0xba, 0x56, 0xae, 0x6e, + 0x94, 0x56, 0x8b, 0x79, 0x06, 0x63, 0xf8, 0x0a, 0x6c, 0x28, 0x64, 0x74, 0xef, 0xc1, 0xd2, 0x72, + 0x71, 0x98, 0xa1, 0xb0, 0xbf, 0x14, 0x94, 0x11, 0x56, 0x3d, 0xa2, 0x54, 0x4a, 0x9b, 0xa5, 0xa5, + 0x52, 0x6d, 0xb9, 0x58, 0x20, 0xe7, 0x60, 0x46, 0x03, 0x59, 0xab, 0xeb, 0x77, 0xaa, 0x6b, 0xc5, + 0x51, 0x32, 0x0b, 0xc5, 0x10, 0x56, 0x59, 0xb2, 0x1e, 0xd4, 0x96, 0xcd, 0x22, 0xc4, 0xa1, 0x6b, + 0xa5, 0xfb, 0xcb, 0xc5, 0x31, 0xe3, 0x1d, 0x1e, 0x71, 0xc4, 0xbb, 0x9a, 0x9c, 0x05, 0x52, 0xdb, + 0x2c, 0x6d, 0x3e, 0xa8, 0xc5, 0x3e, 0x7e, 0x0c, 0x46, 0x6a, 0x0f, 0xca, 0xe5, 0xe5, 0x5a, 0xad, + 0x98, 0x21, 0x00, 0xc3, 0xb7, 0x4b, 0xd5, 0xd5, 0xe5, 0x4a, 0x31, 0x6b, 0xfc, 0x74, 0x06, 0xa6, + 0xa5, 0x06, 0x28, 0xaf, 0x13, 0x3e, 0xe5, 0x5a, 0x7c, 0x57, 0x3b, 0xd8, 0xca, 0x80, 0x90, 0x58, + 0x25, 0x7d, 0x96, 0xa1, 0x07, 0x67, 0x52, 0x91, 0xc9, 0x07, 0x50, 0x94, 0x0d, 0xb8, 0x6f, 0x07, + 0xf5, 0xfd, 0x48, 0x8c, 0x3d, 0x1f, 0xab, 0x24, 0x86, 0xc6, 0x0d, 0x8c, 0xd1, 0x23, 0x7d, 0x09, + 0x36, 0xc6, 0x77, 0x33, 0x70, 0xae, 0x07, 0x31, 0x29, 0xc3, 0x70, 0x98, 0x54, 0xbc, 0x8f, 0xc3, + 0xd2, 0xec, 0xf7, 0x8e, 0x17, 0x04, 0x22, 0xbe, 0x55, 0x86, 0x7f, 0x99, 0xc3, 0x61, 0x96, 0x70, + 0x4c, 0xd5, 0xcd, 0xfb, 0xe4, 0x7c, 0xac, 0x3b, 0x45, 0x4d, 0xa5, 0xed, 0xda, 0xd2, 0x98, 0xe8, + 0x90, 0x9c, 0x7d, 0xe8, 0x63, 0xae, 0x6e, 0xe3, 0x3b, 0x19, 0xa6, 0xb1, 0xc5, 0x11, 0x99, 0x22, + 0x5b, 0xf2, 0xfd, 0x6e, 0x8b, 0x9a, 0x6e, 0x93, 0x96, 0xcc, 0x35, 0xb1, 0x17, 0xa0, 0x0a, 0x6a, + 0x63, 0x01, 0x9e, 0x15, 0x2c, 0xdb, 0x6b, 0x6b, 0x97, 0x93, 0x2a, 0x0d, 0x79, 0x13, 0x20, 0x7c, + 0x33, 0x5e, 0x26, 0x0d, 0xe0, 0x49, 0x33, 0x04, 0x54, 0x57, 0xa2, 0x15, 0x64, 0xe3, 0xaf, 0x64, + 0x60, 0x5c, 0x9c, 0x84, 0x4a, 0x4d, 0xea, 0x05, 0x9f, 0x6e, 0xce, 0xbc, 0xa9, 0xcd, 0x99, 0xd0, + 0x3f, 0x5f, 0xe1, 0xcf, 0x8a, 0x53, 0xa7, 0xcb, 0x7f, 0x96, 0x81, 0x62, 0x1c, 0x91, 0xbc, 0x0b, + 0x85, 0x1a, 0x7d, 0x48, 0x3d, 0x27, 0x38, 0x12, 0xd2, 0x4f, 0x3e, 0xbf, 0xc2, 0x71, 0x44, 0x19, + 0x37, 0xb8, 0xfa, 0xe2, 0x97, 0x19, 0xd2, 0x0c, 0x2a, 0xc4, 0x15, 0x5b, 0x46, 0xee, 0x49, 0xd9, + 0x32, 0x8c, 0xff, 0x31, 0x0b, 0xe7, 0xee, 0xd0, 0x40, 0xfd, 0xa6, 0xf0, 0x36, 0xf9, 0x73, 0x83, + 0x7d, 0x97, 0xf2, 0x25, 0x73, 0x30, 0x82, 0x45, 0x72, 0x7c, 0x4d, 0xf9, 0x93, 0x2c, 0x85, 0xf3, + 0x3a, 0xa7, 0xbd, 0xef, 0xd0, 0xa3, 0xee, 0x6b, 0x4a, 0xc6, 0xf7, 0x70, 0x5a, 0x5f, 0x86, 0x49, + 0x4c, 0x69, 0xda, 0x65, 0xcb, 0x81, 0x36, 0x84, 0x4d, 0xa7, 0x60, 0xc6, 0xa0, 0xe4, 0x15, 0x28, + 0x32, 0x48, 0xa9, 0x7e, 0xd0, 0x76, 0x0f, 0x9b, 0xb4, 0xb1, 0x47, 0xf9, 0x23, 0xdf, 0x05, 0x33, + 0x01, 0x97, 0x3c, 0x1f, 0xb4, 0xf9, 0x79, 0x8c, 0x36, 0xd0, 0xf0, 0x22, 0x78, 0x46, 0xd0, 0xf9, + 0x37, 0x61, 0xec, 0x13, 0xbe, 0xde, 0x60, 0xfc, 0x0f, 0x19, 0x98, 0xc5, 0x8f, 0x53, 0x2a, 0x46, + 0x8b, 0xfc, 0xe7, 0xa2, 0xde, 0x52, 0x12, 0x9a, 0xdb, 0x0c, 0xa4, 0x2f, 0x85, 0xb0, 0x17, 0x23, + 0x43, 0x4f, 0x76, 0x00, 0x43, 0x4f, 0xed, 0x34, 0x6f, 0x82, 0x0e, 0x68, 0xa7, 0xe2, 0x2f, 0xb9, + 0x47, 0x43, 0x6e, 0xfc, 0x68, 0x16, 0x46, 0x4c, 0x8a, 0x8f, 0x25, 0x92, 0xcb, 0x30, 0xb2, 0xe6, + 0x06, 0xd4, 0xbf, 0xaf, 0xbd, 0x8c, 0xd9, 0x66, 0x20, 0xab, 0xd5, 0x30, 0x65, 0x21, 0x9b, 0xf0, + 0x1b, 0x9e, 0xdb, 0xe8, 0xd6, 0x03, 0x75, 0xc2, 0x77, 0x38, 0xc8, 0x94, 0x65, 0xe4, 0x35, 0x18, + 0x15, 0x9c, 0xc3, 0x3b, 0x3c, 0xf4, 0x3d, 0xf5, 0x68, 0xf8, 0xd8, 0x66, 0x84, 0x80, 0x8a, 0x2a, + 0xd7, 0x1a, 0xf2, 0x8a, 0xa2, 0x9a, 0x50, 0x04, 0xa4, 0xfe, 0x3d, 0xd4, 0x47, 0xff, 0xfe, 0x1c, + 0x0c, 0x97, 0x7c, 0x9f, 0x06, 0x32, 0x08, 0x7a, 0x3c, 0xcc, 0x48, 0xe3, 0xd3, 0x80, 0x33, 0xb6, + 0xb1, 0xdc, 0x14, 0x78, 0xc6, 0x9f, 0x66, 0x61, 0x08, 0xff, 0xc4, 0x7b, 0x4b, 0xaf, 0xbe, 0xaf, + 0xdd, 0x5b, 0x7a, 0xf5, 0x7d, 0x13, 0xa1, 0xe4, 0x06, 0x9a, 0x1f, 0x64, 0xee, 0x7d, 0xf1, 0xf5, + 0x68, 0x57, 0x6f, 0x44, 0x60, 0x53, 0xc5, 0x09, 0x2f, 0x74, 0x73, 0xa9, 0xa9, 0x0f, 0xce, 0x42, + 0x76, 0xbd, 0x26, 0xbe, 0x18, 0x53, 0xb4, 0xb8, 0xbe, 0x99, 0x5d, 0xaf, 0x61, 0x6f, 0xac, 0x94, + 0x16, 0xdf, 0xb8, 0xa5, 0x3e, 0xe2, 0xea, 0xef, 0xdb, 0x8b, 0x6f, 0xdc, 0x32, 0x45, 0x09, 0xeb, + 0x5f, 0x6c, 0x33, 0x5e, 0x6c, 0xf2, 0xa0, 0x5d, 0xec, 0x5f, 0xfc, 0x36, 0xbc, 0xc4, 0x34, 0x23, + 0x04, 0xb2, 0x08, 0x63, 0x22, 0x54, 0x1c, 0xf1, 0x95, 0x50, 0x6e, 0x11, 0x4a, 0xce, 0x29, 0x54, + 0x24, 0x7e, 0xc5, 0x25, 0x06, 0x48, 0xbe, 0x10, 0x26, 0xae, 0xb8, 0xe4, 0x10, 0xfa, 0xa6, 0x82, + 0x12, 0xc5, 0x1c, 0x47, 0xc1, 0xb8, 0x6a, 0xcc, 0x31, 0xa6, 0xa8, 0x0d, 0x11, 0x8c, 0x5f, 0xce, + 0x42, 0x61, 0xa3, 0xd9, 0xdd, 0x73, 0xda, 0x5b, 0x37, 0x08, 0x01, 0x3c, 0x9b, 0xc9, 0x1c, 0xc6, + 0xec, 0x6f, 0x72, 0x1e, 0x0a, 0xf2, 0x38, 0x26, 0x05, 0x92, 0x2f, 0x8e, 0x62, 0x73, 0x20, 0xc7, + 0x5d, 0xbc, 0xf8, 0x2e, 0x7f, 0x92, 0x1b, 0x10, 0x1e, 0xaa, 0x7a, 0x9d, 0xbe, 0xf2, 0x6c, 0xb1, + 0x98, 0x21, 0x1a, 0x79, 0x1d, 0x70, 0x93, 0x10, 0x27, 0x02, 0x69, 0xa5, 0xe6, 0x4d, 0x13, 0xca, + 0x07, 0x27, 0x41, 0x34, 0x72, 0x13, 0xc4, 0xc4, 0x14, 0xef, 0x4a, 0x9e, 0xd1, 0x09, 0xf8, 0xdb, + 0x3e, 0x92, 0x44, 0xa0, 0x92, 0xb7, 0x61, 0x2c, 0x7a, 0xd1, 0x3d, 0x7a, 0x2e, 0x52, 0xa5, 0x2c, + 0x47, 0xe5, 0x5b, 0x37, 0x4c, 0x15, 0xdd, 0xf8, 0x4f, 0x86, 0x61, 0x5c, 0x6d, 0x0f, 0x31, 0x61, + 0xc6, 0x6f, 0xb2, 0x03, 0xb9, 0xf0, 0x2d, 0xea, 0x60, 0xa1, 0xd8, 0x4e, 0x2f, 0xea, 0x0d, 0x62, + 0x78, 0xdc, 0xd1, 0x48, 0xc6, 0xb8, 0xaf, 0x3c, 0x63, 0x4e, 0xfb, 0x11, 0x98, 0xe3, 0x91, 0x12, + 0x14, 0xdc, 0x8e, 0xbf, 0x47, 0xdb, 0x8e, 0xbc, 0x44, 0xb9, 0xa4, 0x31, 0x5a, 0x17, 0x85, 0x09, + 0x5e, 0x21, 0x19, 0x79, 0x03, 0x86, 0xdd, 0x0e, 0x6d, 0xdb, 0x8e, 0xd8, 0xe3, 0x9e, 0x8d, 0x31, + 0xa0, 0xed, 0x52, 0x55, 0x21, 0x14, 0xc8, 0xe4, 0x3a, 0xe4, 0xdd, 0x83, 0x70, 0xbc, 0xce, 0xeb, + 0x44, 0x07, 0x81, 0xad, 0x90, 0x20, 0x22, 0x23, 0xf8, 0xc8, 0x6e, 0xed, 0x8a, 0x11, 0xd3, 0x09, + 0xee, 0xda, 0xad, 0x5d, 0x95, 0x80, 0x21, 0x92, 0xf7, 0x00, 0x3a, 0xf6, 0x1e, 0xf5, 0xac, 0x46, + 0x37, 0x38, 0x12, 0xe3, 0xf6, 0xbc, 0x46, 0xb6, 0xc1, 0x8a, 0x2b, 0xdd, 0xe0, 0x48, 0xa1, 0x1d, + 0xed, 0x48, 0x20, 0x29, 0x01, 0xb4, 0xec, 0x20, 0xa0, 0x5e, 0xcb, 0x15, 0xce, 0x5d, 0x63, 0xe1, + 0x73, 0x8c, 0x9c, 0xc1, 0xfd, 0xb0, 0x58, 0xe1, 0xa0, 0x10, 0x61, 0xa3, 0x1d, 0xcf, 0x16, 0xaf, + 0x7b, 0xc6, 0x1a, 0xed, 0x78, 0xda, 0x57, 0x32, 0x44, 0xf2, 0x45, 0x18, 0x69, 0x38, 0x7e, 0xdd, + 0xf5, 0x1a, 0x22, 0xf9, 0xc1, 0x73, 0x1a, 0x4d, 0x85, 0x97, 0x29, 0x64, 0x12, 0x9d, 0xb5, 0x56, + 0xe4, 0x57, 0x5b, 0x73, 0x0f, 0xd1, 0x76, 0x1f, 0x6f, 0x6d, 0x2d, 0x2c, 0x56, 0x5b, 0x1b, 0x11, + 0xb1, 0xa1, 0xdc, 0x73, 0x82, 0xa6, 0xbd, 0x23, 0xee, 0x91, 0xf5, 0xa1, 0xbc, 0x83, 0x45, 0xea, + 0x50, 0x72, 0x64, 0xf2, 0x26, 0x14, 0x68, 0x3b, 0xf0, 0x6c, 0xcb, 0x69, 0x88, 0xa0, 0x38, 0xbd, + 0xd1, 0x6c, 0x03, 0xb6, 0xab, 0x15, 0xb5, 0xd1, 0x88, 0x5f, 0x6d, 0xb0, 0xfe, 0xf1, 0xeb, 0x4e, + 0x4b, 0xc4, 0xb2, 0xe9, 0xfd, 0x53, 0x2b, 0x57, 0xef, 0xab, 0xfd, 0xc3, 0x10, 0xc9, 0xf3, 0x00, + 0x7b, 0xb4, 0x4d, 0x79, 0x60, 0x29, 0xbf, 0x65, 0x30, 0x15, 0xc8, 0x97, 0xf2, 0xff, 0xf3, 0x2f, + 0x2e, 0x64, 0x96, 0x00, 0x0a, 0x32, 0xfb, 0x83, 0xb1, 0x0a, 0xe7, 0x7b, 0x2e, 0x0a, 0x72, 0x15, + 0x8a, 0xbb, 0xb6, 0xb0, 0x73, 0xd5, 0xf7, 0xed, 0x76, 0x9b, 0x36, 0x85, 0x38, 0x9a, 0x92, 0xf0, + 0x32, 0x07, 0x73, 0xce, 0xc6, 0x7b, 0x30, 0x9b, 0xd6, 0x1b, 0xe4, 0x05, 0x18, 0x57, 0x13, 0x5d, + 0x08, 0x26, 0x63, 0x76, 0xc7, 0x91, 0xa9, 0x2e, 0x04, 0x83, 0xdf, 0xc8, 0xc0, 0x73, 0xfd, 0xd6, + 0x16, 0x99, 0x87, 0x42, 0xc7, 0x73, 0x5c, 0xd4, 0xe1, 0xb8, 0x04, 0x0c, 0x7f, 0x93, 0x0b, 0x00, + 0x5c, 0xd9, 0x08, 0xec, 0x3d, 0xe1, 0xec, 0x6e, 0x8e, 0x22, 0x64, 0xd3, 0xde, 0xf3, 0xc9, 0xab, + 0x30, 0xdd, 0xa0, 0xbb, 0x76, 0xb7, 0x19, 0x58, 0x7e, 0x7d, 0x9f, 0x36, 0x30, 0xbe, 0x04, 0x9d, + 0x98, 0xcc, 0xa2, 0x28, 0xa8, 0x49, 0x78, 0xa2, 0xc5, 0x43, 0x3d, 0x5a, 0x7c, 0x37, 0x5f, 0xc8, + 0x14, 0xb3, 0x26, 0xfa, 0xf2, 0x18, 0x3f, 0x94, 0x85, 0xb9, 0x5e, 0x93, 0x89, 0xbc, 0x93, 0xd6, + 0x07, 0xdc, 0x54, 0xaf, 0xc2, 0x55, 0x53, 0xbd, 0x52, 0x1b, 0x59, 0x84, 0x30, 0x3a, 0xe4, 0xa4, + 0x48, 0x6f, 0x09, 0x63, 0x34, 0x1d, 0xdb, 0xf7, 0x0f, 0xd9, 0x7a, 0xc9, 0x29, 0x89, 0xec, 0x04, + 0x4c, 0xa5, 0x91, 0x30, 0xf2, 0x05, 0x80, 0x7a, 0xd3, 0xf5, 0x29, 0xde, 0x88, 0x8b, 0x8d, 0x98, + 0xbb, 0xc8, 0x86, 0x50, 0xf5, 0x0a, 0x14, 0xa1, 0x65, 0xb7, 0x41, 0xc5, 0x00, 0xda, 0x70, 0xae, + 0x87, 0xf4, 0x60, 0xc3, 0x13, 0x3d, 0x7b, 0x29, 0x93, 0xe8, 0x77, 0xc3, 0xc7, 0x2f, 0xe3, 0x3d, + 0x9e, 0xed, 0x35, 0x47, 0x8e, 0x80, 0x24, 0x45, 0x04, 0xe3, 0x2e, 0x1c, 0x3d, 0xbb, 0x5e, 0xc8, + 0x9d, 0x43, 0x1e, 0x78, 0x4d, 0xb2, 0x00, 0x63, 0xf2, 0x91, 0x1c, 0xa6, 0xe8, 0x72, 0xe6, 0x20, + 0x40, 0xf7, 0x28, 0x4e, 0x1e, 0xcc, 0xb7, 0x88, 0x31, 0x40, 0x62, 0x0b, 0x1d, 0x45, 0xc8, 0xe6, + 0x51, 0x47, 0x7e, 0xdd, 0x73, 0x72, 0x7e, 0xeb, 0x82, 0x5b, 0x94, 0xfe, 0x6c, 0x46, 0x0e, 0x7f, + 0x52, 0xf2, 0x9d, 0xd4, 0x3e, 0x02, 0x18, 0xb1, 0x21, 0x1a, 0x86, 0x7f, 0xb3, 0x2d, 0x5d, 0xae, + 0x3a, 0xb1, 0xa5, 0x8b, 0x9f, 0xe4, 0x32, 0x4c, 0x79, 0xdc, 0xa7, 0x2f, 0x70, 0x45, 0x7f, 0xe2, + 0x48, 0x99, 0x13, 0x1c, 0xbc, 0xe9, 0x62, 0x9f, 0x8a, 0x76, 0xdd, 0x0d, 0x3b, 0x4c, 0xd9, 0x08, + 0xc8, 0x35, 0x18, 0x65, 0x1b, 0x01, 0xe6, 0x91, 0x88, 0xb9, 0x8a, 0x23, 0x1e, 0x6e, 0xab, 0x66, + 0xe1, 0x23, 0xf1, 0xb7, 0xe0, 0xf5, 0x0f, 0x33, 0x92, 0x99, 0xba, 0x0d, 0x91, 0x73, 0x30, 0xe2, + 0x7a, 0x7b, 0xca, 0xa7, 0x0d, 0xbb, 0xde, 0x1e, 0xfb, 0xae, 0x2b, 0x50, 0xe4, 0x91, 0x0b, 0x3c, + 0x24, 0xdc, 0x3f, 0x6a, 0xf3, 0x73, 0x6a, 0xc1, 0x9c, 0xe4, 0x70, 0x7c, 0x09, 0xf4, 0xa8, 0x5d, + 0x67, 0x98, 0xbe, 0xef, 0x5a, 0x6a, 0xf2, 0x18, 0xf1, 0xd9, 0x93, 0xbe, 0xef, 0x46, 0x59, 0x64, + 0x1a, 0x64, 0x09, 0x26, 0x18, 0x9f, 0x30, 0x85, 0x8d, 0xd8, 0x25, 0x2f, 0x24, 0x77, 0xc9, 0xa3, + 0x76, 0x5d, 0x36, 0xd1, 0x1c, 0xf7, 0x95, 0x5f, 0xe2, 0x6b, 0x7e, 0x2e, 0x0b, 0x67, 0xd3, 0xd1, + 0x71, 0xbc, 0x58, 0x25, 0x18, 0xc0, 0xc3, 0x6d, 0x96, 0xe6, 0x28, 0x83, 0xf0, 0x1c, 0x05, 0x69, + 0xad, 0xcd, 0xa6, 0xb6, 0xf6, 0x15, 0x98, 0x46, 0x46, 0x42, 0x2f, 0x69, 0x3a, 0x7e, 0x20, 0x42, + 0xef, 0xcd, 0x29, 0x56, 0xc0, 0x05, 0xdc, 0x2a, 0x03, 0x93, 0x97, 0x60, 0x52, 0x8a, 0x28, 0xf7, + 0xb0, 0xcd, 0x2a, 0xe6, 0xf2, 0x69, 0x42, 0x40, 0xd7, 0x11, 0x48, 0xce, 0xc0, 0xb0, 0xdd, 0xe9, + 0xb0, 0x2a, 0xb9, 0x58, 0x1a, 0xb2, 0x3b, 0x9d, 0x6a, 0x83, 0x5c, 0x82, 0x09, 0x0c, 0x57, 0xb2, + 0x76, 0xd1, 0x51, 0x44, 0x38, 0x88, 0x99, 0xe3, 0x08, 0xe4, 0xce, 0x23, 0x3e, 0x5b, 0x08, 0x8c, + 0x56, 0xa2, 0x8c, 0x20, 0x0a, 0xd8, 0x1d, 0x89, 0x20, 0x7a, 0xe6, 0x8b, 0x30, 0x25, 0x76, 0x53, + 0x21, 0xe1, 0x91, 0x52, 0xcc, 0x3f, 0xa6, 0xe6, 0x8a, 0xec, 0xe1, 0x20, 0x40, 0xd5, 0x86, 0xa4, + 0xfc, 0x83, 0x0c, 0x9c, 0x49, 0xdd, 0x8e, 0xc9, 0x37, 0x80, 0x47, 0x6f, 0x04, 0xae, 0xe5, 0xd1, + 0xba, 0xd3, 0x71, 0x30, 0xbe, 0x9d, 0x1b, 0xa1, 0x16, 0xfb, 0x6d, 0xe4, 0x18, 0x09, 0xb2, 0xe9, + 0x9a, 0x21, 0x11, 0x3f, 0x47, 0x17, 0xbd, 0x18, 0x78, 0xfe, 0x43, 0x38, 0x93, 0x8a, 0x9a, 0x72, + 0xbe, 0x7d, 0x4d, 0x7f, 0x64, 0x4d, 0xde, 0x2a, 0xc4, 0x3e, 0x5a, 0x39, 0xf7, 0x8a, 0xcf, 0xfb, + 0xad, 0xf0, 0xf3, 0x62, 0x1b, 0x37, 0x59, 0x8e, 0x4f, 0xcb, 0x34, 0xdd, 0x53, 0x12, 0xf5, 0x9c, + 0x99, 0xe4, 0x43, 0x38, 0x23, 0xa6, 0xca, 0x9e, 0x67, 0x77, 0xf6, 0x23, 0x76, 0xbc, 0xa1, 0x2f, + 0xa7, 0xb1, 0xe3, 0x73, 0xe8, 0x0e, 0xc3, 0x0f, 0xb9, 0xce, 0xd8, 0x49, 0xa0, 0xf8, 0x06, 0x4f, + 0x6e, 0xfa, 0x29, 0xad, 0x49, 0x99, 0x83, 0x99, 0xb4, 0x39, 0x38, 0xf0, 0x02, 0x10, 0x75, 0xfe, + 0x70, 0x06, 0x2e, 0x9e, 0xd4, 0x66, 0xb2, 0x0d, 0x67, 0xf1, 0xde, 0xdb, 0x77, 0xc3, 0xcf, 0xb6, + 0xea, 0x76, 0x7d, 0x9f, 0x8a, 0x59, 0x62, 0xa4, 0x7e, 0x7c, 0xa7, 0x53, 0xab, 0xad, 0x2b, 0xdf, + 0xdd, 0xe9, 0xd4, 0x7c, 0x57, 0xfe, 0x2e, 0x33, 0x72, 0xd1, 0x86, 0x06, 0x3c, 0xdb, 0x87, 0x52, + 0x59, 0x56, 0x19, 0x75, 0x59, 0x5d, 0x81, 0xe2, 0x2e, 0x6d, 0x30, 0x15, 0x8a, 0x36, 0xb0, 0x69, + 0x0f, 0x17, 0xf9, 0x4b, 0x85, 0xe6, 0x64, 0x08, 0xaf, 0xf9, 0xee, 0xd6, 0xa2, 0xa8, 0xa5, 0x25, + 0x25, 0xa4, 0xaa, 0xa2, 0x91, 0x6b, 0x30, 0x13, 0x8b, 0xd5, 0x8f, 0x82, 0x3f, 0xcd, 0x69, 0x56, + 0xa4, 0x67, 0x76, 0x79, 0x01, 0xc6, 0xe5, 0x30, 0x78, 0x61, 0x08, 0x89, 0x39, 0x26, 0x60, 0x6c, + 0x96, 0x8b, 0xea, 0xfe, 0x4e, 0x56, 0xaa, 0x4c, 0x4b, 0xae, 0x1b, 0xf8, 0x81, 0x67, 0x77, 0xb4, + 0x73, 0x13, 0x69, 0xc1, 0x79, 0xd7, 0xee, 0x06, 0xfb, 0x8b, 0x16, 0xfb, 0xd7, 0xf5, 0x64, 0x3c, + 0x67, 0x5d, 0x7a, 0xc2, 0x8d, 0x2d, 0x5e, 0xd7, 0x45, 0x67, 0x89, 0x61, 0x97, 0x54, 0x64, 0xb6, + 0xc3, 0x2b, 0x5c, 0x57, 0x9e, 0x31, 0xcf, 0x71, 0x9e, 0x09, 0x2c, 0xb2, 0x02, 0xe3, 0x3b, 0xd4, + 0xf6, 0xa8, 0x67, 0x45, 0x4f, 0xa2, 0xc7, 0x0f, 0x4e, 0x4b, 0x88, 0x80, 0xfe, 0x99, 0x3a, 0xd7, + 0xb1, 0x9d, 0xa8, 0x84, 0xbc, 0x0b, 0xa3, 0x4e, 0x43, 0xa4, 0xa2, 0x13, 0xc7, 0x27, 0x5d, 0x65, + 0xaf, 0x36, 0x78, 0x66, 0xba, 0x88, 0x07, 0x3b, 0x7b, 0x39, 0x02, 0xba, 0x34, 0xa1, 0x9d, 0x30, + 0x8d, 0x25, 0xb9, 0x3b, 0x27, 0xc9, 0x12, 0x0f, 0xba, 0x9f, 0x85, 0x61, 0x5f, 0xc9, 0x8d, 0x67, + 0x8a, 0x5f, 0xc6, 0x5f, 0x80, 0x2b, 0x83, 0xf6, 0x11, 0x79, 0x1d, 0x48, 0x8f, 0x0e, 0x1f, 0x35, + 0xa7, 0xed, 0x44, 0xbf, 0xbd, 0x00, 0x6a, 0x72, 0x2f, 0x47, 0x0e, 0xb8, 0x84, 0x3d, 0xf0, 0x1c, + 0xe3, 0xbf, 0xc8, 0xc2, 0xa4, 0x7e, 0xa6, 0x26, 0xaf, 0x42, 0x3e, 0x64, 0x3b, 0x19, 0xda, 0x7e, + 0x55, 0x24, 0xc6, 0xdc, 0x44, 0x24, 0xb6, 0x41, 0xe0, 0xfd, 0x8f, 0xd5, 0x52, 0xcd, 0xb3, 0xe6, + 0x38, 0x02, 0xa5, 0x59, 0xf6, 0x2e, 0xf0, 0x87, 0x71, 0x51, 0x96, 0x05, 0x83, 0x3d, 0x03, 0x5f, + 0x60, 0x27, 0x7b, 0xb4, 0xab, 0x8d, 0x33, 0x5a, 0x26, 0x4f, 0xf0, 0xe5, 0xf7, 0xe8, 0xc8, 0x94, + 0xef, 0x7d, 0x64, 0x12, 0x9f, 0xd2, 0xe3, 0xc8, 0x34, 0xd4, 0xe7, 0xc8, 0x14, 0x51, 0x86, 0x47, + 0xa6, 0x17, 0x45, 0xeb, 0x3d, 0xfb, 0xd0, 0xc2, 0xcf, 0xe2, 0x8e, 0x67, 0xbc, 0x5d, 0xa6, 0x7d, + 0x88, 0x17, 0x5f, 0x4b, 0xa3, 0x20, 0x6f, 0xcb, 0x8c, 0xbf, 0x9e, 0x89, 0x9d, 0x59, 0x64, 0xcf, + 0xbe, 0x04, 0x93, 0x4e, 0x8b, 0x29, 0x53, 0xb4, 0xa1, 0x28, 0x01, 0x13, 0xe6, 0x84, 0x84, 0x72, + 0x45, 0xe0, 0x65, 0x98, 0x0a, 0xd1, 0x78, 0xb0, 0x30, 0x77, 0x68, 0x37, 0x43, 0x6a, 0x11, 0x2c, + 0xfc, 0x2a, 0x4c, 0x87, 0x88, 0x42, 0xef, 0xe4, 0x7a, 0xc0, 0x84, 0x59, 0x94, 0x05, 0xe2, 0xc5, + 0x46, 0xdf, 0xd8, 0x8b, 0x6f, 0x32, 0x9f, 0x51, 0xab, 0x8c, 0x7f, 0x92, 0x85, 0x99, 0x14, 0x63, + 0x0b, 0xf9, 0x10, 0x66, 0xa4, 0xd0, 0xe0, 0x9b, 0x11, 0x5f, 0xcc, 0x5c, 0x5c, 0x5c, 0x4d, 0x13, + 0x17, 0x88, 0x96, 0xb2, 0xa4, 0xa7, 0x85, 0xa0, 0x88, 0xca, 0xff, 0xfc, 0x88, 0x08, 0xf2, 0x01, + 0x9c, 0x15, 0x0f, 0x2d, 0x2b, 0x92, 0xc2, 0xf2, 0xe8, 0xae, 0x98, 0xb0, 0x2f, 0x24, 0x16, 0x94, + 0x53, 0x57, 0x9a, 0x63, 0xd2, 0xdd, 0x95, 0x67, 0xcc, 0x59, 0x3f, 0x05, 0x1e, 0x97, 0x3e, 0xff, + 0x6e, 0x06, 0x8c, 0x93, 0xfb, 0x0b, 0x4f, 0x41, 0xf1, 0x0e, 0x67, 0xa7, 0x20, 0xa5, 0xf7, 0x2e, + 0xc1, 0x84, 0x47, 0x77, 0x3d, 0xea, 0xef, 0x2b, 0xdd, 0x37, 0x6a, 0x8e, 0x0b, 0xa0, 0xec, 0x18, + 0x99, 0xa6, 0xe0, 0x54, 0xcb, 0x57, 0x12, 0x19, 0xb7, 0xc3, 0x4d, 0x25, 0x75, 0x1c, 0xc8, 0x2c, + 0x0c, 0xa9, 0x0d, 0xe4, 0x3f, 0xee, 0xe6, 0x0b, 0xd9, 0x62, 0xce, 0x14, 0xc9, 0x14, 0x76, 0x9d, + 0x26, 0x35, 0x7e, 0x3d, 0x03, 0xf3, 0xbd, 0x3b, 0x8f, 0x7c, 0xa8, 0x5c, 0x0f, 0xe6, 0x78, 0x5a, + 0xba, 0x13, 0xfa, 0x5b, 0xbd, 0x49, 0x11, 0xf1, 0xfd, 0xf1, 0x37, 0x86, 0x05, 0xcb, 0x4f, 0x73, + 0xc7, 0xf1, 0xa6, 0xb4, 0x2e, 0x32, 0xbd, 0x7c, 0xeb, 0x06, 0xb9, 0x0a, 0x23, 0xdc, 0xa0, 0x28, + 0x1b, 0x3a, 0xa5, 0x35, 0x74, 0xeb, 0x86, 0x29, 0xcb, 0x8d, 0xef, 0x66, 0x42, 0x93, 0x4a, 0xbc, + 0xf9, 0x5b, 0x37, 0xc8, 0x17, 0x06, 0xbb, 0xe8, 0x2b, 0xc8, 0x8b, 0xbe, 0xf0, 0x92, 0xef, 0x8b, + 0xda, 0x25, 0xdf, 0x8b, 0xfd, 0xfb, 0x49, 0x1c, 0xde, 0xe2, 0xaf, 0x40, 0xfe, 0xb3, 0x0c, 0x5c, + 0xe8, 0x4b, 0x41, 0x9e, 0x83, 0x42, 0x69, 0xa3, 0xba, 0x19, 0x8d, 0x2c, 0x5b, 0x2d, 0x12, 0x42, + 0xee, 0xc0, 0xe8, 0x92, 0xed, 0x3b, 0x75, 0x36, 0x81, 0x53, 0xd5, 0xd1, 0x04, 0xdb, 0x10, 0x7d, + 0xe5, 0x19, 0x33, 0xa2, 0x25, 0x16, 0x4c, 0xe3, 0x2a, 0x48, 0xbc, 0xb2, 0x16, 0x57, 0x45, 0x12, + 0x0c, 0x13, 0x64, 0x4c, 0xc2, 0x24, 0x80, 0xf1, 0xc5, 0xf7, 0x50, 0xea, 0x9e, 0xbd, 0x1b, 0x78, + 0x8a, 0x94, 0x1c, 0x57, 0xa0, 0xb0, 0x21, 0xcd, 0x2a, 0xca, 0x23, 0xab, 0xd2, 0x84, 0x62, 0x86, + 0xa5, 0xc6, 0x5f, 0xcb, 0x48, 0x7d, 0xe1, 0xe4, 0x0f, 0x51, 0x12, 0xf8, 0x36, 0xfa, 0x27, 0xf0, + 0x6d, 0x7c, 0xc2, 0x04, 0xbe, 0xc6, 0x2f, 0x8b, 0x84, 0x59, 0xd5, 0xc6, 0x46, 0xec, 0x4d, 0x89, + 0x4f, 0xeb, 0xb6, 0xb0, 0xac, 0xcd, 0xce, 0x4b, 0x4a, 0x52, 0xf1, 0x64, 0x5d, 0xbd, 0xbd, 0x17, + 0x94, 0xa9, 0xfa, 0x4f, 0xb2, 0xf0, 0x5c, 0x3f, 0xf2, 0xd4, 0xe7, 0x2f, 0x32, 0xa7, 0x7b, 0xfe, + 0xe2, 0x2a, 0x14, 0x38, 0x4c, 0x7f, 0x11, 0x50, 0x90, 0xb2, 0x0e, 0x97, 0xc5, 0xe4, 0x12, 0x0c, + 0x97, 0xca, 0xb5, 0x28, 0xeb, 0x31, 0xde, 0xb3, 0xd9, 0x75, 0x1f, 0x6f, 0x70, 0x44, 0x11, 0xf9, + 0x7a, 0x32, 0xd1, 0xb7, 0x48, 0x77, 0xfc, 0xac, 0xd2, 0x21, 0x89, 0x5c, 0x76, 0xd8, 0xde, 0x28, + 0xf7, 0x9a, 0x48, 0x67, 0x64, 0x26, 0x93, 0x86, 0x1b, 0x30, 0xbc, 0xe1, 0x51, 0x9f, 0x06, 0xea, + 0x1d, 0x58, 0x07, 0x21, 0xa6, 0x28, 0x11, 0x37, 0x54, 0xf6, 0x11, 0x8f, 0x32, 0x18, 0x56, 0x83, + 0xb0, 0xf0, 0x4a, 0x8b, 0x81, 0x4d, 0x05, 0xc5, 0xf8, 0x76, 0x06, 0x66, 0xd3, 0x9a, 0x45, 0x9e, + 0x83, 0x7c, 0x3b, 0x35, 0x45, 0x79, 0x9b, 0xfb, 0x3a, 0x8f, 0xe1, 0x6b, 0x6c, 0xbb, 0xae, 0xd7, + 0xb2, 0x03, 0xf5, 0xe2, 0x4f, 0x01, 0x9b, 0xc0, 0x7e, 0xdc, 0xc6, 0xbf, 0xc9, 0x82, 0x14, 0xb6, + 0xb9, 0x44, 0x52, 0x73, 0xfc, 0xcf, 0x28, 0x01, 0x54, 0x1b, 0x1b, 0xeb, 0x1d, 0x9e, 0x1a, 0xed, + 0x26, 0xe4, 0x59, 0xb3, 0x62, 0x93, 0x91, 0x4d, 0x87, 0xd2, 0xfd, 0x55, 0x81, 0xc4, 0x5b, 0xc5, + 0xce, 0x4e, 0x26, 0x22, 0x1b, 0xdb, 0x30, 0xa9, 0x63, 0x90, 0x65, 0x3d, 0x99, 0x46, 0xf4, 0x50, + 0xfc, 0x92, 0xeb, 0x72, 0xe7, 0x93, 0xa5, 0xf3, 0xdf, 0x3b, 0x5e, 0x00, 0xf6, 0x93, 0xd3, 0xa4, + 0x25, 0xdb, 0x30, 0x7e, 0x2a, 0x0b, 0xb3, 0x91, 0x13, 0xbb, 0x5c, 0x12, 0x4f, 0xad, 0x47, 0x65, + 0x49, 0xf3, 0xf8, 0x5b, 0x48, 0xbc, 0xc5, 0x2c, 0x3f, 0xb0, 0x8f, 0xa3, 0xd1, 0x1d, 0x98, 0xeb, + 0x85, 0x4f, 0x5e, 0x4d, 0xbc, 0x96, 0x2a, 0x82, 0x2d, 0xc3, 0x67, 0x55, 0x95, 0xc7, 0x53, 0xff, + 0x51, 0x06, 0xe6, 0x85, 0xcb, 0xc4, 0x7d, 0xdb, 0x69, 0xe3, 0x0b, 0xf1, 0x75, 0xfa, 0x64, 0x3c, + 0x82, 0xef, 0x68, 0x62, 0xe9, 0x25, 0xdd, 0x33, 0x26, 0x51, 0x5b, 0xef, 0xaf, 0x25, 0x57, 0x31, + 0xac, 0xb6, 0xce, 0x27, 0x6f, 0x9e, 0x47, 0x60, 0xb4, 0x19, 0x40, 0x8d, 0xc0, 0x40, 0x0c, 0xe3, + 0x2f, 0xc1, 0xf3, 0xfd, 0x2b, 0x20, 0x5f, 0x83, 0x09, 0x4c, 0x45, 0xfb, 0xa0, 0xb3, 0xe7, 0xd9, + 0x0d, 0x2a, 0x0d, 0x45, 0xf2, 0x7e, 0x47, 0x2d, 0xe3, 0xa1, 0xc4, 0x22, 0x22, 0x60, 0x0f, 0x93, + 0xdc, 0x0a, 0x22, 0xcd, 0x2f, 0x49, 0xe5, 0x66, 0xfc, 0x50, 0x06, 0x48, 0x92, 0x07, 0xb9, 0x05, + 0xe3, 0x0f, 0x36, 0xcb, 0xb5, 0xc0, 0xf6, 0x82, 0x15, 0xb7, 0xeb, 0x89, 0x10, 0x5d, 0xee, 0x20, + 0x1e, 0xd4, 0x99, 0x64, 0xf0, 0x02, 0x6b, 0xdf, 0xed, 0x7a, 0xa6, 0x86, 0x87, 0xf9, 0x6e, 0x29, + 0x3d, 0x68, 0xd8, 0x47, 0x7a, 0xbe, 0x5b, 0x01, 0xd3, 0xf2, 0xdd, 0x0a, 0x98, 0xf1, 0xb7, 0x32, + 0xf0, 0xac, 0xbc, 0x4b, 0x69, 0xa4, 0xb4, 0xa5, 0x8c, 0x61, 0x50, 0x9e, 0x4c, 0x51, 0xd2, 0x4f, + 0x37, 0x9d, 0x96, 0x91, 0x82, 0xd8, 0x40, 0x54, 0x52, 0x39, 0x2d, 0x79, 0x1f, 0xf2, 0xb5, 0xc0, + 0xed, 0x0c, 0x10, 0x2a, 0x58, 0x0c, 0x47, 0x34, 0x70, 0x3b, 0xc8, 0x02, 0x29, 0x0d, 0x0a, 0xb3, + 0x6a, 0xe3, 0x64, 0x8b, 0xc9, 0x7d, 0x18, 0x11, 0x31, 0xdc, 0x31, 0xbb, 0x53, 0x9f, 0x6f, 0x5a, + 0x9a, 0x92, 0xf1, 0x88, 0x22, 0x45, 0x86, 0x29, 0x79, 0x18, 0x3f, 0x99, 0x81, 0x31, 0xa6, 0x3c, + 0xe0, 0x91, 0xeb, 0xd3, 0x4e, 0x69, 0x5d, 0x0f, 0x94, 0x66, 0xcb, 0x90, 0xfd, 0x40, 0x9b, 0xeb, + 0x1b, 0x30, 0x15, 0x23, 0x20, 0x06, 0x46, 0xa2, 0x34, 0x9d, 0xba, 0xcd, 0xd3, 0x67, 0x72, 0x9b, + 0x9f, 0x06, 0x33, 0xfe, 0x95, 0x0c, 0xcc, 0xae, 0x1f, 0x04, 0x76, 0x15, 0x8f, 0x90, 0x66, 0xb7, + 0x29, 0xd7, 0x3b, 0x53, 0x88, 0xe4, 0xa5, 0x1c, 0xf7, 0x92, 0xe7, 0x0a, 0x91, 0x80, 0x99, 0x61, + 0x29, 0x59, 0x81, 0x82, 0xd8, 0x5f, 0x7c, 0x91, 0xd9, 0x42, 0xde, 0x39, 0xeb, 0x8c, 0x05, 0x12, + 0xfb, 0x12, 0x14, 0x61, 0x82, 0xc6, 0x0c, 0xa9, 0x8d, 0x3f, 0xcd, 0xc0, 0xb9, 0x1e, 0x34, 0xe4, + 0x1d, 0x18, 0x42, 0x67, 0x3f, 0x31, 0x7a, 0xcf, 0xf5, 0xa8, 0x22, 0xa8, 0xef, 0x6f, 0xdd, 0xe0, + 0x1b, 0x51, 0x8b, 0xfd, 0x30, 0x39, 0x15, 0xf9, 0x10, 0x46, 0x4b, 0x8d, 0x86, 0x38, 0x97, 0x64, + 0xb5, 0x73, 0x49, 0x8f, 0x1a, 0xaf, 0x85, 0xf8, 0xfc, 0x5c, 0xc2, 0xdd, 0x4e, 0x1a, 0x0d, 0x4b, + 0x38, 0x32, 0x46, 0xfc, 0xe6, 0xdf, 0x86, 0x49, 0x1d, 0xf9, 0x54, 0xe7, 0x92, 0xef, 0x66, 0xa0, + 0xa8, 0xb7, 0xe1, 0xb3, 0x89, 0xa4, 0x4c, 0x1b, 0xe6, 0x13, 0x26, 0xd5, 0xcf, 0x64, 0xe1, 0x4c, + 0x6a, 0x0f, 0x93, 0xd7, 0x61, 0xb8, 0xd4, 0xe9, 0x54, 0x2b, 0x62, 0x56, 0x09, 0x85, 0x07, 0x2d, + 0xad, 0xda, 0xb1, 0x8d, 0x23, 0x91, 0x9b, 0x50, 0xc0, 0x99, 0xc9, 0x08, 0xb2, 0x51, 0x8e, 0x09, + 0x7e, 0xb5, 0x11, 0xcb, 0x31, 0x21, 0x11, 0xc9, 0x6d, 0x98, 0x14, 0x41, 0x55, 0x26, 0xdd, 0xa3, + 0x8f, 0xc2, 0x64, 0x67, 0x98, 0x8f, 0x4d, 0x86, 0x60, 0x59, 0x1e, 0x2f, 0x53, 0xc3, 0x8a, 0x74, + 0x2a, 0x7c, 0xbd, 0x97, 0xf1, 0x54, 0x39, 0xf1, 0x44, 0x17, 0xfc, 0xf5, 0x5e, 0x6c, 0x44, 0x0f, + 0x5e, 0x09, 0xca, 0x70, 0xb8, 0x4a, 0xbe, 0xef, 0xec, 0xb5, 0x5b, 0xb4, 0x1d, 0x7c, 0x76, 0xc3, + 0x15, 0xd5, 0x31, 0xd0, 0x70, 0x7d, 0x27, 0xcf, 0x17, 0x73, 0x9c, 0xec, 0x84, 0x07, 0xea, 0x2b, + 0x30, 0xc2, 0xc3, 0xb9, 0xe4, 0xca, 0xb8, 0x90, 0xda, 0x04, 0x8e, 0xb3, 0x75, 0x83, 0xab, 0x2f, + 0xdc, 0xeb, 0xd0, 0x37, 0x25, 0x29, 0xd9, 0x82, 0xb1, 0x72, 0x93, 0xda, 0xed, 0x6e, 0x67, 0x73, + 0x30, 0x03, 0xe3, 0x9c, 0xf8, 0x96, 0xf1, 0x3a, 0x27, 0x43, 0xc3, 0x24, 0x4a, 0x72, 0x95, 0x11, + 0xd9, 0x0c, 0x1d, 0x91, 0xf2, 0x68, 0x0f, 0xfd, 0x5c, 0x9f, 0xfe, 0x89, 0x03, 0xff, 0x3f, 0xea, + 0xae, 0xa7, 0xc7, 0x6d, 0xe3, 0x8a, 0x2f, 0x29, 0xed, 0x7a, 0xf7, 0x69, 0xff, 0x70, 0x27, 0xce, + 0x7a, 0xbb, 0xb6, 0x37, 0xa9, 0x9a, 0x3a, 0x8d, 0xd2, 0x24, 0x4d, 0xd2, 0x34, 0xb1, 0x8b, 0xd4, + 0xe5, 0x4a, 0xd4, 0x8a, 0x5e, 0x89, 0xa4, 0x49, 0xca, 0x1b, 0xbb, 0x69, 0x09, 0x79, 0x97, 0x5e, + 0xab, 0x95, 0x29, 0x45, 0xd2, 0xda, 0xb5, 0x6f, 0xbd, 0xe4, 0x52, 0x04, 0x28, 0x72, 0x6d, 0x81, + 0xa2, 0x40, 0xbe, 0x45, 0xbf, 0x40, 0x80, 0xa0, 0x40, 0x0e, 0xbd, 0x15, 0x08, 0x5a, 0x03, 0xbd, + 0xf4, 0xde, 0x4b, 0x4e, 0xc5, 0xbc, 0x99, 0x21, 0x87, 0xa4, 0xa4, 0xec, 0xda, 0x46, 0x8b, 0xde, + 0xc4, 0x37, 0x6f, 0x46, 0x43, 0xce, 0xcc, 0x9b, 0x79, 0xf3, 0xde, 0xfb, 0x3d, 0xac, 0x97, 0xf6, + 0xb2, 0xe3, 0x9e, 0x4a, 0x01, 0xac, 0x36, 0x3b, 0xa3, 0xb1, 0x3f, 0xec, 0x44, 0x23, 0x44, 0x64, + 0x38, 0x41, 0x98, 0xac, 0xc8, 0x6c, 0xb7, 0x86, 0xb7, 0x91, 0xe3, 0xb8, 0x2a, 0xf6, 0x39, 0xd3, + 0x1c, 0x3d, 0x2f, 0xd5, 0xbb, 0x51, 0xa7, 0xd7, 0x7d, 0x24, 0xfc, 0x35, 0xd9, 0x79, 0xe9, 0x8e, + 0x20, 0xba, 0x49, 0x79, 0xf9, 0xc3, 0xdc, 0xb8, 0xb1, 0x5e, 0x96, 0xe0, 0x0c, 0x77, 0xd1, 0x67, + 0x2e, 0xeb, 0x8e, 0x61, 0xd5, 0x4c, 0x6b, 0x57, 0x53, 0xc8, 0x2a, 0x80, 0xe3, 0xda, 0x55, 0xc3, + 0xf3, 0xe8, 0xb3, 0x4a, 0x9f, 0xb9, 0x3f, 0x7b, 0xbd, 0xdd, 0xd4, 0x0a, 0x92, 0x4b, 0x7b, 0xb1, + 0xfc, 0x85, 0x02, 0x1b, 0x93, 0x87, 0x92, 0xf8, 0x80, 0x41, 0x0d, 0xfc, 0xaa, 0xf9, 0x47, 0x33, + 0xc7, 0x7d, 0x22, 0x39, 0x1b, 0x1c, 0x31, 0x66, 0x4e, 0xf7, 0xaa, 0xb0, 0x1c, 0x25, 0x39, 0xd9, + 0xba, 0x87, 0xe5, 0x2a, 0x6c, 0x4e, 0x6b, 0x23, 0xfd, 0xaa, 0x6b, 0x50, 0xd2, 0x1d, 0xa7, 0x69, + 0x56, 0x75, 0xdf, 0xb4, 0x2d, 0x4d, 0x21, 0x4b, 0x30, 0xbf, 0xeb, 0xda, 0x6d, 0x47, 0x53, 0xcb, + 0x9f, 0x2a, 0xb0, 0x62, 0x46, 0xe3, 0xf0, 0x88, 0xf9, 0xbf, 0x3c, 0xed, 0xe2, 0xbb, 0x92, 0x5a, + 0x7c, 0x9b, 0x71, 0xf8, 0x4f, 0xfc, 0x07, 0x27, 0x5a, 0x79, 0x7f, 0x55, 0x60, 0x3d, 0x57, 0x87, + 0x78, 0x70, 0x46, 0xdf, 0xf7, 0x6c, 0xb3, 0x56, 0xe5, 0x3d, 0x13, 0xa7, 0x72, 0x4e, 0xcd, 0xff, + 0x0b, 0xf3, 0xae, 0x7d, 0x30, 0x0a, 0xfa, 0xdd, 0x43, 0x29, 0x13, 0x44, 0x63, 0xce, 0x15, 0x2d, + 0xe1, 0x4e, 0xf6, 0xe8, 0x78, 0x18, 0x62, 0xb3, 0x6a, 0xea, 0x46, 0x33, 0xa6, 0xe7, 0x1b, 0x66, + 0xa9, 0xeb, 0x69, 0x79, 0xbe, 0xe9, 0xa4, 0xbd, 0x9d, 0x15, 0x28, 0x71, 0xad, 0x05, 0x15, 0x82, + 0x4f, 0x14, 0xd8, 0x9c, 0xd6, 0x57, 0xaa, 0x08, 0xa5, 0x5d, 0xed, 0x37, 0x62, 0x2c, 0xbf, 0xb4, + 0x8f, 0xbd, 0x60, 0x23, 0x57, 0xa1, 0xc4, 0x12, 0x5d, 0x7a, 0x6f, 0xb7, 0x5d, 0x93, 0x4f, 0x90, + 0x8b, 0xff, 0xfa, 0xea, 0x85, 0x73, 0x3c, 0xbd, 0xff, 0xe8, 0xed, 0x74, 0xae, 0xf7, 0x4d, 0xc5, + 0x95, 0x6b, 0x94, 0x3f, 0x56, 0x60, 0x6b, 0xfa, 0x4b, 0xd2, 0x5d, 0xc6, 0xa7, 0x67, 0xf3, 0xc4, + 0x5b, 0x19, 0x77, 0x19, 0x3c, 0xaf, 0x67, 0xdc, 0x95, 0x63, 0x46, 0x5a, 0x29, 0xce, 0xb1, 0xa4, + 0xe6, 0x52, 0xab, 0xa4, 0x2b, 0x09, 0xc6, 0xf2, 0xef, 0x55, 0xd8, 0xa0, 0x13, 0xa8, 0x17, 0x8e, + 0x46, 0xfa, 0xf1, 0xf8, 0x6e, 0x18, 0x8d, 0xf9, 0x91, 0x8a, 0xbc, 0x0b, 0x0b, 0x77, 0x4f, 0x77, + 0x1b, 0xc8, 0xd8, 0x09, 0x01, 0x14, 0xca, 0xc2, 0x5d, 0x84, 0xfe, 0x26, 0x17, 0x41, 0x4a, 0x65, + 0x83, 0x32, 0x75, 0xd9, 0x5d, 0x1a, 0xc4, 0x09, 0x6d, 0xde, 0x83, 0x79, 0xd4, 0xfe, 0xb9, 0x68, + 0x14, 0x47, 0xda, 0xc9, 0x3d, 0xc3, 0xbb, 0x01, 0x97, 0x55, 0x20, 0x6f, 0x00, 0x24, 0x98, 0x71, + 0x5c, 0xf6, 0x09, 0x35, 0x3a, 0x86, 0x8d, 0x73, 0x97, 0xee, 0xdd, 0xe9, 0x70, 0x20, 0xb6, 0x0a, + 0xac, 0x8b, 0x4f, 0x32, 0x10, 0x51, 0xf1, 0xdc, 0x0e, 0xb3, 0xc6, 0x0a, 0xcc, 0x01, 0x8f, 0x8c, + 0x2f, 0xff, 0x53, 0x85, 0xa5, 0x7d, 0x7a, 0x50, 0x40, 0xf5, 0x77, 0xb6, 0x3a, 0xfd, 0x16, 0x94, + 0x9a, 0xfd, 0x0e, 0xbf, 0xbb, 0x1f, 0x71, 0x60, 0x0e, 0x74, 0xd9, 0xed, 0xf5, 0x3b, 0xc2, 0x0c, + 0x30, 0x72, 0x65, 0xa6, 0x6f, 0x70, 0x37, 0xbe, 0x06, 0x0b, 0xcc, 0xef, 0x81, 0x5f, 0xd4, 0x88, + 0xa3, 0x62, 0xdc, 0xa3, 0xd7, 0x59, 0xb1, 0x74, 0xdd, 0xcc, 0x3c, 0x27, 0xe4, 0x73, 0x0b, 0xc7, + 0xe5, 0x90, 0x94, 0xfd, 0xf9, 0x93, 0x29, 0xfb, 0x52, 0xfc, 0xf1, 0xc2, 0x49, 0xe2, 0x8f, 0xb7, + 0x2e, 0x43, 0x49, 0xea, 0xcf, 0xa9, 0x4e, 0x8e, 0xbf, 0x51, 0x61, 0x05, 0xdf, 0x2a, 0x36, 0x25, + 0xfd, 0x7f, 0x5e, 0x5d, 0x5c, 0x49, 0x5d, 0x5d, 0x6c, 0xca, 0xe3, 0xc5, 0xde, 0x6c, 0xc6, 0x9d, + 0xc5, 0x35, 0x58, 0xcf, 0x31, 0x92, 0x77, 0x60, 0x9e, 0x76, 0x5f, 0xa8, 0x7a, 0x5a, 0x76, 0x06, + 0x24, 0x58, 0x35, 0xf4, 0xc5, 0x47, 0x2e, 0xe3, 0x2e, 0xff, 0x5b, 0x81, 0x65, 0x0e, 0x22, 0x18, + 0xdd, 0xe9, 0x7f, 0xe3, 0xe7, 0xbc, 0x94, 0xfd, 0x9c, 0x2c, 0x78, 0x86, 0x7f, 0xce, 0xff, 0xf6, + 0x47, 0xbc, 0x9c, 0xfa, 0x88, 0xe7, 0xe2, 0xc8, 0x75, 0xf1, 0x3a, 0x33, 0xbe, 0xe1, 0x9f, 0x11, + 0xcb, 0x25, 0xcd, 0x48, 0x7e, 0x01, 0x4b, 0x56, 0xf8, 0x20, 0xa5, 0x31, 0x5d, 0x9a, 0xd2, 0xe8, + 0xeb, 0x31, 0x23, 0x5b, 0x53, 0xb8, 0xd9, 0x44, 0xe1, 0x83, 0x20, 0x67, 0xc6, 0x49, 0x9a, 0xa4, + 0x4a, 0x53, 0xba, 0xda, 0x69, 0xa6, 0x3e, 0x77, 0xd1, 0xc4, 0x78, 0xb0, 0x3f, 0x15, 0x01, 0x12, + 0xef, 0x36, 0xba, 0x00, 0xc3, 0x14, 0xd4, 0x2e, 0xbf, 0x3b, 0x46, 0x92, 0x3c, 0xc7, 0x39, 0x89, + 0x5c, 0xe2, 0x97, 0xa2, 0xea, 0x74, 0x64, 0x01, 0xbc, 0x1e, 0xad, 0x72, 0xef, 0xb1, 0xc3, 0xb0, + 0xd7, 0x61, 0xb2, 0xb8, 0xb0, 0xf3, 0x12, 0x02, 0xc9, 0xc4, 0xd4, 0x29, 0xd9, 0x60, 0xd0, 0xc7, + 0xac, 0x46, 0x19, 0x72, 0x1e, 0xa3, 0xc5, 0x27, 0xf7, 0x18, 0x9d, 0x7f, 0x02, 0x8f, 0xd1, 0x85, + 0x13, 0x7a, 0x8c, 0x3a, 0xb0, 0xd4, 0x8d, 0xee, 0x87, 0xd1, 0xb8, 0x3f, 0x7c, 0x88, 0xfe, 0x64, + 0xc9, 0x55, 0x16, 0xfd, 0xd4, 0xa6, 0x28, 0x63, 0xe3, 0x8d, 0x1b, 0x66, 0xcc, 0x2f, 0x0f, 0x77, + 0x4c, 0x24, 0x3f, 0x84, 0xc4, 0xea, 0xc1, 0x91, 0x3f, 0xa7, 0xef, 0xb3, 0x07, 0xc2, 0x28, 0xf2, + 0x53, 0x48, 0x1b, 0x3f, 0x78, 0xbc, 0x05, 0xcb, 0x5c, 0x26, 0x17, 0xc8, 0x60, 0x1a, 0x07, 0x92, + 0x7d, 0x84, 0x3b, 0xd4, 0x7c, 0xad, 0x02, 0xc9, 0x77, 0x9c, 0x5c, 0x81, 0x12, 0x13, 0xfd, 0xc1, + 0x70, 0xf4, 0x11, 0x77, 0x73, 0x64, 0xf1, 0x7e, 0x12, 0x59, 0x8e, 0xf7, 0x63, 0x64, 0x77, 0xf4, + 0x51, 0x8f, 0xfc, 0x1c, 0x9e, 0xc3, 0x81, 0x1f, 0x84, 0xc3, 0x6e, 0xff, 0x30, 0x40, 0xc4, 0x95, + 0x4e, 0x8f, 0x63, 0xca, 0xbf, 0x86, 0xc9, 0x4f, 0xf2, 0xc5, 0x53, 0x26, 0x08, 0x7a, 0x13, 0x3a, + 0xc8, 0xe9, 0x30, 0x46, 0xe2, 0x83, 0x26, 0xd7, 0xbf, 0x73, 0xdc, 0xeb, 0xf1, 0x39, 0x57, 0xc1, + 0xd4, 0xd7, 0x99, 0xb2, 0x29, 0x0d, 0xaf, 0x26, 0x0d, 0xd7, 0x8f, 0x7b, 0x3d, 0xf2, 0x2e, 0x40, + 0x3f, 0x0a, 0xee, 0x75, 0x47, 0x23, 0x66, 0xc8, 0x88, 0x3d, 0x81, 0x13, 0xaa, 0x3c, 0x7c, 0xfd, + 0xa8, 0xc5, 0x88, 0x74, 0xf8, 0x06, 0x9d, 0xa3, 0x10, 0xe3, 0x67, 0x70, 0xe6, 0xcd, 0x73, 0x94, + 0x48, 0x41, 0x4c, 0x4f, 0xa3, 0xa3, 0xd0, 0xeb, 0x3e, 0x12, 0xde, 0x4c, 0xb7, 0x60, 0x9d, 0x3b, + 0xa2, 0xec, 0x77, 0xc7, 0x77, 0xf9, 0xb9, 0xfb, 0x69, 0x0e, 0xed, 0xd2, 0xc1, 0xfb, 0x6f, 0x45, + 0x00, 0x7d, 0xdf, 0x13, 0xa1, 0xa9, 0xaf, 0xc0, 0x3c, 0xd5, 0x26, 0xc4, 0xad, 0x04, 0xde, 0xe9, + 0x62, 0xbb, 0xf2, 0x9d, 0x2e, 0x72, 0x50, 0x39, 0xe1, 0x86, 0x47, 0x78, 0x31, 0xa6, 0x26, 0x57, + 0x18, 0x43, 0x46, 0x4a, 0x9d, 0x5e, 0x19, 0x89, 0x34, 0x01, 0x92, 0x60, 0x51, 0xae, 0xdf, 0xae, + 0x27, 0x51, 0x57, 0xbc, 0x80, 0xc3, 0xff, 0x25, 0x01, 0xa7, 0xf2, 0xf4, 0x49, 0xd8, 0xc8, 0x1e, + 0x14, 0xfd, 0x4e, 0xec, 0xe7, 0x3a, 0x25, 0x84, 0xf6, 0x45, 0x8e, 0xf9, 0x9f, 0x84, 0xd1, 0xae, + 0x8e, 0x3b, 0xa9, 0xd4, 0x28, 0xd8, 0x08, 0x31, 0x60, 0x81, 0xe7, 0x73, 0x9a, 0x82, 0xa7, 0xc0, + 0xd3, 0x39, 0x71, 0x14, 0x25, 0x24, 0xca, 0xa7, 0x1d, 0x9e, 0xb9, 0xe9, 0x2d, 0x28, 0x78, 0x5e, + 0x8b, 0x07, 0x8e, 0xac, 0x24, 0xba, 0x8a, 0xe7, 0xb5, 0x44, 0xfa, 0xbb, 0x7b, 0x52, 0x35, 0xca, + 0x4c, 0x7e, 0x0c, 0x25, 0xe9, 0x20, 0xce, 0x43, 0xae, 0xf0, 0x1b, 0x74, 0x13, 0xb2, 0x2c, 0xce, + 0x24, 0x6e, 0xd2, 0x04, 0x6d, 0xef, 0xf8, 0x76, 0xa8, 0x0f, 0x06, 0xe8, 0xa3, 0x79, 0x3f, 0x1c, + 0x32, 0x68, 0xc2, 0xc5, 0x04, 0x80, 0x28, 0xe8, 0x0c, 0x06, 0xc1, 0xa1, 0x28, 0x95, 0x6f, 0x66, + 0xb2, 0x35, 0x89, 0x03, 0xeb, 0x5e, 0x38, 0x3e, 0x1e, 0x30, 0x37, 0x8c, 0x7a, 0x7f, 0x48, 0x55, + 0x13, 0x26, 0x30, 0x10, 0xab, 0x65, 0x44, 0x0b, 0x85, 0xef, 0xcb, 0x9d, 0xfe, 0x30, 0xa3, 0xa6, + 0xe4, 0x2b, 0x97, 0x43, 0x79, 0xc8, 0xe9, 0x7e, 0x9f, 0x56, 0x78, 0x70, 0xbf, 0x17, 0x0a, 0x4f, + 0xa2, 0xe6, 0xbc, 0x31, 0x21, 0x88, 0x18, 0xcd, 0x68, 0x52, 0x10, 0x71, 0x2a, 0x74, 0xf8, 0xb3, + 0xa2, 0x04, 0x4e, 0xc1, 0xc7, 0xe2, 0x7d, 0x80, 0x6b, 0xfd, 0x6e, 0xd4, 0x0a, 0xc7, 0x77, 0xfb, + 0x87, 0x52, 0x2c, 0x73, 0xe9, 0x97, 0xfd, 0x6e, 0x14, 0xdc, 0x43, 0xf2, 0xd7, 0x5f, 0xbd, 0x20, + 0x31, 0xb9, 0xd2, 0x6f, 0xf2, 0x7d, 0x58, 0xa2, 0x4f, 0x7e, 0xe2, 0x4c, 0xc2, 0x2e, 0x30, 0xb1, + 0x36, 0x4f, 0xa3, 0x19, 0x33, 0x90, 0xcb, 0x88, 0x1f, 0xda, 0x1d, 0x8c, 0xa5, 0x63, 0xb5, 0x00, + 0x0b, 0xed, 0x0e, 0xc6, 0x59, 0xbc, 0x21, 0x89, 0x99, 0x34, 0xe2, 0xae, 0x0b, 0x04, 0x5a, 0x0e, + 0x53, 0x8a, 0xb7, 0x74, 0x7c, 0xae, 0x05, 0x02, 0xe8, 0x44, 0xce, 0x15, 0x92, 0xa9, 0x86, 0x9d, + 0xf0, 0x1a, 0x35, 0x66, 0x56, 0xe1, 0xbb, 0x1b, 0xeb, 0xc4, 0xe8, 0xee, 0x61, 0x70, 0x80, 0xe4, + 0x54, 0x27, 0x62, 0x66, 0xb2, 0x03, 0x6b, 0x2c, 0xe2, 0x2e, 0x46, 0xb2, 0xe7, 0x3b, 0x1d, 0xca, + 0xb6, 0x04, 0xea, 0x5e, 0xfe, 0xfb, 0x4c, 0x05, 0x52, 0x87, 0x79, 0x54, 0x2d, 0x79, 0xd8, 0xd3, + 0x79, 0x59, 0xa7, 0xce, 0xae, 0x23, 0x94, 0x2b, 0xa8, 0x4d, 0xcb, 0x72, 0x05, 0x59, 0xc9, 0x07, + 0x00, 0x46, 0x34, 0xec, 0xf7, 0x7a, 0x08, 0xc5, 0xb3, 0x88, 0x8a, 0xd9, 0xc5, 0xf4, 0x7a, 0xc4, + 0x56, 0x12, 0x26, 0x1e, 0x61, 0x8e, 0xcf, 0x41, 0x06, 0xb0, 0x47, 0x6a, 0xab, 0x6c, 0xc2, 0x02, + 0x5b, 0x8c, 0x08, 0x6b, 0xc5, 0x31, 0x33, 0x25, 0x50, 0x24, 0x06, 0x6b, 0xc5, 0xe9, 0x79, 0x58, + 0x2b, 0xa9, 0x42, 0x79, 0x0f, 0xce, 0x4e, 0x7a, 0xb1, 0x94, 0x32, 0xac, 0x9c, 0x54, 0x19, 0xfe, + 0x63, 0x01, 0x96, 0xb1, 0x35, 0x21, 0x85, 0x75, 0x58, 0xf1, 0x8e, 0x6f, 0xc7, 0xe1, 0xa1, 0x42, + 0x1a, 0x63, 0xff, 0x46, 0x72, 0x81, 0x6c, 0xf0, 0x4a, 0xd5, 0x20, 0x06, 0xac, 0x8a, 0x9d, 0x60, + 0x57, 0xf8, 0xba, 0xc5, 0x88, 0x52, 0x02, 0xb8, 0x20, 0x9f, 0xc9, 0x23, 0x53, 0x29, 0xd9, 0x0f, + 0x0a, 0xa7, 0xd9, 0x0f, 0x8a, 0x27, 0xda, 0x0f, 0x7e, 0x06, 0xcb, 0xe2, 0xdf, 0x50, 0x92, 0xcf, + 0x3f, 0x9d, 0x24, 0x4f, 0x35, 0x46, 0x9a, 0xb1, 0x44, 0x5f, 0x98, 0x29, 0xd1, 0xd1, 0x8a, 0x28, + 0x56, 0x59, 0x2e, 0x39, 0x1f, 0x6f, 0x03, 0xa1, 0xee, 0x77, 0xab, 0xce, 0x13, 0xec, 0x92, 0xef, + 0xc0, 0x52, 0xb3, 0x2f, 0x0c, 0x48, 0xd2, 0xcd, 0x7d, 0x4f, 0x10, 0xe5, 0xe3, 0x42, 0xcc, 0x19, + 0xef, 0x6e, 0x85, 0x67, 0xb1, 0xbb, 0x5d, 0x06, 0xe0, 0x4e, 0x94, 0x09, 0x44, 0x35, 0x2e, 0x19, + 0x11, 0xfd, 0x93, 0x36, 0x20, 0x48, 0xcc, 0x54, 0x3a, 0x71, 0x57, 0x13, 0xfd, 0xe0, 0xa0, 0x7f, + 0x1c, 0x8d, 0x53, 0x39, 0x5d, 0x78, 0x20, 0x20, 0xdd, 0x12, 0xb0, 0x4c, 0x16, 0x0f, 0x99, 0x6a, + 0xcf, 0x76, 0x40, 0xc8, 0xf5, 0xd8, 0x47, 0x6e, 0x66, 0x8a, 0xcb, 0x72, 0xee, 0x0b, 0x4d, 0xf5, + 0x8c, 0x2b, 0x7f, 0xa1, 0xc8, 0x70, 0x7e, 0x4f, 0x30, 0xd4, 0xef, 0x01, 0xc4, 0x16, 0x7c, 0x31, + 0xd6, 0x4c, 0x93, 0x8b, 0xa9, 0xf2, 0x57, 0x4e, 0x78, 0xa5, 0xb7, 0x29, 0x3c, 0xab, 0xb7, 0xf1, + 0xa1, 0x64, 0xff, 0x6a, 0xdc, 0x49, 0x5c, 0x3e, 0xc0, 0x8b, 0x4f, 0xb2, 0x28, 0x99, 0x44, 0x2a, + 0xce, 0xe4, 0x1c, 0x3c, 0x35, 0x15, 0x67, 0x5c, 0xb1, 0x7c, 0x1d, 0xd6, 0xe4, 0x10, 0x85, 0x87, + 0xd1, 0x01, 0xf9, 0x09, 0xc3, 0x21, 0x51, 0x52, 0x3a, 0x8e, 0xc4, 0x44, 0x25, 0xee, 0xc3, 0xe8, + 0x80, 0x9d, 0x7f, 0x3a, 0x0f, 0xe4, 0xbe, 0xa2, 0xf6, 0xf9, 0xa5, 0x02, 0x24, 0xcf, 0x2e, 0x4b, + 0x13, 0xe5, 0x7f, 0x70, 0xba, 0xcc, 0x9c, 0xca, 0x8a, 0xa7, 0x39, 0x95, 0x55, 0x7e, 0xa7, 0xc0, + 0x9a, 0xa9, 0xb7, 0x38, 0xf6, 0x1e, 0xb3, 0x44, 0x7c, 0x1b, 0x2e, 0x9a, 0x7a, 0x2b, 0x70, 0xec, + 0xa6, 0x59, 0xbd, 0x19, 0x4c, 0x84, 0xd4, 0xb9, 0x08, 0xdf, 0xca, 0xb3, 0x24, 0x16, 0x8b, 0x0b, + 0xb0, 0x99, 0x2f, 0x16, 0xb0, 0x3b, 0x93, 0x2b, 0x0b, 0x84, 0x9e, 0x42, 0xe5, 0x2a, 0xac, 0x09, + 0x34, 0x1a, 0xbf, 0xe9, 0x21, 0x88, 0xdd, 0x1a, 0x94, 0x6e, 0x18, 0xae, 0x59, 0xbf, 0x19, 0xd4, + 0xdb, 0xcd, 0xa6, 0x36, 0x47, 0x56, 0x60, 0x89, 0x13, 0xaa, 0xba, 0xa6, 0x90, 0x65, 0x58, 0x34, + 0x2d, 0xcf, 0xa8, 0xb6, 0x5d, 0x43, 0x53, 0x2b, 0x57, 0x61, 0xd5, 0x19, 0x76, 0xef, 0x77, 0xc6, + 0xe1, 0x5e, 0xf8, 0x10, 0x0d, 0x0e, 0x67, 0xa0, 0xe0, 0xea, 0xfb, 0xda, 0x1c, 0x01, 0x58, 0x70, + 0xf6, 0xaa, 0xde, 0x9b, 0x6f, 0x6a, 0x0a, 0x29, 0xc1, 0x99, 0xdd, 0xaa, 0x13, 0xec, 0xb5, 0x3c, + 0x4d, 0xa5, 0x0f, 0xfa, 0xbe, 0x87, 0x0f, 0x85, 0xca, 0x0f, 0x60, 0x1d, 0xcf, 0x0a, 0xcd, 0xee, + 0x68, 0x1c, 0x46, 0xe1, 0x10, 0xfb, 0xb0, 0x0c, 0x8b, 0x5e, 0x48, 0x17, 0xf9, 0x38, 0x64, 0x1d, + 0x68, 0x1d, 0xf7, 0xc6, 0xdd, 0x41, 0x2f, 0xfc, 0xb5, 0xa6, 0x54, 0x2e, 0xc3, 0x9a, 0xdb, 0x3f, + 0x1e, 0x77, 0xa3, 0x23, 0x6f, 0x4c, 0x39, 0x8e, 0x1e, 0x92, 0xe7, 0x61, 0xbd, 0x6d, 0xe9, 0xad, + 0x1d, 0x73, 0xb7, 0x6d, 0xb7, 0xbd, 0xa0, 0xa5, 0xfb, 0xd5, 0x06, 0x33, 0x77, 0xb4, 0x6c, 0xcf, + 0x0f, 0x5c, 0xa3, 0x6a, 0x58, 0xbe, 0xa6, 0x54, 0x7e, 0xab, 0xc0, 0x6a, 0x7b, 0xc4, 0x5d, 0x74, + 0xdb, 0xe8, 0xc2, 0xff, 0x22, 0x5c, 0x68, 0x7b, 0x86, 0x1b, 0xf8, 0xf6, 0x9e, 0x61, 0x05, 0x6d, + 0x4f, 0xdf, 0xcd, 0xe2, 0x39, 0xbd, 0x00, 0xe7, 0x25, 0x0e, 0xd7, 0xa8, 0xda, 0x37, 0x0c, 0x37, + 0x70, 0x74, 0xcf, 0xdb, 0xb7, 0xdd, 0x9a, 0xa6, 0x90, 0x2d, 0xd8, 0x98, 0xc0, 0xd0, 0xaa, 0xeb, + 0x9a, 0x9a, 0x2b, 0xb3, 0x8c, 0x7d, 0xbd, 0x19, 0xec, 0xd8, 0xbe, 0x56, 0xa8, 0xb4, 0xe8, 0x46, + 0x87, 0x90, 0x27, 0x0c, 0xb0, 0x76, 0x11, 0x8a, 0x96, 0x6d, 0x19, 0x59, 0x93, 0xd4, 0x32, 0x2c, + 0xea, 0x8e, 0xe3, 0xda, 0x37, 0x70, 0x40, 0x01, 0x16, 0x6a, 0x86, 0x45, 0x7b, 0x56, 0xa0, 0x25, + 0x8e, 0x6b, 0xb7, 0x6c, 0xdf, 0xa8, 0x69, 0xc5, 0x8a, 0x2b, 0x16, 0x8c, 0x68, 0xf4, 0xa0, 0xcf, + 0xec, 0x3f, 0x35, 0xa3, 0xae, 0xb7, 0x9b, 0x3e, 0xff, 0x20, 0x37, 0x03, 0xd7, 0xb8, 0xde, 0x36, + 0x3c, 0xdf, 0xd3, 0x14, 0xa2, 0xc1, 0xb2, 0x65, 0x18, 0x35, 0x2f, 0x70, 0x8d, 0x1b, 0xa6, 0xb1, + 0xaf, 0xa9, 0xb4, 0x4d, 0xf6, 0x9b, 0xfe, 0x43, 0xe5, 0x33, 0x05, 0x08, 0x83, 0x8b, 0x11, 0xc0, + 0xa2, 0x38, 0x3e, 0xdb, 0xb0, 0xd5, 0xa0, 0x1f, 0x16, 0x5f, 0xad, 0x65, 0xd7, 0xb2, 0x9f, 0x6c, + 0x03, 0x48, 0xa6, 0xdc, 0xae, 0xd7, 0x35, 0x85, 0x9c, 0x87, 0xe7, 0x32, 0xf4, 0x9a, 0x6b, 0x3b, + 0x9a, 0xba, 0xa5, 0x2e, 0x2a, 0xe4, 0x5c, 0xae, 0x70, 0xcf, 0x30, 0x1c, 0xad, 0x40, 0x87, 0x28, + 0x53, 0x20, 0x26, 0x20, 0xab, 0x5e, 0xac, 0x7c, 0xac, 0xc0, 0x06, 0xeb, 0xa6, 0x98, 0xcd, 0x71, + 0x57, 0x2f, 0xc0, 0x26, 0x47, 0xb6, 0x9a, 0xd4, 0xd1, 0xb3, 0xa0, 0xa5, 0x4a, 0x59, 0x37, 0x9f, + 0x87, 0xf5, 0x14, 0x15, 0xfb, 0xa1, 0xd2, 0xb5, 0x9a, 0x22, 0xef, 0x18, 0x9e, 0x1f, 0x18, 0xf5, + 0xba, 0xed, 0xfa, 0xac, 0x23, 0x85, 0x4a, 0x19, 0xd6, 0xab, 0xe1, 0x70, 0x4c, 0x75, 0x90, 0x68, + 0xd4, 0xed, 0x47, 0xd8, 0x85, 0x15, 0x58, 0x32, 0x3e, 0xf0, 0x0d, 0xcb, 0x33, 0x6d, 0x4b, 0x9b, + 0xab, 0x5c, 0xc8, 0xf0, 0x88, 0x55, 0xe3, 0x79, 0x0d, 0x6d, 0xae, 0xd2, 0x81, 0x15, 0xe1, 0x12, + 0xcb, 0x66, 0xc5, 0x36, 0x6c, 0x89, 0xb9, 0x86, 0xeb, 0x37, 0xfb, 0x0a, 0x9b, 0x70, 0x36, 0x5f, + 0x6e, 0xf8, 0x9a, 0x42, 0x47, 0x21, 0x53, 0x42, 0xe9, 0x6a, 0xe5, 0x0f, 0x0a, 0x6c, 0xf2, 0x6c, + 0x5a, 0xdc, 0x1e, 0xc1, 0xc0, 0x34, 0x11, 0x98, 0xa6, 0x02, 0x97, 0x7c, 0xb7, 0xed, 0xf9, 0x46, + 0x2d, 0xa8, 0x19, 0x37, 0xcc, 0xaa, 0x81, 0xd3, 0xc5, 0x74, 0x8d, 0x96, 0x61, 0xf9, 0x99, 0xbf, + 0x7e, 0x15, 0x5e, 0x9e, 0xc1, 0x6b, 0xd9, 0xbe, 0x78, 0xa6, 0xab, 0xe4, 0x65, 0xf8, 0xce, 0x0c, + 0xe6, 0x98, 0x51, 0xad, 0x7c, 0x08, 0xcb, 0x29, 0x80, 0xf0, 0x73, 0xf0, 0x9c, 0xfc, 0xec, 0x84, + 0xd1, 0x61, 0x37, 0x3a, 0xd2, 0xe6, 0xb2, 0x05, 0xee, 0x71, 0x14, 0xd1, 0x02, 0x5c, 0x90, 0x72, + 0x81, 0x1f, 0x0e, 0xef, 0x75, 0xa3, 0xce, 0x38, 0x3c, 0xd4, 0xd4, 0xca, 0xeb, 0xb0, 0x92, 0x42, + 0x30, 0xa2, 0x5f, 0xbe, 0x69, 0x73, 0x79, 0xd5, 0x32, 0x6a, 0x66, 0xbb, 0xa5, 0xcd, 0xd3, 0xa5, + 0xd8, 0x30, 0x77, 0x1b, 0x1a, 0x54, 0x3e, 0x55, 0xe8, 0x89, 0x19, 0xbf, 0x4f, 0xab, 0xae, 0x8b, + 0xb1, 0xa2, 0xf3, 0x84, 0x81, 0x9d, 0x19, 0x9e, 0xc7, 0x4c, 0xa9, 0x17, 0x60, 0x93, 0x3f, 0x04, + 0xba, 0x55, 0x0b, 0x1a, 0xba, 0x5b, 0xdb, 0xd7, 0x5d, 0x3a, 0x79, 0x6e, 0x6a, 0x2a, 0xae, 0x08, + 0x89, 0x12, 0xf8, 0x76, 0xbb, 0xda, 0xd0, 0x0a, 0x74, 0x02, 0xa6, 0xe8, 0x8e, 0x69, 0x69, 0x45, + 0x5c, 0x5f, 0x39, 0x6e, 0x6c, 0x96, 0x96, 0xcf, 0x57, 0xba, 0xa0, 0x65, 0xc3, 0x96, 0x72, 0x36, + 0x6d, 0xb7, 0x6d, 0x59, 0x4c, 0x80, 0xac, 0x41, 0xc9, 0xf6, 0x1b, 0x86, 0xcb, 0xe1, 0xe8, 0x10, + 0x7f, 0xae, 0x6d, 0xe9, 0x6d, 0xbf, 0x61, 0xbb, 0xe6, 0x2d, 0x94, 0x24, 0x9b, 0x70, 0xd6, 0x6b, + 0xea, 0xd5, 0x3d, 0x1c, 0x34, 0xd3, 0x0a, 0xaa, 0x0d, 0xdd, 0xb2, 0x8c, 0xa6, 0x06, 0x95, 0xbf, + 0x28, 0x70, 0x7e, 0x86, 0xdd, 0x8b, 0xbc, 0x06, 0xaf, 0x34, 0x0c, 0xbd, 0xd6, 0x34, 0x3c, 0x2f, + 0xa0, 0x4d, 0x1a, 0x96, 0xcf, 0xcd, 0xcb, 0x13, 0x67, 0xeb, 0x2b, 0xf0, 0xdd, 0xd9, 0xec, 0x89, + 0xdc, 0xfb, 0x1e, 0xbc, 0x34, 0x9b, 0x95, 0xcb, 0x41, 0x95, 0xce, 0xd9, 0xd9, 0x9c, 0xb1, 0xfc, + 0x2c, 0x54, 0x3e, 0x51, 0x60, 0x63, 0xb2, 0xba, 0x48, 0xfb, 0x66, 0x5a, 0x9e, 0xaf, 0x37, 0x9b, + 0x81, 0xa3, 0xbb, 0x7a, 0x2b, 0x30, 0x2c, 0xd7, 0x6e, 0x36, 0x27, 0xc9, 0x8d, 0x97, 0xe0, 0xc5, + 0xe9, 0xac, 0x5e, 0xd5, 0x35, 0x1d, 0xba, 0x00, 0xcb, 0xb0, 0x3d, 0x9d, 0xcb, 0x30, 0xab, 0x86, + 0xa6, 0xee, 0xbc, 0xff, 0xf9, 0x3f, 0xb6, 0xe7, 0x3e, 0x7f, 0xbc, 0xad, 0x7c, 0xf9, 0x78, 0x5b, + 0xf9, 0xfb, 0xe3, 0x6d, 0xe5, 0xd6, 0xab, 0xa7, 0x48, 0x44, 0x79, 0x7b, 0x01, 0xfd, 0x29, 0xde, + 0xfe, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x89, 0xcb, 0xc3, 0xdf, 0xfb, 0x85, 0x01, 0x00, } func (this *PluginSpecV1) Equal(that interface{}) bool { @@ -36091,6 +36097,15 @@ func (m *GithubAuthRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.ClientUserAgent) > 0 { + i -= len(m.ClientUserAgent) + copy(dAtA[i:], m.ClientUserAgent) + i = encodeVarintTypes(dAtA, i, uint64(len(m.ClientUserAgent))) + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0x92 + } if len(m.ClientLoginIP) > 0 { i -= len(m.ClientLoginIP) copy(dAtA[i:], m.ClientLoginIP) @@ -50544,6 +50559,10 @@ func (m *GithubAuthRequest) Size() (n int) { if l > 0 { n += 2 + l + sovTypes(uint64(l)) } + l = len(m.ClientUserAgent) + if l > 0 { + n += 2 + l + sovTypes(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -96841,6 +96860,38 @@ func (m *GithubAuthRequest) Unmarshal(dAtA []byte) error { } m.ClientLoginIP = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 18: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClientUserAgent", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ClientUserAgent = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) diff --git a/lib/auth/auth.go b/lib/auth/auth.go index 10a3ea1b68e88..73e5ce870259d 100644 --- a/lib/auth/auth.go +++ b/lib/auth/auth.go @@ -4092,7 +4092,7 @@ func (a *Server) ExtendWebSession(ctx context.Context, req authclient.WebSession } sessionTTL := utils.ToTTL(a.clock, expiresAt) - sess, err := a.newWebSession(ctx, NewWebSessionRequest{ + sess, _, err := a.newWebSession(ctx, NewWebSessionRequest{ User: req.User, LoginIP: identity.LoginIP, Roles: roles, diff --git a/lib/auth/auth_test.go b/lib/auth/auth_test.go index 092debe7a2e88..bdcf55bffb4a7 100644 --- a/lib/auth/auth_test.go +++ b/lib/auth/auth_test.go @@ -3012,7 +3012,7 @@ func TestNewWebSession(t *testing.T) { } bearerTokenTTL := min(req.SessionTTL, defaults.BearerTokenTTL) - ws, err := p.a.newWebSession(ctx, req, nil /* opts */) + ws, _, err := p.a.newWebSession(ctx, req, nil /* opts */) require.NoError(t, err) require.Equal(t, user.GetName(), ws.GetUser()) require.Equal(t, duration, ws.GetIdleTimeout()) diff --git a/lib/auth/github.go b/lib/auth/github.go index 7f535a935b8eb..ea1fdf0c13013 100644 --- a/lib/auth/github.go +++ b/lib/auth/github.go @@ -713,13 +713,15 @@ func (a *Server) validateGithubAuthCallback(ctx context.Context, diagCtx *SSODia // If the request is coming from a browser, create a web session. if req.CreateWebSession { session, err := a.CreateWebSessionFromReq(ctx, NewWebSessionRequest{ - User: userState.GetName(), - Roles: userState.GetRoles(), - Traits: userState.GetTraits(), - SessionTTL: params.SessionTTL, - LoginTime: a.clock.Now().UTC(), - LoginIP: req.ClientLoginIP, - AttestWebSession: true, + User: userState.GetName(), + Roles: userState.GetRoles(), + Traits: userState.GetTraits(), + SessionTTL: params.SessionTTL, + LoginTime: a.clock.Now().UTC(), + LoginIP: req.ClientLoginIP, + LoginUserAgent: req.ClientUserAgent, + AttestWebSession: true, + CreateDeviceWebToken: true, }) if err != nil { return nil, trace.Wrap(err, "Failed to create web session.") diff --git a/lib/auth/methods.go b/lib/auth/methods.go index 7dffef7b890d5..e42cf1ae5b398 100644 --- a/lib/auth/methods.go +++ b/lib/auth/methods.go @@ -30,7 +30,6 @@ import ( "github.com/gravitational/teleport/api/client/proto" "github.com/gravitational/teleport/api/constants" - devicepb "github.com/gravitational/teleport/api/gen/proto/go/teleport/devicetrust/v1" mfav1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/mfa/v1" "github.com/gravitational/teleport/api/types" apievents "github.com/gravitational/teleport/api/types/events" @@ -38,9 +37,7 @@ import ( wantypes "github.com/gravitational/teleport/lib/auth/webauthntypes" "github.com/gravitational/teleport/lib/authz" "github.com/gravitational/teleport/lib/defaults" - dtconfig "github.com/gravitational/teleport/lib/devicetrust/config" "github.com/gravitational/teleport/lib/events" - "github.com/gravitational/teleport/lib/modules" "github.com/gravitational/teleport/lib/services" "github.com/gravitational/teleport/lib/utils" ) @@ -630,89 +627,22 @@ func (a *Server) AuthenticateWebUser(ctx context.Context, req authclient.Authent } sess, err := a.CreateWebSessionFromReq(ctx, NewWebSessionRequest{ - User: user.GetName(), - LoginIP: loginIP, - Roles: user.GetRoles(), - Traits: user.GetTraits(), - LoginTime: a.clock.Now().UTC(), - AttestWebSession: true, + User: user.GetName(), + LoginIP: loginIP, + LoginUserAgent: userAgent, + Roles: user.GetRoles(), + Traits: user.GetTraits(), + LoginTime: a.clock.Now().UTC(), + AttestWebSession: true, + CreateDeviceWebToken: true, }) if err != nil { return nil, trace.Wrap(err) } - // Create the device trust DeviceWebToken. - // We only get a token if the server is enabled for Device Trust and the user - // has a suitable trusted device. - if loginIP != "" && userAgent != "" { - webToken, err := a.createDeviceWebToken(ctx, &devicepb.DeviceWebToken{ - WebSessionId: sess.GetName(), - BrowserUserAgent: userAgent, - BrowserIp: loginIP, - User: sess.GetUser(), - }) - switch { - case err != nil: - log.WithError(err).Warn("Failed to create DeviceWebToken for user") - case webToken != nil: // May be nil even if err==nil. - sess.SetDeviceWebToken(&types.DeviceWebToken{ - Id: webToken.Id, - Token: webToken.Token, - }) - } - } - - // Calculate the trusted device requirement for the session. Helps inform the - // frontend if the user might run into access problems without a trusted - // device. - trustedDeviceRequirement, err := a.calculateTrustedDeviceMode(ctx, func() ([]types.Role, error) { - // TODO(codingllama): Levegare the checker inside CreateWebSessionFromReq to - // avoid duplicate work here. - roles, err := services.FetchRoles(user.GetRoles(), a, user.GetTraits()) - if err != nil { - return nil, trace.Wrap(err) - } - return roles, nil - }) - if err != nil { - return nil, trace.Wrap(err) - } - sess.SetTrustedDeviceRequirement(trustedDeviceRequirement) - return sess, nil } -func (a *Server) calculateTrustedDeviceMode(ctx context.Context, getRoles func() ([]types.Role, error)) (types.TrustedDeviceRequirement, error) { - const unspecified = types.TrustedDeviceRequirement_TRUSTED_DEVICE_REQUIREMENT_UNSPECIFIED - - // Don't evaluate for OSS. - if !modules.GetModules().IsEnterpriseBuild() { - return unspecified, nil - } - - // Required by cluster mode? - ap, err := a.GetAuthPreference(ctx) - if err != nil { - return unspecified, trace.Wrap(err) - } - if dtconfig.GetEffectiveMode(ap.GetDeviceTrust()) == constants.DeviceTrustModeRequired { - return types.TrustedDeviceRequirement_TRUSTED_DEVICE_REQUIREMENT_REQUIRED, nil - } - - // Required by roles? - roles, err := getRoles() - if err != nil { - return unspecified, trace.Wrap(err) - } - for _, role := range roles { - if role.GetOptions().DeviceTrustMode == constants.DeviceTrustModeRequired { - return types.TrustedDeviceRequirement_TRUSTED_DEVICE_REQUIREMENT_REQUIRED, nil - } - } - - return types.TrustedDeviceRequirement_TRUSTED_DEVICE_REQUIREMENT_NOT_REQUIRED, nil -} - // AuthenticateSSHUser authenticates an SSH user and returns SSH and TLS // certificates for the public key in req. func (a *Server) AuthenticateSSHUser(ctx context.Context, req authclient.AuthenticateSSHRequest) (*authclient.SSHLoginResponse, error) { diff --git a/lib/auth/sessions.go b/lib/auth/sessions.go index 9b49071884ee8..92cc0d17d1e84 100644 --- a/lib/auth/sessions.go +++ b/lib/auth/sessions.go @@ -26,13 +26,16 @@ import ( "github.com/gravitational/teleport" "github.com/gravitational/teleport/api/client/proto" + "github.com/gravitational/teleport/api/constants" apidefaults "github.com/gravitational/teleport/api/defaults" + devicepb "github.com/gravitational/teleport/api/gen/proto/go/teleport/devicetrust/v1" mfav1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/mfa/v1" "github.com/gravitational/teleport/api/types" apievents "github.com/gravitational/teleport/api/types/events" "github.com/gravitational/teleport/api/utils/keys" "github.com/gravitational/teleport/lib/auth/native" "github.com/gravitational/teleport/lib/defaults" + dtconfig "github.com/gravitational/teleport/lib/devicetrust/config" "github.com/gravitational/teleport/lib/events" "github.com/gravitational/teleport/lib/jwt" "github.com/gravitational/teleport/lib/modules" @@ -48,6 +51,9 @@ type NewWebSessionRequest struct { User string // LoginIP is an observed IP of the client, it will be embedded into certificates. LoginIP string + // LoginUserAgent is the user agent of the client's browser, as captured by + // the Proxy. + LoginUserAgent string // Roles optionally lists additional user roles Roles []string // Traits optionally lists role traits @@ -69,6 +75,13 @@ type NewWebSessionRequest struct { // This should be provided when extending an attested web session in order to maintain the // session attested status. PrivateKey *keys.PrivateKey + // CreateDeviceWebToken informs Auth to issue a DeviceWebToken when creating + // this session. + // A DeviceWebToken must only be issued for users that have been authenticated + // in the same RPC. + // May only be set internally by Auth (and Auth-related logic), not allowed + // for external requests. + CreateDeviceWebToken bool } // CheckAndSetDefaults validates the request and sets defaults. @@ -89,7 +102,7 @@ func (r *NewWebSessionRequest) CheckAndSetDefaults() error { } func (a *Server) CreateWebSessionFromReq(ctx context.Context, req NewWebSessionRequest) (types.WebSession, error) { - session, err := a.newWebSession(ctx, req, nil /* opts */) + session, sessionChecker, err := a.newWebSession(ctx, req, nil /* opts */) if err != nil { return nil, trace.Wrap(err) } @@ -99,9 +112,96 @@ func (a *Server) CreateWebSessionFromReq(ctx context.Context, req NewWebSessionR return nil, trace.Wrap(err) } + // Issue and assign the DeviceWebToken, but never persist it with the + // session. + if req.CreateDeviceWebToken { + if err := a.augmentSessionForDeviceTrust(ctx, session, req.LoginIP, req.LoginUserAgent); err != nil { + return nil, trace.Wrap(err) + } + } + + // Assign the TrustedDeviceRequirement to the session, but do not persist it, + // so only the initial session gets it. + // This avoids persisting a possibly stale value. + if tdr, err := a.calculateTrustedDeviceMode(ctx, func() ([]types.Role, error) { + return sessionChecker.Roles(), nil + }); err != nil { + log. + WithError(err). + Warnf("Failed to calculate trusted device mode for session") + } else { + session.SetTrustedDeviceRequirement(tdr) + } + return session, nil } +func (a *Server) augmentSessionForDeviceTrust( + ctx context.Context, + session types.WebSession, + loginIP, userAgent string, +) error { + // IP and user agent are mandatory for device web authentication. + if loginIP == "" || userAgent == "" { + return nil + } + + // Create the device trust DeviceWebToken. + // We only get a token if the server is enabled for Device Trust and the user + // has a suitable trusted device. + webToken, err := a.createDeviceWebToken(ctx, &devicepb.DeviceWebToken{ + WebSessionId: session.GetName(), + BrowserUserAgent: userAgent, + BrowserIp: loginIP, + User: session.GetUser(), + }) + switch { + case err != nil: + log.WithError(err).Warn("Failed to create DeviceWebToken for user") + case webToken != nil: // May be nil even if err==nil. + session.SetDeviceWebToken(&types.DeviceWebToken{ + Id: webToken.Id, + Token: webToken.Token, + }) + } + + return nil +} + +func (a *Server) calculateTrustedDeviceMode( + ctx context.Context, + getRoles func() ([]types.Role, error), +) (types.TrustedDeviceRequirement, error) { + const unspecified = types.TrustedDeviceRequirement_TRUSTED_DEVICE_REQUIREMENT_UNSPECIFIED + + // Don't evaluate for OSS. + if !modules.GetModules().IsEnterpriseBuild() { + return unspecified, nil + } + + // Required by cluster mode? + ap, err := a.GetAuthPreference(ctx) + if err != nil { + return unspecified, trace.Wrap(err) + } + if dtconfig.GetEffectiveMode(ap.GetDeviceTrust()) == constants.DeviceTrustModeRequired { + return types.TrustedDeviceRequirement_TRUSTED_DEVICE_REQUIREMENT_REQUIRED, nil + } + + // Required by roles? + roles, err := getRoles() + if err != nil { + return unspecified, trace.Wrap(err) + } + for _, role := range roles { + if role.GetOptions().DeviceTrustMode == constants.DeviceTrustModeRequired { + return types.TrustedDeviceRequirement_TRUSTED_DEVICE_REQUIREMENT_REQUIRED, nil + } + } + + return types.TrustedDeviceRequirement_TRUSTED_DEVICE_REQUIREMENT_NOT_REQUIRED, nil +} + // newWebSessionOpts are WebSession creation options exclusive to Auth. // These options complement [types.NewWebSessionRequest]. // See [Server.newWebSession]. @@ -117,10 +217,10 @@ func (a *Server) newWebSession( ctx context.Context, req NewWebSessionRequest, opts *newWebSessionOpts, -) (types.WebSession, error) { +) (types.WebSession, services.AccessChecker, error) { userState, err := a.GetUserOrLoginState(ctx, req.User) if err != nil { - return nil, trace.Wrap(err) + return nil, nil, trace.Wrap(err) } if req.LoginIP == "" { // TODO(antonam): consider turning this into error after all use cases are covered (before v14.0 testplan) @@ -129,7 +229,7 @@ func (a *Server) newWebSession( clusterName, err := a.GetClusterName() if err != nil { - return nil, trace.Wrap(err) + return nil, nil, trace.Wrap(err) } checker, err := services.NewAccessChecker(&services.AccessInfo{ @@ -138,18 +238,18 @@ func (a *Server) newWebSession( AllowedResourceIDs: req.RequestedResourceIDs, }, clusterName.GetClusterName(), a) if err != nil { - return nil, trace.Wrap(err) + return nil, nil, trace.Wrap(err) } idleTimeout, err := a.getWebIdleTimeout(ctx) if err != nil { - return nil, trace.Wrap(err) + return nil, nil, trace.Wrap(err) } if req.PrivateKey == nil { req.PrivateKey, err = native.GeneratePrivateKey() if err != nil { - return nil, trace.Wrap(err) + return nil, nil, trace.Wrap(err) } } @@ -163,10 +263,10 @@ func (a *Server) newWebSession( // will be marked with the web session private key policy. webAttData, err := services.NewWebSessionAttestationData(req.PrivateKey.Public()) if err != nil { - return nil, trace.Wrap(err) + return nil, nil, trace.Wrap(err) } if err = a.UpsertKeyAttestationData(ctx, webAttData, sessionTTL); err != nil { - return nil, trace.Wrap(err) + return nil, nil, trace.Wrap(err) } } @@ -188,15 +288,15 @@ func (a *Server) newWebSession( certs, err := a.generateUserCert(ctx, certReq) if err != nil { - return nil, trace.Wrap(err) + return nil, nil, trace.Wrap(err) } token, err := utils.CryptoRandomHex(defaults.SessionTokenBytes) if err != nil { - return nil, trace.Wrap(err) + return nil, nil, trace.Wrap(err) } bearerToken, err := utils.CryptoRandomHex(defaults.SessionTokenBytes) if err != nil { - return nil, trace.Wrap(err) + return nil, nil, trace.Wrap(err) } bearerTokenTTL := min(sessionTTL, defaults.BearerTokenTTL) @@ -221,9 +321,9 @@ func (a *Server) newWebSession( sess, err := types.NewWebSession(token, types.KindWebSession, sessionSpec) if err != nil { - return nil, trace.Wrap(err) + return nil, nil, trace.Wrap(err) } - return sess, nil + return sess, checker, nil } func (a *Server) getWebIdleTimeout(ctx context.Context) (time.Duration, error) { @@ -352,6 +452,10 @@ func (a *Server) CreateAppSessionFromReq(ctx context.Context, req NewAppSessionR "this Teleport cluster is not licensed for application access, please contact the cluster administrator") } + if req.CreateDeviceWebToken { + return nil, trace.BadParameter("parameter CreateDeviceWebToken disallowed for App Sessions") + } + user, err := a.GetUserOrLoginState(ctx, req.User) if err != nil { return nil, trace.Wrap(err) diff --git a/lib/web/apiserver.go b/lib/web/apiserver.go index e209675939a65..3b3ba1c5e0a92 100644 --- a/lib/web/apiserver.go +++ b/lib/web/apiserver.go @@ -1757,6 +1757,7 @@ func (h *Handler) githubLoginWeb(w http.ResponseWriter, r *http.Request, p httpr CreateWebSession: true, ClientRedirectURL: req.ClientRedirectURL, ClientLoginIP: remoteAddr, + ClientUserAgent: r.UserAgent(), }) if err != nil { logger.WithError(err).Error("Error creating auth request.") @@ -1854,6 +1855,9 @@ func (h *Handler) githubCallback(w http.ResponseWriter, r *http.Request, p httpr return client.LoginFailedRedirectURL } + if dwt := response.Session.GetDeviceWebToken(); dwt != nil { + logger.Debug("GitHub WebSession created with device web token") + } return res.ClientRedirectURL } From 0134615cabfe6b95462aedd81501462002547a60 Mon Sep 17 00:00:00 2001 From: Michael Date: Tue, 30 Jul 2024 15:37:24 -0500 Subject: [PATCH 019/139] Fix device trust passthrough styles (#44678) This will set the top padding of the passthrough page to a screen height ratio instead of a fixed pixel size. Also, this will remove the absolute positioning of the bottom text for very short screen sizes to prevent it from overlapping with the text above --- .../components/AuthorizeDeviceWeb/AuthorizeDeviceWeb.tsx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/web/packages/shared/components/AuthorizeDeviceWeb/AuthorizeDeviceWeb.tsx b/web/packages/shared/components/AuthorizeDeviceWeb/AuthorizeDeviceWeb.tsx index 9a46336ea0efb..0bf8023beacd9 100644 --- a/web/packages/shared/components/AuthorizeDeviceWeb/AuthorizeDeviceWeb.tsx +++ b/web/packages/shared/components/AuthorizeDeviceWeb/AuthorizeDeviceWeb.tsx @@ -139,8 +139,10 @@ export const DeviceTrustConnectPassthrough = ({ const SkipAuthNotice = styled(Box)` text-align: center; width: 100%; - position: absolute; - bottom: 24px; + @media (min-height: 500px) { + position: absolute; + bottom: 24px; + } `; const DownloadButton = styled(ButtonLink)` @@ -156,5 +158,5 @@ const BoldText = styled.span` const Wrapper = styled(Box)` text-align: center; line-height: 32px; - padding-top: 200px; + padding-top: 5vh; `; From 265879e861d859a2740963a974a01110ad93d1ab Mon Sep 17 00:00:00 2001 From: fheinecke <23390735+fheinecke@users.noreply.github.com> Date: Tue, 30 Jul 2024 15:38:49 -0500 Subject: [PATCH 020/139] fix(helm-chart): adjust to entrypoint within dockerfile (#44697) Signed-off-by: Fred Heinecke Co-authored-by: Denis Pudov --- examples/chart/event-handler/templates/deployment.yaml | 2 +- .../tests/__snapshot__/deployment_test.yaml.snap | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/chart/event-handler/templates/deployment.yaml b/examples/chart/event-handler/templates/deployment.yaml index 2cc2b8bc705cf..368b0015ab7a1 100644 --- a/examples/chart/event-handler/templates/deployment.yaml +++ b/examples/chart/event-handler/templates/deployment.yaml @@ -35,7 +35,7 @@ spec: image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" imagePullPolicy: {{ .Values.image.pullPolicy }} command: - - /usr/local/bin/teleport-event-handler + - /usr/local/bin/teleport-plugin - start - "--config" - "/etc/teleport-event-handler.toml" diff --git a/examples/chart/event-handler/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/event-handler/tests/__snapshot__/deployment_test.yaml.snap index 48cd1306b809a..8568abd94ab63 100644 --- a/examples/chart/event-handler/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/event-handler/tests/__snapshot__/deployment_test.yaml.snap @@ -24,7 +24,7 @@ should match the snapshot: spec: containers: - command: - - /usr/local/bin/teleport-event-handler + - /usr/local/bin/teleport-plugin - start - --config - /etc/teleport-event-handler.toml @@ -73,7 +73,7 @@ should mount tls.existingCASecretName and set environment when set in values: 1: | containers: - command: - - /usr/local/bin/teleport-event-handler + - /usr/local/bin/teleport-plugin - start - --config - /etc/teleport-event-handler.toml From 6765a013ee16384d000ec3ca273406a9ac4649a3 Mon Sep 17 00:00:00 2001 From: Alan Parra Date: Tue, 30 Jul 2024 18:40:45 -0300 Subject: [PATCH 021/139] Test DeviceWebToken creation from CreateWebSessionFromReq (#44841) --- lib/auth/sessions_test.go | 85 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 lib/auth/sessions_test.go diff --git a/lib/auth/sessions_test.go b/lib/auth/sessions_test.go new file mode 100644 index 0000000000000..4af78758d24f9 --- /dev/null +++ b/lib/auth/sessions_test.go @@ -0,0 +1,85 @@ +// Teleport +// Copyright (C) 2024 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package auth + +import ( + "context" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + devicepb "github.com/gravitational/teleport/api/gen/proto/go/teleport/devicetrust/v1" + "github.com/gravitational/teleport/api/types" +) + +func TestServer_CreateWebSessionFromReq_deviceWebToken(t *testing.T) { + t.Parallel() + + testAuthServer, err := NewTestAuthServer(TestAuthServerConfig{ + Dir: t.TempDir(), + }) + require.NoError(t, err, "NewTestAuthServer failed") + t.Cleanup(func() { + assert.NoError(t, testAuthServer.Close(), "testAuthServer.Close() errored") + }) + + authServer := testAuthServer.AuthServer + ctx := context.Background() + + // Wire a fake CreateDeviceWebTokenFunc to authServer. + fakeWebToken := &devicepb.DeviceWebToken{ + Id: "423f10ed-c3c1-4de7-99dc-3bc5b9ab7fd5", + Token: "409d21e4-9563-497f-9393-1209f9e4289c", + } + wantToken := &types.DeviceWebToken{ + Id: fakeWebToken.Id, + Token: fakeWebToken.Token, + } + authServer.SetCreateDeviceWebTokenFunc(func(ctx context.Context, dwt *devicepb.DeviceWebToken) (*devicepb.DeviceWebToken, error) { + return fakeWebToken, nil + }) + + const userLlama = "llama" + user, _, err := CreateUserAndRole(authServer, userLlama, []string{userLlama} /* logins */, nil /* allowRules */) + require.NoError(t, err, "CreateUserAndRole failed") + + // Arbitrary, real-looking values. + const loginIP = "40.89.244.232" + const loginUserAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36" + + t.Run("ok", func(t *testing.T) { + session, err := authServer.CreateWebSessionFromReq(ctx, NewWebSessionRequest{ + User: userLlama, + LoginIP: loginIP, + LoginUserAgent: loginUserAgent, + Roles: user.GetRoles(), + Traits: user.GetTraits(), + SessionTTL: 1 * time.Minute, + LoginTime: time.Now(), + CreateDeviceWebToken: true, + }) + require.NoError(t, err, "CreateWebSessionFromReq failed") + + gotToken := session.GetDeviceWebToken() + if diff := cmp.Diff(wantToken, gotToken); diff != "" { + t.Errorf("CreateWebSessionFromReq DeviceWebToken mismatch (-want +got)\n%s", diff) + } + }) +} From bb0f35db0e419af35d80cb5790ef637fe31ee7d4 Mon Sep 17 00:00:00 2001 From: Roman Tkachenko Date: Tue, 30 Jul 2024 14:53:48 -0700 Subject: [PATCH 022/139] Add option to allow client redirects from IPs in specified CIDR ranges in SSO client logins (#44556) (#44846) Co-authored-by: Andrew LeFevre --- api/proto/teleport/legacy/types/types.proto | 2 + api/types/oidc.go | 23 + api/types/types.pb.go | 3367 +++++++++-------- docs/pages/access-controls/sso.mdx | 29 + docs/pages/reference/cli/tsh.mdx | 1 + .../data-sources/github_connector.mdx | 1 + .../data-sources/oidc_connector.mdx | 1 + .../data-sources/saml_connector.mdx | 1 + .../resources/github_connector.mdx | 1 + .../resources/oidc_connector.mdx | 1 + .../resources/saml_connector.mdx | 1 + ...sources.teleport.dev_githubconnectors.yaml | 7 + ...resources.teleport.dev_oidcconnectors.yaml | 7 + ...resources.teleport.dev_samlconnectors.yaml | 7 + examples/resources/adfs-connector.yaml | 12 + examples/resources/github.yaml | 11 + .../gworkspace-connector-inline.yaml | 11 + examples/resources/gworkspace-connector.yaml | 11 + examples/resources/oidc-connector.yaml | 11 + examples/resources/onelogin-connector.yaml | 11 + examples/resources/saml-connector.yaml | 11 + ...sources.teleport.dev_githubconnectors.yaml | 7 + ...resources.teleport.dev_oidcconnectors.yaml | 7 + ...resources.teleport.dev_samlconnectors.yaml | 7 + .../terraform/tfschema/types_terraform.go | 291 +- lib/auth/github.go | 78 +- lib/auth/github_test.go | 57 + lib/client/redirect.go | 7 +- lib/services/local/users.go | 9 + 29 files changed, 2289 insertions(+), 1701 deletions(-) diff --git a/api/proto/teleport/legacy/types/types.proto b/api/proto/teleport/legacy/types/types.proto index 435728fc1366b..5b909502bb7b8 100644 --- a/api/proto/teleport/legacy/types/types.proto +++ b/api/proto/teleport/legacy/types/types.proto @@ -4409,6 +4409,8 @@ message MaxAge { message SSOClientRedirectSettings { // a list of hostnames allowed for https client redirect URLs repeated string allowed_https_hostnames = 1; + // a list of CIDRs allowed for HTTP or HTTPS client redirect URLs + repeated string insecure_allowed_cidr_ranges = 2; } // OIDCAuthRequest is a request to authenticate with OIDC diff --git a/api/types/oidc.go b/api/types/oidc.go index a5a498bc425ba..d80da8a72f33f 100644 --- a/api/types/oidc.go +++ b/api/types/oidc.go @@ -17,6 +17,7 @@ limitations under the License. package types import ( + "net/netip" "net/url" "slices" "time" @@ -35,6 +36,11 @@ type OIDCConnector interface { // ResourceWithSecrets provides common methods for objects ResourceWithSecrets ResourceWithOrigin + // Validate will preform checks not found in CheckAndSetDefaults + // that should only be preformed when the OIDC connector resource + // itself is being created or updated, not when a OIDCConnector + // object is being created or updated. + Validate() error // Issuer URL is the endpoint of the provider, e.g. https://accounts.google.com GetIssuerURL() string // ClientID is id for authentication client (in our case it's our Auth server) @@ -449,6 +455,23 @@ func (o *OIDCConnectorV3) CheckAndSetDefaults() error { return nil } +// Validate will preform checks not found in CheckAndSetDefaults +// that should only be preformed when the OIDC connector resource +// itself is being created or updated, not when a OIDCConnector +// object is being created or updated. +func (o *OIDCConnectorV3) Validate() error { + if o.Spec.ClientRedirectSettings != nil { + for _, cidrStr := range o.Spec.ClientRedirectSettings.InsecureAllowedCidrRanges { + _, err := netip.ParsePrefix(cidrStr) + if err != nil { + return trace.BadParameter("bad CIDR range in insecure_allowed_cidr_ranges '%s': %v", cidrStr, err) + } + } + } + + return nil +} + // GetAllowUnverifiedEmail returns true if unverified emails should be allowed in received users. func (o *OIDCConnectorV3) GetAllowUnverifiedEmail() bool { return o.Spec.AllowUnverifiedEmail diff --git a/api/types/types.pb.go b/api/types/types.pb.go index ef29d41be7928..c1ccbdd9a2a1d 100644 --- a/api/types/types.pb.go +++ b/api/types/types.pb.go @@ -11410,9 +11410,11 @@ var xxx_messageInfo_MaxAge proto.InternalMessageInfo type SSOClientRedirectSettings struct { // a list of hostnames allowed for https client redirect URLs AllowedHttpsHostnames []string `protobuf:"bytes,1,rep,name=allowed_https_hostnames,json=allowedHttpsHostnames,proto3" json:"allowed_https_hostnames,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + // a list of CIDRs allowed for HTTP or HTTPS client redirect URLs + InsecureAllowedCidrRanges []string `protobuf:"bytes,2,rep,name=insecure_allowed_cidr_ranges,json=insecureAllowedCidrRanges,proto3" json:"insecure_allowed_cidr_ranges,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *SSOClientRedirectSettings) Reset() { *m = SSOClientRedirectSettings{} } @@ -19288,1661 +19290,1663 @@ func init() { func init() { proto.RegisterFile("teleport/legacy/types/types.proto", fileDescriptor_9198ee693835762e) } var fileDescriptor_9198ee693835762e = []byte{ - // 26463 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xfd, 0x7d, 0x70, 0x1c, 0x49, - 0x76, 0x20, 0x86, 0x4f, 0x7f, 0x00, 0x68, 0x3c, 0x7c, 0x35, 0x12, 0x20, 0x09, 0x62, 0x86, 0x03, - 0x4e, 0x71, 0x86, 0x43, 0xce, 0x07, 0xb9, 0x04, 0x77, 0xb8, 0x3b, 0x3b, 0x9f, 0x8d, 0x6e, 0x90, - 0x68, 0x12, 0x04, 0xb0, 0xd5, 0x20, 0xb0, 0xa3, 0xd9, 0xdd, 0xda, 0x42, 0x77, 0x02, 0xa8, 0x41, - 0x77, 0x57, 0x6f, 0x55, 0x35, 0x41, 0xac, 0xee, 0x7e, 0xa7, 0x8f, 0xd3, 0xed, 0x4f, 0xbe, 0xd3, - 0x97, 0x6f, 0x65, 0xed, 0x39, 0x74, 0x0a, 0x85, 0x7c, 0x77, 0x96, 0x3f, 0x4e, 0xe1, 0x90, 0x74, - 0xe1, 0x73, 0x28, 0x2c, 0x9f, 0x1c, 0xb2, 0x42, 0xd6, 0xc5, 0xd9, 0x72, 0xf8, 0x7b, 0xad, 0x80, - 0x2c, 0xeb, 0xe2, 0xc2, 0xc1, 0xb0, 0x1d, 0x3a, 0xcb, 0x71, 0x61, 0x8f, 0x43, 0xb6, 0x23, 0x5f, - 0x66, 0x56, 0x65, 0x56, 0x55, 0x37, 0x1a, 0x33, 0x9c, 0x3b, 0x71, 0xe3, 0xfe, 0x21, 0xd1, 0x2f, - 0xdf, 0x7b, 0x99, 0x95, 0x1f, 0x2f, 0x5f, 0xbe, 0x7c, 0xef, 0x25, 0xbc, 0x10, 0xd0, 0x26, 0xed, - 0xb8, 0x5e, 0x70, 0xbd, 0x49, 0xf7, 0xec, 0xfa, 0xd1, 0xf5, 0xe0, 0xa8, 0x43, 0x7d, 0xfe, 0xef, - 0xb5, 0x8e, 0xe7, 0x06, 0x2e, 0x19, 0xc2, 0x1f, 0xf3, 0xb3, 0x7b, 0xee, 0x9e, 0x8b, 0x90, 0xeb, - 0xec, 0x2f, 0x5e, 0x38, 0xbf, 0xb0, 0xe7, 0xba, 0x7b, 0x4d, 0x7a, 0x1d, 0x7f, 0xed, 0x74, 0x77, - 0xaf, 0x07, 0x4e, 0x8b, 0xfa, 0x81, 0xdd, 0xea, 0x08, 0x84, 0xab, 0x61, 0x05, 0x76, 0x10, 0xb0, - 0x92, 0xc0, 0x71, 0xdb, 0xd7, 0x1f, 0xde, 0x50, 0x7f, 0x0a, 0xd4, 0xd7, 0xd3, 0xdb, 0x72, 0xe8, - 0xd9, 0x9d, 0x0e, 0xf5, 0xa2, 0x3f, 0x38, 0xba, 0xf1, 0x0b, 0x39, 0x18, 0xbd, 0x47, 0x69, 0xa7, - 0xd4, 0x74, 0x1e, 0x52, 0x72, 0x09, 0xf2, 0x6b, 0x76, 0x8b, 0xce, 0x65, 0x2e, 0x66, 0xae, 0x8c, - 0x2e, 0x4d, 0x3d, 0x3e, 0x5e, 0x18, 0xf3, 0xa9, 0xf7, 0x90, 0x7a, 0x56, 0xdb, 0x6e, 0x51, 0x13, - 0x0b, 0xc9, 0xab, 0x30, 0xca, 0xfe, 0xf7, 0x3b, 0x76, 0x9d, 0xce, 0x65, 0x11, 0x73, 0xe2, 0xf1, - 0xf1, 0xc2, 0x68, 0x5b, 0x02, 0xcd, 0xa8, 0x9c, 0x54, 0x61, 0x64, 0xf9, 0x51, 0xc7, 0xf1, 0xa8, - 0x3f, 0x97, 0xbf, 0x98, 0xb9, 0x32, 0xb6, 0x38, 0x7f, 0x8d, 0x7f, 0xec, 0x35, 0xf9, 0xb1, 0xd7, - 0x36, 0xe5, 0xc7, 0x2e, 0xcd, 0xfc, 0xee, 0xf1, 0xc2, 0x33, 0x8f, 0x8f, 0x17, 0x46, 0x28, 0x27, - 0xf9, 0xe9, 0x3f, 0x5c, 0xc8, 0x98, 0x92, 0x9e, 0xbc, 0x0d, 0xf9, 0xcd, 0xa3, 0x0e, 0x9d, 0x1b, - 0xbd, 0x98, 0xb9, 0x32, 0xb9, 0xf8, 0xfc, 0x35, 0xde, 0xbd, 0x61, 0xe3, 0xa3, 0xbf, 0x18, 0xd6, - 0x52, 0xe1, 0xf1, 0xf1, 0x42, 0x9e, 0xa1, 0x98, 0x48, 0x45, 0x5e, 0x87, 0xe1, 0x15, 0xd7, 0x0f, - 0xaa, 0x95, 0x39, 0xc0, 0x26, 0x9f, 0x79, 0x7c, 0xbc, 0x30, 0xbd, 0xef, 0xfa, 0x81, 0xe5, 0x34, - 0x5e, 0x73, 0x5b, 0x4e, 0x40, 0x5b, 0x9d, 0xe0, 0xc8, 0x14, 0x48, 0xc6, 0x23, 0x98, 0xd0, 0xf8, - 0x91, 0x31, 0x18, 0x79, 0xb0, 0x76, 0x6f, 0x6d, 0x7d, 0x7b, 0xad, 0xf8, 0x0c, 0x29, 0x40, 0x7e, - 0x6d, 0xbd, 0xb2, 0x5c, 0xcc, 0x90, 0x11, 0xc8, 0x95, 0x36, 0x36, 0x8a, 0x59, 0x32, 0x0e, 0x85, - 0x4a, 0x69, 0xb3, 0xb4, 0x54, 0xaa, 0x2d, 0x17, 0x73, 0x64, 0x06, 0xa6, 0xb6, 0xab, 0x6b, 0x95, - 0xf5, 0xed, 0x9a, 0x55, 0x59, 0xae, 0xdd, 0xdb, 0x5c, 0xdf, 0x28, 0xe6, 0xc9, 0x24, 0xc0, 0xbd, - 0x07, 0x4b, 0xcb, 0xe6, 0xda, 0xf2, 0xe6, 0x72, 0xad, 0x38, 0x44, 0x66, 0xa1, 0x28, 0x49, 0xac, - 0xda, 0xb2, 0xb9, 0x55, 0x2d, 0x2f, 0x17, 0x87, 0xef, 0xe6, 0x0b, 0xb9, 0x62, 0xde, 0x1c, 0x59, - 0xa5, 0xb6, 0x4f, 0xab, 0x15, 0xe3, 0xdf, 0xc8, 0x41, 0xe1, 0x3e, 0x0d, 0xec, 0x86, 0x1d, 0xd8, - 0xe4, 0x39, 0x6d, 0x7c, 0xf0, 0x13, 0x95, 0x81, 0xb9, 0x94, 0x1c, 0x98, 0xa1, 0xc7, 0xc7, 0x0b, - 0x99, 0xd7, 0xd5, 0x01, 0x79, 0x0b, 0xc6, 0x2a, 0xd4, 0xaf, 0x7b, 0x4e, 0x87, 0x4d, 0x9a, 0xb9, - 0x1c, 0xa2, 0x9d, 0x7f, 0x7c, 0xbc, 0x70, 0xa6, 0x11, 0x81, 0x95, 0x0e, 0x51, 0xb1, 0x49, 0x15, - 0x86, 0x57, 0xed, 0x1d, 0xda, 0xf4, 0xe7, 0x86, 0x2e, 0xe6, 0xae, 0x8c, 0x2d, 0x3e, 0x2b, 0x06, - 0x41, 0x36, 0xf0, 0x1a, 0x2f, 0x5d, 0x6e, 0x07, 0xde, 0xd1, 0xd2, 0xec, 0xe3, 0xe3, 0x85, 0x62, - 0x13, 0x01, 0x6a, 0x07, 0x73, 0x14, 0x52, 0x8b, 0x26, 0xc6, 0xf0, 0x89, 0x13, 0xe3, 0xc2, 0xef, - 0x1e, 0x2f, 0x64, 0xd8, 0x80, 0x89, 0x89, 0x11, 0xf1, 0xd3, 0xa7, 0xc8, 0x22, 0x14, 0x4c, 0xfa, - 0xd0, 0xf1, 0xd9, 0x97, 0x15, 0xf0, 0xcb, 0xce, 0x3e, 0x3e, 0x5e, 0x20, 0x9e, 0x80, 0x29, 0xcd, - 0x08, 0xf1, 0xe6, 0xdf, 0x84, 0x31, 0xa5, 0xd5, 0xa4, 0x08, 0xb9, 0x03, 0x7a, 0xc4, 0x7b, 0xd8, - 0x64, 0x7f, 0x92, 0x59, 0x18, 0x7a, 0x68, 0x37, 0xbb, 0xa2, 0x4b, 0x4d, 0xfe, 0xe3, 0x4b, 0xd9, - 0x2f, 0x66, 0xee, 0xe6, 0x0b, 0x23, 0xc5, 0x82, 0x99, 0xad, 0x56, 0x8c, 0x7f, 0x35, 0x0f, 0x05, - 0xd3, 0xe5, 0x0b, 0x91, 0x5c, 0x85, 0xa1, 0x5a, 0x60, 0x07, 0x72, 0x98, 0x66, 0x1e, 0x1f, 0x2f, - 0x4c, 0xb1, 0x45, 0x4a, 0x95, 0xfa, 0x39, 0x06, 0x43, 0xdd, 0xd8, 0xb7, 0x7d, 0x39, 0x5c, 0x88, - 0xda, 0x61, 0x00, 0x15, 0x15, 0x31, 0xc8, 0x65, 0xc8, 0xdf, 0x77, 0x1b, 0x54, 0x8c, 0x18, 0x79, - 0x7c, 0xbc, 0x30, 0xd9, 0x72, 0x1b, 0x2a, 0x22, 0x96, 0x93, 0xd7, 0x60, 0xb4, 0xdc, 0xf5, 0x3c, - 0xda, 0x66, 0x73, 0x3d, 0x8f, 0xc8, 0x93, 0x8f, 0x8f, 0x17, 0xa0, 0xce, 0x81, 0x96, 0xd3, 0x30, - 0x23, 0x04, 0x36, 0x0c, 0xb5, 0xc0, 0xf6, 0x02, 0xda, 0x98, 0x1b, 0x1a, 0x68, 0x18, 0xd8, 0xfa, - 0x9c, 0xf6, 0x39, 0x49, 0x7c, 0x18, 0x04, 0x27, 0xb2, 0x02, 0x63, 0x77, 0x3c, 0xbb, 0x4e, 0x37, - 0xa8, 0xe7, 0xb8, 0x0d, 0x1c, 0xdf, 0xdc, 0xd2, 0xe5, 0xc7, 0xc7, 0x0b, 0x67, 0xf7, 0x18, 0xd8, - 0xea, 0x20, 0x3c, 0xa2, 0xfe, 0xf8, 0x78, 0xa1, 0x50, 0xe9, 0x7a, 0xd8, 0x7b, 0xa6, 0x4a, 0x4a, - 0xbe, 0xc1, 0x06, 0xc7, 0x0f, 0xb0, 0x6b, 0x69, 0x63, 0x6e, 0xe4, 0xc4, 0x26, 0x1a, 0xa2, 0x89, - 0x67, 0x9b, 0xb6, 0x1f, 0x58, 0x1e, 0xa7, 0x8b, 0xb5, 0x53, 0x65, 0x49, 0xd6, 0xa1, 0x50, 0xab, - 0xef, 0xd3, 0x46, 0xb7, 0x49, 0x71, 0xca, 0x8c, 0x2d, 0x9e, 0x13, 0x93, 0x5a, 0x8e, 0xa7, 0x2c, - 0x5e, 0x9a, 0x17, 0xbc, 0x89, 0x2f, 0x20, 0xea, 0x7c, 0x92, 0x58, 0x5f, 0x2a, 0x7c, 0xf7, 0x17, - 0x17, 0x9e, 0xf9, 0xa1, 0x3f, 0xb8, 0xf8, 0x8c, 0xf1, 0xef, 0x67, 0xa1, 0x18, 0x67, 0x42, 0x76, - 0x61, 0xe2, 0x41, 0xa7, 0x61, 0x07, 0xb4, 0xdc, 0x74, 0x68, 0x3b, 0xf0, 0x71, 0x92, 0xf4, 0xff, - 0xa6, 0x17, 0x45, 0xbd, 0x73, 0x5d, 0x24, 0xb4, 0xea, 0x9c, 0x32, 0xf6, 0x55, 0x3a, 0xdb, 0xa8, - 0x9e, 0x1a, 0x0a, 0x70, 0x1f, 0x67, 0xd8, 0xe9, 0xea, 0xe1, 0xa2, 0xbf, 0x47, 0x3d, 0x82, 0xad, - 0x98, 0x40, 0xed, 0xc6, 0xce, 0x11, 0xce, 0xcc, 0xc1, 0x27, 0x10, 0x23, 0x49, 0x99, 0x40, 0x0c, - 0x6c, 0xfc, 0xe3, 0x0c, 0x4c, 0x9a, 0xd4, 0x77, 0xbb, 0x5e, 0x9d, 0xae, 0x50, 0xbb, 0x41, 0x3d, - 0x36, 0xfd, 0xef, 0x39, 0xed, 0x86, 0x58, 0x53, 0x38, 0xfd, 0x0f, 0x9c, 0xb6, 0x2a, 0xba, 0xb1, - 0x9c, 0x7c, 0x0e, 0x46, 0x6a, 0xdd, 0x1d, 0x44, 0xcd, 0x46, 0x12, 0xc0, 0xef, 0xee, 0x58, 0x31, - 0x74, 0x89, 0x46, 0xae, 0xc3, 0xc8, 0x16, 0xf5, 0xfc, 0x48, 0x1a, 0xe2, 0xd6, 0xf0, 0x90, 0x83, - 0x54, 0x02, 0x81, 0x45, 0xee, 0x44, 0x12, 0x59, 0x6c, 0x6a, 0x53, 0x31, 0x39, 0x18, 0x4d, 0x95, - 0x96, 0x80, 0xa8, 0x53, 0x45, 0x62, 0x19, 0x3f, 0x93, 0x85, 0x62, 0xc5, 0x0e, 0xec, 0x1d, 0xdb, - 0x17, 0xfd, 0xb9, 0x75, 0x93, 0xc9, 0x78, 0xe5, 0x43, 0x51, 0xc6, 0xb3, 0x96, 0x7f, 0xe2, 0xcf, - 0x7b, 0x29, 0xfe, 0x79, 0x63, 0x6c, 0x87, 0x15, 0x9f, 0x17, 0x7d, 0xd4, 0x3b, 0x27, 0x7f, 0x54, - 0x51, 0x7c, 0x54, 0x41, 0x7e, 0x54, 0xf4, 0x29, 0xe4, 0x1d, 0xc8, 0xd7, 0x3a, 0xb4, 0x2e, 0x84, - 0x88, 0xdc, 0x17, 0xf4, 0x8f, 0x63, 0x08, 0x5b, 0x37, 0x97, 0xc6, 0x05, 0x9b, 0xbc, 0xdf, 0xa1, - 0x75, 0x13, 0xc9, 0x94, 0x45, 0xf3, 0xf7, 0x73, 0x30, 0x9b, 0x46, 0xa6, 0x7e, 0xc7, 0x70, 0x9f, - 0xef, 0xb8, 0x02, 0x05, 0xb6, 0x85, 0xb3, 0x6d, 0x11, 0xc5, 0xc5, 0xe8, 0xd2, 0x38, 0x6b, 0xf2, - 0xbe, 0x80, 0x99, 0x61, 0x29, 0xb9, 0x14, 0x6a, 0x04, 0x85, 0x88, 0x9f, 0xd0, 0x08, 0xa4, 0x1e, - 0xc0, 0xc6, 0x5a, 0x2e, 0x61, 0x54, 0x1c, 0xa2, 0x6e, 0x91, 0xe0, 0x68, 0xac, 0x3d, 0x01, 0xd1, - 0xb6, 0x19, 0xb9, 0x29, 0x2c, 0x43, 0x41, 0x7e, 0xd6, 0xdc, 0x38, 0x32, 0x9a, 0x8e, 0x75, 0xd2, - 0xd6, 0x4d, 0x3e, 0x98, 0x0d, 0xf1, 0x5b, 0x65, 0x23, 0x71, 0xc8, 0x4d, 0x28, 0x6c, 0x78, 0xee, - 0xa3, 0xa3, 0x6a, 0xc5, 0x9f, 0x9b, 0xb8, 0x98, 0xbb, 0x32, 0xba, 0x74, 0xee, 0xf1, 0xf1, 0xc2, - 0x4c, 0x87, 0xc1, 0x2c, 0xa7, 0xa1, 0xee, 0xb4, 0x21, 0xe2, 0xdd, 0x7c, 0x21, 0x53, 0xcc, 0xde, - 0xcd, 0x17, 0xb2, 0xc5, 0x1c, 0x57, 0x2f, 0xee, 0xe6, 0x0b, 0xf9, 0xe2, 0xd0, 0xdd, 0x7c, 0x61, - 0x08, 0x15, 0x8e, 0xd1, 0x22, 0xdc, 0xcd, 0x17, 0xc6, 0x8a, 0xe3, 0xda, 0x6e, 0x8f, 0x0c, 0x02, - 0xb7, 0xee, 0x36, 0xcd, 0xdc, 0x03, 0xb3, 0x6a, 0x0e, 0x97, 0x4b, 0x65, 0xea, 0x05, 0x66, 0xae, - 0xb4, 0x5d, 0x33, 0x27, 0x2a, 0x47, 0x6d, 0xbb, 0xe5, 0xd4, 0xf9, 0xd6, 0x69, 0xe6, 0xee, 0x94, - 0x37, 0x8c, 0x12, 0x4c, 0x46, 0xdf, 0xb2, 0xea, 0xf8, 0x01, 0xb9, 0x0e, 0xa3, 0x12, 0xc2, 0x04, - 0x5d, 0x2e, 0xf5, 0xab, 0xcd, 0x08, 0xc7, 0xf8, 0x9d, 0x2c, 0x40, 0x54, 0xf2, 0x94, 0xae, 0x85, - 0x2f, 0x68, 0x6b, 0xe1, 0x4c, 0x7c, 0x2d, 0xf4, 0x5c, 0x05, 0xe4, 0x3d, 0x18, 0x66, 0x6a, 0x41, - 0x57, 0xaa, 0x44, 0xe7, 0xe2, 0xa4, 0x58, 0xb8, 0x75, 0x73, 0x69, 0x52, 0x10, 0x0f, 0xfb, 0x08, - 0x31, 0x05, 0x99, 0xb2, 0x8c, 0x7e, 0x61, 0x24, 0x1a, 0x0c, 0xb1, 0x80, 0xae, 0x40, 0x38, 0xa0, - 0xa2, 0x43, 0x71, 0x65, 0x74, 0xe4, 0x20, 0x87, 0xa5, 0xe4, 0x3c, 0xb0, 0x01, 0x17, 0x9d, 0x3a, - 0xf2, 0xf8, 0x78, 0x21, 0xd7, 0xf5, 0x1c, 0x9c, 0x04, 0xe4, 0x3a, 0x88, 0x69, 0x20, 0x3a, 0x90, - 0xcd, 0xbe, 0xe9, 0xba, 0x6d, 0xd5, 0xa9, 0x17, 0x44, 0x3d, 0x3e, 0x97, 0x91, 0xb3, 0x85, 0x74, - 0x40, 0x9f, 0x2a, 0x73, 0x79, 0x9c, 0x06, 0x57, 0x52, 0x7b, 0xe5, 0x9a, 0x86, 0xca, 0xd5, 0xc8, - 0x8b, 0x72, 0x57, 0x6a, 0xf0, 0x32, 0x2b, 0xa1, 0x52, 0xea, 0x15, 0x90, 0x9b, 0xc0, 0x66, 0xa8, - 0xe8, 0x7d, 0x10, 0xf5, 0x94, 0xb6, 0x6b, 0x4b, 0x67, 0x04, 0xa7, 0x09, 0xfb, 0x50, 0x25, 0x67, - 0xd8, 0xe4, 0x2d, 0x60, 0x53, 0x58, 0xf4, 0x3b, 0x11, 0x44, 0x77, 0xca, 0x1b, 0xe5, 0xa6, 0xdb, - 0x6d, 0xd4, 0xbe, 0xbc, 0x1a, 0x11, 0xef, 0xd5, 0x3b, 0x2a, 0xf1, 0x9d, 0xf2, 0x06, 0x79, 0x0b, - 0x86, 0x4a, 0xdf, 0xea, 0x7a, 0x54, 0xe8, 0x27, 0xe3, 0xb2, 0x4e, 0x06, 0x5b, 0x3a, 0x27, 0x08, - 0xa7, 0x6c, 0xf6, 0x53, 0xd5, 0xeb, 0xb0, 0x9c, 0xd5, 0xbc, 0xb9, 0x5a, 0x13, 0xba, 0x07, 0x89, - 0x75, 0xcb, 0xe6, 0xaa, 0xd2, 0xec, 0x40, 0xfb, 0x6a, 0x46, 0x45, 0xae, 0x43, 0xb6, 0x54, 0xc1, - 0x13, 0xd1, 0xd8, 0xe2, 0xa8, 0xac, 0xb6, 0xb2, 0x34, 0x2b, 0x48, 0xc6, 0x6d, 0x75, 0x19, 0x64, - 0x4b, 0x15, 0xb2, 0x04, 0x43, 0xf7, 0x8f, 0x6a, 0x5f, 0x5e, 0x15, 0xc2, 0x6c, 0x46, 0xce, 0x6b, - 0x06, 0x5b, 0xc7, 0x65, 0xef, 0x47, 0x2d, 0x6e, 0x1d, 0xf9, 0xdf, 0x6c, 0xaa, 0x2d, 0x46, 0x34, - 0xb2, 0x01, 0xa3, 0xa5, 0x46, 0xcb, 0x69, 0x3f, 0xf0, 0xa9, 0x37, 0x37, 0x86, 0x7c, 0xe6, 0x62, - 0xed, 0x0e, 0xcb, 0x97, 0xe6, 0x1e, 0x1f, 0x2f, 0xcc, 0xda, 0xec, 0xa7, 0xd5, 0xf5, 0xa9, 0xa7, - 0x70, 0x8b, 0x98, 0x90, 0x0d, 0x80, 0xfb, 0x6e, 0x7b, 0xcf, 0x2d, 0x05, 0x4d, 0xdb, 0x8f, 0x89, - 0xc7, 0xa8, 0x20, 0x54, 0x1f, 0xce, 0xb4, 0x18, 0xcc, 0xb2, 0x19, 0x50, 0x61, 0xa8, 0xf0, 0x20, - 0xb7, 0x61, 0x78, 0xdd, 0xb3, 0xeb, 0x4d, 0x3a, 0x37, 0x81, 0xdc, 0x66, 0x05, 0x37, 0x0e, 0x94, - 0x5f, 0x3a, 0x27, 0x18, 0x16, 0x5d, 0x04, 0xab, 0xc7, 0x14, 0x8e, 0x38, 0xbf, 0x0d, 0x24, 0x39, - 0x27, 0x53, 0x0e, 0x09, 0xaf, 0xaa, 0x87, 0x84, 0x68, 0xd1, 0x97, 0xdd, 0x56, 0xcb, 0x6e, 0x37, - 0x90, 0x76, 0x6b, 0x51, 0x39, 0x3b, 0x18, 0xdf, 0x84, 0xe9, 0x44, 0x67, 0x9d, 0x70, 0xbe, 0x7b, - 0x17, 0xa6, 0x2a, 0x74, 0xd7, 0xee, 0x36, 0x83, 0x70, 0x27, 0xe1, 0x4b, 0x14, 0x4f, 0x5a, 0x0d, - 0x5e, 0x64, 0xc9, 0xed, 0xc3, 0x8c, 0x23, 0x1b, 0xef, 0xc0, 0x84, 0xf6, 0xf9, 0xec, 0xa8, 0x50, - 0xea, 0x36, 0x9c, 0x00, 0x07, 0x32, 0x13, 0x1d, 0x15, 0x6c, 0x06, 0xc4, 0xe1, 0x32, 0x23, 0x04, - 0xe3, 0x6f, 0xa9, 0xda, 0x8a, 0x90, 0x44, 0xec, 0x58, 0x2d, 0xe4, 0x41, 0x26, 0xd2, 0x9d, 0x12, - 0xf2, 0x20, 0x94, 0x06, 0x57, 0xf9, 0xda, 0xcc, 0x26, 0xd6, 0xe6, 0x98, 0x18, 0x89, 0x9c, 0x7d, - 0xe8, 0xf3, 0x15, 0x19, 0xce, 0xd4, 0xdc, 0x27, 0x9f, 0xa9, 0xef, 0xc1, 0xf8, 0x7d, 0xbb, 0x6d, - 0xef, 0xd1, 0x06, 0xfb, 0x02, 0x2e, 0x7b, 0x46, 0x97, 0x9e, 0x7d, 0x7c, 0xbc, 0x70, 0xae, 0xc5, - 0xe1, 0xf8, 0x95, 0xea, 0x24, 0xd2, 0x08, 0xc8, 0x0d, 0xb9, 0xb2, 0x87, 0x52, 0x56, 0xf6, 0x84, - 0xa8, 0x7d, 0x08, 0x57, 0xb6, 0x58, 0xcf, 0xc6, 0xff, 0x51, 0xc0, 0x6f, 0x24, 0xaf, 0xc1, 0xb0, - 0x49, 0xf7, 0xd8, 0x56, 0x93, 0x89, 0x06, 0xc9, 0x43, 0x88, 0xda, 0x31, 0x1c, 0x07, 0xf5, 0x0c, - 0xda, 0xf0, 0xf7, 0x9d, 0xdd, 0x40, 0xf4, 0x4e, 0xa8, 0x67, 0x08, 0xb0, 0xa2, 0x67, 0x08, 0x88, - 0x7e, 0x9c, 0xe5, 0x30, 0x26, 0xfd, 0xcc, 0x4a, 0x4d, 0x74, 0x9a, 0xec, 0x61, 0xb3, 0xa2, 0x88, - 0x11, 0x4f, 0xd3, 0x12, 0x18, 0x36, 0xb9, 0x05, 0xa3, 0xa5, 0x7a, 0xdd, 0xed, 0x2a, 0x67, 0x46, - 0xbe, 0x6e, 0x39, 0x50, 0x37, 0x91, 0x44, 0xa8, 0xa4, 0x06, 0x63, 0xcb, 0xec, 0xa0, 0xe5, 0x94, - 0xed, 0xfa, 0xbe, 0xec, 0x24, 0x29, 0xc3, 0x94, 0x92, 0x68, 0xe5, 0x52, 0x04, 0xd6, 0x19, 0x50, - 0x35, 0x32, 0x28, 0xb8, 0x64, 0x13, 0xc6, 0x6a, 0xb4, 0xee, 0xd1, 0xa0, 0x16, 0xb8, 0x1e, 0x8d, - 0x89, 0x64, 0xa5, 0x64, 0xe9, 0x79, 0x79, 0xd6, 0xf3, 0x11, 0x68, 0xf9, 0x0c, 0xaa, 0x72, 0x55, - 0x90, 0xb9, 0xd2, 0xde, 0x72, 0xbd, 0xa3, 0xca, 0x92, 0x10, 0xd3, 0xd1, 0x9e, 0xce, 0xc1, 0xaa, - 0xd2, 0xce, 0x20, 0x8d, 0x1d, 0x5d, 0x69, 0xe7, 0x58, 0x38, 0x52, 0x95, 0x1a, 0xea, 0x56, 0x42, - 0x68, 0x4f, 0x45, 0xbd, 0x8c, 0x60, 0x65, 0xa4, 0x1a, 0x3e, 0x6a, 0x66, 0xda, 0x48, 0x09, 0x2c, - 0xd2, 0x01, 0x22, 0x47, 0x8d, 0x2b, 0xba, 0x4d, 0xea, 0xfb, 0x42, 0x96, 0x9f, 0x8f, 0x0d, 0x7e, - 0x84, 0xb0, 0xf4, 0x92, 0x60, 0x7e, 0x41, 0x4e, 0x03, 0x71, 0x4e, 0x63, 0x85, 0x4a, 0x3d, 0x29, - 0xbc, 0xc9, 0x9b, 0x00, 0xcb, 0x8f, 0x02, 0xea, 0xb5, 0xed, 0x66, 0x68, 0x07, 0x43, 0xd3, 0x0f, - 0x15, 0x50, 0x7d, 0xa0, 0x15, 0x64, 0x52, 0x86, 0x89, 0x92, 0xef, 0x77, 0x5b, 0xd4, 0x74, 0x9b, - 0xb4, 0x64, 0xae, 0xa1, 0xdc, 0x1f, 0x5d, 0xba, 0xf0, 0xf8, 0x78, 0xe1, 0xbc, 0x8d, 0x05, 0x96, - 0xe7, 0x36, 0xa9, 0x65, 0x7b, 0xea, 0xec, 0xd6, 0x69, 0xc8, 0x3a, 0xc0, 0x7a, 0x87, 0xb6, 0x6b, - 0xd4, 0xf6, 0xea, 0xfb, 0x31, 0x31, 0x1f, 0x15, 0x2c, 0x3d, 0x27, 0xbe, 0x70, 0xd6, 0xed, 0xd0, - 0xb6, 0x8f, 0x30, 0xb5, 0x55, 0x11, 0x26, 0xd9, 0x86, 0xa9, 0x6a, 0xe9, 0xfe, 0x86, 0xdb, 0x74, - 0xea, 0x47, 0x42, 0x73, 0x9a, 0x44, 0xeb, 0xe0, 0x59, 0xc1, 0x35, 0x56, 0xca, 0xc5, 0x93, 0x63, - 0xb7, 0xac, 0x0e, 0x42, 0x2d, 0xa1, 0x3f, 0xc5, 0xb9, 0x90, 0x0f, 0xd8, 0x1c, 0xf4, 0x99, 0x32, - 0xb8, 0x69, 0xef, 0xf9, 0x73, 0x53, 0x9a, 0xb5, 0xab, 0xb4, 0x5d, 0xbb, 0xa6, 0x94, 0x72, 0x35, - 0x65, 0x9e, 0x4f, 0x44, 0x84, 0x5a, 0x81, 0xbd, 0xe7, 0xeb, 0x13, 0x31, 0xc4, 0x9e, 0x7f, 0x17, - 0x8a, 0x71, 0xe2, 0x53, 0x1a, 0x9d, 0x26, 0x8a, 0x93, 0x4a, 0x8b, 0x97, 0x1f, 0x39, 0x7e, 0xe0, - 0x1b, 0x3f, 0xa8, 0xad, 0x1a, 0xb6, 0xa2, 0xef, 0xd1, 0xa3, 0x0d, 0x8f, 0xee, 0x3a, 0x8f, 0x84, - 0x00, 0xc2, 0x15, 0x7d, 0x40, 0x8f, 0xac, 0x0e, 0x42, 0xd5, 0x15, 0x1d, 0xa2, 0x92, 0xcf, 0x43, - 0xe1, 0xde, 0xfd, 0xda, 0x3d, 0x7a, 0x54, 0xad, 0x88, 0xcd, 0x85, 0x93, 0xb5, 0x7c, 0x8b, 0x91, - 0x6a, 0xf3, 0x23, 0xc4, 0x34, 0x96, 0x22, 0xe9, 0xc5, 0x6a, 0x2e, 0x37, 0xbb, 0x7e, 0x40, 0xbd, - 0x6a, 0x45, 0xad, 0xb9, 0xce, 0x81, 0x31, 0x59, 0x12, 0xa2, 0x1a, 0x7f, 0x3f, 0x8b, 0x92, 0x8b, - 0x4d, 0xd2, 0x6a, 0xdb, 0x0f, 0xec, 0x76, 0x9d, 0x86, 0x0c, 0x70, 0x92, 0x3a, 0x02, 0x1a, 0x9b, - 0xa4, 0x11, 0xb2, 0x5e, 0x75, 0x76, 0xe0, 0xaa, 0x59, 0x95, 0xd2, 0xda, 0x50, 0xad, 0xa8, 0x26, - 0x51, 0x4f, 0x40, 0x63, 0x55, 0x46, 0xc8, 0xe4, 0x32, 0x8c, 0x54, 0x4b, 0xf7, 0x4b, 0xdd, 0x60, - 0x1f, 0xe5, 0x66, 0x81, 0xeb, 0xd4, 0x6c, 0x86, 0xd9, 0xdd, 0x60, 0xdf, 0x94, 0x85, 0xe4, 0x3a, - 0x9e, 0x55, 0xda, 0x34, 0xe0, 0xa6, 0x53, 0xb1, 0x51, 0xfa, 0x1c, 0x14, 0x3b, 0xaa, 0x30, 0x10, - 0x79, 0x05, 0x86, 0xb6, 0x36, 0xca, 0xd5, 0x8a, 0x38, 0xec, 0xe2, 0xee, 0xf1, 0xb0, 0x53, 0xd7, - 0x5b, 0xc2, 0x51, 0x8c, 0xdf, 0xca, 0x44, 0x32, 0x89, 0x5c, 0xd6, 0x74, 0x08, 0x34, 0x94, 0x30, - 0x1d, 0x42, 0x35, 0x94, 0xa0, 0x36, 0x61, 0x02, 0x29, 0x77, 0xfd, 0xc0, 0x6d, 0x2d, 0xb7, 0x1b, - 0x1d, 0xd7, 0x69, 0x07, 0x48, 0xc5, 0x7b, 0xcd, 0x78, 0x7c, 0xbc, 0xf0, 0x7c, 0x1d, 0x4b, 0x2d, - 0x2a, 0x8a, 0xad, 0x18, 0x97, 0x14, 0xea, 0x4f, 0xd1, 0x91, 0xc6, 0xef, 0x65, 0xb5, 0xbd, 0x84, - 0x35, 0xcf, 0xa4, 0x9d, 0xa6, 0x53, 0xc7, 0xe3, 0xf3, 0x1d, 0xcf, 0xed, 0x76, 0xc2, 0xe9, 0x80, - 0xcd, 0xf3, 0xa2, 0x52, 0x6b, 0x8f, 0x15, 0xeb, 0xbc, 0x53, 0xa8, 0xc9, 0xfb, 0x30, 0xce, 0xb6, - 0x75, 0xf1, 0xd3, 0x9f, 0xcb, 0xe2, 0x48, 0x3c, 0x87, 0x26, 0x2f, 0x9f, 0x7a, 0x21, 0x1b, 0x4d, - 0x1f, 0x50, 0x29, 0x48, 0x03, 0xe6, 0x36, 0x3d, 0xbb, 0xed, 0x3b, 0xc1, 0x72, 0xbb, 0xee, 0x1d, - 0xa1, 0x1a, 0xb2, 0xdc, 0xb6, 0x77, 0x9a, 0xb4, 0x81, 0x9f, 0x5b, 0x58, 0xba, 0xf2, 0xf8, 0x78, - 0xe1, 0xc5, 0x80, 0xe3, 0x58, 0x34, 0x44, 0xb2, 0x28, 0xc7, 0x52, 0x38, 0xf7, 0xe4, 0xc4, 0xd4, - 0x16, 0xd9, 0xad, 0x78, 0xe3, 0xc1, 0x77, 0x64, 0x54, 0x5b, 0xc2, 0xd1, 0x60, 0xa2, 0x48, 0x6d, - 0xa6, 0x4a, 0x60, 0xfc, 0xb3, 0x4c, 0xb4, 0xdb, 0x91, 0xb7, 0x61, 0x4c, 0x4c, 0x75, 0x65, 0x5e, - 0xa0, 0xb8, 0x92, 0xeb, 0x22, 0x36, 0xb2, 0x2a, 0x3a, 0x3b, 0x64, 0x97, 0xca, 0xab, 0xca, 0xdc, - 0xc0, 0x43, 0xb6, 0x5d, 0x6f, 0xc6, 0xa9, 0x24, 0x1a, 0x9b, 0x04, 0x9b, 0xab, 0x35, 0xbd, 0x57, - 0x70, 0x12, 0x04, 0x4d, 0x3f, 0xa5, 0x1b, 0x14, 0xe4, 0x4f, 0xff, 0xe1, 0xff, 0x6d, 0x26, 0x6d, - 0x53, 0x25, 0x4b, 0x30, 0xb1, 0xed, 0x7a, 0x07, 0x38, 0xbe, 0x4a, 0x27, 0xe0, 0xc8, 0x1f, 0xca, - 0x82, 0xf8, 0x07, 0xe9, 0x24, 0x6a, 0xdb, 0x94, 0xde, 0xd0, 0xdb, 0x16, 0xe3, 0xa0, 0x11, 0xb0, - 0x71, 0x08, 0x39, 0x86, 0xab, 0x03, 0xc7, 0x21, 0x6a, 0x82, 0x36, 0x85, 0x55, 0x74, 0xe3, 0x3f, - 0xcc, 0xa8, 0x9b, 0x27, 0xeb, 0xe4, 0x8a, 0xdb, 0xb2, 0x9d, 0xb6, 0xf2, 0x39, 0xfc, 0x16, 0x07, - 0xa1, 0xf1, 0x96, 0x28, 0xc8, 0xe4, 0x26, 0x14, 0xf8, 0xaf, 0x50, 0x48, 0xa2, 0x09, 0x49, 0x10, - 0xea, 0x12, 0x5e, 0x22, 0x26, 0x46, 0x26, 0x77, 0xda, 0x91, 0xf9, 0xa1, 0x0c, 0x8c, 0x29, 0xe7, - 0x69, 0x26, 0xab, 0x37, 0x3c, 0xf7, 0x23, 0x5a, 0x0f, 0xf4, 0x6d, 0xa2, 0xc3, 0x81, 0x31, 0x59, - 0x1d, 0xa2, 0xc6, 0xb6, 0x87, 0xec, 0x29, 0xb6, 0x07, 0xe3, 0x9f, 0x66, 0x84, 0x36, 0x3f, 0xb0, - 0x8c, 0xd4, 0xe5, 0x59, 0xf6, 0x34, 0x1b, 0xc3, 0xfb, 0x30, 0x64, 0xd2, 0x86, 0xe3, 0x0b, 0x4d, - 0x7c, 0x5a, 0x3d, 0x39, 0x60, 0x41, 0x74, 0x78, 0xf1, 0xd8, 0x4f, 0x55, 0xaa, 0x63, 0x39, 0x53, - 0xb9, 0xaa, 0xfe, 0xed, 0x26, 0x7d, 0xe4, 0xf0, 0x99, 0x2c, 0x36, 0x18, 0x54, 0xb9, 0x1c, 0xdf, - 0xda, 0x65, 0x25, 0x42, 0xf7, 0x53, 0x67, 0xad, 0x46, 0x63, 0x7c, 0x00, 0x10, 0x55, 0x49, 0xee, - 0x41, 0x51, 0xac, 0x6d, 0xa7, 0xbd, 0xc7, 0xd5, 0x07, 0xd1, 0x07, 0x0b, 0x8f, 0x8f, 0x17, 0x9e, - 0xad, 0x87, 0x65, 0x42, 0x3f, 0x52, 0xf8, 0x26, 0x08, 0x8d, 0x7f, 0x33, 0x0b, 0xd9, 0x12, 0x0e, - 0xc8, 0x3d, 0x7a, 0x14, 0xd8, 0x3b, 0xb7, 0x9d, 0xa6, 0x36, 0x13, 0x0f, 0x10, 0x6a, 0xed, 0x3a, - 0xda, 0xc1, 0x5a, 0x41, 0x66, 0x33, 0xf1, 0x9e, 0xb7, 0xf3, 0x06, 0x12, 0x2a, 0x33, 0xf1, 0xc0, - 0xdb, 0x79, 0x23, 0x4e, 0x16, 0x22, 0x12, 0x03, 0x86, 0xf9, 0xac, 0x14, 0x73, 0x10, 0x1e, 0x1f, - 0x2f, 0x0c, 0xf3, 0xc9, 0x6b, 0x8a, 0x12, 0x72, 0x1e, 0x72, 0xb5, 0x8d, 0x35, 0x21, 0x3e, 0xd0, - 0x80, 0xe5, 0x77, 0xda, 0x26, 0x83, 0xb1, 0x3a, 0x57, 0x2b, 0xa5, 0x0d, 0x3c, 0xb2, 0x0e, 0x45, - 0x75, 0x36, 0x1b, 0x76, 0x27, 0x7e, 0x68, 0x0d, 0x11, 0xc9, 0x3b, 0x30, 0x76, 0xaf, 0x52, 0x5e, - 0x71, 0x7d, 0xbe, 0xf4, 0x87, 0xa3, 0xc9, 0x7f, 0xd0, 0xa8, 0x5b, 0x68, 0x33, 0x8e, 0xcb, 0x50, - 0x05, 0xdf, 0xf8, 0xb1, 0x2c, 0x8c, 0x29, 0x16, 0x1d, 0xf2, 0x79, 0x71, 0x95, 0x97, 0xd1, 0x74, - 0x55, 0x05, 0x83, 0x95, 0xf2, 0xe3, 0x7f, 0xcb, 0x6d, 0x50, 0x71, 0xb1, 0x17, 0x1d, 0xb5, 0xb3, - 0x83, 0x1c, 0xb5, 0xdf, 0x04, 0xe0, 0x73, 0x00, 0x9b, 0xac, 0xec, 0xc5, 0xca, 0x8d, 0xbe, 0x3a, - 0x2e, 0x11, 0x32, 0xd9, 0x82, 0x99, 0x4d, 0xaf, 0xeb, 0x07, 0xb5, 0x23, 0x3f, 0xa0, 0x2d, 0xc6, - 0x6d, 0xc3, 0x75, 0x9b, 0x62, 0xfe, 0xbd, 0xf8, 0xf8, 0x78, 0xe1, 0x62, 0xc0, 0x8a, 0x2d, 0x1f, - 0xcb, 0xb1, 0x01, 0x56, 0xc7, 0x75, 0xd5, 0x03, 0x78, 0x1a, 0x03, 0xc3, 0x84, 0x71, 0xf5, 0xf8, - 0xce, 0xc4, 0xb2, 0xb8, 0xf6, 0x10, 0x46, 0x59, 0x45, 0x2c, 0x8b, 0x56, 0x26, 0xaf, 0x61, 0x74, - 0x12, 0xe3, 0xf3, 0xaa, 0xe9, 0x68, 0xd0, 0x85, 0x6d, 0xfc, 0x48, 0x26, 0x12, 0x23, 0x5b, 0x37, - 0xc8, 0x5b, 0x30, 0xcc, 0xaf, 0x99, 0xc4, 0x6d, 0xdc, 0x99, 0xf0, 0xf8, 0xa5, 0xde, 0x41, 0x71, - 0x9b, 0xed, 0xef, 0xf3, 0xab, 0xe8, 0x67, 0x4c, 0x41, 0x12, 0x9a, 0x7b, 0x75, 0xcb, 0x8f, 0xe4, - 0x8e, 0x86, 0xcd, 0x1b, 0x69, 0xe6, 0x5e, 0xe3, 0xb7, 0xf3, 0x30, 0xa9, 0xa3, 0xa9, 0x77, 0x51, - 0x99, 0x81, 0xee, 0xa2, 0xde, 0x87, 0x02, 0xeb, 0x0f, 0xa7, 0x4e, 0xa5, 0x3a, 0xf3, 0x22, 0x1a, - 0xc1, 0x05, 0x4c, 0xbb, 0x63, 0x05, 0x3e, 0x1c, 0xec, 0x34, 0x66, 0x86, 0x54, 0x64, 0x51, 0xb9, - 0x30, 0xc9, 0x45, 0x3b, 0xbc, 0xbc, 0x30, 0x51, 0xd7, 0x43, 0x78, 0x75, 0xf2, 0x3a, 0x0c, 0x33, - 0xad, 0x36, 0x34, 0x16, 0x60, 0x2b, 0x99, 0xc2, 0x1b, 0x73, 0xa6, 0xe0, 0x48, 0x64, 0x1b, 0x0a, - 0xab, 0xb6, 0x1f, 0xd4, 0x28, 0x6d, 0x0f, 0x70, 0xcb, 0xbc, 0x20, 0xba, 0x6a, 0x06, 0xaf, 0x70, - 0x7d, 0x4a, 0xdb, 0xb1, 0x6b, 0xc2, 0x90, 0x19, 0xf9, 0x1a, 0x40, 0xd9, 0x6d, 0x07, 0x9e, 0xdb, - 0x5c, 0x75, 0xf7, 0xe6, 0x86, 0xf1, 0x94, 0xf6, 0x7c, 0x6c, 0x00, 0x22, 0x04, 0x7e, 0x50, 0x0b, - 0x4d, 0x11, 0x75, 0x5e, 0x60, 0x35, 0xdd, 0x3d, 0x75, 0x1d, 0x44, 0xf8, 0xe4, 0x36, 0x14, 0xe5, - 0x11, 0xf8, 0x41, 0x67, 0xcf, 0xc3, 0x09, 0x32, 0x12, 0x6d, 0xdb, 0xf4, 0x51, 0x60, 0x75, 0x05, - 0x5c, 0x95, 0x94, 0x71, 0x1a, 0xf2, 0x55, 0x38, 0x17, 0x87, 0xc9, 0x51, 0x2e, 0x44, 0x0a, 0xad, - 0xca, 0x2e, 0x65, 0xde, 0xf7, 0x62, 0x61, 0x7c, 0x9c, 0x85, 0x73, 0x3d, 0x3e, 0x96, 0xad, 0x07, - 0xdc, 0xae, 0x95, 0xf5, 0x10, 0xdb, 0xa5, 0xb9, 0x77, 0xcc, 0x45, 0xc8, 0x8a, 0x0d, 0x2e, 0xbf, - 0x54, 0x7c, 0x7c, 0xbc, 0x30, 0xae, 0x8d, 0x63, 0xb6, 0x5a, 0x21, 0x77, 0x21, 0xcf, 0x86, 0x68, - 0x80, 0x4b, 0x5e, 0x69, 0xfd, 0x98, 0x0c, 0x1c, 0x75, 0xfa, 0xe0, 0xd0, 0x21, 0x0f, 0xf2, 0x79, - 0xc8, 0x6d, 0x6e, 0xae, 0xe2, 0xdc, 0xc9, 0xe1, 0xb7, 0x4f, 0x04, 0x41, 0x53, 0x9b, 0xaa, 0x13, - 0x8c, 0xf6, 0x5a, 0xe8, 0x13, 0xc0, 0xd0, 0xc9, 0x57, 0x62, 0xce, 0x27, 0xaf, 0xf4, 0x1f, 0xe8, - 0xc1, 0x7d, 0x51, 0x3e, 0x85, 0x0b, 0x88, 0xf1, 0xf3, 0xd9, 0x68, 0x0d, 0xdf, 0x76, 0x9a, 0x01, - 0xf5, 0xc8, 0x3c, 0x5f, 0x92, 0xd1, 0xf9, 0xd7, 0x0c, 0x7f, 0x93, 0xb9, 0x68, 0x7d, 0x73, 0x56, - 0xe1, 0x42, 0x7e, 0x45, 0x59, 0xc8, 0x39, 0x5c, 0xc8, 0x93, 0x3d, 0x97, 0xec, 0x2b, 0x29, 0xf3, - 0x12, 0x17, 0x62, 0xca, 0xdc, 0x7b, 0x11, 0x26, 0xd6, 0xdc, 0xe5, 0x47, 0x41, 0x88, 0xc8, 0x16, - 0x60, 0xc1, 0xd4, 0x81, 0x8c, 0xe3, 0x7a, 0xb3, 0x41, 0xbd, 0xcd, 0x7d, 0xbb, 0xad, 0xdd, 0xb2, - 0x9a, 0x09, 0x38, 0xc3, 0x5d, 0xa3, 0x87, 0x3a, 0xee, 0x08, 0xc7, 0x8d, 0xc3, 0x8d, 0x1f, 0xce, - 0xca, 0xce, 0xd8, 0x5a, 0x7c, 0x4a, 0x6f, 0xf3, 0xde, 0xd0, 0x6e, 0xf3, 0x66, 0x42, 0x3b, 0x64, - 0x78, 0x35, 0xbd, 0x78, 0xc2, 0x8d, 0xf6, 0x7f, 0x37, 0x04, 0xe3, 0x2a, 0x3a, 0xeb, 0x87, 0x52, - 0xa3, 0xe1, 0xa9, 0xfd, 0x60, 0x37, 0x1a, 0x9e, 0x89, 0x50, 0xed, 0x02, 0x3b, 0xd7, 0xf7, 0x02, - 0xfb, 0xeb, 0x30, 0x5a, 0x6e, 0x35, 0xb4, 0x6b, 0x35, 0x23, 0xa5, 0x79, 0xd7, 0x42, 0x24, 0xbe, - 0x16, 0x42, 0xf3, 0x5a, 0xbd, 0xd5, 0x48, 0x5e, 0xa6, 0x45, 0x2c, 0xb5, 0xbb, 0xef, 0xa1, 0x4f, - 0x73, 0xf7, 0x7d, 0x0b, 0x46, 0x1f, 0xf8, 0x74, 0xb3, 0xdb, 0x6e, 0xd3, 0x26, 0x4e, 0xab, 0x02, - 0xd7, 0xf5, 0xbb, 0x3e, 0xb5, 0x02, 0x84, 0xaa, 0x0d, 0x08, 0x51, 0xd5, 0x01, 0x1e, 0xe9, 0x33, - 0xc0, 0x37, 0xa1, 0xb0, 0x41, 0xa9, 0x87, 0x7d, 0x3a, 0x16, 0xa9, 0x74, 0x1d, 0x4a, 0x3d, 0x8b, - 0x75, 0xac, 0x76, 0x27, 0x2e, 0x10, 0xb5, 0x8b, 0xf4, 0xf1, 0x01, 0x2f, 0xd2, 0xc9, 0x0b, 0x30, - 0xde, 0xe9, 0xee, 0x34, 0x9d, 0x3a, 0xf2, 0x15, 0x37, 0xf0, 0xe6, 0x18, 0x87, 0x31, 0xb6, 0x3e, - 0xf9, 0x0a, 0x4c, 0xe0, 0x19, 0x27, 0x9c, 0x72, 0x93, 0xda, 0xfd, 0x93, 0x56, 0xc6, 0x35, 0x9d, - 0x3a, 0x03, 0x59, 0x29, 0x8e, 0x22, 0x3a, 0xa3, 0xf9, 0x1a, 0x4c, 0xea, 0x23, 0xf9, 0x04, 0xae, - 0xa1, 0x42, 0xa7, 0x80, 0x42, 0x71, 0xf4, 0x6e, 0xbe, 0x00, 0xc5, 0x31, 0xee, 0x0e, 0x60, 0xc2, - 0x46, 0xf8, 0x4d, 0x26, 0xb9, 0xd7, 0xdd, 0xa1, 0x5e, 0x9b, 0x06, 0xd4, 0x17, 0x87, 0x00, 0xdf, - 0xcc, 0x97, 0x3a, 0x1d, 0xdf, 0xf8, 0xf5, 0x2c, 0x8c, 0x94, 0xb6, 0x6b, 0xd5, 0xf6, 0xae, 0x8b, - 0x97, 0x49, 0xe1, 0x1d, 0x82, 0x7a, 0x99, 0x14, 0xde, 0x21, 0xa8, 0x37, 0x07, 0xd7, 0x53, 0x8e, - 0x71, 0xe8, 0x6f, 0xaa, 0x1c, 0xe3, 0x34, 0xdb, 0x5e, 0x74, 0x9d, 0x92, 0x1b, 0xe0, 0x3a, 0x25, - 0xb4, 0x9e, 0xe5, 0x4f, 0xb4, 0x9e, 0x91, 0xb7, 0x60, 0xac, 0xda, 0x0e, 0xe8, 0x9e, 0x17, 0xcd, - 0xf4, 0xf0, 0x48, 0x19, 0x82, 0x55, 0xd5, 0x5e, 0xc1, 0x66, 0xd3, 0x88, 0x5b, 0xec, 0x42, 0x4b, - 0x1d, 0x4e, 0x23, 0x6e, 0xd8, 0x8b, 0x1d, 0xa6, 0x25, 0xa2, 0x51, 0x89, 0xcd, 0x11, 0x79, 0x65, - 0xcd, 0x95, 0xcf, 0xc9, 0xc8, 0xcc, 0xcc, 0x3a, 0x76, 0x69, 0x3a, 0xfd, 0xca, 0xda, 0xf8, 0x76, - 0x16, 0xc6, 0x4a, 0x9d, 0xce, 0x53, 0xee, 0x38, 0xf4, 0x45, 0x4d, 0xbc, 0xca, 0xb3, 0x50, 0xf8, - 0x5d, 0x03, 0xf9, 0x0c, 0xfd, 0x4a, 0x16, 0xa6, 0x62, 0x14, 0x6a, 0xeb, 0x33, 0x03, 0xba, 0x0b, - 0x65, 0x07, 0x74, 0x17, 0xca, 0x0d, 0xe6, 0x2e, 0x94, 0xff, 0x34, 0x22, 0xf3, 0x65, 0xc8, 0x95, - 0x3a, 0x9d, 0xf8, 0xb5, 0x63, 0xa7, 0xb3, 0x75, 0x93, 0x9f, 0x67, 0xed, 0x4e, 0xc7, 0x64, 0x18, - 0x9a, 0x1c, 0x1b, 0x1e, 0x50, 0x8e, 0x19, 0xaf, 0xc3, 0x28, 0xf2, 0x42, 0x27, 0x9d, 0x8b, 0x80, - 0x8b, 0x59, 0xf8, 0xe7, 0x68, 0x75, 0x89, 0x65, 0xfe, 0x7f, 0x67, 0x60, 0x08, 0x7f, 0x3f, 0xa5, - 0x73, 0x6c, 0x51, 0x9b, 0x63, 0x45, 0x65, 0x8e, 0x0d, 0x32, 0xbb, 0xfe, 0xb7, 0x3c, 0xf6, 0x96, - 0x98, 0x57, 0xc2, 0x37, 0x26, 0x93, 0xe2, 0x1b, 0xf3, 0x26, 0x28, 0x52, 0x53, 0xb5, 0x16, 0x29, - 0x7b, 0x86, 0x7a, 0xd2, 0x88, 0x90, 0xc9, 0x41, 0xdc, 0x4b, 0x26, 0x87, 0x83, 0x71, 0x29, 0xde, - 0xd4, 0x27, 0xe2, 0x20, 0xb3, 0x02, 0xa4, 0xda, 0xf6, 0x69, 0xbd, 0xeb, 0xd1, 0xda, 0x81, 0xd3, - 0xd9, 0xa2, 0x9e, 0xb3, 0x7b, 0x24, 0x4e, 0xf7, 0xb8, 0x2f, 0x3b, 0xa2, 0xd4, 0xf2, 0x0f, 0x9c, - 0x0e, 0x3b, 0x8a, 0x38, 0xbb, 0x47, 0x66, 0x0a, 0x0d, 0x79, 0x0f, 0x46, 0x4c, 0x7a, 0xe8, 0x39, - 0x81, 0xbc, 0xfb, 0x9d, 0x0c, 0x0f, 0xce, 0x08, 0xe5, 0x07, 0x43, 0x8f, 0xff, 0x50, 0xc7, 0x5f, - 0x94, 0x93, 0x45, 0x2e, 0xf8, 0xf8, 0x1d, 0xef, 0x44, 0xf4, 0xb5, 0xa5, 0xed, 0x5a, 0x2f, 0xb9, - 0x47, 0xae, 0xc2, 0x10, 0x4a, 0x4f, 0xa1, 0x13, 0xa0, 0xcf, 0x34, 0xee, 0xa1, 0xaa, 0x68, 0x47, - 0x0c, 0xf2, 0x3c, 0x40, 0x68, 0xbe, 0xf7, 0xe7, 0x0a, 0xb8, 0x5b, 0x2b, 0x90, 0xb8, 0xe8, 0x1f, - 0x3d, 0x8d, 0xe8, 0xff, 0xec, 0x5c, 0x43, 0x7e, 0x25, 0x0b, 0x97, 0x42, 0x71, 0xb6, 0xee, 0xd5, - 0x4a, 0xf7, 0x57, 0xab, 0x8d, 0x0d, 0xa1, 0xfd, 0x6f, 0x78, 0xee, 0x43, 0x87, 0x9d, 0xfe, 0x6e, - 0x9c, 0xb0, 0x18, 0x57, 0xf9, 0xac, 0xe5, 0xa6, 0xc3, 0xac, 0x76, 0x89, 0xae, 0xec, 0x1a, 0xe2, - 0x9e, 0xbf, 0xd3, 0x49, 0x58, 0x12, 0x57, 0x9e, 0x31, 0x23, 0x06, 0xe4, 0x47, 0x32, 0x70, 0x36, - 0xbd, 0x21, 0xe2, 0x44, 0xb8, 0x20, 0x35, 0xcf, 0x1e, 0xad, 0x5d, 0x7a, 0xf9, 0xf1, 0xf1, 0xc2, - 0x25, 0xdf, 0x6e, 0x35, 0x2d, 0xa7, 0xc1, 0x6b, 0x73, 0xea, 0xd4, 0xea, 0x08, 0x04, 0xad, 0xde, - 0x1e, 0x35, 0x7d, 0x09, 0xe4, 0x9a, 0x9c, 0xcb, 0x2c, 0x01, 0x14, 0xa4, 0x75, 0xc6, 0xf8, 0x7b, - 0x19, 0x50, 0x66, 0x54, 0xc1, 0xa4, 0x0d, 0xc7, 0xa3, 0xf5, 0x00, 0x25, 0x5a, 0x18, 0x02, 0xc0, - 0x61, 0x31, 0x9f, 0x09, 0x84, 0x91, 0x77, 0x61, 0x84, 0xdb, 0x72, 0xb8, 0x0d, 0x25, 0x9a, 0x89, - 0xc2, 0xee, 0xc3, 0x63, 0x45, 0x38, 0x86, 0x3a, 0x8b, 0x05, 0x11, 0xd3, 0x6f, 0xef, 0x6e, 0x6f, - 0x96, 0x9b, 0xb6, 0xd3, 0xf2, 0x85, 0x1c, 0xc3, 0x6e, 0xfd, 0xe8, 0x30, 0xb0, 0xea, 0x08, 0x55, - 0xf5, 0xdb, 0x10, 0xd5, 0xb8, 0x23, 0xcd, 0x4e, 0x27, 0x38, 0xfe, 0x2c, 0xc0, 0xd0, 0x56, 0x74, - 0xfc, 0x5c, 0x1a, 0x7d, 0x7c, 0xbc, 0xc0, 0xa7, 0x8b, 0xc9, 0xe1, 0xc6, 0x5f, 0xcd, 0xc0, 0xa4, - 0x3e, 0x9f, 0xc8, 0x35, 0x18, 0x16, 0xee, 0xf7, 0x19, 0x3c, 0x66, 0xb3, 0x5e, 0x18, 0xe6, 0x8e, - 0xf7, 0x9a, 0xbb, 0xbd, 0xc0, 0x62, 0x92, 0x58, 0x70, 0x10, 0x76, 0x24, 0x94, 0xc4, 0x75, 0x0e, - 0x32, 0x65, 0x19, 0x31, 0x98, 0x1a, 0xe6, 0x77, 0x9b, 0x81, 0x6a, 0x7d, 0xf5, 0x10, 0x62, 0x8a, - 0x12, 0xa3, 0x0c, 0xc3, 0x7c, 0x09, 0xc7, 0x1c, 0x0e, 0x32, 0xa7, 0x70, 0x38, 0x30, 0x8e, 0x33, - 0x00, 0xb5, 0xda, 0xca, 0x3d, 0x7a, 0xb4, 0x61, 0x3b, 0x1e, 0x5e, 0x17, 0xa0, 0xb8, 0xbc, 0x27, - 0x16, 0xd7, 0xb8, 0xb8, 0x2e, 0xe0, 0xa2, 0xf5, 0x80, 0x1e, 0x69, 0xd7, 0x05, 0x12, 0x15, 0x65, - 0xb2, 0xe7, 0x3c, 0xb4, 0x03, 0xca, 0x08, 0xb3, 0x48, 0xc8, 0x65, 0x32, 0x87, 0xc6, 0x28, 0x15, - 0x64, 0xf2, 0x35, 0x98, 0x8c, 0x7e, 0x85, 0x97, 0x1e, 0x93, 0xe1, 0x02, 0xd6, 0x0b, 0x97, 0x9e, - 0x7f, 0x7c, 0xbc, 0x30, 0xaf, 0x70, 0x8d, 0x5f, 0x87, 0xc4, 0x98, 0x19, 0xbf, 0x94, 0xc1, 0x7b, - 0x32, 0xf9, 0x81, 0x97, 0x21, 0x1f, 0xba, 0x51, 0x8d, 0x73, 0x4b, 0x4d, 0xcc, 0xb0, 0x8b, 0xe5, - 0xe4, 0x12, 0xe4, 0xa2, 0x2f, 0x41, 0x11, 0xa9, 0x7f, 0x01, 0x2b, 0x25, 0x77, 0x60, 0x64, 0xa0, - 0x36, 0xe3, 0xd2, 0x48, 0x69, 0xab, 0xa4, 0xc6, 0x51, 0xb8, 0xbb, 0xbd, 0xf9, 0xfd, 0x3b, 0x0a, - 0x3f, 0x95, 0x85, 0x29, 0xd6, 0xaf, 0xa5, 0x6e, 0xb0, 0xef, 0x7a, 0x4e, 0x70, 0xf4, 0xd4, 0xda, - 0x29, 0xde, 0xd6, 0x94, 0x9c, 0x79, 0xb9, 0xcb, 0xa8, 0xdf, 0x36, 0x90, 0xb9, 0xe2, 0x77, 0x86, - 0x60, 0x26, 0x85, 0x8a, 0xbc, 0xa6, 0x99, 0x12, 0xe7, 0x64, 0x78, 0xdd, 0xc7, 0xc7, 0x0b, 0xe3, - 0x12, 0x7d, 0x33, 0x0a, 0xb7, 0x5b, 0xd4, 0x2f, 0x9d, 0x79, 0x4f, 0xa1, 0x65, 0x51, 0xbd, 0x74, - 0xd6, 0xaf, 0x9a, 0xaf, 0xc2, 0x90, 0xe9, 0x36, 0xa9, 0xf4, 0x90, 0xc0, 0x8d, 0xdd, 0x63, 0x00, - 0xed, 0x6e, 0x8c, 0x01, 0xc8, 0x0a, 0x8c, 0xb0, 0x3f, 0xee, 0xdb, 0x1d, 0x61, 0xf5, 0x25, 0xa1, - 0x9a, 0x8d, 0xd0, 0x8e, 0xd3, 0xde, 0x53, 0x35, 0xed, 0x26, 0xb5, 0x5a, 0x76, 0x47, 0xd3, 0x40, - 0x38, 0xa2, 0xa6, 0xb1, 0x17, 0x7a, 0x6b, 0xec, 0x99, 0x13, 0x35, 0xf6, 0x06, 0x40, 0xcd, 0xd9, - 0x6b, 0x3b, 0xed, 0xbd, 0x52, 0x73, 0x4f, 0x04, 0x29, 0x5e, 0xed, 0x3d, 0x0a, 0xd7, 0x22, 0x64, - 0x9c, 0xb8, 0xfc, 0x6a, 0x86, 0xc3, 0x2c, 0xbb, 0xa9, 0x99, 0xa4, 0x23, 0x54, 0xb2, 0x06, 0x50, - 0xaa, 0x07, 0xce, 0x43, 0x36, 0x81, 0x7d, 0xe1, 0x7c, 0x2b, 0x1b, 0x5c, 0x2e, 0xdd, 0xa3, 0x47, - 0x35, 0x1a, 0x44, 0x26, 0x6e, 0x1b, 0x51, 0xd9, 0x3a, 0xd0, 0xfc, 0x64, 0x23, 0x0e, 0xa4, 0x03, - 0x67, 0x4a, 0x8d, 0x86, 0xc3, 0xbe, 0xc0, 0x6e, 0xe2, 0x9d, 0x0d, 0x6d, 0x20, 0xeb, 0xf1, 0x74, - 0xd6, 0x57, 0x05, 0xeb, 0x17, 0xec, 0x90, 0xca, 0x0a, 0x38, 0x59, 0xbc, 0x9a, 0x74, 0xc6, 0xc6, - 0x3a, 0x4c, 0xea, 0x9f, 0xae, 0x87, 0x56, 0x8e, 0x43, 0xc1, 0xac, 0x95, 0xac, 0xda, 0x4a, 0xe9, - 0x46, 0x31, 0x43, 0x8a, 0x30, 0x2e, 0x7e, 0x2d, 0x5a, 0x8b, 0x6f, 0xdc, 0x2a, 0x66, 0x35, 0xc8, - 0x1b, 0x37, 0x16, 0x13, 0x11, 0x0d, 0x23, 0xc5, 0x02, 0x37, 0x64, 0x18, 0xbf, 0x9a, 0x81, 0x82, - 0x6c, 0x37, 0xb9, 0x05, 0xb9, 0x5a, 0x6d, 0x25, 0x16, 0x83, 0x10, 0xed, 0x2f, 0x5c, 0x92, 0xfa, - 0xbe, 0xea, 0x68, 0xc6, 0x08, 0x18, 0xdd, 0xe6, 0x6a, 0x4d, 0xa8, 0x05, 0x92, 0x2e, 0x12, 0xdb, - 0x9c, 0x2e, 0xc5, 0x31, 0xfb, 0x16, 0xe4, 0xee, 0x6e, 0x6f, 0x0a, 0x35, 0x5e, 0xd2, 0x45, 0x92, - 0x94, 0xd3, 0x7d, 0x74, 0xa8, 0xca, 0x77, 0x46, 0x60, 0x98, 0x30, 0xa6, 0x4c, 0x61, 0xbe, 0xdd, - 0xb6, 0xdc, 0x30, 0x96, 0x50, 0x6c, 0xb7, 0x0c, 0x62, 0x8a, 0x12, 0xa6, 0x1d, 0xac, 0xba, 0x75, - 0xbb, 0x29, 0xf6, 0x6d, 0xd4, 0x0e, 0x9a, 0x0c, 0x60, 0x72, 0xb8, 0xf1, 0x5b, 0x19, 0x28, 0xa2, - 0x0e, 0x85, 0x4e, 0x67, 0xee, 0x01, 0x6d, 0x6f, 0xdd, 0x20, 0xaf, 0xcb, 0xc5, 0x96, 0x09, 0x0f, - 0x8d, 0x43, 0xb8, 0xd8, 0x62, 0x56, 0x67, 0xb1, 0xe0, 0x94, 0x70, 0xcd, 0xec, 0xe0, 0x61, 0x5e, - 0x27, 0x84, 0x6b, 0x2e, 0xc0, 0x10, 0x36, 0x47, 0x88, 0x45, 0x6c, 0x79, 0xc0, 0x00, 0x26, 0x87, - 0x2b, 0x52, 0xe9, 0x67, 0xb2, 0x89, 0x6f, 0x58, 0xfc, 0xbe, 0x0a, 0x95, 0xd2, 0x3f, 0x6e, 0x20, - 0x49, 0xfd, 0x01, 0xcc, 0xc6, 0xbb, 0x04, 0x0f, 0xf4, 0x25, 0x98, 0xd2, 0xe1, 0xf2, 0x6c, 0x7f, - 0x2e, 0xb5, 0xae, 0xad, 0x45, 0x33, 0x8e, 0x6f, 0xfc, 0x4f, 0x19, 0x18, 0xc5, 0x3f, 0xcd, 0x6e, - 0x13, 0xdd, 0x20, 0x4a, 0xdb, 0x35, 0x61, 0xbc, 0x53, 0xd5, 0x38, 0xfb, 0xd0, 0xb7, 0x84, 0x7d, - 0x4f, 0x93, 0x2f, 0x21, 0xb2, 0x20, 0xe5, 0x56, 0x39, 0x79, 0x43, 0x19, 0x92, 0x72, 0xf3, 0x9d, - 0x1f, 0x23, 0x15, 0xc8, 0xe8, 0x79, 0xb4, 0x5d, 0x63, 0xd3, 0x4f, 0xbd, 0x97, 0x44, 0x3a, 0xb7, - 0xa9, 0x7b, 0x1e, 0x71, 0x34, 0xbc, 0x96, 0xdc, 0xae, 0x95, 0xcc, 0x35, 0xed, 0x5a, 0x92, 0xb5, - 0x51, 0xf3, 0x4a, 0x15, 0x48, 0xc6, 0x3f, 0x1a, 0x8d, 0x77, 0xa0, 0xd8, 0xea, 0x4e, 0xb9, 0x36, - 0xde, 0x82, 0xa1, 0x52, 0xb3, 0xe9, 0x1e, 0x0a, 0x29, 0x21, 0xed, 0x0b, 0x61, 0xff, 0xf1, 0x9d, - 0xcc, 0x66, 0x28, 0x5a, 0xf8, 0x07, 0x03, 0x90, 0x32, 0x8c, 0x96, 0xb6, 0x6b, 0xd5, 0x6a, 0x65, - 0x73, 0x93, 0xbb, 0xba, 0xe7, 0x96, 0x5e, 0x92, 0xfd, 0xe3, 0x38, 0x0d, 0x2b, 0x7e, 0x33, 0x16, - 0x69, 0xee, 0x11, 0x1d, 0x79, 0x07, 0xe0, 0xae, 0xeb, 0xb4, 0xef, 0xd3, 0x60, 0xdf, 0x6d, 0x88, - 0x8f, 0xbf, 0xf0, 0xf8, 0x78, 0x61, 0xec, 0x23, 0xd7, 0x69, 0x5b, 0x2d, 0x04, 0xb3, 0xb6, 0x47, - 0x48, 0xa6, 0xf2, 0x37, 0xeb, 0xe9, 0x25, 0x97, 0xbb, 0x36, 0x0c, 0x45, 0x3d, 0xbd, 0xe3, 0x26, - 0xbc, 0x1a, 0x24, 0x1a, 0x69, 0xc1, 0x54, 0xad, 0xbb, 0xb7, 0x47, 0x99, 0x54, 0x17, 0x16, 0x8b, - 0x61, 0x71, 0xba, 0x0d, 0x13, 0x0c, 0xf0, 0x93, 0x08, 0x3b, 0x9f, 0xf8, 0x4b, 0xaf, 0xb1, 0x89, - 0xfc, 0xbd, 0xe3, 0x05, 0x71, 0xe3, 0xc6, 0x94, 0x34, 0x5f, 0xd2, 0x27, 0xed, 0x15, 0x71, 0xde, - 0x64, 0x1d, 0x86, 0xef, 0x38, 0xc1, 0x4a, 0x77, 0x47, 0xb8, 0x6e, 0xbf, 0xd0, 0x67, 0xd1, 0x70, - 0x44, 0x6e, 0xf2, 0xdd, 0x73, 0x82, 0xfd, 0xae, 0xea, 0xc6, 0x2d, 0xd8, 0x90, 0x6d, 0x28, 0x94, - 0x1d, 0xaf, 0xde, 0xa4, 0xe5, 0xaa, 0xd8, 0xf5, 0x2f, 0xf5, 0x61, 0x29, 0x51, 0x79, 0xbf, 0xd4, - 0xf1, 0x57, 0xdd, 0x51, 0xb5, 0x00, 0x89, 0x41, 0xfe, 0x7a, 0x06, 0x9e, 0x0d, 0x5b, 0x5f, 0xda, - 0xa3, 0xed, 0xe0, 0xbe, 0x1d, 0xd4, 0xf7, 0xa9, 0x27, 0x7a, 0x69, 0xb4, 0x5f, 0x2f, 0x7d, 0x29, - 0xd1, 0x4b, 0x57, 0xa2, 0x5e, 0xb2, 0x19, 0x33, 0xab, 0xc5, 0xb9, 0x25, 0xfb, 0xac, 0x5f, 0xad, - 0xc4, 0x02, 0x88, 0x6c, 0xf8, 0x22, 0xf4, 0xe7, 0xa5, 0x3e, 0x1f, 0x1c, 0x21, 0x0b, 0xf7, 0xdf, - 0xf0, 0xb7, 0xe6, 0xc9, 0x13, 0x42, 0xc9, 0x3d, 0x19, 0x27, 0xc1, 0x35, 0x92, 0x8b, 0x7d, 0x78, - 0xf3, 0xd8, 0x89, 0x99, 0x3e, 0x11, 0x51, 0x7c, 0xb4, 0x57, 0xed, 0x1d, 0xa1, 0x84, 0x9c, 0x30, - 0xda, 0xab, 0x76, 0x34, 0xda, 0x4d, 0x3b, 0x3e, 0xda, 0xab, 0xf6, 0x0e, 0x29, 0xf3, 0xe0, 0x2e, - 0x1e, 0x09, 0xf4, 0x7c, 0x3f, 0x6e, 0xe5, 0x0d, 0xbe, 0x33, 0xa7, 0x04, 0x79, 0x7d, 0x08, 0xa3, - 0xb5, 0x8e, 0x5d, 0xa7, 0x4d, 0x67, 0x37, 0x10, 0x97, 0x3a, 0x2f, 0xf6, 0x61, 0x15, 0xe2, 0x8a, - 0x0b, 0x01, 0xf9, 0x53, 0x3d, 0x20, 0x85, 0x38, 0xac, 0x85, 0x9b, 0x1b, 0xf7, 0xe7, 0xa6, 0x4e, - 0x6c, 0xe1, 0xe6, 0xc6, 0x7d, 0xa1, 0x73, 0x74, 0x5a, 0x9a, 0xce, 0xb1, 0x71, 0xdf, 0xf8, 0x8d, - 0x1c, 0x9c, 0xeb, 0x41, 0x43, 0xd6, 0xa4, 0x8c, 0xca, 0x68, 0x86, 0xc5, 0x1e, 0xe8, 0xd7, 0x4e, - 0x14, 0x5b, 0xab, 0x50, 0x5c, 0xbe, 0x87, 0x6a, 0x2d, 0xfb, 0x49, 0x1b, 0xe5, 0x92, 0x94, 0xee, - 0x17, 0x1f, 0x1f, 0x2f, 0x3c, 0x47, 0x0f, 0xd0, 0x29, 0xc8, 0xe6, 0x85, 0x56, 0x5d, 0x8b, 0xd3, - 0x4a, 0x50, 0xce, 0xff, 0x70, 0x16, 0xf2, 0xb8, 0xd3, 0xc4, 0xb2, 0x53, 0x64, 0x4e, 0x95, 0x9d, - 0xe2, 0x7d, 0x18, 0x5f, 0xbe, 0xc7, 0x0f, 0x9d, 0x2b, 0xb6, 0xbf, 0x2f, 0xe4, 0x20, 0xde, 0xb1, - 0xd1, 0x03, 0x4b, 0x9c, 0x51, 0xf7, 0x6d, 0x4d, 0xc9, 0xd3, 0x28, 0xc8, 0x03, 0x98, 0xe1, 0x6d, - 0x73, 0x76, 0x9d, 0x3a, 0x0f, 0x72, 0x77, 0xec, 0xa6, 0x10, 0x8a, 0x97, 0x1e, 0x1f, 0x2f, 0x2c, - 0xd0, 0x03, 0x74, 0x77, 0x12, 0xe5, 0x96, 0x8f, 0x08, 0xaa, 0xdf, 0x53, 0x0a, 0xbd, 0x1a, 0x79, - 0x6b, 0x8e, 0x62, 0x85, 0xac, 0x36, 0x56, 0x37, 0xc3, 0xe5, 0x48, 0xc6, 0xdf, 0x1b, 0x82, 0xf9, - 0xde, 0xf2, 0x8c, 0x7c, 0x59, 0x1f, 0xc0, 0xcb, 0x27, 0x4a, 0xc0, 0x93, 0xc7, 0xf0, 0x2b, 0x30, - 0xbb, 0xdc, 0x0e, 0xa8, 0xd7, 0xf1, 0x1c, 0x19, 0x6b, 0xbd, 0xe2, 0xfa, 0xd2, 0xbd, 0x0c, 0xfd, - 0xbc, 0x68, 0x58, 0x2e, 0xec, 0x83, 0xe8, 0xec, 0xa6, 0xb0, 0x4a, 0xe5, 0x40, 0x96, 0x61, 0x52, - 0x81, 0x37, 0xbb, 0x7b, 0x62, 0x07, 0x47, 0xdf, 0x45, 0x95, 0x67, 0xb3, 0xab, 0x1e, 0x74, 0x62, - 0x44, 0xf3, 0xbf, 0x94, 0x13, 0xd3, 0xe2, 0x12, 0xe4, 0x6a, 0xdd, 0x1d, 0x31, 0x1d, 0xb8, 0xaa, - 0xae, 0x89, 0x75, 0x56, 0x4a, 0xbe, 0x08, 0x60, 0xd2, 0x8e, 0xeb, 0x3b, 0x81, 0xeb, 0x1d, 0xa9, - 0xee, 0xff, 0x5e, 0x08, 0xd5, 0x7d, 0x35, 0x25, 0x94, 0xac, 0xc0, 0x54, 0xf4, 0x6b, 0xfd, 0xb0, - 0x2d, 0x8c, 0x9a, 0xa3, 0xdc, 0x9a, 0x10, 0x91, 0x5b, 0x2e, 0x2b, 0x53, 0x37, 0xaa, 0x18, 0x19, - 0x59, 0x84, 0xc2, 0xb6, 0xeb, 0x1d, 0xec, 0xb2, 0x81, 0xca, 0x47, 0x5b, 0xe9, 0xa1, 0x80, 0xa9, - 0x5b, 0x86, 0xc4, 0x63, 0x73, 0x7e, 0xb9, 0xfd, 0xd0, 0xf1, 0xdc, 0x76, 0x8b, 0xb6, 0x03, 0xf5, - 0xfe, 0x91, 0x46, 0x60, 0x2d, 0x58, 0x2a, 0x02, 0xb3, 0x33, 0x73, 0xa9, 0x1e, 0xb8, 0x9e, 0xb8, - 0x7c, 0xe4, 0xc3, 0xcd, 0x00, 0xda, 0x70, 0x33, 0x00, 0xeb, 0x44, 0x93, 0xee, 0x0a, 0xab, 0x39, - 0x76, 0xa2, 0x47, 0x77, 0xb5, 0x48, 0x30, 0xba, 0xcb, 0x54, 0x01, 0x93, 0xee, 0xe2, 0x41, 0x5f, - 0x4b, 0xa0, 0xb2, 0x9b, 0x30, 0x11, 0x09, 0x34, 0xe3, 0x77, 0x47, 0x7b, 0xce, 0x5b, 0x26, 0x7b, - 0x4f, 0x37, 0x6f, 0x57, 0xed, 0x01, 0xe6, 0xed, 0x6b, 0xa1, 0x07, 0xa8, 0x1a, 0xfe, 0x88, 0x10, - 0x55, 0xf8, 0x73, 0x9c, 0xf9, 0x5f, 0x2e, 0x9c, 0x66, 0x12, 0x89, 0x4e, 0xca, 0x0e, 0xda, 0x49, - 0xb9, 0x81, 0x3a, 0x89, 0x2c, 0xc1, 0x44, 0x98, 0x82, 0x67, 0xc3, 0x0e, 0x34, 0xd9, 0x14, 0xe6, - 0x4d, 0xb2, 0x3a, 0x76, 0xa0, 0xca, 0x26, 0x9d, 0x84, 0xbc, 0x0d, 0x63, 0xc2, 0x0d, 0x1a, 0x39, - 0x0c, 0x45, 0x8e, 0x68, 0xd2, 0x67, 0x3a, 0x46, 0xaf, 0xa2, 0xb3, 0x25, 0xb9, 0xe1, 0x74, 0x68, - 0xd3, 0x69, 0xd3, 0x1a, 0x5a, 0xcd, 0xc5, 0x8c, 0xc1, 0x25, 0xd9, 0x11, 0x25, 0x16, 0x37, 0xa8, - 0x6b, 0xf6, 0x32, 0x8d, 0x28, 0x3e, 0x59, 0x47, 0x4e, 0x35, 0x59, 0xb9, 0x1f, 0x88, 0xb7, 0xea, - 0xee, 0x39, 0xd2, 0xf3, 0x4d, 0xfa, 0x81, 0x78, 0x56, 0x93, 0x41, 0x63, 0x7e, 0x20, 0x1c, 0x95, - 0xe9, 0xf5, 0xec, 0x47, 0xb5, 0x22, 0x6e, 0x68, 0x50, 0xaf, 0x47, 0x22, 0xdd, 0xdd, 0x90, 0x23, - 0xc9, 0x6a, 0x96, 0x5b, 0xb6, 0xd3, 0x14, 0x51, 0x6e, 0x51, 0x35, 0x94, 0x41, 0xe3, 0xd5, 0x20, - 0x2a, 0xa9, 0xc3, 0xb8, 0x49, 0x77, 0x37, 0x3c, 0x37, 0xa0, 0xf5, 0x80, 0x36, 0x84, 0x2e, 0x23, - 0xd5, 0xf9, 0x25, 0xd7, 0xe5, 0x7a, 0xda, 0xd2, 0xeb, 0xbf, 0x7b, 0xbc, 0x90, 0xf9, 0xde, 0xf1, - 0x02, 0x30, 0x10, 0xf7, 0x65, 0x7d, 0x7c, 0xbc, 0x70, 0x8e, 0x8d, 0x7f, 0x47, 0x12, 0xab, 0x5b, - 0x8c, 0xca, 0x94, 0xfc, 0x20, 0x13, 0xba, 0x61, 0x97, 0x44, 0x95, 0x8d, 0xf7, 0xa8, 0xec, 0x8d, - 0xd4, 0xca, 0x16, 0x94, 0xde, 0x4e, 0xad, 0x34, 0xb5, 0x12, 0xf2, 0x0e, 0x8c, 0x95, 0xab, 0x65, - 0xb7, 0xbd, 0xeb, 0xec, 0xd5, 0x56, 0x4a, 0xa8, 0x10, 0x09, 0x3f, 0xe6, 0xba, 0x63, 0xd5, 0x11, - 0x6e, 0xf9, 0xfb, 0xb6, 0x16, 0x0b, 0x12, 0xe1, 0x93, 0x3b, 0x30, 0x29, 0x7f, 0x9a, 0x74, 0xf7, - 0x81, 0x59, 0x45, 0x3d, 0x48, 0x3a, 0x8f, 0x87, 0x1c, 0x58, 0x47, 0x74, 0x3d, 0x55, 0x3f, 0x8e, - 0x91, 0xb1, 0xc9, 0x58, 0xa1, 0x9d, 0xa6, 0x7b, 0xc4, 0x9a, 0xb7, 0xe9, 0x50, 0x0f, 0x35, 0x1f, - 0x31, 0x19, 0x1b, 0x61, 0x89, 0x15, 0x38, 0x9a, 0xb8, 0x8d, 0x11, 0x91, 0x35, 0x98, 0x16, 0x53, - 0x7c, 0xcb, 0xf1, 0x9d, 0x1d, 0xa7, 0xe9, 0x04, 0x47, 0x73, 0x45, 0xe4, 0x84, 0x5a, 0x88, 0x5c, - 0x17, 0x0f, 0xc3, 0x52, 0x85, 0x59, 0x92, 0xd4, 0xf8, 0xd5, 0x2c, 0x3c, 0xd7, 0x4f, 0xff, 0x27, - 0x35, 0x5d, 0x98, 0x5d, 0x19, 0xe0, 0xcc, 0x70, 0xb2, 0x38, 0x5b, 0x86, 0xc9, 0x75, 0x6f, 0xcf, - 0x6e, 0x3b, 0xdf, 0xc2, 0x73, 0x5d, 0xe8, 0x0e, 0x83, 0x9d, 0xe1, 0x2a, 0x25, 0xfa, 0x6c, 0x8f, - 0x11, 0xcd, 0x3f, 0x14, 0x62, 0xee, 0x93, 0x06, 0x56, 0xdc, 0x82, 0xd1, 0xb2, 0xdb, 0x0e, 0xe8, - 0xa3, 0x20, 0x16, 0x3c, 0xc7, 0x81, 0xf1, 0xe0, 0x39, 0x89, 0x6a, 0xfc, 0xbf, 0x59, 0xb8, 0xd0, - 0x57, 0x01, 0x26, 0x9b, 0x7a, 0xaf, 0x5d, 0x1d, 0x44, 0x6b, 0x3e, 0xb9, 0xdb, 0x16, 0x13, 0x9e, - 0x1b, 0x27, 0xfa, 0x2d, 0xcf, 0xff, 0x97, 0x19, 0xd1, 0x49, 0x9f, 0x83, 0x11, 0xac, 0x2a, 0xec, - 0x22, 0x6e, 0x1b, 0x42, 0x29, 0xec, 0xe8, 0xb6, 0x21, 0x8e, 0x46, 0x6e, 0x42, 0xa1, 0x6c, 0x37, - 0x9b, 0x4a, 0x68, 0x21, 0xea, 0xf5, 0x75, 0x84, 0xc5, 0x1c, 0x7d, 0x24, 0x22, 0x79, 0x13, 0x80, - 0xff, 0xad, 0xec, 0x15, 0x28, 0x2c, 0x05, 0x59, 0x6c, 0xbb, 0x50, 0x90, 0x31, 0x89, 0x58, 0xdd, - 0x0d, 0x63, 0xa0, 0x78, 0x12, 0x31, 0x06, 0xd0, 0x92, 0x88, 0x31, 0x80, 0xf1, 0x6b, 0x39, 0x78, - 0xbe, 0xff, 0x29, 0x8e, 0x3c, 0xd0, 0x87, 0xe0, 0x95, 0x81, 0xce, 0x7e, 0x27, 0x8f, 0x81, 0x4c, - 0xc9, 0xc7, 0x3b, 0xe4, 0x4a, 0xd2, 0xbd, 0xf8, 0xe3, 0xe3, 0x05, 0xc5, 0x7b, 0xec, 0xae, 0xeb, - 0xb4, 0x95, 0x3b, 0x82, 0x6f, 0x02, 0xd4, 0x02, 0x3b, 0x70, 0xea, 0x77, 0xb7, 0xef, 0xc9, 0x88, - 0xf5, 0x5b, 0x83, 0xb5, 0x2c, 0xa2, 0xe3, 0x72, 0x45, 0x98, 0xcf, 0x11, 0x6a, 0x7d, 0x74, 0x78, - 0xa0, 0x9d, 0x53, 0x23, 0xe4, 0xf9, 0x2f, 0x41, 0x31, 0x4e, 0x4a, 0x2e, 0x43, 0x1e, 0x1b, 0xa0, - 0xf8, 0x48, 0xc7, 0x38, 0x60, 0xf9, 0xfc, 0x7d, 0x31, 0x77, 0x96, 0x61, 0x52, 0x5c, 0x4c, 0xeb, - 0x16, 0x31, 0x5c, 0xaf, 0xf2, 0x5e, 0x3b, 0x69, 0x15, 0x8b, 0x11, 0x19, 0x7f, 0x96, 0x81, 0xf3, - 0x3d, 0xcf, 0xc7, 0x64, 0x43, 0x1f, 0xb0, 0x97, 0x4e, 0x3a, 0x50, 0x9f, 0x38, 0x56, 0xf3, 0x3f, - 0x21, 0xe7, 0xfe, 0xbb, 0x30, 0x5e, 0xeb, 0xee, 0xc4, 0x0f, 0x59, 0x3c, 0x7e, 0x59, 0x81, 0xab, - 0x3b, 0x98, 0x8a, 0xcf, 0xbe, 0x5f, 0xde, 0xbc, 0x0b, 0xc7, 0x0a, 0x7e, 0xf0, 0xc3, 0xef, 0x0f, - 0x03, 0xa3, 0x30, 0x6e, 0x4d, 0xed, 0xc4, 0x18, 0x91, 0xf1, 0x2b, 0xd9, 0xf4, 0xd3, 0x2a, 0x3b, - 0x6b, 0x9f, 0xe2, 0xb4, 0x7a, 0xa7, 0xbc, 0x71, 0xf2, 0xb7, 0xff, 0xc7, 0xf2, 0xdb, 0xf1, 0x22, - 0x52, 0x48, 0x3c, 0x69, 0xde, 0x13, 0x17, 0x91, 0x52, 0x3a, 0xfa, 0xfa, 0x45, 0xa4, 0x44, 0x26, - 0x6f, 0xc0, 0xe8, 0xaa, 0xcb, 0xe3, 0x49, 0xe5, 0x17, 0xf3, 0xc8, 0x21, 0x09, 0x54, 0xc5, 0x63, - 0x88, 0xc9, 0xce, 0x16, 0xfa, 0xc0, 0x4b, 0xf7, 0x6e, 0x3c, 0x5b, 0xc4, 0xa6, 0x8b, 0x6e, 0x04, - 0xd3, 0xc9, 0x8c, 0x9f, 0xc8, 0xc2, 0x24, 0x9f, 0xbc, 0xdc, 0x48, 0xfb, 0xd4, 0x1a, 0xc0, 0xdf, - 0xd2, 0x0c, 0xe0, 0x32, 0xd5, 0x81, 0xfa, 0x69, 0x03, 0x99, 0xbf, 0xf7, 0x81, 0x24, 0x69, 0x88, - 0x09, 0xe3, 0x2a, 0xb4, 0xbf, 0xe5, 0xfb, 0x46, 0x94, 0x15, 0x43, 0xc8, 0x0e, 0xbc, 0x7e, 0xf0, - 0x4d, 0x8d, 0x87, 0xf1, 0x57, 0xb3, 0x30, 0xa1, 0x5c, 0x54, 0x3e, 0xb5, 0x1d, 0xff, 0x25, 0xad, - 0xe3, 0xe7, 0x42, 0x97, 0xe4, 0xf0, 0xcb, 0x06, 0xea, 0xf7, 0x2e, 0x4c, 0x27, 0x48, 0xe2, 0xf7, - 0xbd, 0x99, 0x41, 0xee, 0x7b, 0x5f, 0x4b, 0x86, 0xeb, 0xf3, 0x4c, 0x95, 0x61, 0xb8, 0xbe, 0x9a, - 0x1f, 0xe0, 0xa7, 0xb2, 0x30, 0x2b, 0x7e, 0x61, 0x4e, 0x1a, 0x2e, 0xbd, 0x9f, 0xda, 0xb1, 0x28, - 0x69, 0x63, 0xb1, 0xa0, 0x8f, 0x85, 0xf2, 0x81, 0xbd, 0x87, 0xc4, 0xf8, 0xcb, 0x00, 0x73, 0xbd, - 0x08, 0x06, 0x8e, 0xfc, 0x89, 0xfc, 0xaa, 0xb3, 0x03, 0xf8, 0x55, 0xaf, 0x42, 0x11, 0xab, 0x12, - 0x19, 0x2c, 0x7c, 0x76, 0x06, 0xc8, 0x45, 0x0a, 0x37, 0x4f, 0x1c, 0x24, 0xb2, 0x60, 0xf8, 0xb1, - 0x43, 0x40, 0x82, 0x92, 0xfc, 0x52, 0x06, 0x26, 0x11, 0xb8, 0xfc, 0x90, 0xb6, 0x03, 0x64, 0x96, - 0x17, 0x6e, 0xc0, 0xa1, 0x7d, 0xbc, 0x16, 0x78, 0x4e, 0x7b, 0x4f, 0x18, 0xc8, 0x77, 0x84, 0x81, - 0xfc, 0x6d, 0x6e, 0xd8, 0xbf, 0x56, 0x77, 0x5b, 0xd7, 0xf7, 0x3c, 0xfb, 0xa1, 0xc3, 0xef, 0xe0, - 0xed, 0xe6, 0xf5, 0x28, 0x51, 0x72, 0xc7, 0x89, 0xa5, 0x3e, 0x16, 0xac, 0xf0, 0xf2, 0x81, 0x37, - 0x94, 0x62, 0xb5, 0xf1, 0xb3, 0x8a, 0xde, 0x22, 0xf2, 0x03, 0x70, 0x8e, 0x87, 0xa7, 0x33, 0x95, - 0xd7, 0x69, 0x77, 0xdd, 0xae, 0xbf, 0x64, 0xd7, 0x0f, 0xd8, 0xbe, 0xc7, 0x43, 0x19, 0xf0, 0xcb, - 0xeb, 0x61, 0xa1, 0xb5, 0xc3, 0x4b, 0xb5, 0xd0, 0xad, 0x74, 0x06, 0x64, 0x05, 0xa6, 0x79, 0x51, - 0xa9, 0x1b, 0xb8, 0xb5, 0xba, 0xdd, 0x74, 0xda, 0x7b, 0x78, 0xa6, 0x2e, 0xf0, 0xfd, 0xd8, 0xee, - 0x06, 0xae, 0xe5, 0x73, 0xb8, 0x7a, 0x74, 0x49, 0x10, 0x91, 0x2a, 0x4c, 0x99, 0xd4, 0x6e, 0xdc, - 0xb7, 0x1f, 0x95, 0xed, 0x8e, 0x5d, 0x67, 0x07, 0xa1, 0x02, 0x5e, 0x26, 0xe1, 0xd9, 0xcc, 0xa3, - 0x76, 0xc3, 0x6a, 0xd9, 0x8f, 0xac, 0xba, 0x28, 0xd4, 0x6d, 0x58, 0x1a, 0x5d, 0xc8, 0xca, 0x69, - 0x87, 0xac, 0x46, 0xe3, 0xac, 0x9c, 0x76, 0x6f, 0x56, 0x11, 0x9d, 0x64, 0xb5, 0x69, 0x7b, 0x7b, - 0x34, 0xe0, 0x2e, 0x6c, 0xec, 0x3c, 0x9e, 0x51, 0x58, 0x05, 0x58, 0x66, 0xa1, 0x3b, 0x5b, 0x9c, - 0x95, 0x42, 0xc7, 0x66, 0xde, 0xb6, 0xe7, 0x04, 0x54, 0xfd, 0xc2, 0x31, 0x6c, 0x16, 0xf6, 0x3f, - 0x3a, 0xff, 0xf5, 0xfa, 0xc4, 0x04, 0x65, 0xc4, 0x4d, 0xf9, 0xc8, 0xf1, 0x04, 0xb7, 0xf4, 0xaf, - 0x4c, 0x50, 0x86, 0xdc, 0xd4, 0xef, 0x9c, 0xc0, 0xef, 0x54, 0xb8, 0xf5, 0xf8, 0xd0, 0x04, 0x25, - 0x59, 0x63, 0x9d, 0x16, 0xd0, 0x36, 0x9b, 0xd1, 0xc2, 0x85, 0x6f, 0x12, 0x9b, 0xf6, 0xa2, 0xf0, - 0x43, 0x29, 0x7a, 0xb2, 0xd8, 0x4a, 0x71, 0xe8, 0x8b, 0x13, 0x93, 0xbf, 0x00, 0x53, 0x0f, 0x7c, - 0x7a, 0xbb, 0xba, 0x51, 0x93, 0x01, 0xf9, 0x78, 0xda, 0x9e, 0x5c, 0xbc, 0x71, 0x82, 0xd0, 0xb9, - 0xa6, 0xd2, 0x60, 0xbe, 0x62, 0x3e, 0x6e, 0x5d, 0x9f, 0x5a, 0xbb, 0x4e, 0xc7, 0x0f, 0x53, 0x83, - 0xa8, 0xe3, 0x16, 0xab, 0xca, 0x58, 0x81, 0xe9, 0x04, 0x1b, 0x32, 0x09, 0xc0, 0x80, 0xd6, 0x83, - 0xb5, 0xda, 0xf2, 0x66, 0xf1, 0x19, 0x52, 0x84, 0x71, 0xfc, 0xbd, 0xbc, 0x56, 0x5a, 0x5a, 0x5d, - 0xae, 0x14, 0x33, 0x64, 0x1a, 0x26, 0x10, 0x52, 0xa9, 0xd6, 0x38, 0x28, 0xcb, 0xb3, 0x55, 0x9a, - 0x45, 0xbe, 0x74, 0x03, 0xb6, 0x00, 0x70, 0x4f, 0x31, 0xfe, 0x46, 0x16, 0xce, 0xcb, 0x6d, 0x85, - 0x06, 0x87, 0xae, 0x77, 0xe0, 0xb4, 0xf7, 0x9e, 0xf2, 0xdd, 0xe1, 0xb6, 0xb6, 0x3b, 0xbc, 0x18, - 0xdb, 0xa9, 0x63, 0x5f, 0xd9, 0x67, 0x8b, 0xf8, 0x5f, 0x0a, 0x70, 0xa1, 0x2f, 0x15, 0xf9, 0x32, - 0xdb, 0xcd, 0x1d, 0xda, 0x0e, 0xaa, 0x8d, 0x26, 0xdd, 0x74, 0x5a, 0xd4, 0xed, 0x06, 0xc2, 0x65, - 0xf4, 0x12, 0x1e, 0x70, 0xb1, 0xd0, 0x72, 0x1a, 0x4d, 0x6a, 0x05, 0xbc, 0x58, 0x9b, 0x6e, 0x49, - 0x6a, 0xc6, 0x32, 0xcc, 0x9d, 0x5e, 0x6d, 0x07, 0xd4, 0x7b, 0x88, 0xce, 0x29, 0x21, 0xcb, 0x03, - 0x4a, 0x3b, 0x96, 0xcd, 0x4a, 0x2d, 0x47, 0x14, 0xeb, 0x2c, 0x13, 0xd4, 0xe4, 0xb6, 0xc2, 0xb2, - 0xcc, 0xd4, 0xe1, 0xfb, 0xf6, 0x23, 0x71, 0x5b, 0x2e, 0xd2, 0x1a, 0x85, 0x2c, 0x79, 0xb4, 0x51, - 0xcb, 0x7e, 0x64, 0x26, 0x49, 0xc8, 0xd7, 0xe0, 0x8c, 0xd8, 0x80, 0x44, 0xb4, 0xa8, 0xfc, 0x62, - 0x1e, 0x8b, 0xfa, 0xf2, 0xe3, 0xe3, 0x85, 0x73, 0x32, 0x89, 0x93, 0x8c, 0x0f, 0x4e, 0xfb, 0xea, - 0x74, 0x2e, 0x64, 0x93, 0x6d, 0xc8, 0xb1, 0xee, 0xb8, 0x4f, 0x7d, 0xdf, 0xde, 0x93, 0x37, 0xeb, - 0xdc, 0xbf, 0x5e, 0xe9, 0x4c, 0xab, 0xc5, 0xcb, 0xcd, 0x9e, 0x94, 0x64, 0x05, 0x26, 0xb7, 0xe9, - 0x8e, 0x3a, 0x3e, 0xc3, 0xa1, 0xa8, 0x2a, 0x1e, 0xd2, 0x9d, 0xde, 0x83, 0x13, 0xa3, 0x23, 0x0e, - 0x1a, 0xcc, 0x1e, 0x1d, 0xad, 0x3a, 0x7e, 0x40, 0xdb, 0xd4, 0xc3, 0x2c, 0x04, 0x23, 0x28, 0x0c, - 0xe6, 0x22, 0x0d, 0x59, 0x2f, 0x5f, 0x7a, 0xe1, 0xf1, 0xf1, 0xc2, 0x05, 0x1e, 0x4f, 0xd2, 0x14, - 0x70, 0x2b, 0x96, 0x79, 0x3c, 0xc9, 0x95, 0x7c, 0x03, 0xa6, 0x4c, 0xb7, 0x1b, 0x38, 0xed, 0xbd, - 0x5a, 0xe0, 0xd9, 0x01, 0xdd, 0xe3, 0x1b, 0x52, 0x94, 0xee, 0x20, 0x56, 0x2a, 0xee, 0x5a, 0x38, - 0xd0, 0xf2, 0x05, 0x54, 0xdb, 0x11, 0x74, 0x02, 0xf2, 0x75, 0x98, 0xe4, 0x71, 0x82, 0x61, 0x05, - 0xa3, 0x5a, 0xd6, 0x54, 0xbd, 0x70, 0xeb, 0x06, 0x3f, 0xa0, 0xf2, 0x78, 0xc3, 0xb4, 0x0a, 0x62, - 0xdc, 0xc8, 0x87, 0xa2, 0xb3, 0x36, 0x9c, 0xf6, 0x5e, 0x38, 0x8d, 0x01, 0x7b, 0xfe, 0xf5, 0xa8, - 0x4b, 0x3a, 0xac, 0xb9, 0x72, 0x1a, 0xf7, 0xf0, 0xd4, 0x48, 0xf2, 0x21, 0x01, 0x5c, 0x28, 0xf9, - 0xbe, 0xe3, 0x07, 0xc2, 0xb1, 0x7a, 0xf9, 0x11, 0xad, 0x77, 0x19, 0xf2, 0xb6, 0xeb, 0x1d, 0x50, - 0x8f, 0xbb, 0xf6, 0x0d, 0x2d, 0x5d, 0x7b, 0x7c, 0xbc, 0xf0, 0x8a, 0x8d, 0x88, 0x96, 0xf0, 0xc5, - 0xb6, 0xa8, 0x44, 0xb5, 0x0e, 0x39, 0xae, 0xf2, 0x0d, 0xfd, 0x99, 0x92, 0xaf, 0xc3, 0xd9, 0xb2, - 0xed, 0xd3, 0x6a, 0xdb, 0xa7, 0x6d, 0xdf, 0x09, 0x9c, 0x87, 0x54, 0x74, 0x2a, 0x6e, 0x7e, 0x05, - 0xcc, 0xd1, 0x6e, 0xd4, 0x6d, 0x9f, 0x2d, 0xcc, 0x10, 0xc5, 0x12, 0x83, 0xa2, 0x54, 0xd3, 0x83, - 0x8b, 0x71, 0x9c, 0x81, 0x62, 0xbc, 0xdb, 0xc9, 0x57, 0x60, 0x94, 0xbb, 0x24, 0x50, 0x7f, 0x5f, - 0x84, 0xb8, 0xc9, 0x1b, 0xee, 0x10, 0xae, 0x13, 0x89, 0xa0, 0x04, 0xee, 0xf0, 0x40, 0xd5, 0xfb, - 0x5a, 0x0c, 0x4a, 0x90, 0x44, 0xa4, 0x01, 0xe3, 0xbc, 0x67, 0x29, 0xe6, 0x25, 0x11, 0x9e, 0x69, - 0x2f, 0xa8, 0x33, 0x59, 0x14, 0xc5, 0xf8, 0xa3, 0xc9, 0x5b, 0x8c, 0x1f, 0x47, 0xd0, 0xaa, 0xd0, - 0xb8, 0x2e, 0x01, 0x14, 0x24, 0xa1, 0x71, 0x1e, 0xce, 0xf5, 0x68, 0xb3, 0xf1, 0x10, 0xaf, 0xc1, - 0x7a, 0xd4, 0x48, 0xbe, 0x02, 0xb3, 0x48, 0x58, 0x76, 0xdb, 0x6d, 0x5a, 0x0f, 0x50, 0x74, 0x48, - 0xd3, 0x51, 0x8e, 0xdf, 0xb5, 0xf2, 0xef, 0xad, 0x87, 0x08, 0x56, 0xdc, 0x82, 0x94, 0xca, 0xc1, - 0xf8, 0xb9, 0x2c, 0xcc, 0x09, 0x69, 0x64, 0xd2, 0xba, 0xeb, 0x35, 0x9e, 0xfe, 0xdd, 0x6f, 0x59, - 0xdb, 0xfd, 0x2e, 0x85, 0x31, 0xcd, 0x69, 0x1f, 0xd9, 0x67, 0xf3, 0xfb, 0x95, 0x0c, 0x3c, 0xd7, - 0x8f, 0x88, 0xf5, 0x4e, 0x98, 0x87, 0x65, 0x34, 0x91, 0x6f, 0xa5, 0x03, 0x33, 0x38, 0xa0, 0xe5, - 0x7d, 0x5a, 0x3f, 0xf0, 0x57, 0x5c, 0x3f, 0x40, 0xc7, 0xd8, 0x6c, 0x8f, 0x8b, 0x9a, 0xd7, 0x52, - 0x2f, 0x6a, 0xce, 0xf2, 0x59, 0x56, 0x47, 0x1e, 0x3c, 0x53, 0xcc, 0x01, 0x3d, 0xf2, 0xcd, 0x34, - 0xd6, 0xe8, 0xe4, 0x58, 0xea, 0x06, 0xfb, 0x1b, 0x1e, 0xdd, 0xa5, 0x1e, 0x6d, 0xd7, 0xe9, 0xf7, - 0x99, 0x93, 0xa3, 0xfe, 0x71, 0x03, 0x59, 0x1b, 0x7e, 0x65, 0x1c, 0x66, 0xd3, 0xc8, 0x58, 0xbf, - 0x28, 0x07, 0xdc, 0xf8, 0x73, 0x2f, 0x3f, 0x9a, 0x81, 0xf1, 0x1a, 0xad, 0xbb, 0xed, 0xc6, 0x6d, - 0xbc, 0x0e, 0x17, 0xbd, 0x63, 0xf1, 0x0d, 0x9e, 0xc1, 0xad, 0xdd, 0xd8, 0x3d, 0xf9, 0xc7, 0xc7, - 0x0b, 0xef, 0x0f, 0x76, 0xae, 0xac, 0xbb, 0x18, 0x97, 0x1c, 0x60, 0x3a, 0xd2, 0xb0, 0x0a, 0xb4, - 0x6c, 0x6b, 0x95, 0x92, 0x25, 0x98, 0x10, 0xcb, 0xd5, 0x55, 0xd3, 0xf0, 0xf0, 0xb0, 0x6f, 0x59, - 0x90, 0xc8, 0x3b, 0xa6, 0x91, 0x90, 0x9b, 0x90, 0x7b, 0xb0, 0x78, 0x5b, 0x8c, 0x81, 0x4c, 0xe8, - 0xfa, 0x60, 0xf1, 0x36, 0x9a, 0xae, 0xd8, 0x71, 0x60, 0xa2, 0xbb, 0xa8, 0xdd, 0x50, 0x3f, 0x58, - 0xbc, 0x4d, 0xfe, 0x12, 0x9c, 0xa9, 0x38, 0xbe, 0xa8, 0x82, 0xbb, 0xdb, 0x36, 0x30, 0xbc, 0x64, - 0xb8, 0xc7, 0xec, 0xfd, 0x42, 0xea, 0xec, 0x7d, 0xa1, 0x11, 0x32, 0xb1, 0xb8, 0x2f, 0x6f, 0x23, - 0x9e, 0x6e, 0x28, 0xbd, 0x1e, 0xf2, 0x11, 0x4c, 0xa2, 0xe9, 0x15, 0x3d, 0x90, 0x31, 0x3d, 0xe2, - 0x48, 0x8f, 0x9a, 0x3f, 0x97, 0x5a, 0xf3, 0x3c, 0x5a, 0x72, 0x2d, 0xf4, 0x63, 0xc6, 0x54, 0x8a, - 0xda, 0x09, 0x5d, 0xe3, 0x4c, 0xee, 0xc2, 0x94, 0x50, 0x95, 0xd6, 0x77, 0x37, 0xf7, 0x69, 0xc5, - 0x3e, 0x12, 0x97, 0xcb, 0x78, 0xfa, 0x12, 0xfa, 0x95, 0xe5, 0xee, 0x5a, 0xc1, 0x3e, 0xb5, 0x1a, - 0xb6, 0xa6, 0x54, 0xc4, 0x08, 0xc9, 0x0f, 0xc2, 0xd8, 0xaa, 0x5b, 0x67, 0x5a, 0x32, 0x4a, 0x06, - 0x7e, 0xdf, 0xfc, 0x01, 0x3e, 0x28, 0xc2, 0xc1, 0x31, 0xd5, 0xe7, 0xe3, 0xe3, 0x85, 0xb7, 0x4e, - 0x3b, 0x69, 0x94, 0x0a, 0x4c, 0xb5, 0x36, 0x52, 0x86, 0xc2, 0x36, 0xdd, 0x61, 0x5f, 0x1b, 0x7f, - 0x6c, 0x40, 0x82, 0x85, 0x3b, 0x89, 0xf8, 0xa5, 0xb9, 0x93, 0x08, 0x18, 0xf1, 0x60, 0x1a, 0xfb, - 0x67, 0xc3, 0xf6, 0xfd, 0x43, 0xd7, 0x6b, 0x60, 0x56, 0xd9, 0x5e, 0x57, 0xd9, 0x8b, 0xa9, 0x9d, - 0xff, 0x1c, 0xef, 0xfc, 0x8e, 0xc2, 0x41, 0x55, 0xf6, 0x12, 0xec, 0xc9, 0x37, 0x60, 0xd2, 0xa4, - 0xdf, 0xec, 0x3a, 0x1e, 0xbd, 0x7f, 0xbb, 0x84, 0xab, 0x72, 0x5c, 0x0b, 0xd2, 0xd1, 0x0b, 0xb9, - 0x46, 0xe9, 0x71, 0x98, 0xb4, 0x16, 0x59, 0xad, 0x5d, 0x5b, 0xbf, 0x2d, 0x50, 0x49, 0xc8, 0x06, - 0x8c, 0x55, 0xe8, 0x43, 0xa7, 0x4e, 0x31, 0x94, 0x40, 0xb8, 0xf2, 0x85, 0xd9, 0xd2, 0xa3, 0x12, - 0x6e, 0x37, 0x69, 0x20, 0x80, 0x07, 0x26, 0xe8, 0xde, 0x62, 0x21, 0x22, 0xb9, 0x05, 0xb9, 0x6a, - 0x65, 0x43, 0x78, 0xf2, 0x49, 0x0f, 0xfd, 0x6a, 0x63, 0x43, 0xe6, 0x96, 0x46, 0xe7, 0x0f, 0xa7, - 0xa1, 0xf9, 0x01, 0x56, 0x2b, 0x1b, 0x64, 0x17, 0x26, 0xb0, 0x03, 0x56, 0xa8, 0xcd, 0xfb, 0x76, - 0xaa, 0x47, 0xdf, 0x5e, 0x4b, 0xed, 0xdb, 0x39, 0xde, 0xb7, 0xfb, 0x82, 0x5a, 0x4b, 0x96, 0xab, - 0xb2, 0x65, 0xea, 0xa7, 0x48, 0xe0, 0x2d, 0xd3, 0xc5, 0x6e, 0xae, 0xe2, 0xe5, 0xb6, 0x50, 0x3f, - 0x65, 0xbe, 0xef, 0x30, 0xe7, 0x6c, 0x4f, 0x47, 0xe1, 0x24, 0x1f, 0xf2, 0x25, 0xc8, 0xaf, 0x1f, - 0x04, 0xf6, 0xdc, 0xb4, 0xd6, 0x8f, 0x0c, 0x24, 0x3f, 0x1f, 0x2d, 0x86, 0xee, 0x81, 0x96, 0x90, - 0x02, 0x69, 0xc8, 0x22, 0x8c, 0x6c, 0x54, 0xb7, 0x6a, 0x4d, 0x37, 0x98, 0x23, 0xe1, 0x99, 0x86, - 0x74, 0x9c, 0x87, 0x96, 0xdf, 0x74, 0xf5, 0x47, 0x00, 0x24, 0x22, 0x1b, 0xbe, 0x15, 0xdb, 0x6b, - 0x1c, 0xda, 0x1e, 0x46, 0x80, 0xcd, 0x68, 0xd5, 0x2a, 0x25, 0x7c, 0xf8, 0xf6, 0x05, 0x20, 0x16, - 0x16, 0xa6, 0xb2, 0x10, 0xd6, 0x80, 0x69, 0x31, 0x4d, 0xc4, 0xa7, 0xdd, 0xbf, 0x5d, 0x32, 0xfe, - 0x83, 0x0c, 0x0a, 0x4c, 0xf2, 0x0a, 0xc6, 0xac, 0x87, 0x17, 0xbc, 0x68, 0xd7, 0xb4, 0x3b, 0xb1, - 0x14, 0x8b, 0x1c, 0x85, 0xbc, 0x06, 0xc3, 0xb7, 0xed, 0x3a, 0x0d, 0xe4, 0xc5, 0x0e, 0x22, 0xef, - 0x22, 0x44, 0x35, 0x82, 0x72, 0x1c, 0xa6, 0xcb, 0xf1, 0x89, 0x54, 0x8a, 0x5e, 0x5f, 0x2b, 0x97, - 0xe4, 0xbd, 0x0e, 0xea, 0x72, 0x62, 0x02, 0x2a, 0xcf, 0xb3, 0xc5, 0x7c, 0x20, 0x53, 0x39, 0x18, - 0x7f, 0x92, 0x89, 0x24, 0x00, 0x79, 0x19, 0xf2, 0xe6, 0x46, 0xd8, 0x7e, 0x1e, 0x0d, 0x15, 0x6b, - 0x3e, 0x22, 0x90, 0x0f, 0xe1, 0x8c, 0xc2, 0x27, 0xe1, 0x90, 0xf9, 0x12, 0x86, 0xeb, 0x28, 0x2d, - 0x49, 0xf7, 0xca, 0x4c, 0xe7, 0x81, 0x8a, 0x6b, 0x54, 0x50, 0xa1, 0x6d, 0x87, 0xf3, 0x56, 0x3e, - 0x56, 0xe5, 0xdd, 0x40, 0x84, 0xf8, 0xc7, 0xa6, 0x71, 0xe0, 0x11, 0x3b, 0xc6, 0x6f, 0x66, 0xb4, - 0x95, 0x1d, 0x3e, 0x73, 0x95, 0x39, 0xe1, 0x99, 0xab, 0x37, 0x01, 0x4a, 0xdd, 0xc0, 0x5d, 0x6e, - 0x7b, 0x6e, 0x93, 0x5b, 0x17, 0x44, 0x96, 0x51, 0xb4, 0x99, 0x52, 0x04, 0x6b, 0x81, 0x05, 0x21, - 0x72, 0xaa, 0xef, 0x6a, 0xee, 0x93, 0xfa, 0xae, 0x1a, 0xbf, 0x97, 0xd1, 0xe6, 0x36, 0xd3, 0xc8, - 0xe4, 0xf2, 0x50, 0x5c, 0x0b, 0x92, 0xcb, 0x23, 0x5a, 0x1c, 0xff, 0xff, 0x0c, 0x9c, 0xe5, 0x4e, - 0xa0, 0x6b, 0xdd, 0xd6, 0x0e, 0xf5, 0xb6, 0xec, 0xa6, 0xd3, 0xe0, 0x11, 0x69, 0x5c, 0xd9, 0xbc, - 0x92, 0x5c, 0x28, 0xe9, 0xf8, 0xfc, 0x00, 0xc7, 0x9d, 0x52, 0xad, 0x36, 0x16, 0x5a, 0x0f, 0xc3, - 0x52, 0xf5, 0x00, 0x97, 0x4e, 0x6f, 0xfc, 0x6a, 0x06, 0x5e, 0x38, 0xb1, 0x16, 0x72, 0x1d, 0x46, - 0x64, 0x7a, 0xd7, 0x0c, 0x76, 0x3c, 0x3a, 0x64, 0x25, 0x53, 0xbb, 0x4a, 0x2c, 0xf2, 0x55, 0x38, - 0xa3, 0xb2, 0xda, 0xf4, 0x6c, 0x47, 0x4d, 0xa2, 0x9a, 0xd2, 0xea, 0x80, 0xa1, 0xc4, 0x35, 0xa3, - 0x74, 0x26, 0xc6, 0xff, 0x95, 0x51, 0x1e, 0xbe, 0x7b, 0x4a, 0xf5, 0xe5, 0x5b, 0x9a, 0xbe, 0x2c, - 0xb3, 0x05, 0x85, 0x5f, 0xc5, 0xca, 0x52, 0xcf, 0x38, 0x53, 0x8a, 0x63, 0x21, 0x02, 0xbe, 0x9d, - 0x85, 0xb1, 0x07, 0x3e, 0xf5, 0xf8, 0x05, 0xe7, 0xf7, 0x57, 0x56, 0x98, 0xf0, 0xbb, 0x06, 0xca, - 0xdb, 0xf1, 0x47, 0x19, 0x34, 0x7c, 0xab, 0x14, 0xac, 0x37, 0x94, 0xc7, 0x2e, 0xb0, 0x37, 0xf0, - 0x99, 0x0b, 0x84, 0xf2, 0xdc, 0x1e, 0xab, 0xfa, 0xbb, 0x37, 0xf8, 0xf8, 0xd1, 0x2a, 0x79, 0x1f, - 0x86, 0x1e, 0xa0, 0x19, 0x4f, 0x8f, 0x3e, 0x0e, 0xf9, 0x63, 0x21, 0x17, 0xd2, 0x5d, 0xf6, 0xa7, - 0xba, 0xc7, 0x60, 0x19, 0xa9, 0xc1, 0x48, 0xd9, 0xa3, 0xf8, 0x8c, 0x5d, 0x7e, 0xf0, 0x08, 0xba, - 0x3a, 0x27, 0x89, 0x47, 0xd0, 0x09, 0x4e, 0xc6, 0xcf, 0x66, 0x81, 0x44, 0xdf, 0x88, 0xf9, 0xdf, - 0xfd, 0xa7, 0x76, 0xd0, 0xdf, 0xd3, 0x06, 0xfd, 0x42, 0x62, 0xd0, 0xf9, 0xe7, 0x0d, 0x34, 0xf6, - 0xbf, 0x95, 0x81, 0xb3, 0xe9, 0x84, 0xe4, 0x12, 0x0c, 0xaf, 0x6f, 0x6e, 0xc8, 0x00, 0x76, 0xf1, - 0x29, 0x6e, 0x07, 0xcf, 0xe5, 0xa6, 0x28, 0x22, 0xaf, 0xc3, 0xf0, 0x97, 0xcd, 0x32, 0xdb, 0x87, - 0x94, 0x5c, 0xab, 0xdf, 0xf4, 0xac, 0xba, 0xbe, 0x15, 0x09, 0x24, 0x75, 0x6c, 0x73, 0x4f, 0x6c, - 0x6c, 0x7f, 0x2a, 0x0b, 0x53, 0xa5, 0x7a, 0x9d, 0xfa, 0x3e, 0x53, 0x72, 0xa8, 0x1f, 0x3c, 0xb5, - 0x03, 0x9b, 0x1e, 0x9a, 0xae, 0x7d, 0xdb, 0x40, 0xa3, 0xfa, 0x3b, 0x19, 0x38, 0x23, 0xa9, 0x1e, - 0x3a, 0xf4, 0x70, 0x73, 0xdf, 0xa3, 0xfe, 0xbe, 0xdb, 0x6c, 0x0c, 0x9c, 0xd0, 0x99, 0x29, 0x7a, - 0x98, 0xa5, 0x51, 0xbd, 0xed, 0xde, 0x45, 0x88, 0xa6, 0xe8, 0xf1, 0x4c, 0x8e, 0xd7, 0x61, 0xa4, - 0xd4, 0xe9, 0x78, 0xee, 0x43, 0xbe, 0xec, 0x27, 0x44, 0x40, 0x21, 0x07, 0x69, 0x01, 0x88, 0x1c, - 0xc4, 0x9a, 0x51, 0xa1, 0x6d, 0x9e, 0x4b, 0x67, 0x82, 0x37, 0xa3, 0x41, 0xdb, 0xaa, 0x0e, 0x8b, - 0xe5, 0x46, 0x0d, 0xc8, 0x86, 0xe7, 0xb6, 0xdc, 0x80, 0x36, 0xf8, 0xf7, 0x60, 0xdc, 0xe6, 0x89, - 0x49, 0x40, 0x36, 0x9d, 0xa0, 0xa9, 0x25, 0x01, 0x09, 0x18, 0xc0, 0xe4, 0x70, 0xe3, 0x7f, 0x1f, - 0x82, 0x71, 0xb5, 0x77, 0x88, 0xc1, 0xb3, 0xb4, 0xba, 0x9e, 0x1a, 0x3c, 0x6c, 0x23, 0xc4, 0x14, - 0x25, 0x51, 0xcc, 0x7d, 0xf6, 0xc4, 0x98, 0xfb, 0x6d, 0x98, 0xd8, 0xf0, 0xdc, 0x8e, 0xeb, 0xd3, - 0x06, 0x7f, 0xde, 0x94, 0x8b, 0xc2, 0x19, 0xe5, 0x8c, 0xc7, 0x06, 0x12, 0xef, 0x09, 0xd1, 0xc2, - 0xd1, 0x11, 0xd8, 0x56, 0xfc, 0xf1, 0x53, 0x9d, 0x0f, 0x77, 0x41, 0xb0, 0x7d, 0x91, 0x32, 0x2b, - 0x74, 0x41, 0x60, 0x10, 0xdd, 0x05, 0x81, 0x41, 0xd4, 0xb5, 0x36, 0xf4, 0xa4, 0xd6, 0x1a, 0xf9, - 0xd9, 0x0c, 0x8c, 0x95, 0xda, 0x6d, 0x11, 0xcb, 0x7f, 0x42, 0x30, 0xe3, 0x57, 0x85, 0x17, 0xc2, - 0x5b, 0x9f, 0xc8, 0x0b, 0x01, 0xf5, 0x16, 0x1f, 0x35, 0xd5, 0xa8, 0x42, 0xf5, 0x94, 0xa3, 0xb4, - 0x83, 0xbc, 0x05, 0xc5, 0x70, 0x92, 0x57, 0xdb, 0x0d, 0xfa, 0x88, 0xfa, 0x73, 0x23, 0x17, 0x73, - 0x57, 0x26, 0x44, 0xb2, 0x3c, 0x55, 0x33, 0x8d, 0x23, 0x92, 0x4d, 0x00, 0x3b, 0x9c, 0x5d, 0xb1, - 0x87, 0x65, 0x92, 0xd3, 0x4f, 0x68, 0xcf, 0xf8, 0x1b, 0x2f, 0x7a, 0x54, 0xed, 0x39, 0xe2, 0x43, - 0x5a, 0x30, 0xc5, 0x5f, 0x75, 0xc1, 0xd7, 0x5e, 0x31, 0x27, 0x2c, 0x9c, 0x38, 0x0e, 0x2f, 0x0b, - 0x5b, 0xd5, 0xb3, 0xe2, 0xad, 0x18, 0x7c, 0x40, 0xd6, 0x4a, 0x49, 0x10, 0x1b, 0xe7, 0xcd, 0x53, - 0x13, 0x9a, 0xe7, 0x92, 0xed, 0xe5, 0x93, 0xfe, 0xa7, 0x32, 0x70, 0x56, 0x9d, 0xf4, 0xb5, 0xee, - 0x4e, 0xcb, 0xc1, 0xb3, 0x20, 0xb9, 0x06, 0xa3, 0x62, 0x4e, 0x86, 0x87, 0xa8, 0x64, 0x6a, 0xdb, - 0x08, 0x85, 0x2c, 0xb3, 0x69, 0xc8, 0x78, 0x08, 0xad, 0x7b, 0x26, 0x26, 0xa7, 0x58, 0x51, 0xf4, - 0x62, 0x98, 0x87, 0xbf, 0xf5, 0xf9, 0xc9, 0x20, 0xc6, 0xbb, 0x30, 0xad, 0x8f, 0x44, 0x8d, 0x06, - 0xe4, 0x2a, 0x8c, 0xc8, 0xe1, 0xcb, 0xa4, 0x0f, 0x9f, 0x2c, 0x37, 0xb6, 0x81, 0x24, 0xe8, 0x7d, - 0x74, 0x17, 0xa2, 0x81, 0x74, 0x67, 0x93, 0x97, 0x75, 0x09, 0xc4, 0xf0, 0x09, 0xed, 0x31, 0xcd, - 0x7f, 0x95, 0x91, 0x1a, 0x7f, 0x32, 0x09, 0x33, 0x29, 0x32, 0xf7, 0x04, 0x9d, 0x68, 0x41, 0x17, - 0x10, 0xa3, 0x61, 0x2c, 0xb4, 0x14, 0x0b, 0xef, 0xca, 0xd7, 0x8e, 0xfb, 0x88, 0x83, 0x7e, 0x4f, - 0x20, 0x7f, 0x16, 0x7a, 0x91, 0x9a, 0xae, 0x60, 0xe8, 0x89, 0xa5, 0x2b, 0x58, 0x82, 0x09, 0xf1, - 0x55, 0x42, 0x5c, 0x0d, 0x47, 0xd6, 0x5c, 0x8f, 0x17, 0x58, 0x09, 0xb1, 0xa5, 0x93, 0x70, 0x1e, - 0xbe, 0xdb, 0x7c, 0x48, 0x05, 0x8f, 0x11, 0x95, 0x07, 0x16, 0xa4, 0xf2, 0x50, 0x48, 0xc8, 0xbf, - 0x83, 0x8f, 0x5c, 0x20, 0x44, 0x95, 0x59, 0x85, 0x7e, 0x32, 0xab, 0xf1, 0x64, 0x64, 0xd6, 0x05, - 0xd9, 0xc6, 0x74, 0xd9, 0x95, 0xd2, 0x2c, 0xf2, 0xcb, 0x19, 0x98, 0xe6, 0x31, 0xf3, 0x6a, 0x63, - 0xfb, 0xc6, 0x41, 0xd7, 0x9f, 0x4c, 0x63, 0x9f, 0x13, 0xf9, 0xe9, 0xd3, 0xdb, 0x9a, 0x6c, 0x14, - 0xf9, 0x01, 0x80, 0x70, 0x45, 0xf9, 0x73, 0x80, 0x4b, 0xed, 0xb9, 0x14, 0x29, 0x10, 0x22, 0x45, - 0xb9, 0x74, 0x83, 0x90, 0x4e, 0x7b, 0xda, 0x24, 0x84, 0x92, 0xbf, 0x04, 0xb3, 0x6c, 0xbd, 0x84, - 0x10, 0x91, 0xe1, 0x63, 0x6e, 0x0c, 0x6b, 0xf9, 0x7c, 0x6f, 0x9d, 0xe8, 0x5a, 0x1a, 0x19, 0xcf, - 0xfc, 0x17, 0x3d, 0xe9, 0x16, 0xa8, 0xc1, 0xc0, 0xa9, 0x15, 0x61, 0xca, 0x1c, 0x6c, 0x3d, 0xcf, - 0x77, 0xdb, 0x43, 0xbe, 0x9d, 0x97, 0x6b, 0x81, 0xcb, 0x37, 0x5f, 0x0f, 0x66, 0x43, 0x10, 0xf9, - 0x32, 0x90, 0x30, 0xd8, 0x9c, 0xc3, 0xa8, 0xcc, 0x85, 0xcb, 0x4d, 0xbb, 0x51, 0xd0, 0xba, 0x27, - 0x8b, 0xd5, 0x49, 0x92, 0x24, 0x26, 0x14, 0x66, 0xc5, 0x47, 0x33, 0xa8, 0x7c, 0x44, 0xc3, 0x9f, - 0x9b, 0xd4, 0xf2, 0xa7, 0x44, 0x25, 0xd1, 0xdb, 0x6f, 0xca, 0x4b, 0x1c, 0x9a, 0xc9, 0x29, 0x8d, - 0x1d, 0xb9, 0x05, 0xa3, 0x18, 0x51, 0xb6, 0x22, 0x9d, 0xa0, 0x84, 0x43, 0x06, 0xc6, 0x9e, 0x59, - 0xfb, 0xba, 0x2b, 0x53, 0x84, 0xca, 0x8e, 0x03, 0x15, 0xef, 0xc8, 0xec, 0xb6, 0xd1, 0x00, 0x2b, - 0xec, 0x1d, 0x0d, 0xef, 0xc8, 0xf2, 0xba, 0x7a, 0xc8, 0x21, 0x22, 0x91, 0x6f, 0xc0, 0xd8, 0x7d, - 0xfb, 0x91, 0xb4, 0xbf, 0x0a, 0x23, 0xeb, 0x40, 0xaf, 0x96, 0xb7, 0xec, 0x47, 0x56, 0xa3, 0x1b, - 0xcf, 0x3b, 0xc8, 0x5f, 0x2d, 0x57, 0x58, 0x92, 0xaf, 0x01, 0x28, 0x56, 0x61, 0x72, 0x62, 0x05, - 0x2f, 0xc8, 0x8c, 0x40, 0xa9, 0xd6, 0x62, 0xe4, 0xaf, 0x30, 0x8c, 0x69, 0x0e, 0xb3, 0x9f, 0x9d, - 0xe6, 0x70, 0xe6, 0xb3, 0xd3, 0x1c, 0xe6, 0x77, 0xe0, 0x7c, 0xcf, 0xa5, 0x93, 0x92, 0xa6, 0xf1, - 0xba, 0x9e, 0xa6, 0xf1, 0x7c, 0xaf, 0x2d, 0xd6, 0xd7, 0xd3, 0x27, 0xcf, 0x14, 0x67, 0x7b, 0x6b, - 0x27, 0xdf, 0xcb, 0xc6, 0xb6, 0x5c, 0x71, 0xb0, 0xe0, 0xe9, 0xf6, 0x7b, 0xe9, 0x24, 0x59, 0x7c, - 0x57, 0x8c, 0x6f, 0xca, 0xd9, 0xe8, 0x40, 0x13, 0x7b, 0x3e, 0x95, 0x6f, 0xcf, 0x9f, 0x76, 0xf7, - 0x7d, 0x1b, 0x26, 0xf9, 0x8b, 0x42, 0xf7, 0xe8, 0xd1, 0xa1, 0xeb, 0x35, 0xe4, 0x1b, 0x99, 0xa8, - 0x83, 0x27, 0xde, 0xde, 0x8b, 0xe1, 0x92, 0x8a, 0x0c, 0x52, 0x1a, 0xc2, 0xda, 0xcf, 0xa7, 0x4a, - 0x31, 0x86, 0xd0, 0x2f, 0x7e, 0x89, 0xbc, 0x11, 0x2a, 0x6a, 0xd4, 0x53, 0x93, 0x28, 0x7b, 0x12, - 0x98, 0xa2, 0xaf, 0x51, 0xcf, 0xf8, 0x83, 0x1c, 0x10, 0x5e, 0x53, 0xd9, 0xee, 0xd8, 0x18, 0xc2, - 0xe7, 0x60, 0x2a, 0x8a, 0xa2, 0xc0, 0xb1, 0x77, 0x9a, 0x54, 0xcd, 0xe3, 0x22, 0x9c, 0x4e, 0xc3, - 0x32, 0x2b, 0x7e, 0xd0, 0x49, 0x10, 0xf6, 0x10, 0x75, 0xd9, 0x4f, 0x23, 0xea, 0xbe, 0x01, 0xcf, - 0x96, 0x3a, 0xf8, 0x34, 0x99, 0xac, 0xe5, 0xb6, 0xeb, 0x49, 0x21, 0xa5, 0x05, 0x87, 0xd8, 0x21, - 0x5a, 0xa2, 0xa5, 0xfd, 0x58, 0x28, 0x7a, 0x0a, 0x9b, 0x97, 0x9d, 0x40, 0x0d, 0x36, 0x96, 0x7a, - 0x4a, 0x07, 0x4b, 0x52, 0xf4, 0x14, 0x4e, 0x22, 0x79, 0x38, 0x9e, 0xd4, 0x53, 0xf0, 0xd9, 0x80, - 0x88, 0x87, 0xe3, 0xd1, 0x1e, 0xba, 0x4e, 0x48, 0x42, 0xde, 0x86, 0xb1, 0x52, 0x37, 0x70, 0x05, - 0x63, 0xe1, 0x2d, 0x1d, 0xf9, 0x35, 0x8b, 0xa6, 0x68, 0x47, 0x9f, 0x08, 0xdd, 0xf8, 0xe3, 0x1c, - 0x9c, 0x4f, 0x0e, 0xaf, 0x28, 0x0d, 0xd7, 0x47, 0xe6, 0x84, 0xf5, 0x91, 0x36, 0x1b, 0xf8, 0x65, - 0xc1, 0x13, 0x9b, 0x0d, 0xfc, 0x85, 0xb3, 0x4f, 0x38, 0x1b, 0x6a, 0x30, 0xa6, 0xee, 0x77, 0xf9, - 0x4f, 0xba, 0xdf, 0xa9, 0x5c, 0xd8, 0xa1, 0x9e, 0xc7, 0x58, 0x0f, 0x45, 0x57, 0x47, 0xf1, 0xf0, - 0x6a, 0x8e, 0x41, 0xfe, 0x7f, 0x70, 0x91, 0xcb, 0xa4, 0xf8, 0xc7, 0x2e, 0x1d, 0x49, 0x8e, 0x62, - 0xe0, 0x16, 0x1f, 0x1f, 0x2f, 0x5c, 0xe3, 0xa6, 0x12, 0x2b, 0xd1, 0x6d, 0xd6, 0xce, 0x91, 0x25, - 0x5b, 0xa6, 0x54, 0x72, 0x22, 0x6f, 0x7c, 0xd6, 0x4c, 0x79, 0x35, 0xeb, 0xf5, 0xb4, 0x30, 0x12, - 0x9e, 0x89, 0x94, 0x83, 0xf5, 0x08, 0x12, 0x69, 0x0e, 0xcb, 0xa6, 0x9a, 0xc3, 0xa4, 0x3d, 0x25, - 0x97, 0x6a, 0x4f, 0xa9, 0xc0, 0x54, 0xad, 0xbb, 0x23, 0xeb, 0x46, 0xc4, 0xbc, 0x16, 0x09, 0x97, - 0xf6, 0x41, 0x71, 0x12, 0xe3, 0xc7, 0xb3, 0x30, 0xbe, 0xd1, 0xec, 0xee, 0x39, 0xed, 0x8a, 0x1d, - 0xd8, 0x4f, 0xad, 0x85, 0xee, 0x4d, 0xcd, 0x42, 0x17, 0x46, 0x4b, 0x85, 0x1f, 0x36, 0x90, 0x79, - 0xee, 0x3b, 0x19, 0x98, 0x8a, 0x48, 0xf8, 0x3e, 0xbb, 0x02, 0x79, 0xf6, 0x43, 0x9c, 0x5b, 0x2f, - 0x26, 0x18, 0xf3, 0xa7, 0x5a, 0xc2, 0xbf, 0x84, 0xcd, 0x4c, 0x7f, 0x07, 0x01, 0x39, 0xcc, 0x7f, - 0x01, 0x46, 0x23, 0xb6, 0xa7, 0x79, 0xa2, 0xe5, 0xd7, 0x32, 0x50, 0x8c, 0x7f, 0x09, 0xb9, 0x07, - 0x23, 0x8c, 0x93, 0x43, 0xe5, 0x91, 0xfa, 0xc5, 0x1e, 0xdf, 0x7c, 0x4d, 0xa0, 0xf1, 0xe6, 0x61, - 0xe7, 0x53, 0x0e, 0x31, 0x25, 0x87, 0x79, 0x13, 0xc6, 0x55, 0xac, 0x94, 0xd6, 0xbd, 0xa6, 0x2b, - 0x17, 0x67, 0xd3, 0xfb, 0x41, 0x7b, 0x58, 0x46, 0x6b, 0xb5, 0xd0, 0x1b, 0x2e, 0x6b, 0x93, 0x0b, - 0xfb, 0x2a, 0x36, 0x6f, 0xf8, 0x34, 0x5b, 0x8c, 0x92, 0x23, 0xab, 0xf3, 0x2c, 0x65, 0x42, 0x87, - 0x78, 0xe4, 0x35, 0x18, 0xe6, 0xf5, 0xa9, 0x0f, 0x2c, 0x74, 0x10, 0xa2, 0xaa, 0xb8, 0x1c, 0xc7, - 0xf8, 0x9b, 0x39, 0x38, 0x1b, 0x35, 0xef, 0x41, 0xa7, 0x61, 0x07, 0x74, 0xc3, 0xf6, 0xec, 0x96, - 0x7f, 0xc2, 0x0a, 0xb8, 0x92, 0x68, 0x1a, 0x26, 0xdc, 0x97, 0x4d, 0x53, 0x1a, 0x64, 0xc4, 0x1a, - 0x84, 0xe6, 0x4b, 0xde, 0x20, 0xd9, 0x0c, 0x72, 0x0f, 0x72, 0x35, 0x1a, 0x08, 0xb1, 0x79, 0x39, - 0xd1, 0xab, 0x6a, 0xbb, 0xae, 0xd5, 0x68, 0xc0, 0x07, 0x91, 0xe7, 0xfe, 0xa0, 0x5a, 0xee, 0xc5, - 0x1a, 0x0d, 0xc8, 0x36, 0x0c, 0x2f, 0x3f, 0xea, 0xd0, 0x7a, 0x20, 0x1e, 0x18, 0xba, 0xda, 0x9f, - 0x1f, 0xc7, 0x55, 0xde, 0x17, 0xa2, 0x08, 0x50, 0x3b, 0x8b, 0xa3, 0xcc, 0xdf, 0x82, 0x82, 0xac, - 0xfc, 0x34, 0x33, 0x77, 0xfe, 0x4d, 0x18, 0x53, 0x2a, 0x39, 0xd5, 0xa4, 0xff, 0x05, 0x26, 0x57, - 0xdd, 0xa6, 0x7c, 0x93, 0x68, 0x39, 0xa1, 0xe6, 0x65, 0xa2, 0x98, 0x5d, 0xae, 0xe6, 0x59, 0x07, - 0xa2, 0xa8, 0x8f, 0xbe, 0x57, 0x85, 0xa9, 0xda, 0x81, 0xd3, 0x89, 0x52, 0xe0, 0x69, 0x9b, 0x29, - 0x66, 0x8b, 0x17, 0x67, 0xee, 0xf8, 0x66, 0x1a, 0xa7, 0x33, 0xfe, 0x2c, 0x03, 0xc3, 0xec, 0xaf, - 0xad, 0x5b, 0x4f, 0xa9, 0xc8, 0xbc, 0xa9, 0x89, 0xcc, 0x69, 0x25, 0xff, 0x2c, 0x0a, 0x8e, 0x5b, - 0x27, 0x08, 0xcb, 0x63, 0x31, 0x40, 0x1c, 0x99, 0xdc, 0x81, 0x11, 0xe1, 0x79, 0x23, 0x5c, 0xa4, - 0xd5, 0x84, 0xb6, 0xd2, 0x27, 0x27, 0x3c, 0x9c, 0xbb, 0x9d, 0xb8, 0x35, 0x43, 0x52, 0x33, 0x95, - 0x5c, 0x26, 0x23, 0xd4, 0x5e, 0xb2, 0x73, 0x31, 0xfe, 0x8c, 0x27, 0x64, 0x55, 0xde, 0x9e, 0xec, - 0x11, 0xd8, 0x5f, 0x12, 0x17, 0x19, 0xb9, 0x7e, 0x4c, 0xce, 0xca, 0x87, 0xbe, 0x52, 0xef, 0x38, - 0xfe, 0x70, 0x86, 0xa7, 0x32, 0x95, 0x0d, 0x7b, 0x07, 0xc6, 0x6f, 0xbb, 0xde, 0xa1, 0xed, 0xf1, - 0x04, 0x75, 0xc2, 0x73, 0x80, 0x1d, 0x1d, 0x27, 0x76, 0x39, 0x9c, 0xa7, 0xb8, 0xfb, 0xf8, 0x78, - 0x21, 0xbf, 0xe4, 0xba, 0x4d, 0x53, 0x43, 0x27, 0xeb, 0x30, 0x71, 0xdf, 0x7e, 0xa4, 0x1c, 0x7a, - 0x79, 0x40, 0xc9, 0x55, 0x36, 0x81, 0xd9, 0xa9, 0xf9, 0x64, 0x37, 0x28, 0x9d, 0x9e, 0x38, 0x30, - 0xb9, 0xe1, 0x7a, 0x81, 0xa8, 0xc4, 0x69, 0xef, 0x89, 0x8f, 0x4d, 0x3a, 0x72, 0x5d, 0x4f, 0x75, - 0xe4, 0x3a, 0xdf, 0x71, 0xbd, 0xc0, 0xda, 0x0d, 0xc9, 0xb5, 0xa4, 0x39, 0x1a, 0x63, 0xf2, 0x0e, - 0x4c, 0x2b, 0x49, 0xc1, 0x6e, 0xbb, 0x5e, 0xcb, 0x96, 0x4a, 0x39, 0xda, 0x81, 0xd1, 0xdf, 0x64, - 0x17, 0xc1, 0x66, 0x12, 0x93, 0x7c, 0x98, 0x16, 0xa2, 0x33, 0x14, 0x79, 0x82, 0xa5, 0x84, 0xe8, - 0xf4, 0xf2, 0x04, 0x4b, 0x06, 0xeb, 0xec, 0xf5, 0xf3, 0x14, 0x2d, 0x2c, 0xdd, 0x10, 0xc7, 0xef, - 0x93, 0x3d, 0x41, 0xc3, 0x71, 0xeb, 0xe1, 0x11, 0xba, 0x08, 0xb9, 0xa5, 0x8d, 0xdb, 0x78, 0x7b, - 0x21, 0x1d, 0x6d, 0xda, 0xfb, 0x76, 0xbb, 0x8e, 0xca, 0xb2, 0xf0, 0xce, 0x56, 0x25, 0xf2, 0xd2, - 0xc6, 0x6d, 0x62, 0xc3, 0xcc, 0x06, 0xf5, 0x5a, 0x4e, 0xf0, 0x95, 0x1b, 0x37, 0x94, 0x81, 0x2a, - 0x60, 0xd3, 0xae, 0x8b, 0xa6, 0x2d, 0x74, 0x10, 0xc5, 0x7a, 0x74, 0xe3, 0x46, 0xea, 0x70, 0x84, - 0x0d, 0x4b, 0xe3, 0xc5, 0x24, 0xe3, 0x7d, 0xfb, 0x51, 0xe4, 0x54, 0xef, 0x8b, 0x60, 0xc7, 0x0b, - 0x72, 0x62, 0x45, 0x0e, 0xf9, 0x9a, 0x64, 0xd4, 0x89, 0xd8, 0x59, 0x27, 0x9a, 0x5e, 0xbe, 0x08, - 0x13, 0x99, 0x97, 0x26, 0x1d, 0x19, 0x11, 0xab, 0x2a, 0xec, 0x0a, 0x3a, 0x79, 0x10, 0x9e, 0xd8, - 0xf8, 0x89, 0x47, 0x3c, 0x63, 0x75, 0x5d, 0x3d, 0xb1, 0x71, 0x43, 0x8a, 0xf6, 0x59, 0x53, 0xe1, - 0x31, 0x9f, 0x47, 0x19, 0x98, 0x3a, 0x97, 0xe4, 0x41, 0x70, 0xfc, 0xf4, 0x07, 0x41, 0x0a, 0xf9, - 0x55, 0xb7, 0x7e, 0x20, 0x32, 0xfd, 0x7c, 0x99, 0x2d, 0xf7, 0xa6, 0x5b, 0x3f, 0x78, 0x72, 0x1e, - 0xb0, 0xc8, 0x9e, 0xac, 0xb1, 0xa6, 0xb2, 0x59, 0x20, 0xfa, 0x44, 0x78, 0x55, 0xce, 0x86, 0x27, - 0x21, 0xa5, 0x8c, 0x2b, 0x3e, 0x7c, 0xd2, 0xc8, 0xae, 0x35, 0x75, 0x72, 0x42, 0xa1, 0x58, 0xa1, - 0xfe, 0x41, 0xe0, 0x76, 0xca, 0x4d, 0xa7, 0xb3, 0xe3, 0xda, 0x5e, 0x03, 0x6d, 0x77, 0x69, 0xeb, - 0xfb, 0xe5, 0xd4, 0xf5, 0x3d, 0xdd, 0xe0, 0xf4, 0x56, 0x5d, 0x32, 0x30, 0x13, 0x2c, 0xc9, 0x87, - 0x30, 0xc9, 0x26, 0xf7, 0xf2, 0xa3, 0x80, 0xb6, 0xf9, 0xc8, 0x4f, 0xa3, 0xea, 0x30, 0xab, 0x24, - 0xfe, 0x0e, 0x0b, 0xf9, 0x9c, 0xc2, 0xc5, 0x4e, 0x43, 0x02, 0x2d, 0x4b, 0x92, 0xc6, 0x8a, 0x34, - 0x60, 0xee, 0xbe, 0xfd, 0x48, 0x79, 0x7c, 0x4b, 0x99, 0xa4, 0x04, 0x27, 0x18, 0x3e, 0x36, 0xce, - 0x26, 0x58, 0x94, 0xa0, 0xb3, 0xc7, 0x7c, 0xed, 0xc9, 0x89, 0xfc, 0x20, 0x9c, 0x13, 0x9f, 0x55, - 0xc1, 0xd7, 0x30, 0x5c, 0xef, 0xa8, 0xb6, 0x6f, 0x63, 0x3c, 0xcd, 0xcc, 0xe9, 0x04, 0xa2, 0xec, - 0xb0, 0x86, 0xe4, 0x63, 0xf9, 0x9c, 0x91, 0xd9, 0xab, 0x06, 0xf2, 0x11, 0x4c, 0xf2, 0x2b, 0x9b, - 0x15, 0xd7, 0x0f, 0xf0, 0x40, 0x3f, 0x7b, 0x3a, 0x37, 0x71, 0x7e, 0x0f, 0xc4, 0x03, 0x2b, 0x62, - 0x06, 0x80, 0x18, 0x67, 0xf2, 0x16, 0x8c, 0x6d, 0x38, 0x6d, 0x9e, 0xc7, 0xac, 0xba, 0x81, 0xa6, - 0x47, 0xb1, 0xff, 0x74, 0x9c, 0xb6, 0x25, 0x4f, 0xd5, 0x9d, 0x50, 0x5c, 0xa8, 0xd8, 0x64, 0x1b, - 0xc6, 0x6a, 0xb5, 0x95, 0xdb, 0x0e, 0xdb, 0x00, 0x3b, 0x47, 0x73, 0x67, 0x7b, 0xb4, 0xf2, 0x52, - 0x6a, 0x2b, 0x27, 0x7c, 0x7f, 0x1f, 0x1f, 0x34, 0xb6, 0xea, 0x6e, 0xe7, 0xc8, 0x54, 0x39, 0xa5, - 0xb8, 0x4e, 0x9f, 0x7b, 0xc2, 0xae, 0xd3, 0x55, 0x98, 0x52, 0x1c, 0x2c, 0xd1, 0xb9, 0x72, 0x2e, - 0x4a, 0xdb, 0xa5, 0xba, 0x4a, 0xc7, 0xc3, 0xfa, 0xe2, 0x74, 0xd2, 0x67, 0xfa, 0xfc, 0x69, 0x7d, - 0xa6, 0x1d, 0x98, 0xe6, 0x83, 0x21, 0xe6, 0x01, 0x8e, 0xf4, 0x7c, 0x8f, 0x3e, 0xbc, 0x9a, 0xda, - 0x87, 0x33, 0x62, 0xa4, 0xe5, 0x24, 0xc3, 0x2b, 0xca, 0x24, 0x57, 0xb2, 0x0b, 0x44, 0x00, 0xc5, - 0x73, 0xca, 0x58, 0xd7, 0xb3, 0x3d, 0xea, 0x7a, 0x31, 0xb5, 0xae, 0x49, 0x59, 0xd7, 0x0e, 0xaf, - 0x26, 0x85, 0x23, 0x69, 0xcb, 0x7a, 0xe4, 0xfc, 0xc2, 0x8e, 0x7d, 0x4e, 0xb3, 0x83, 0x26, 0x11, - 0x78, 0x12, 0xd1, 0xf8, 0xa4, 0x8d, 0xf7, 0x7b, 0x0a, 0x67, 0xf2, 0x08, 0xce, 0x26, 0x5b, 0x81, - 0x75, 0x5e, 0xc0, 0x3a, 0x2f, 0x68, 0x75, 0xc6, 0x91, 0xf8, 0xbc, 0xd1, 0x3f, 0x2b, 0x5e, 0x6b, - 0x0f, 0xfe, 0x77, 0xf3, 0x85, 0x89, 0xe2, 0x64, 0x9a, 0xa7, 0xf5, 0x3f, 0xc8, 0xc6, 0x84, 0x36, - 0xa9, 0xc2, 0x88, 0x18, 0x0b, 0xa1, 0xc5, 0x26, 0x7b, 0xfc, 0x42, 0x6a, 0x8f, 0x8f, 0x88, 0x61, - 0x35, 0x25, 0x3d, 0x39, 0x64, 0xac, 0xd0, 0x6d, 0x5d, 0xa8, 0xfd, 0x5f, 0xe3, 0x32, 0x19, 0x41, - 0xda, 0xee, 0x53, 0x39, 0x7d, 0xd0, 0x8e, 0x1e, 0x13, 0x86, 0xdb, 0x90, 0xac, 0x8d, 0x1c, 0xf0, - 0x97, 0x02, 0x72, 0x61, 0xe4, 0x87, 0xfe, 0x2c, 0xc0, 0x13, 0xab, 0x90, 0xd5, 0x62, 0xfc, 0x66, - 0x06, 0x26, 0x34, 0xa9, 0x4f, 0x6e, 0x29, 0x61, 0x4d, 0x51, 0x54, 0xae, 0x86, 0x83, 0x82, 0x20, - 0x1e, 0xf0, 0x74, 0x4b, 0xf8, 0x4d, 0x67, 0x7b, 0xd3, 0xa5, 0xbe, 0x2a, 0xde, 0xdf, 0x48, 0x16, - 0xbe, 0x3c, 0x94, 0xef, 0xf1, 0xf2, 0xd0, 0xaf, 0x3f, 0x0b, 0x93, 0xfa, 0xb1, 0x80, 0xbc, 0x06, - 0xc3, 0x68, 0x5b, 0x94, 0x67, 0x4c, 0xfe, 0xf6, 0x2e, 0x42, 0xb4, 0xb7, 0x77, 0x11, 0x42, 0x5e, - 0x02, 0x08, 0x1d, 0x58, 0xa5, 0x65, 0x7d, 0xe8, 0xf1, 0xf1, 0x42, 0xe6, 0x75, 0x53, 0x29, 0x20, - 0x5f, 0x07, 0x58, 0x73, 0x1b, 0x34, 0x7c, 0x1d, 0xad, 0xcf, 0xed, 0xf1, 0xcb, 0x89, 0x2c, 0xda, - 0x67, 0xda, 0x6e, 0x83, 0x26, 0x53, 0x66, 0x2b, 0x1c, 0xc9, 0x97, 0x60, 0xc8, 0xec, 0xb2, 0xf3, - 0x2c, 0x37, 0x25, 0x8c, 0x49, 0xe9, 0xdb, 0x6d, 0x52, 0xe5, 0xa1, 0xfe, 0x6e, 0xdc, 0x31, 0x8a, - 0x01, 0xc8, 0x7b, 0x3c, 0xbb, 0xb6, 0x48, 0x86, 0x35, 0x14, 0xdd, 0x35, 0x28, 0xbb, 0x72, 0x22, - 0x1d, 0x96, 0x42, 0x42, 0xd6, 0x61, 0x44, 0x35, 0x92, 0x2b, 0xf1, 0xb1, 0xea, 0x45, 0x8a, 0x72, - 0xf2, 0x12, 0xcf, 0xaa, 0xc5, 0xed, 0xe7, 0x92, 0x0b, 0x79, 0x1b, 0x46, 0x19, 0x7b, 0xb6, 0x84, - 0x7d, 0xa1, 0x71, 0xe3, 0x8d, 0x82, 0xd2, 0x20, 0x26, 0x01, 0xb4, 0x94, 0x55, 0x21, 0x01, 0xf9, - 0x10, 0x5f, 0x0e, 0x13, 0x5d, 0xdd, 0xd7, 0xab, 0xe0, 0x72, 0xa2, 0xab, 0xf1, 0x29, 0xb1, 0xe4, - 0xa3, 0xb2, 0x21, 0x3f, 0xb2, 0x17, 0xa6, 0x52, 0x1a, 0x24, 0x23, 0xfa, 0x2b, 0x89, 0x0a, 0xe6, - 0x64, 0x76, 0xa0, 0xe4, 0x2b, 0x77, 0x1a, 0x5f, 0xd2, 0x81, 0x62, 0xa4, 0xf0, 0x88, 0xba, 0xa0, - 0x5f, 0x5d, 0xaf, 0x27, 0xea, 0x52, 0x07, 0x30, 0x51, 0x5d, 0x82, 0x3b, 0x69, 0xc0, 0xa4, 0x14, - 0x9e, 0xa2, 0xbe, 0xb1, 0x7e, 0xf5, 0xbd, 0x94, 0xa8, 0x6f, 0xa6, 0xb1, 0x93, 0xac, 0x27, 0xc6, - 0x93, 0xbc, 0x0d, 0x13, 0x12, 0x82, 0xeb, 0x43, 0xbc, 0x5e, 0x8b, 0x56, 0x91, 0xc6, 0x0e, 0xba, - 0xcc, 0xeb, 0x6f, 0xff, 0xa9, 0xc8, 0x2a, 0x35, 0x9f, 0x1d, 0x13, 0x1a, 0x75, 0x7c, 0x56, 0xe8, - 0xc8, 0xe4, 0x03, 0x18, 0xab, 0xb6, 0xd8, 0x87, 0xb8, 0x6d, 0x3b, 0xa0, 0x22, 0x76, 0x4a, 0x7a, - 0x48, 0x28, 0x25, 0xca, 0x54, 0xe5, 0xaf, 0xe9, 0x45, 0x45, 0xda, 0x6b, 0x7a, 0x11, 0x98, 0x75, - 0x1e, 0xbf, 0x15, 0x11, 0x73, 0x58, 0xc6, 0x55, 0x5d, 0x48, 0xf1, 0x52, 0x50, 0xd8, 0x8b, 0xa4, - 0x73, 0x0c, 0x2a, 0x6f, 0x25, 0x62, 0x49, 0xe7, 0x54, 0x9e, 0xe4, 0x1d, 0x18, 0x13, 0x8f, 0x45, - 0x94, 0xcc, 0x35, 0x7f, 0xae, 0x88, 0x1f, 0x8f, 0xd1, 0xe0, 0xf2, 0x5d, 0x09, 0xcb, 0xf6, 0x62, - 0xee, 0x78, 0x11, 0x3e, 0xf9, 0x0a, 0xcc, 0x6e, 0x3b, 0xed, 0x86, 0x7b, 0xe8, 0x8b, 0x6d, 0x4a, - 0x08, 0xba, 0xe9, 0x28, 0x18, 0xe6, 0x90, 0x97, 0x87, 0x7a, 0x4a, 0x42, 0xf0, 0xa5, 0x72, 0x20, - 0x7f, 0x31, 0xc1, 0x99, 0xcf, 0x20, 0xd2, 0x6f, 0x06, 0x2d, 0x26, 0x66, 0x50, 0xb2, 0xfa, 0xf8, - 0x74, 0x4a, 0xad, 0x86, 0xb8, 0x40, 0xf4, 0xfd, 0xfd, 0xae, 0xeb, 0xb4, 0xe7, 0x66, 0x50, 0x16, - 0x3e, 0x1b, 0x8f, 0xbf, 0x46, 0xbc, 0x0d, 0xb7, 0xe9, 0xd4, 0x8f, 0xf8, 0xcb, 0xf5, 0x71, 0x7d, - 0xf4, 0x23, 0x57, 0xb3, 0x19, 0xa7, 0xb0, 0x26, 0x1f, 0xc0, 0x38, 0xfb, 0x3f, 0x3c, 0x30, 0xcf, - 0x6a, 0x7e, 0x6d, 0x0a, 0xa6, 0xa8, 0x07, 0xc7, 0x08, 0x5f, 0xb3, 0x48, 0x39, 0x4b, 0x6b, 0xac, - 0xc8, 0x9b, 0x00, 0x4c, 0x73, 0x12, 0xe2, 0xf8, 0x4c, 0x94, 0xe3, 0x0f, 0xf5, 0xad, 0xa4, 0x20, - 0x8e, 0x90, 0xd9, 0x29, 0x9e, 0xfd, 0xaa, 0x75, 0x1b, 0x2e, 0x5b, 0x1b, 0x67, 0x91, 0x96, 0x87, - 0xa4, 0x31, 0x5a, 0x9f, 0xc3, 0xb5, 0x90, 0xb4, 0x08, 0x9d, 0xac, 0xc0, 0x14, 0xe6, 0x62, 0xac, - 0x36, 0x68, 0x3b, 0xc0, 0xdb, 0xca, 0xb9, 0x73, 0xca, 0x6d, 0x2e, 0x2b, 0xb2, 0x9c, 0xb0, 0x4c, - 0xd5, 0xb3, 0x63, 0x64, 0xc4, 0x87, 0x99, 0x48, 0xba, 0x44, 0x77, 0xc3, 0x73, 0xd8, 0x49, 0x52, - 0xbb, 0x4c, 0x62, 0x70, 0x79, 0xcc, 0x46, 0x44, 0x11, 0x5c, 0xd2, 0xb2, 0xae, 0x56, 0x98, 0xc6, - 0x9d, 0x98, 0x40, 0xee, 0x94, 0x37, 0xe2, 0xc9, 0x0a, 0xcf, 0xe3, 0x17, 0xe0, 0x30, 0xef, 0xd5, - 0xa3, 0x77, 0x1b, 0x53, 0x12, 0x16, 0xa6, 0x50, 0x93, 0x6f, 0xc1, 0x19, 0x29, 0x41, 0x44, 0x91, - 0x98, 0xd7, 0xf3, 0xa7, 0x94, 0xc4, 0x8d, 0x9d, 0xb0, 0xea, 0xc4, 0x94, 0x4e, 0xaf, 0x82, 0xd8, - 0x30, 0x86, 0xc3, 0x2a, 0x6a, 0x7c, 0xb6, 0x5f, 0x8d, 0x57, 0x12, 0x35, 0x9e, 0xc5, 0x89, 0x92, - 0xac, 0x4c, 0xe5, 0x49, 0x96, 0x60, 0x42, 0xac, 0x23, 0x31, 0xdb, 0x9e, 0xc3, 0xde, 0x42, 0x03, - 0x8b, 0x5c, 0x81, 0x89, 0x09, 0xa7, 0x93, 0xa8, 0x12, 0x99, 0x5b, 0xd4, 0x2f, 0x68, 0x12, 0x39, - 0x6e, 0x48, 0xd7, 0x91, 0x99, 0x44, 0x8a, 0xb4, 0x98, 0xe5, 0x47, 0x1d, 0x4f, 0x98, 0x4f, 0x9e, - 0x8f, 0x72, 0xf8, 0x2b, 0xca, 0x8f, 0x45, 0x43, 0x0c, 0x55, 0x24, 0xa4, 0x71, 0x20, 0x0f, 0x60, - 0x26, 0xdc, 0xb5, 0x15, 0xc6, 0x0b, 0xd1, 0x5b, 0x08, 0xd1, 0x56, 0x9f, 0xce, 0x37, 0x8d, 0x9e, - 0xd8, 0x70, 0x4e, 0xdb, 0xa7, 0x15, 0xd6, 0x17, 0x91, 0x35, 0xbe, 0x13, 0xaa, 0x6f, 0xf2, 0xe9, - 0xec, 0x7b, 0xf1, 0x21, 0x1f, 0xc1, 0x7c, 0x7c, 0x6f, 0x56, 0x6a, 0x79, 0x01, 0x6b, 0x79, 0xe5, - 0xf1, 0xf1, 0xc2, 0xe5, 0xc4, 0xf6, 0x9e, 0x5e, 0x51, 0x1f, 0x6e, 0xe4, 0xeb, 0x30, 0xa7, 0xef, - 0xcf, 0x4a, 0x4d, 0x06, 0xd6, 0x84, 0x4b, 0x27, 0xdc, 0xd8, 0xd3, 0x6b, 0xe8, 0xc9, 0x83, 0x04, - 0xb0, 0x90, 0x3a, 0xbb, 0x95, 0x6a, 0x2e, 0x45, 0x1f, 0x94, 0x58, 0x25, 0xe9, 0xd5, 0x9d, 0xc4, - 0x92, 0x1c, 0xc2, 0xf3, 0x69, 0xdb, 0x84, 0x52, 0xe9, 0x8b, 0xa1, 0x81, 0xf2, 0xd5, 0xf4, 0x2d, - 0x27, 0xbd, 0xe6, 0x13, 0xd8, 0x92, 0x0f, 0xe1, 0x8c, 0xb2, 0xbe, 0x94, 0xfa, 0x5e, 0xc2, 0xfa, - 0x30, 0x94, 0x55, 0x5d, 0x98, 0xe9, 0xb5, 0xa4, 0xf3, 0x20, 0x2d, 0x98, 0x91, 0x1f, 0x8e, 0x96, - 0x60, 0xb1, 0xf5, 0x5c, 0xd6, 0xa4, 0x6a, 0x12, 0x43, 0x79, 0x60, 0x79, 0xc7, 0xea, 0x44, 0x84, - 0xea, 0x4c, 0x4f, 0xe1, 0x4b, 0x56, 0x60, 0xb8, 0xb6, 0x51, 0xbd, 0x7d, 0x7b, 0x79, 0xee, 0x65, - 0xac, 0x41, 0xc6, 0xbd, 0x70, 0xa0, 0x76, 0x68, 0x12, 0xee, 0x56, 0x1d, 0x67, 0x77, 0x57, 0x0b, - 0x2f, 0xe2, 0xa8, 0x77, 0xf3, 0x85, 0x2b, 0xc5, 0xab, 0x77, 0xf3, 0x85, 0xab, 0xc5, 0x57, 0xcc, - 0xe7, 0xd2, 0xdf, 0xc6, 0xe5, 0x1f, 0x6b, 0x5e, 0xee, 0x57, 0x1a, 0x75, 0x85, 0xf1, 0x0b, 0x19, - 0x98, 0x49, 0x69, 0x07, 0xb9, 0x0c, 0x79, 0x7c, 0x5c, 0x40, 0xb9, 0x60, 0x8e, 0x3d, 0x2a, 0x80, - 0xe5, 0xe4, 0x73, 0x30, 0x52, 0x59, 0xab, 0xd5, 0x4a, 0x6b, 0xf2, 0xc8, 0xc6, 0xc5, 0x55, 0xdb, - 0xb7, 0x7c, 0x5b, 0xbf, 0x97, 0x12, 0x68, 0xe4, 0x75, 0x18, 0xae, 0x6e, 0x20, 0x01, 0xf7, 0x70, - 0xc2, 0x23, 0x8c, 0xd3, 0x89, 0xe3, 0x0b, 0x24, 0xe3, 0x27, 0x32, 0x40, 0x92, 0x9d, 0x4a, 0x6e, - 0xc0, 0x98, 0x3a, 0x74, 0xfc, 0x80, 0x89, 0x77, 0x28, 0xca, 0xc0, 0x98, 0x2a, 0x0e, 0xa9, 0xc0, - 0x10, 0x3e, 0x86, 0x14, 0x5e, 0x88, 0xa5, 0x6e, 0x00, 0xe7, 0x12, 0x1b, 0xc0, 0x10, 0x3e, 0xb5, - 0x64, 0x72, 0x62, 0xe3, 0x77, 0x32, 0x40, 0x92, 0x9b, 0xe6, 0xc0, 0x17, 0xf2, 0x6f, 0x28, 0x11, - 0xaa, 0x6a, 0xfa, 0xf0, 0xf0, 0xed, 0x07, 0xf5, 0xb0, 0x14, 0xc5, 0xb2, 0x5e, 0xd6, 0x0e, 0xe7, - 0xbd, 0xc3, 0x9a, 0xae, 0xc2, 0xd0, 0x16, 0xf5, 0x76, 0xa4, 0xf3, 0x1e, 0x3a, 0xfc, 0x3c, 0x64, - 0x00, 0xf5, 0xb0, 0x8a, 0x18, 0xc6, 0x1f, 0x67, 0x60, 0x36, 0x4d, 0x93, 0x3b, 0x21, 0xfa, 0xc8, - 0x88, 0x05, 0x4e, 0xe1, 0x65, 0x3c, 0xf7, 0x06, 0x0a, 0xc3, 0xa5, 0x16, 0x60, 0x88, 0x7d, 0xac, - 0x1c, 0x61, 0x34, 0x16, 0xb0, 0xde, 0xf0, 0x4d, 0x0e, 0x67, 0x08, 0x3c, 0xeb, 0x51, 0x1e, 0x93, - 0x5b, 0x21, 0x02, 0x2a, 0x0a, 0x26, 0x87, 0x33, 0x84, 0xfb, 0x6e, 0x23, 0x7c, 0x01, 0x14, 0x11, - 0x5a, 0x0c, 0x60, 0x72, 0x38, 0xb9, 0x0c, 0x23, 0xeb, 0xed, 0x55, 0x6a, 0x3f, 0x94, 0xcf, 0x57, - 0xa0, 0xf3, 0x80, 0xdb, 0xb6, 0x9a, 0x0c, 0x66, 0xca, 0x42, 0xe3, 0x3b, 0x19, 0x98, 0x4e, 0x28, - 0x91, 0x27, 0x07, 0x58, 0xf5, 0x8f, 0x74, 0x18, 0xe4, 0xfb, 0x78, 0xf3, 0xf3, 0xe9, 0xcd, 0x37, - 0xfe, 0xcf, 0x3c, 0x9c, 0xeb, 0x71, 0xa6, 0x8f, 0x22, 0xb1, 0x32, 0x27, 0x46, 0x62, 0x7d, 0x95, - 0x9d, 0xa1, 0x6d, 0xa7, 0xe5, 0x6f, 0xba, 0x51, 0x8b, 0x23, 0x87, 0x6e, 0x2c, 0x93, 0x8f, 0xa0, - 0x4a, 0xcf, 0xdf, 0xf3, 0xfc, 0x21, 0x6a, 0x2b, 0x70, 0x93, 0x2a, 0x85, 0xc6, 0x2c, 0x11, 0x0b, - 0x95, 0xfb, 0x73, 0x12, 0x0b, 0xa5, 0x7b, 0xe7, 0xe7, 0x9f, 0xa8, 0x77, 0x7e, 0xba, 0x67, 0xdf, - 0xd0, 0xa7, 0xf1, 0xf3, 0x2c, 0xc3, 0x04, 0xf7, 0x9e, 0x28, 0xf9, 0x7c, 0x90, 0x86, 0x13, 0x1e, - 0x17, 0xb6, 0x9f, 0x1c, 0x0b, 0x8d, 0x86, 0xac, 0xe8, 0x9e, 0xe4, 0x23, 0x78, 0xeb, 0x73, 0xb9, - 0xb7, 0xa7, 0xb8, 0x76, 0xdb, 0xab, 0x92, 0x1a, 0xdf, 0xc9, 0xea, 0x81, 0x52, 0x7f, 0x1e, 0x67, - 0xde, 0x55, 0x18, 0xda, 0xde, 0xa7, 0x9e, 0x94, 0x77, 0xd8, 0x90, 0x43, 0x06, 0x50, 0x1b, 0x82, - 0x18, 0xe4, 0x36, 0x4c, 0x6e, 0xf0, 0x91, 0x90, 0xdd, 0x9b, 0x8f, 0x8e, 0x5a, 0x1d, 0x61, 0x10, - 0x48, 0xe9, 0xdf, 0x18, 0x95, 0x71, 0x07, 0x2e, 0x68, 0x0b, 0x52, 0x24, 0x76, 0xe0, 0x0e, 0xdd, - 0x7c, 0x47, 0x9c, 0x8c, 0x5c, 0xd8, 0x23, 0xe9, 0x61, 0xc6, 0xa0, 0xc6, 0x2e, 0x3c, 0xdf, 0x97, - 0x11, 0xdb, 0x88, 0xa0, 0x13, 0xfe, 0x8a, 0x79, 0x9d, 0xf5, 0x25, 0x35, 0x15, 0x3a, 0xe3, 0x07, - 0x61, 0x5c, 0xed, 0x65, 0x94, 0xa9, 0xec, 0xb7, 0x10, 0x6a, 0x5c, 0xa6, 0x32, 0x80, 0xc9, 0xe1, - 0x27, 0x3e, 0x1e, 0x1f, 0x0d, 0x7f, 0xee, 0xa4, 0xe1, 0x67, 0x95, 0xe3, 0x92, 0x55, 0x2a, 0xc7, - 0xdf, 0x6a, 0xe5, 0x98, 0xb9, 0xc1, 0xe4, 0xf0, 0x27, 0x5a, 0xf9, 0x6f, 0xcb, 0x24, 0xfe, 0xe8, - 0x2f, 0x2e, 0xcf, 0xc4, 0xd1, 0x13, 0x9d, 0x33, 0x69, 0x27, 0xdd, 0x08, 0x33, 0xda, 0x24, 0xb3, - 0x27, 0x6d, 0x92, 0xa7, 0x99, 0x88, 0xd7, 0x61, 0xa4, 0x24, 0xee, 0x64, 0xf3, 0x91, 0x62, 0x63, - 0x27, 0x2e, 0x60, 0x25, 0x96, 0xf1, 0xdd, 0x0c, 0x9c, 0x49, 0x35, 0x95, 0xb1, 0x5a, 0xb9, 0x4d, - 0x4e, 0x59, 0x87, 0x71, 0x83, 0x1c, 0xc7, 0x38, 0x4d, 0xd8, 0xee, 0xe0, 0xdf, 0x62, 0xbc, 0x00, - 0xa3, 0xe1, 0x45, 0x0d, 0x99, 0x95, 0x43, 0x87, 0x8e, 0x3a, 0xd2, 0xde, 0x5f, 0x03, 0x60, 0x2d, - 0x78, 0xa2, 0x6e, 0x65, 0xc6, 0x6f, 0x67, 0xf9, 0x03, 0x4f, 0x4f, 0x6d, 0xb6, 0xbb, 0x74, 0x5f, - 0x30, 0xf6, 0x49, 0xbd, 0x73, 0xdc, 0x91, 0x65, 0x18, 0xae, 0x05, 0x76, 0xd0, 0x95, 0xd1, 0xc6, - 0x33, 0x2a, 0x19, 0x16, 0x6c, 0x2d, 0x46, 0xf1, 0xa6, 0x3e, 0x42, 0xb4, 0xc3, 0x01, 0x42, 0x14, - 0x97, 0x32, 0x07, 0xc6, 0x55, 0x5a, 0xf2, 0x01, 0x4c, 0xca, 0x14, 0x5e, 0x3c, 0x04, 0x5b, 0x5c, - 0x2a, 0x49, 0xe7, 0x04, 0x99, 0xc2, 0x4b, 0x0d, 0xd9, 0xd6, 0xf0, 0x55, 0x49, 0xdd, 0x51, 0x91, - 0x8d, 0x3f, 0x19, 0xe6, 0xf3, 0x40, 0xe4, 0xe2, 0xdb, 0x81, 0xc9, 0xf5, 0x6a, 0xa5, 0xac, 0x18, - 0xbe, 0xf4, 0x67, 0x17, 0x96, 0x1f, 0x05, 0xd4, 0x6b, 0xdb, 0x4d, 0x81, 0x70, 0x14, 0xed, 0x0d, - 0xae, 0xd3, 0xa8, 0xa7, 0x1b, 0xc5, 0x62, 0x1c, 0x59, 0x1d, 0xfc, 0x70, 0x13, 0xd6, 0x91, 0x1d, - 0xb0, 0x0e, 0xdf, 0x6e, 0x35, 0x7b, 0xd4, 0xa1, 0x73, 0x24, 0xfb, 0x50, 0xbc, 0x83, 0x7a, 0x8c, - 0x52, 0x4b, 0xae, 0x7f, 0x2d, 0x97, 0x44, 0x2d, 0xcf, 0x72, 0x05, 0x28, 0xbd, 0x9e, 0x04, 0xd7, - 0x68, 0x01, 0xe7, 0x4f, 0x5c, 0xc0, 0x7f, 0x25, 0x03, 0xc3, 0x5c, 0x51, 0x12, 0xf3, 0xab, 0x87, - 0x2a, 0xb6, 0xfd, 0x64, 0x54, 0xb1, 0x22, 0x0a, 0x70, 0x6d, 0xa6, 0xf1, 0x32, 0x52, 0x89, 0x4d, - 0x58, 0xe9, 0xa2, 0x88, 0x26, 0x6c, 0x5e, 0x72, 0xf2, 0x7c, 0x25, 0xd5, 0x28, 0x34, 0x77, 0xe4, - 0xc4, 0xe8, 0x2f, 0x19, 0xce, 0x3c, 0x22, 0x42, 0x73, 0xf5, 0x80, 0xdc, 0x55, 0x18, 0x15, 0x01, - 0xbf, 0x4b, 0x47, 0xe2, 0xa2, 0xaa, 0xa8, 0x5d, 0x83, 0x37, 0x96, 0x8e, 0x22, 0x25, 0x50, 0x84, - 0x0c, 0x5b, 0x3b, 0x47, 0xda, 0x43, 0x56, 0x12, 0x91, 0xac, 0xf3, 0x07, 0x5e, 0x78, 0xb6, 0x42, - 0x3d, 0x95, 0x70, 0x08, 0x17, 0xa9, 0x44, 0x64, 0xd4, 0x60, 0x4a, 0x72, 0xc2, 0x88, 0x07, 0x59, - 0x85, 0xa2, 0x78, 0xf8, 0x9e, 0xfb, 0x51, 0x54, 0x2b, 0x3c, 0xa8, 0x54, 0xb8, 0xbf, 0xc9, 0x67, - 0xf3, 0x85, 0x07, 0x86, 0x1e, 0xcf, 0x91, 0xa0, 0x64, 0x07, 0xb7, 0x62, 0x7c, 0xf6, 0x91, 0xb7, - 0x61, 0x2c, 0xcc, 0x16, 0x19, 0x46, 0x94, 0xa1, 0xc1, 0x3a, 0x4a, 0x2f, 0xa9, 0xc5, 0x96, 0xa9, - 0xe8, 0x64, 0x11, 0x0a, 0x6c, 0x11, 0xc7, 0x9f, 0xd0, 0xea, 0x0a, 0x98, 0xea, 0x26, 0x2e, 0xf1, - 0x48, 0x0d, 0x66, 0xd8, 0xa2, 0xa9, 0x39, 0xed, 0xbd, 0x26, 0x5d, 0x75, 0xf7, 0xdc, 0x6e, 0xf0, - 0xc0, 0x5c, 0x15, 0xc2, 0x95, 0xab, 0xca, 0x76, 0xab, 0xa9, 0x15, 0x7b, 0xda, 0x03, 0xa9, 0x29, - 0xd4, 0x8a, 0x0c, 0xfb, 0xc3, 0x2c, 0x8c, 0x29, 0xf3, 0x89, 0x5c, 0x85, 0x42, 0xd5, 0x5f, 0x75, - 0xeb, 0x07, 0x61, 0xae, 0xa9, 0x89, 0xc7, 0xc7, 0x0b, 0xa3, 0x8e, 0x6f, 0x35, 0x11, 0x68, 0x86, - 0xc5, 0x64, 0x09, 0x26, 0xf8, 0x5f, 0x32, 0xe3, 0x76, 0x36, 0xf2, 0x76, 0xe3, 0xc8, 0x32, 0xd7, - 0xb6, 0x2a, 0xd7, 0x34, 0x12, 0xf2, 0x35, 0x00, 0x0e, 0xc0, 0xe8, 0xc4, 0xdc, 0xe0, 0x71, 0x95, - 0xa2, 0x82, 0x94, 0xb8, 0x44, 0x85, 0x21, 0xf9, 0x06, 0xcf, 0x2e, 0x29, 0xe7, 0x7f, 0x7e, 0xf0, - 0xc0, 0x50, 0xc6, 0xdf, 0x4a, 0x8f, 0x4f, 0x57, 0x59, 0x8a, 0xb4, 0x78, 0xf3, 0x26, 0xad, 0xbb, - 0x0f, 0xa9, 0x77, 0x54, 0x0a, 0x10, 0x51, 0xc1, 0x30, 0xfe, 0xfb, 0x8c, 0xb2, 0x6a, 0xc8, 0x1a, - 0xbe, 0xfa, 0xc6, 0x67, 0x84, 0xf0, 0xd9, 0x08, 0x95, 0x79, 0x09, 0x37, 0xe9, 0xee, 0xd2, 0xb3, - 0xc2, 0xd9, 0x72, 0x26, 0x9c, 0x57, 0xb1, 0xd7, 0xe0, 0x38, 0x90, 0xbc, 0x0f, 0x79, 0xec, 0xba, - 0xec, 0x89, 0x9f, 0x26, 0xf7, 0xd3, 0x3c, 0xeb, 0x33, 0xfc, 0x10, 0xa4, 0x24, 0x9f, 0x13, 0x91, - 0x5d, 0xbc, 0xf3, 0x27, 0x95, 0x4d, 0x91, 0xb5, 0x23, 0xdc, 0x48, 0xa3, 0x14, 0x05, 0xca, 0xec, - 0xf9, 0xd7, 0xb2, 0x50, 0x8c, 0xaf, 0x55, 0xf2, 0x1e, 0x8c, 0xcb, 0x9d, 0x0e, 0x9f, 0x05, 0x66, - 0x5f, 0x39, 0x2e, 0x52, 0x40, 0xcb, 0xed, 0x2e, 0xfe, 0x2a, 0xb0, 0x4a, 0xc0, 0xb4, 0x8e, 0x4d, - 0x91, 0x32, 0x48, 0x59, 0x25, 0x81, 0x1b, 0x74, 0x62, 0x09, 0x0a, 0x25, 0x1a, 0x79, 0x03, 0x72, - 0xf7, 0x6f, 0x97, 0x44, 0x18, 0x81, 0x14, 0x49, 0xf7, 0x6f, 0x97, 0xf8, 0x6a, 0xe6, 0x6e, 0x52, - 0xba, 0xd3, 0x16, 0xc3, 0x27, 0xab, 0x4a, 0xfe, 0xcf, 0x61, 0xed, 0x8d, 0x1e, 0x09, 0x0e, 0x3f, - 0xee, 0xe4, 0x44, 0xa0, 0xfc, 0xbd, 0x61, 0x91, 0x65, 0xef, 0xdf, 0xca, 0xc1, 0x68, 0x58, 0x3f, - 0x21, 0x80, 0x4a, 0x95, 0x38, 0xc9, 0xe0, 0xdf, 0xe4, 0x3c, 0x14, 0xa4, 0x1e, 0x25, 0xa2, 0x09, - 0x46, 0x7c, 0xa1, 0x43, 0xcd, 0x81, 0x54, 0x98, 0xf8, 0x32, 0x37, 0xe5, 0x4f, 0x72, 0x03, 0x42, - 0x6d, 0xa8, 0x97, 0xda, 0x94, 0x67, 0x03, 0x66, 0x86, 0x68, 0x64, 0x12, 0xb2, 0x0e, 0xcf, 0xdc, - 0x32, 0x6a, 0x66, 0x9d, 0x06, 0x79, 0x0f, 0x0a, 0x76, 0xa3, 0x41, 0x1b, 0x96, 0x2d, 0x9d, 0x1f, - 0xfa, 0x4d, 0x9a, 0x02, 0xe3, 0xc6, 0x37, 0x01, 0xa4, 0x2a, 0x05, 0xa4, 0x04, 0xa3, 0x4d, 0x9b, - 0x3b, 0x52, 0x35, 0x06, 0xd8, 0x51, 0x22, 0x0e, 0x05, 0x46, 0xf6, 0xc0, 0xa7, 0x0d, 0xf2, 0x32, - 0xe4, 0xd9, 0x68, 0x8a, 0x2d, 0x44, 0xaa, 0x6f, 0x6c, 0x30, 0x79, 0x87, 0xad, 0x3c, 0x63, 0x22, - 0x02, 0x79, 0x11, 0x72, 0xdd, 0xc5, 0x5d, 0xb1, 0x39, 0x14, 0xa3, 0x5c, 0xbc, 0x21, 0x1a, 0x2b, - 0x26, 0x37, 0xa1, 0x70, 0xa8, 0xa7, 0x71, 0x3d, 0x13, 0x1b, 0xc6, 0x10, 0x3f, 0x44, 0x5c, 0x2a, - 0xc0, 0x30, 0xdf, 0x08, 0x8c, 0xe7, 0x01, 0xa2, 0xaa, 0x93, 0x41, 0x1f, 0xc6, 0xd7, 0x60, 0x34, - 0xac, 0x92, 0x5c, 0x00, 0x38, 0xa0, 0x47, 0xd6, 0xbe, 0xdd, 0x6e, 0x34, 0xb9, 0x7e, 0x37, 0x6e, - 0x8e, 0x1e, 0xd0, 0xa3, 0x15, 0x04, 0x90, 0x73, 0x30, 0xd2, 0x61, 0xa3, 0x2a, 0xa6, 0xee, 0xb8, - 0x39, 0xdc, 0xe9, 0xee, 0xb0, 0x19, 0x3a, 0x07, 0x23, 0x68, 0x79, 0x13, 0x0b, 0x6d, 0xc2, 0x94, - 0x3f, 0x8d, 0xff, 0x34, 0x8b, 0xcf, 0x0d, 0x28, 0xed, 0x24, 0x97, 0x60, 0xa2, 0xee, 0x51, 0xdc, - 0x73, 0x6c, 0xa6, 0x49, 0x89, 0x7a, 0xc6, 0x23, 0x60, 0xb5, 0x41, 0x2e, 0xc3, 0x94, 0x78, 0x62, - 0x9b, 0x35, 0xa8, 0xbe, 0x23, 0x72, 0x2e, 0x8f, 0x9b, 0x13, 0x1c, 0x7c, 0x8f, 0x1e, 0x95, 0x77, - 0x30, 0xe3, 0x50, 0x51, 0x4d, 0x18, 0x19, 0x84, 0x2f, 0x23, 0x9a, 0x53, 0x0a, 0x1c, 0x7d, 0x9a, - 0xce, 0xc2, 0xb0, 0x6d, 0xef, 0x75, 0x1d, 0x9e, 0x19, 0x64, 0xdc, 0x14, 0xbf, 0xc8, 0xab, 0x30, - 0xed, 0x3b, 0x7b, 0x6d, 0x3b, 0xe8, 0x7a, 0xe2, 0xbd, 0x07, 0xea, 0xe1, 0x94, 0x9a, 0x30, 0x8b, - 0x61, 0x41, 0x99, 0xc3, 0xc9, 0xeb, 0x40, 0xd4, 0xfa, 0xdc, 0x9d, 0x8f, 0x68, 0x9d, 0x4f, 0xb5, - 0x71, 0x73, 0x5a, 0x29, 0x59, 0xc7, 0x02, 0xf2, 0x02, 0x8c, 0x7b, 0xd4, 0x47, 0x2d, 0x0e, 0xbb, - 0x0d, 0x5f, 0xe3, 0x31, 0xc7, 0x24, 0x8c, 0xf5, 0xdd, 0x15, 0x28, 0x2a, 0xdd, 0x81, 0x39, 0x39, - 0x79, 0xc2, 0x61, 0x73, 0x32, 0x82, 0x9b, 0x9d, 0x6a, 0xc3, 0x58, 0x82, 0xe9, 0xc4, 0xca, 0x55, - 0x5e, 0xb3, 0xe5, 0x92, 0xa8, 0xff, 0x6b, 0xb6, 0x46, 0x1b, 0xc6, 0x55, 0x49, 0x7c, 0x42, 0xde, - 0xeb, 0xb3, 0x18, 0x59, 0xce, 0xc5, 0xd4, 0xf0, 0xe3, 0xe3, 0x85, 0xac, 0xd3, 0xc0, 0x78, 0xf2, - 0x2b, 0x50, 0x90, 0x4a, 0x83, 0xd8, 0xab, 0xd1, 0x72, 0x2a, 0xb4, 0xd5, 0x23, 0x33, 0x2c, 0x35, - 0x5e, 0x86, 0x11, 0x21, 0x6c, 0xfb, 0xdb, 0x4b, 0x8d, 0x1f, 0xcb, 0xc2, 0x94, 0x49, 0x99, 0x28, - 0xa0, 0x3c, 0xd9, 0xfd, 0x53, 0x7b, 0x7c, 0x4b, 0xcf, 0x4f, 0xa6, 0x7d, 0x5b, 0x9f, 0x34, 0xf3, - 0x7f, 0x37, 0x03, 0x33, 0x29, 0xb8, 0x9f, 0xe8, 0x49, 0xb4, 0x5b, 0x30, 0x5a, 0x71, 0xec, 0x66, - 0xa9, 0xd1, 0x08, 0xc3, 0xcc, 0x51, 0xd5, 0x6c, 0xb0, 0x99, 0x66, 0x33, 0xa8, 0xba, 0xed, 0x86, - 0xa8, 0xe4, 0x15, 0x31, 0x29, 0xa2, 0xe7, 0xa8, 0x71, 0x52, 0x7c, 0x7c, 0xbc, 0x00, 0xbc, 0x4d, - 0xd1, 0xb3, 0x9b, 0x98, 0x33, 0x90, 0x03, 0x23, 0x37, 0xf0, 0xa7, 0x76, 0xe8, 0xd2, 0x73, 0x06, - 0xc6, 0x3f, 0x6f, 0xa0, 0x4c, 0xf3, 0x3f, 0x99, 0x85, 0xb3, 0xe9, 0x84, 0x9f, 0xf4, 0x75, 0x3b, - 0xcc, 0xf1, 0xaf, 0xe4, 0x39, 0xc5, 0xd7, 0xed, 0xf8, 0x83, 0x00, 0x88, 0x1f, 0x21, 0x90, 0x5d, - 0x98, 0x58, 0xb5, 0xfd, 0x60, 0x85, 0xda, 0x5e, 0xb0, 0x43, 0xed, 0x60, 0x00, 0xdd, 0xf3, 0x45, - 0x79, 0x2d, 0x89, 0xdb, 0xdf, 0xbe, 0xa4, 0x8c, 0x69, 0x87, 0x3a, 0xdb, 0x70, 0xa2, 0xe4, 0x07, - 0x98, 0x28, 0xdf, 0x84, 0xa9, 0x1a, 0x6d, 0xd9, 0x9d, 0x7d, 0xd7, 0x93, 0x71, 0x84, 0xd7, 0x60, - 0x22, 0x04, 0xa5, 0xce, 0x16, 0xbd, 0x58, 0xc3, 0x57, 0x3a, 0x22, 0x12, 0x25, 0x7a, 0xb1, 0xf1, - 0x37, 0xb2, 0x70, 0xae, 0x54, 0x17, 0xde, 0x42, 0xa2, 0x40, 0x3a, 0x35, 0x7e, 0xc6, 0x75, 0x93, - 0xeb, 0x30, 0x7a, 0xdf, 0x7e, 0xb4, 0x4a, 0x6d, 0x9f, 0xfa, 0xe2, 0x6d, 0x21, 0xae, 0xa8, 0xd9, - 0x8f, 0x22, 0x27, 0x1a, 0x33, 0xc2, 0x51, 0x4f, 0xb2, 0xf9, 0x4f, 0x79, 0x92, 0x35, 0x60, 0x78, - 0xc5, 0x6d, 0x36, 0xc4, 0x36, 0x26, 0xae, 0xd7, 0xf6, 0x11, 0x62, 0x8a, 0x12, 0x76, 0x00, 0x9c, - 0x0c, 0x5b, 0x8c, 0x4d, 0xf8, 0xcc, 0xbb, 0xe4, 0x32, 0x8c, 0x60, 0x45, 0xd5, 0x8a, 0xba, 0x69, - 0x34, 0x29, 0xbe, 0x10, 0xd3, 0x30, 0x65, 0xa1, 0xda, 0x13, 0x43, 0x9f, 0xae, 0x27, 0x8c, 0x7f, - 0x1b, 0x6f, 0xee, 0xd4, 0xaf, 0x64, 0x3b, 0x91, 0xd2, 0x90, 0xcc, 0x80, 0x0d, 0xc9, 0x3e, 0xb1, - 0x21, 0xc9, 0xf5, 0x1c, 0x92, 0x6f, 0x67, 0x61, 0x2c, 0x6c, 0xec, 0xf7, 0x59, 0xb2, 0xdd, 0xf0, - 0xbb, 0x06, 0x8a, 0xfd, 0xaf, 0x29, 0xb2, 0x42, 0x84, 0xd8, 0xbf, 0x0f, 0xc3, 0x62, 0x31, 0x65, - 0x62, 0xce, 0x7d, 0xb1, 0xd1, 0x5d, 0x9a, 0x14, 0xac, 0x87, 0x71, 0x40, 0x7d, 0x53, 0xd0, 0x61, - 0x72, 0x85, 0x6d, 0xba, 0x23, 0x2e, 0x72, 0x9f, 0xda, 0x3d, 0x2a, 0x3d, 0xb9, 0x42, 0xf4, 0x61, - 0x03, 0xed, 0x4e, 0x3f, 0x5f, 0x80, 0x62, 0x9c, 0xe4, 0xe4, 0x74, 0xc6, 0x1b, 0xdd, 0x1d, 0xae, - 0x85, 0xf3, 0x74, 0xc6, 0x9d, 0xee, 0x8e, 0xc9, 0x60, 0xe8, 0xe7, 0xe1, 0x39, 0x0f, 0xf1, 0xab, - 0xc7, 0x85, 0x9f, 0x87, 0xe7, 0x3c, 0xd4, 0xfc, 0x3c, 0x3c, 0xe7, 0x21, 0x1e, 0x7d, 0x57, 0x6b, - 0x18, 0x0f, 0x8a, 0x2a, 0xb8, 0x38, 0xfa, 0x36, 0xfd, 0xf8, 0x33, 0x20, 0x12, 0x8d, 0x6d, 0x95, - 0x4b, 0xd4, 0xf6, 0x44, 0xea, 0x5d, 0x21, 0xce, 0x70, 0xab, 0xdc, 0x41, 0x30, 0x7f, 0x61, 0xd7, - 0x54, 0x91, 0x48, 0x13, 0x88, 0xf2, 0x53, 0x2e, 0xe0, 0x93, 0x4f, 0x83, 0xd2, 0x31, 0x67, 0x56, - 0x65, 0x6d, 0xa9, 0xab, 0x39, 0x85, 0xef, 0x93, 0x34, 0x40, 0x6e, 0x88, 0x7c, 0x62, 0x68, 0xf2, - 0x28, 0x9c, 0xc8, 0x4c, 0x06, 0x4c, 0x03, 0xcf, 0x37, 0x16, 0x1a, 0x3e, 0x22, 0x26, 0xe4, 0x5d, - 0x18, 0x53, 0xa3, 0x7c, 0x79, 0x2c, 0xea, 0x73, 0x3c, 0x45, 0x54, 0x8f, 0x47, 0xde, 0x54, 0x02, - 0xb2, 0x03, 0xe7, 0xca, 0x6e, 0xdb, 0xef, 0xb6, 0x64, 0x32, 0xaa, 0x28, 0x05, 0x26, 0x84, 0x8f, - 0xb4, 0xbf, 0x58, 0x17, 0x28, 0x22, 0xa8, 0x54, 0x7a, 0x4e, 0xeb, 0x07, 0x90, 0x5e, 0x8c, 0xc8, - 0x26, 0x8c, 0xa1, 0x11, 0x4f, 0xb8, 0x66, 0x8d, 0xe9, 0x62, 0x23, 0x2a, 0xa9, 0xb0, 0x85, 0xc1, - 0xb3, 0xa9, 0xd8, 0xad, 0xa6, 0x74, 0xdc, 0x55, 0x8d, 0x91, 0x0a, 0x32, 0xf9, 0x1a, 0x4c, 0xf2, - 0xe3, 0xe6, 0x36, 0xdd, 0xe1, 0x73, 0x67, 0x5c, 0x3b, 0x3b, 0xeb, 0x85, 0xfc, 0xa2, 0x57, 0x98, - 0x4e, 0x0f, 0xe9, 0x0e, 0x1f, 0x7b, 0xcd, 0x6d, 0x5e, 0xc3, 0x27, 0x0f, 0x60, 0x66, 0xc5, 0xf6, - 0x39, 0x50, 0x09, 0xd7, 0x9c, 0x40, 0x9b, 0x22, 0xba, 0x33, 0xee, 0xdb, 0xbe, 0xb4, 0xc5, 0xa6, - 0x86, 0x67, 0xa6, 0xd1, 0x93, 0x1f, 0xcb, 0xc0, 0x9c, 0x66, 0xaa, 0x15, 0x4e, 0x35, 0x2d, 0xda, - 0x0e, 0xd0, 0x3f, 0x7e, 0x32, 0x7c, 0xdb, 0xb7, 0x17, 0x1a, 0x1f, 0x92, 0x98, 0x35, 0xd8, 0x8b, - 0xca, 0x55, 0x3f, 0xc1, 0x5e, 0x3c, 0x8c, 0x5b, 0xf1, 0xde, 0x13, 0x86, 0x96, 0x4c, 0x68, 0x68, - 0x99, 0x85, 0x21, 0xec, 0x23, 0x99, 0x2b, 0x02, 0x7f, 0x18, 0x9f, 0x53, 0xa5, 0x8a, 0x50, 0xf2, - 0xfa, 0x4a, 0x15, 0xe3, 0xbf, 0x1e, 0x86, 0xa9, 0xd8, 0x20, 0x8b, 0x53, 0x67, 0x26, 0x71, 0xea, - 0xac, 0x01, 0x70, 0x53, 0xe3, 0x80, 0x36, 0x41, 0x19, 0x69, 0x33, 0x26, 0x22, 0xd5, 0xc2, 0x15, - 0xa2, 0xb0, 0x61, 0x4c, 0xf9, 0xfa, 0x1b, 0xd0, 0x46, 0x1b, 0x32, 0xe5, 0x4b, 0x58, 0x61, 0x1a, - 0xb1, 0x21, 0x0b, 0x30, 0x84, 0x09, 0xde, 0xd4, 0x40, 0x27, 0x87, 0x01, 0x4c, 0x0e, 0x27, 0x97, - 0x60, 0x98, 0xa9, 0x44, 0xd5, 0x8a, 0x10, 0x69, 0xb8, 0x53, 0x30, 0x9d, 0x89, 0xe9, 0x1f, 0xa2, - 0x88, 0xdc, 0x82, 0x71, 0xfe, 0x97, 0x88, 0xf1, 0x1f, 0xd6, 0xfd, 0xb6, 0x2c, 0xa7, 0x21, 0xc3, - 0xfc, 0x35, 0x3c, 0x76, 0x56, 0xa8, 0x75, 0x77, 0xf8, 0x4b, 0xf3, 0x22, 0x23, 0x28, 0x9e, 0x15, - 0x7c, 0x0e, 0xc4, 0x97, 0xb0, 0x43, 0x04, 0xa6, 0x99, 0x08, 0x77, 0xe3, 0x02, 0x9e, 0x10, 0x51, - 0x33, 0xe1, 0x6e, 0xc6, 0xa6, 0x28, 0x21, 0x57, 0xb9, 0x69, 0x1f, 0x95, 0x3c, 0xfe, 0x88, 0x11, - 0xda, 0xcd, 0xd1, 0xcc, 0x80, 0x9a, 0x5e, 0x58, 0xcc, 0x2a, 0x67, 0x7f, 0x2f, 0xb7, 0x6c, 0xa7, - 0x29, 0x84, 0x04, 0x56, 0x8e, 0xb8, 0x94, 0x41, 0xcd, 0x08, 0x81, 0xbc, 0x0d, 0x93, 0xec, 0x47, - 0xd9, 0x6d, 0xb5, 0xdc, 0x36, 0xb2, 0x1f, 0x8b, 0xd2, 0xc5, 0x20, 0x49, 0x1d, 0x8b, 0x78, 0x2d, - 0x31, 0x5c, 0xb6, 0x3b, 0xe0, 0xb5, 0x61, 0x97, 0x5f, 0x3a, 0x8c, 0x47, 0xbb, 0x03, 0x92, 0xfa, - 0x1c, 0x6e, 0xaa, 0x48, 0xe4, 0x4d, 0x98, 0x60, 0x3f, 0xef, 0x38, 0x0f, 0x29, 0xaf, 0x70, 0x22, - 0xba, 0xc8, 0x46, 0xaa, 0x3d, 0x56, 0xc2, 0xeb, 0xd3, 0x31, 0xc9, 0x97, 0xe1, 0x0c, 0x72, 0xaa, - 0xbb, 0x1d, 0xda, 0x28, 0xed, 0xee, 0x3a, 0x4d, 0x87, 0x3b, 0xd2, 0xf0, 0x68, 0x76, 0xb4, 0x01, - 0xf3, 0x8a, 0x11, 0xc3, 0xb2, 0x23, 0x14, 0x33, 0x9d, 0x92, 0x6c, 0x43, 0xb1, 0xdc, 0xf5, 0x03, - 0xb7, 0x55, 0x0a, 0x02, 0xcf, 0xd9, 0xe9, 0x06, 0xd4, 0x9f, 0x9b, 0xd2, 0x62, 0xbe, 0xd9, 0xe2, - 0x08, 0x0b, 0xb9, 0x75, 0xa7, 0x8e, 0x14, 0x96, 0x1d, 0x92, 0x98, 0x09, 0x26, 0xc6, 0x7f, 0x95, - 0x81, 0x09, 0x8d, 0x94, 0xbc, 0x01, 0xe3, 0xb7, 0x3d, 0x87, 0xb6, 0x1b, 0xcd, 0x23, 0xe5, 0xd8, - 0x89, 0x67, 0x92, 0x5d, 0x01, 0xe7, 0x5f, 0xad, 0xa1, 0x85, 0x56, 0x9b, 0x6c, 0xaa, 0x97, 0xdb, - 0x75, 0x1e, 0x6f, 0x27, 0x26, 0x68, 0x2e, 0x4a, 0x42, 0x81, 0x13, 0x54, 0xcc, 0x4e, 0x05, 0x85, - 0xbc, 0x03, 0xc3, 0xfc, 0x82, 0x51, 0xb8, 0x5c, 0x9d, 0x4f, 0xfb, 0x4c, 0x1e, 0xdb, 0x89, 0x13, - 0x11, 0xdd, 0x3b, 0x7c, 0x53, 0x10, 0x19, 0x3f, 0x9b, 0x01, 0x92, 0x44, 0x3d, 0xc1, 0x8a, 0x75, - 0xa2, 0xdb, 0xc8, 0xfb, 0xe1, 0x6a, 0xcc, 0x69, 0x36, 0x5b, 0x56, 0x13, 0x2f, 0xe0, 0x1d, 0x2f, - 0x56, 0x9d, 0x6a, 0x56, 0xe3, 0xc5, 0xc6, 0x5f, 0xce, 0x02, 0x44, 0xd8, 0xe4, 0x8b, 0xfc, 0x1d, - 0x8d, 0x2f, 0x77, 0xed, 0xa6, 0xb3, 0xeb, 0xe8, 0x89, 0xe5, 0x90, 0xc9, 0x37, 0x65, 0x89, 0xa9, - 0x23, 0x92, 0xf7, 0x60, 0xaa, 0xb6, 0xa1, 0xd3, 0x2a, 0x6f, 0x06, 0xf8, 0x1d, 0x2b, 0x46, 0x1e, - 0xc7, 0x46, 0xd7, 0x4a, 0x75, 0x34, 0xb8, 0x6b, 0x25, 0x1f, 0x08, 0x51, 0xc2, 0x04, 0x4b, 0x6d, - 0x43, 0x78, 0xf3, 0x36, 0xaa, 0x15, 0x21, 0xa5, 0xb0, 0x75, 0x7e, 0xc7, 0xea, 0x08, 0x37, 0x5f, - 0x26, 0x27, 0x34, 0xbc, 0xa8, 0x23, 0x87, 0x7a, 0xc4, 0x6f, 0xfe, 0x1c, 0x1a, 0xf1, 0x5a, 0x6e, - 0x40, 0x85, 0xed, 0xe2, 0xa9, 0x3d, 0xc5, 0x44, 0xb7, 0xd3, 0x43, 0x5a, 0x58, 0x9a, 0xf6, 0x75, - 0xc2, 0x37, 0xe2, 0x66, 0x74, 0xe4, 0xe0, 0xf7, 0xd4, 0x29, 0xde, 0x14, 0x7f, 0x3b, 0x03, 0x67, - 0x52, 0x69, 0xc9, 0x35, 0x80, 0xc8, 0x42, 0x24, 0x7a, 0x09, 0x25, 0x66, 0x94, 0x7a, 0xc1, 0x54, - 0x30, 0xc8, 0x57, 0xe3, 0xb6, 0x9d, 0x93, 0x37, 0xc2, 0x79, 0x99, 0x5a, 0x47, 0xb7, 0xed, 0xa4, - 0x58, 0x74, 0x8c, 0xbf, 0x9b, 0x83, 0x69, 0x25, 0xb3, 0x03, 0x6f, 0xeb, 0x09, 0xae, 0xae, 0x07, - 0x30, 0xce, 0xbe, 0xc6, 0xa9, 0x8b, 0xd8, 0x18, 0xee, 0x49, 0xf1, 0x4a, 0x22, 0xb0, 0x48, 0x70, - 0xbb, 0xa6, 0x22, 0xf3, 0x84, 0x57, 0x28, 0x3a, 0xd1, 0x72, 0x5e, 0x4f, 0xc6, 0xc8, 0x68, 0xcc, - 0x89, 0x0f, 0x13, 0x95, 0xa3, 0xb6, 0xdd, 0x0a, 0x6b, 0xe3, 0x1e, 0x15, 0xaf, 0xf6, 0xac, 0x4d, - 0xc3, 0xe6, 0xd5, 0x45, 0x2e, 0xf8, 0xbc, 0x2c, 0x25, 0xfa, 0x53, 0xa3, 0x9a, 0x7f, 0x0f, 0xa6, - 0x13, 0x8d, 0x3e, 0x55, 0xee, 0xad, 0x6d, 0x20, 0xc9, 0x76, 0xa4, 0x70, 0x78, 0x55, 0xcf, 0xec, - 0x76, 0x26, 0xbc, 0x3c, 0xc5, 0x17, 0x78, 0xb9, 0x7f, 0xc6, 0xa2, 0x9a, 0x99, 0xeb, 0xe7, 0xb2, - 0x6a, 0x70, 0xd7, 0xd3, 0xbe, 0xea, 0xde, 0xd7, 0xce, 0xb6, 0xcf, 0xf7, 0x1a, 0xd3, 0x81, 0x6c, - 0x08, 0xdf, 0xcb, 0xc1, 0xb9, 0x1e, 0x94, 0xe4, 0x28, 0x3e, 0x89, 0xb8, 0x4d, 0xe1, 0x46, 0xff, - 0x0a, 0x9f, 0xc4, 0x54, 0x22, 0x5f, 0xe4, 0xe1, 0xdd, 0x75, 0x7c, 0x39, 0x56, 0x9c, 0xa6, 0xf9, - 0xa3, 0xe3, 0x21, 0x34, 0x1e, 0xd7, 0xcd, 0xa1, 0xe4, 0x3d, 0x18, 0xc2, 0xc8, 0xbe, 0x58, 0x66, - 0x29, 0x86, 0x81, 0x70, 0x25, 0x0d, 0x17, 0xfb, 0xa9, 0xa5, 0xe1, 0x62, 0x00, 0xf2, 0x05, 0xc8, - 0x95, 0xb6, 0x6b, 0x62, 0x5c, 0x26, 0x55, 0xf2, 0xed, 0x5a, 0x94, 0xfd, 0xdb, 0xd6, 0xd2, 0x74, - 0x33, 0x0a, 0x46, 0x78, 0xa7, 0xbc, 0x21, 0x46, 0x45, 0x25, 0xbc, 0x53, 0xde, 0x88, 0x08, 0xf7, - 0xea, 0x5a, 0xa6, 0x8e, 0x3b, 0xe5, 0x8d, 0xcf, 0x6e, 0xda, 0xff, 0xb5, 0x2c, 0x8f, 0x49, 0xe7, - 0x1f, 0xf6, 0x1e, 0x8c, 0x6b, 0x99, 0x37, 0x33, 0x91, 0x3e, 0x16, 0x26, 0x38, 0x8d, 0xb9, 0xa0, - 0x68, 0x04, 0x32, 0x8f, 0x3e, 0xfb, 0x8d, 0x1a, 0xaf, 0xea, 0xec, 0x11, 0x72, 0x40, 0x9d, 0x38, - 0x9e, 0x47, 0x3f, 0x24, 0x21, 0x37, 0xa1, 0xb0, 0x49, 0xdb, 0x76, 0x3b, 0x08, 0xcd, 0x9b, 0xe8, - 0x46, 0x1a, 0x20, 0x4c, 0xd7, 0x1a, 0x42, 0x44, 0x74, 0x79, 0xec, 0xee, 0xf8, 0x75, 0xcf, 0xc1, - 0xdc, 0x15, 0xe1, 0x5e, 0xcc, 0x5d, 0x1e, 0x95, 0x12, 0x9d, 0x41, 0x8c, 0xc8, 0xf8, 0xb9, 0x0c, - 0x8c, 0x88, 0x81, 0xe4, 0xef, 0x9f, 0xec, 0x45, 0x7b, 0x89, 0x78, 0xff, 0x64, 0xcf, 0x89, 0xbf, - 0x7f, 0xb2, 0xc7, 0x13, 0x44, 0x8c, 0x8a, 0xf0, 0xca, 0xf0, 0xa2, 0x8f, 0x3f, 0x97, 0xcd, 0x81, - 0x7a, 0xb5, 0x11, 0xea, 0xa0, 0xb1, 0x24, 0xc6, 0xdf, 0x14, 0x2d, 0xbb, 0x53, 0xde, 0x20, 0x8b, - 0x50, 0x58, 0x75, 0xeb, 0xb6, 0xb2, 0xcf, 0xa1, 0xd8, 0x69, 0x0a, 0x98, 0xda, 0x41, 0x12, 0x8f, - 0xb5, 0x6f, 0xc3, 0x73, 0xc5, 0x59, 0x46, 0x69, 0x5f, 0x87, 0x03, 0x63, 0xed, 0x0b, 0x51, 0x07, - 0x6e, 0x1f, 0x4d, 0x11, 0x12, 0x5b, 0x37, 0x31, 0xc1, 0xf8, 0x5d, 0x35, 0x46, 0x47, 0x14, 0x49, - 0x49, 0x31, 0xdf, 0x4b, 0x52, 0x6c, 0xdd, 0x34, 0x53, 0xa8, 0xf0, 0x96, 0x2c, 0x02, 0xd7, 0xa8, - 0xf7, 0xf0, 0x29, 0x96, 0xd2, 0xe9, 0xb7, 0x64, 0xf1, 0xcf, 0x1b, 0x48, 0x48, 0xff, 0xe7, 0x59, - 0x38, 0x9b, 0x4e, 0xa8, 0x7e, 0x4b, 0xa6, 0xcf, 0xb7, 0x5c, 0x81, 0xc2, 0x8a, 0xeb, 0x07, 0x8a, - 0xd7, 0x19, 0x1a, 0xf3, 0xf7, 0x05, 0xcc, 0x0c, 0x4b, 0xd9, 0x99, 0x9b, 0xfd, 0x1d, 0x2e, 0x4f, - 0xe4, 0x87, 0x91, 0xd8, 0xec, 0xcc, 0xcd, 0x8b, 0xc8, 0x1d, 0x28, 0x98, 0x22, 0x46, 0x24, 0xd6, - 0x35, 0x12, 0x1c, 0x6a, 0x53, 0xc4, 0x13, 0x10, 0x2d, 0x01, 0xaa, 0x80, 0x91, 0x12, 0x8c, 0x88, - 0xd1, 0x8f, 0x5d, 0x04, 0xa7, 0x4c, 0x19, 0x3d, 0x27, 0xb1, 0xa4, 0x63, 0x12, 0x05, 0xaf, 0xf4, - 0xaa, 0x15, 0x19, 0xee, 0x81, 0x12, 0x85, 0x5f, 0xf9, 0xe9, 0x0e, 0x7e, 0x21, 0xa2, 0xf1, 0x63, - 0x59, 0x00, 0x69, 0xb5, 0x79, 0x6a, 0x67, 0xd8, 0x17, 0xb4, 0x19, 0xa6, 0xf8, 0xbb, 0x0c, 0xfe, - 0x5e, 0xdf, 0x3a, 0xfa, 0x9d, 0x0c, 0xfe, 0x5a, 0xdf, 0x02, 0x0c, 0x6d, 0x46, 0x06, 0x2d, 0x11, - 0x7c, 0x80, 0xc6, 0x65, 0x0e, 0x37, 0x76, 0x60, 0xf6, 0x0e, 0x0d, 0x22, 0xf3, 0x96, 0xbc, 0x48, - 0xec, 0xcf, 0xf6, 0x35, 0x18, 0x15, 0xf8, 0xa1, 0xfc, 0xe2, 0xb6, 0x18, 0x91, 0xdc, 0x00, 0x6d, - 0x31, 0x12, 0x81, 0x49, 0xa3, 0x0a, 0x6d, 0xd2, 0x80, 0x7e, 0xb6, 0xd5, 0xd4, 0x80, 0xf0, 0x4f, - 0xc1, 0x2f, 0x1b, 0xac, 0x86, 0x13, 0xfb, 0x67, 0x0b, 0xce, 0x84, 0x6d, 0x7f, 0x92, 0x7c, 0xaf, - 0xb3, 0x23, 0xa5, 0x48, 0xe7, 0x1b, 0x71, 0xec, 0xe3, 0x49, 0xf2, 0x08, 0xe6, 0x25, 0xc1, 0xb6, - 0x13, 0x3a, 0xee, 0x0d, 0x44, 0x4b, 0xde, 0x86, 0x31, 0x85, 0x46, 0xa4, 0xa3, 0x45, 0xa3, 0xf3, - 0xa1, 0x13, 0xec, 0x5b, 0x3e, 0x87, 0xab, 0x46, 0x67, 0x05, 0xdd, 0xf8, 0x10, 0x9e, 0x0d, 0x03, - 0x44, 0x52, 0xaa, 0x8e, 0x31, 0xcf, 0x9c, 0x8e, 0xf9, 0x5a, 0xf4, 0x59, 0xd5, 0x76, 0x18, 0xd4, - 0x29, 0x79, 0x13, 0xf5, 0xb3, 0xc4, 0xc7, 0x3c, 0x97, 0x08, 0x13, 0x55, 0xa2, 0x41, 0x8d, 0xb7, - 0x94, 0xc6, 0xa6, 0x30, 0xd4, 0x88, 0x33, 0x71, 0xe2, 0x1f, 0xcb, 0xc2, 0xd4, 0x7a, 0xb5, 0x52, - 0x0e, 0x7d, 0x89, 0xbe, 0xcf, 0x5e, 0x13, 0xd4, 0xbe, 0xad, 0xb7, 0xbc, 0x31, 0x1e, 0xc0, 0x4c, - 0xac, 0x1b, 0x50, 0x75, 0x78, 0x97, 0x47, 0x30, 0x84, 0x60, 0xa9, 0x36, 0x9c, 0x4d, 0x63, 0xbf, - 0x75, 0xd3, 0x8c, 0x61, 0x1b, 0xff, 0x78, 0x34, 0xc6, 0x57, 0x88, 0xb0, 0xd7, 0x60, 0xb4, 0xea, - 0xfb, 0x5d, 0xea, 0x3d, 0x30, 0x57, 0x55, 0x53, 0x81, 0x83, 0x40, 0xab, 0xeb, 0x35, 0xcd, 0x08, - 0x81, 0x5c, 0x85, 0x82, 0xc8, 0xd0, 0x2a, 0x65, 0x02, 0x5a, 0x6d, 0xc3, 0x04, 0xaf, 0x66, 0x58, - 0x4c, 0xde, 0x80, 0x71, 0xfe, 0x37, 0x9f, 0x6d, 0xa2, 0xc3, 0xd1, 0x38, 0x28, 0xd0, 0xf9, 0xec, - 0x34, 0x35, 0x34, 0xf2, 0x0a, 0xe4, 0x4a, 0x65, 0x53, 0x98, 0x83, 0x84, 0xde, 0x88, 0x6f, 0x04, - 0x77, 0xa9, 0x7e, 0x88, 0x28, 0x9b, 0x4c, 0xfb, 0x93, 0x01, 0xe4, 0xc2, 0x92, 0xcd, 0x9f, 0x32, - 0x16, 0xb0, 0xd8, 0x66, 0x86, 0x30, 0x72, 0x1d, 0x46, 0x2a, 0x8e, 0xdf, 0x69, 0xda, 0x47, 0xc2, - 0x8e, 0xcd, 0x9f, 0xca, 0xe1, 0x20, 0x2d, 0x2e, 0x9c, 0x83, 0xc8, 0x55, 0xf9, 0x84, 0x48, 0x21, - 0x0a, 0x84, 0xe8, 0xf1, 0x4e, 0xc8, 0x6b, 0x30, 0x2c, 0xf2, 0x98, 0x8e, 0x2a, 0x19, 0xca, 0xe3, - 0xf9, 0x4b, 0x05, 0x4e, 0x32, 0x54, 0x11, 0x9e, 0x64, 0xa8, 0xe2, 0x0e, 0x9c, 0xbb, 0x83, 0xd6, - 0x1b, 0x3d, 0xe3, 0xc9, 0x03, 0xb3, 0x2a, 0xec, 0xe1, 0x78, 0xa9, 0xc3, 0x0d, 0x3c, 0xf1, 0xa4, - 0x29, 0x56, 0xd7, 0x53, 0x5f, 0x7e, 0xeb, 0xc5, 0x88, 0x7c, 0x05, 0x66, 0xd3, 0x8a, 0x84, 0xd5, - 0x1c, 0x73, 0x7b, 0xa4, 0x57, 0xa0, 0xe6, 0xf6, 0x48, 0xe3, 0x40, 0x56, 0xa1, 0xc8, 0xe1, 0xa5, - 0x46, 0xcb, 0x69, 0x73, 0xcb, 0x3f, 0xb7, 0xaa, 0x63, 0x64, 0x82, 0xe0, 0x6a, 0xb3, 0x42, 0x7e, - 0x03, 0xa0, 0xc5, 0xb2, 0xc4, 0x28, 0xc9, 0x4f, 0x67, 0xd8, 0x69, 0x8e, 0x67, 0xfd, 0x7c, 0x60, - 0xae, 0xfa, 0x22, 0x2f, 0xd4, 0xd9, 0x28, 0x4c, 0xa5, 0x16, 0x78, 0x4e, 0x7b, 0x4f, 0xc4, 0xa9, - 0x6c, 0x8a, 0x38, 0x95, 0xb7, 0x3f, 0x51, 0x9c, 0x0a, 0x67, 0xe5, 0x3f, 0x3e, 0x5e, 0x18, 0xf7, - 0x44, 0x9d, 0xb8, 0x8a, 0xb4, 0x16, 0xe0, 0xab, 0xe5, 0xcd, 0xa6, 0x7b, 0xf8, 0xa0, 0xfd, 0x90, - 0x7a, 0xce, 0xae, 0x43, 0x1b, 0xfc, 0x23, 0xa7, 0x50, 0x82, 0xf3, 0x57, 0xcb, 0xf1, 0x1d, 0xfe, - 0x6e, 0x88, 0x90, 0xf8, 0xd0, 0x54, 0x0e, 0xec, 0xe0, 0x29, 0x63, 0x21, 0x78, 0xdc, 0x65, 0x31, - 0x3a, 0x78, 0xca, 0xc0, 0x09, 0x0b, 0xa7, 0x91, 0x3a, 0x79, 0x34, 0x12, 0x72, 0x1d, 0x86, 0xef, - 0xdb, 0x8f, 0x4a, 0x7b, 0x54, 0x3c, 0x0d, 0x35, 0x21, 0xc5, 0x1f, 0x02, 0x97, 0x0a, 0xbf, 0xcf, - 0x7d, 0xed, 0x9f, 0x31, 0x05, 0x1a, 0xf9, 0xa1, 0x0c, 0x9c, 0xe5, 0xcb, 0x58, 0x7e, 0x65, 0x8d, - 0x06, 0x01, 0xeb, 0x07, 0x91, 0x20, 0x4a, 0x3e, 0xac, 0x50, 0xab, 0xad, 0xa7, 0xe3, 0xf1, 0x37, - 0xb6, 0x85, 0x64, 0x08, 0x3b, 0xce, 0x17, 0xa5, 0x5a, 0x16, 0xc8, 0x54, 0x7a, 0xe1, 0x47, 0xfe, - 0x05, 0xd9, 0x72, 0xf2, 0xba, 0x1a, 0x1e, 0x98, 0x43, 0x3d, 0x77, 0xa4, 0x65, 0x3f, 0xb2, 0xec, - 0x3d, 0xaa, 0xdd, 0x4e, 0x87, 0x71, 0x83, 0xe7, 0x7b, 0xb6, 0x8d, 0xdc, 0x82, 0x73, 0xf2, 0xb5, - 0xf5, 0xfd, 0x20, 0xe8, 0xf8, 0x96, 0x3c, 0x0b, 0x88, 0x78, 0x42, 0xf3, 0x8c, 0x28, 0x5e, 0x61, - 0xa5, 0xf2, 0x78, 0xe0, 0x1b, 0x7f, 0x34, 0xca, 0xf7, 0xb4, 0x52, 0x37, 0xd8, 0x97, 0xbb, 0xe0, - 0x62, 0x5a, 0x44, 0x0c, 0x77, 0xd5, 0x53, 0x22, 0x62, 0xf4, 0x38, 0x18, 0x79, 0x19, 0x91, 0x4d, - 0xbd, 0x8c, 0x78, 0x0d, 0x46, 0xcb, 0xfb, 0xb4, 0x7e, 0x10, 0x46, 0x25, 0x14, 0x84, 0xb5, 0x97, - 0x01, 0x79, 0x82, 0xd0, 0x08, 0x81, 0x5c, 0x07, 0xc0, 0x10, 0x39, 0xae, 0x22, 0x29, 0x49, 0xbe, - 0x31, 0xa2, 0x4e, 0x78, 0x3f, 0x28, 0x28, 0xc8, 0xbe, 0x66, 0xde, 0x56, 0xdd, 0x25, 0x38, 0x7b, - 0xdf, 0xdb, 0x15, 0xe8, 0x11, 0x02, 0xfb, 0x3c, 0x65, 0xa2, 0x0b, 0xb1, 0x5c, 0x4c, 0xac, 0x06, - 0x15, 0x09, 0x3d, 0x11, 0xa5, 0x0b, 0x36, 0x4a, 0xe5, 0x71, 0xe1, 0x89, 0x18, 0xba, 0x6b, 0x9b, - 0x11, 0x02, 0xf9, 0x02, 0x8c, 0x94, 0xa9, 0x17, 0x6c, 0x6e, 0xae, 0xa2, 0x47, 0x03, 0xcf, 0x84, - 0x5d, 0xc0, 0xac, 0xc5, 0x41, 0xd0, 0xfc, 0xf8, 0x78, 0x61, 0x22, 0x70, 0x5a, 0xf4, 0x5a, 0x38, - 0xc0, 0x12, 0x9b, 0x2c, 0x41, 0x91, 0xdf, 0xd2, 0x46, 0xaa, 0x30, 0x0a, 0xea, 0x02, 0xdf, 0x36, - 0xc4, 0x95, 0xee, 0x21, 0xdd, 0x09, 0x73, 0x36, 0x27, 0xf0, 0xc9, 0xb2, 0x4c, 0x75, 0xae, 0x7e, - 0x24, 0x44, 0xb6, 0x99, 0xf8, 0x04, 0x66, 0xdf, 0x9a, 0xa4, 0x20, 0x25, 0x98, 0x28, 0xbb, 0xad, - 0x8e, 0x1d, 0x38, 0xf8, 0x6e, 0xd0, 0x91, 0x90, 0xc9, 0x68, 0x5f, 0xaa, 0xab, 0x05, 0x9a, 0x80, - 0x57, 0x0b, 0xc8, 0x6d, 0x98, 0x34, 0xdd, 0x2e, 0x1b, 0x24, 0x79, 0x28, 0xe4, 0x62, 0x17, 0xfd, - 0x0e, 0x3c, 0x56, 0xc2, 0x76, 0x09, 0x71, 0x02, 0xd4, 0x32, 0xce, 0x69, 0x54, 0x64, 0x2d, 0xc5, - 0x3a, 0xaf, 0xca, 0x5a, 0x35, 0x73, 0x73, 0x82, 0x59, 0x8a, 0x61, 0xff, 0x26, 0x8c, 0xd5, 0x6a, - 0xeb, 0x9b, 0xd4, 0x0f, 0x6e, 0x37, 0xdd, 0x43, 0x14, 0xb5, 0x05, 0xf1, 0xa2, 0x85, 0xef, 0x5a, - 0x01, 0xf5, 0x03, 0x6b, 0xb7, 0xe9, 0x1e, 0x9a, 0x2a, 0x16, 0xf9, 0x3a, 0xeb, 0x0f, 0x45, 0x31, - 0x11, 0xb9, 0xf5, 0xfa, 0xe9, 0x4e, 0x28, 0xd0, 0xa2, 0x25, 0xc3, 0x34, 0x28, 0xbd, 0xb3, 0x14, - 0x74, 0x0c, 0xb1, 0x61, 0xc7, 0xd9, 0x52, 0xa3, 0xe1, 0x51, 0xdf, 0x17, 0x32, 0x91, 0x87, 0xd8, - 0xe0, 0xd9, 0xd7, 0xe6, 0x05, 0x5a, 0x88, 0x8d, 0x42, 0x40, 0xbe, 0x9d, 0x81, 0x33, 0xaa, 0x97, - 0x3e, 0x2e, 0x16, 0xf4, 0xa1, 0xe0, 0x12, 0xf2, 0xf5, 0x6b, 0x72, 0x4f, 0xb8, 0xa6, 0xa0, 0x5d, - 0x7b, 0x78, 0xe3, 0x5a, 0x29, 0xfa, 0x59, 0x93, 0x44, 0x22, 0x3d, 0x55, 0x1a, 0x3f, 0x55, 0xbe, - 0xdb, 0x29, 0xa4, 0xa4, 0xcc, 0xd4, 0x06, 0x36, 0x9f, 0xd0, 0x27, 0xa7, 0xba, 0x81, 0x02, 0x56, - 0x98, 0xf7, 0xc4, 0xec, 0xe3, 0xde, 0x3b, 0x4e, 0x47, 0xd7, 0x0e, 0x14, 0x1a, 0x52, 0x85, 0x29, - 0x0e, 0x60, 0x22, 0x81, 0x3f, 0x77, 0x30, 0x13, 0xa5, 0x5c, 0x16, 0x6c, 0xf0, 0xe2, 0x19, 0x9f, - 0x3c, 0x50, 0x53, 0xc1, 0xc5, 0xe8, 0x50, 0x6f, 0xaf, 0x95, 0xee, 0xaf, 0x46, 0xca, 0xe7, 0xf7, - 0x97, 0x97, 0xbd, 0xf6, 0x6d, 0x7d, 0xbc, 0xec, 0x1f, 0xf0, 0xb8, 0x43, 0xa5, 0x1b, 0xa4, 0xde, - 0xae, 0x81, 0xe3, 0x7a, 0x7b, 0x8c, 0xc6, 0x8c, 0x61, 0x1b, 0x1f, 0x17, 0x62, 0x7c, 0x85, 0x67, - 0x9d, 0x01, 0xc3, 0x5c, 0x2d, 0x57, 0xdf, 0xce, 0xe6, 0x4a, 0xbb, 0x29, 0x4a, 0xc8, 0x79, 0xc8, - 0xd5, 0x6a, 0xeb, 0xa2, 0x93, 0xd1, 0xbf, 0xce, 0xf7, 0x5d, 0x93, 0xc1, 0xd8, 0x08, 0xa1, 0xd3, - 0x9c, 0x92, 0x55, 0x97, 0x49, 0x50, 0x13, 0xa1, 0xac, 0xbf, 0xa5, 0x92, 0x9c, 0x8f, 0xfa, 0x5b, - 0x28, 0xc9, 0x91, 0x6a, 0x5c, 0x86, 0xb9, 0x92, 0xef, 0x53, 0x8f, 0x4d, 0x50, 0xe1, 0x8b, 0xe5, - 0x09, 0x45, 0x4e, 0x6c, 0x14, 0x58, 0xa9, 0x5d, 0xf7, 0xcd, 0x9e, 0x88, 0xe4, 0x0a, 0x14, 0x4a, - 0xdd, 0x86, 0x43, 0xdb, 0x75, 0x2d, 0x65, 0x8e, 0x2d, 0x60, 0x66, 0x58, 0x4a, 0xbe, 0x0c, 0x67, - 0x62, 0x69, 0xa3, 0x44, 0x0f, 0x8c, 0x44, 0xab, 0x59, 0x2a, 0x9a, 0xd1, 0x8d, 0x33, 0xef, 0x92, - 0x74, 0x4a, 0x52, 0x82, 0xe2, 0x32, 0x46, 0x95, 0x54, 0x28, 0x37, 0x7e, 0xbb, 0x1e, 0x8f, 0x94, - 0xe1, 0xc7, 0x02, 0x1e, 0x71, 0x62, 0x35, 0xc2, 0x42, 0x33, 0x81, 0x4e, 0xee, 0xc1, 0x4c, 0x1c, - 0xc6, 0xf6, 0x04, 0x7e, 0x02, 0xc0, 0xb4, 0x8e, 0x09, 0x2e, 0xb8, 0x2b, 0xa4, 0x51, 0x91, 0x1d, - 0x98, 0x8e, 0x3c, 0x2e, 0xf4, 0x73, 0x81, 0x74, 0xcb, 0x0c, 0xcb, 0xe5, 0xd9, 0xe0, 0x59, 0x31, - 0x19, 0x67, 0x22, 0xef, 0x8d, 0xf0, 0x7c, 0x60, 0x26, 0xd9, 0x91, 0x06, 0x4c, 0xd6, 0x9c, 0xbd, - 0xb6, 0xd3, 0xde, 0xbb, 0x47, 0x8f, 0x36, 0x6c, 0xc7, 0x13, 0x0e, 0x72, 0xd2, 0xfd, 0xb5, 0xe4, - 0x1f, 0xb5, 0x5a, 0x34, 0xf0, 0x70, 0xb7, 0x65, 0xe5, 0x18, 0xe4, 0xc9, 0xf4, 0xbd, 0x79, 0x9f, - 0xd3, 0x61, 0x00, 0x55, 0xc7, 0x76, 0xb4, 0x6d, 0x45, 0xe7, 0xa9, 0x9d, 0xcd, 0xc6, 0x07, 0x3c, - 0x9b, 0x35, 0x61, 0x7a, 0xb9, 0x5d, 0xf7, 0x8e, 0xf0, 0x0e, 0x42, 0x36, 0x6e, 0xe2, 0x84, 0xc6, - 0xbd, 0x28, 0x1a, 0xf7, 0x9c, 0x2d, 0x67, 0x58, 0x5a, 0xf3, 0x92, 0x8c, 0x49, 0x0d, 0xa6, 0x51, - 0x81, 0xae, 0x56, 0x36, 0xaa, 0x6d, 0x27, 0x70, 0xf0, 0x85, 0x67, 0xbe, 0x5d, 0xbd, 0x24, 0x78, - 0x5e, 0xe0, 0x3a, 0xb8, 0xd3, 0xe8, 0x58, 0x8e, 0x44, 0x51, 0x99, 0x26, 0xe8, 0xfb, 0x29, 0xc2, - 0x53, 0xff, 0x7c, 0x14, 0x61, 0x7c, 0x03, 0x29, 0x16, 0xfc, 0x5c, 0x8c, 0x64, 0xbb, 0x8f, 0x45, - 0x6c, 0x8b, 0x70, 0xbb, 0xa8, 0x9e, 0x68, 0x6f, 0x20, 0xe9, 0x74, 0xc6, 0xb7, 0x47, 0xb9, 0x6c, - 0x57, 0xf5, 0xd7, 0x5e, 0xae, 0x74, 0x31, 0xbd, 0x36, 0x7b, 0x1a, 0xbd, 0x36, 0x77, 0xb2, 0x5e, - 0x9b, 0x3f, 0x49, 0xaf, 0x8d, 0x29, 0x9e, 0x43, 0xa7, 0x56, 0x3c, 0x87, 0x4f, 0xa1, 0x78, 0x8e, - 0x9c, 0x4a, 0xf1, 0xd4, 0x34, 0xe8, 0xc2, 0x49, 0x1a, 0xf4, 0xbf, 0x54, 0x53, 0x9f, 0x56, 0x35, - 0x35, 0x4d, 0x55, 0x38, 0x95, 0x9a, 0xda, 0x5b, 0xcb, 0x2c, 0xfe, 0x8b, 0xd6, 0x32, 0xa7, 0x9f, - 0x8c, 0x96, 0x49, 0x3e, 0xa1, 0x96, 0xf9, 0x17, 0xa0, 0x18, 0xdf, 0xf8, 0x4e, 0xce, 0x96, 0xf7, - 0xc4, 0x32, 0x3b, 0xb1, 0x6d, 0x39, 0xbe, 0xf1, 0xb0, 0x83, 0xf4, 0x86, 0xe7, 0x3c, 0xb4, 0x03, - 0x7a, 0x4f, 0xba, 0x1e, 0x88, 0x4c, 0x8f, 0x1c, 0x8a, 0xe2, 0x43, 0x41, 0x09, 0x75, 0xae, 0x6c, - 0x9a, 0xce, 0x65, 0xfc, 0x78, 0x16, 0xa6, 0x79, 0x16, 0x96, 0xa7, 0xdf, 0x02, 0xfe, 0xae, 0xa6, - 0x49, 0x4b, 0x47, 0xb7, 0xd8, 0xd7, 0xf5, 0xb1, 0x81, 0x7f, 0x0d, 0xce, 0x24, 0xba, 0x02, 0xb5, - 0xe9, 0x8a, 0xcc, 0x7f, 0x93, 0xd0, 0xa7, 0xe7, 0xd2, 0x2b, 0xd9, 0xba, 0x69, 0x26, 0x28, 0x8c, - 0x7f, 0x9a, 0x4f, 0xf0, 0x17, 0xd6, 0x70, 0xd5, 0xbe, 0x9d, 0x39, 0x9d, 0x7d, 0x3b, 0x3b, 0x98, - 0x7d, 0x3b, 0xb6, 0x4d, 0xe5, 0x06, 0xd9, 0xa6, 0xbe, 0x0c, 0x13, 0x9b, 0xd4, 0x6e, 0xf9, 0x9b, - 0xae, 0x48, 0xe7, 0xce, 0x1d, 0x5d, 0x65, 0x7a, 0x1b, 0x56, 0x26, 0x95, 0xc1, 0xd0, 0x61, 0x27, - 0x60, 0x04, 0x4c, 0xb4, 0xf2, 0xfc, 0xee, 0xa6, 0xce, 0x41, 0xd5, 0xf0, 0x87, 0xfa, 0x68, 0xf8, - 0x35, 0x18, 0x17, 0x74, 0x51, 0x8a, 0xc0, 0x48, 0x15, 0x65, 0x45, 0x08, 0x97, 0xb5, 0x87, 0x0f, - 0xee, 0x85, 0xb5, 0x73, 0x2d, 0x54, 0x63, 0xc2, 0xba, 0x60, 0xb9, 0xdd, 0xe8, 0xb8, 0x4e, 0x1b, - 0xbb, 0x60, 0x24, 0xea, 0x02, 0x2a, 0xc0, 0xbc, 0x0b, 0x14, 0x24, 0xf2, 0x36, 0x4c, 0x96, 0x36, - 0xaa, 0x2a, 0x59, 0x21, 0x32, 0xb1, 0xdb, 0x1d, 0xc7, 0xd2, 0x48, 0x63, 0xb8, 0xfd, 0xb4, 0xb2, - 0xd1, 0x7f, 0x3e, 0x5a, 0x99, 0xf1, 0x0f, 0x47, 0xe5, 0xf2, 0xfe, 0x6c, 0x8d, 0x81, 0xba, 0x79, - 0x2f, 0x77, 0x4a, 0xf3, 0x5e, 0xfe, 0x24, 0xe5, 0x44, 0xd3, 0x98, 0x86, 0x4e, 0xa1, 0x31, 0x0d, - 0x7f, 0x6a, 0x53, 0xdd, 0xc8, 0x29, 0x75, 0xa0, 0xd8, 0x4a, 0x2b, 0x0c, 0xb2, 0xd2, 0x52, 0xf5, - 0xa6, 0xd1, 0x4f, 0xaf, 0x37, 0xc1, 0xa9, 0xf5, 0xa6, 0x5a, 0x14, 0x04, 0x36, 0x76, 0xa2, 0x37, - 0xee, 0x05, 0x71, 0x5e, 0x99, 0x4e, 0x4f, 0xc0, 0x13, 0x86, 0x83, 0x7d, 0x5f, 0x29, 0x63, 0xdf, - 0x48, 0x57, 0xc6, 0xfa, 0xef, 0x36, 0xff, 0x52, 0x1d, 0x7b, 0x22, 0xea, 0x98, 0x87, 0x03, 0xb6, - 0x6d, 0x7b, 0x6d, 0x3c, 0x72, 0x5e, 0x87, 0x11, 0x99, 0xd3, 0x2a, 0x13, 0x59, 0x4f, 0x92, 0xc9, - 0xac, 0x24, 0x16, 0x59, 0x84, 0x82, 0x24, 0x56, 0xf3, 0x73, 0x1f, 0x0a, 0x98, 0x96, 0x2e, 0x48, - 0xc0, 0x8c, 0xbf, 0x93, 0x97, 0x42, 0x81, 0xb5, 0x43, 0xbc, 0xe5, 0xbc, 0xa4, 0x4c, 0x02, 0x45, - 0x19, 0x8c, 0x0d, 0x73, 0xcc, 0x4f, 0x4f, 0x27, 0xf9, 0x44, 0x59, 0xc6, 0xa2, 0x37, 0xa4, 0x72, - 0x03, 0xbc, 0x21, 0xf5, 0xa6, 0xf6, 0x00, 0x53, 0x3e, 0x7a, 0xf1, 0x83, 0x2d, 0x94, 0xfe, 0x4f, - 0x2f, 0xdd, 0x52, 0x5f, 0x4a, 0x1a, 0x8a, 0x12, 0x6e, 0x20, 0x65, 0x9f, 0x37, 0x92, 0x42, 0xed, - 0x76, 0xf8, 0x34, 0xf9, 0xfb, 0x46, 0xfe, 0x85, 0xe6, 0xef, 0x5b, 0x06, 0x50, 0xde, 0xcf, 0xe5, - 0x97, 0x3b, 0x2f, 0xb1, 0x6e, 0x3a, 0xf9, 0xed, 0x5c, 0x85, 0xd0, 0xf8, 0x3d, 0x02, 0xd3, 0xb5, - 0xda, 0x7a, 0xc5, 0xb1, 0xf7, 0xda, 0xae, 0x1f, 0x38, 0xf5, 0x6a, 0x7b, 0xd7, 0x65, 0xaa, 0x5d, - 0x28, 0x60, 0x94, 0x44, 0x6d, 0x91, 0x70, 0x09, 0x8b, 0xd9, 0xd1, 0x61, 0xd9, 0xf3, 0x5c, 0x4f, - 0x3d, 0x3a, 0x50, 0x06, 0x30, 0x39, 0x9c, 0x69, 0x4f, 0xb5, 0x2e, 0x7f, 0x08, 0x95, 0xdf, 0xb7, - 0xa1, 0xf6, 0xe4, 0x73, 0x90, 0x29, 0xcb, 0x08, 0x4d, 0x4e, 0x58, 0xa1, 0x4d, 0x9f, 0xd3, 0xb2, - 0x00, 0x46, 0xc5, 0x5c, 0x7c, 0x8a, 0xed, 0x0d, 0x97, 0x62, 0x07, 0xe1, 0xea, 0xf5, 0x76, 0x62, - 0x0d, 0x1c, 0xc1, 0x19, 0x2d, 0x80, 0x69, 0x50, 0xc3, 0xe1, 0x2b, 0x42, 0x5b, 0x33, 0x30, 0xfa, - 0x35, 0xc5, 0x7a, 0xa8, 0xbe, 0x58, 0x90, 0x5a, 0x03, 0xf9, 0xf1, 0x0c, 0x5c, 0x48, 0x2d, 0x09, - 0x57, 0xf7, 0x98, 0x96, 0x89, 0x51, 0x11, 0x1a, 0xfc, 0x6d, 0x86, 0x5e, 0x55, 0x5b, 0x29, 0xa2, - 0xa0, 0x7f, 0x4d, 0xe4, 0x37, 0x32, 0x70, 0x4e, 0xc3, 0x08, 0xc5, 0xa7, 0x1f, 0x46, 0xea, 0xa6, - 0xce, 0xeb, 0x8f, 0x9e, 0xcc, 0xbc, 0xbe, 0xa4, 0x7f, 0x4b, 0x24, 0xdd, 0xd5, 0x6f, 0xe8, 0xd5, - 0x42, 0xf2, 0x10, 0xa6, 0xb1, 0x48, 0x1a, 0x31, 0xd9, 0x9c, 0x15, 0xb6, 0xcf, 0xd9, 0xa8, 0xd9, - 0x3c, 0x28, 0x0f, 0xdf, 0xd7, 0x5b, 0xfc, 0xde, 0xf1, 0xc2, 0x84, 0x86, 0x2e, 0x73, 0x1b, 0x5a, - 0x91, 0x25, 0xd4, 0x69, 0xef, 0xba, 0xea, 0xd6, 0x9b, 0xa8, 0x82, 0xfc, 0x47, 0x19, 0x98, 0x63, - 0x50, 0xfe, 0x19, 0xb7, 0x3d, 0xb7, 0x15, 0x96, 0x4b, 0x3f, 0x89, 0x1e, 0xdd, 0xd6, 0x7c, 0x32, - 0xdd, 0xf6, 0x12, 0x36, 0x99, 0xcb, 0x04, 0x6b, 0xd7, 0x73, 0x5b, 0x51, 0xf3, 0xb5, 0xf7, 0x61, - 0x7b, 0x35, 0x92, 0xfc, 0x70, 0x06, 0xce, 0x6b, 0x96, 0x17, 0x35, 0x03, 0xb4, 0x08, 0x7d, 0x9c, - 0x09, 0x43, 0x9c, 0xa3, 0xa2, 0xa5, 0x6b, 0x62, 0xfe, 0x5f, 0xc6, 0x16, 0x44, 0xbb, 0x05, 0xb6, - 0xc5, 0x6a, 0x71, 0x2c, 0xa5, 0x09, 0xbd, 0x6b, 0x21, 0x0e, 0x4c, 0xe3, 0x1d, 0xa5, 0xe6, 0xcf, - 0x33, 0xdb, 0xdb, 0x9f, 0x27, 0x7c, 0x07, 0x09, 0xd3, 0xcb, 0xf6, 0x76, 0xea, 0x49, 0x72, 0x25, - 0x7f, 0x11, 0xce, 0x27, 0x80, 0xe1, 0x6a, 0x3b, 0xd3, 0x73, 0xb5, 0xbd, 0xfa, 0xf8, 0x78, 0xe1, - 0xe5, 0xb4, 0xda, 0xd2, 0x56, 0x5a, 0xef, 0x1a, 0x88, 0x0d, 0x10, 0x15, 0x8a, 0x67, 0x66, 0xd3, - 0x27, 0xe8, 0xab, 0x62, 0x7e, 0x28, 0xf8, 0x4c, 0x96, 0x2b, 0x6d, 0x50, 0xb7, 0xbc, 0x08, 0x89, - 0x50, 0x18, 0x57, 0x52, 0xeb, 0x1e, 0xe1, 0x7b, 0xb3, 0x3d, 0x2b, 0xf9, 0xde, 0xf1, 0x82, 0x86, - 0xcd, 0x54, 0x6c, 0x35, 0x67, 0xaf, 0xaa, 0x62, 0x6b, 0x88, 0xe4, 0xd7, 0x32, 0x30, 0xcb, 0x00, - 0xd1, 0xa4, 0x12, 0x1f, 0x35, 0xd7, 0x6f, 0xd6, 0xef, 0x3f, 0x99, 0x59, 0xff, 0x02, 0xb6, 0x51, - 0x9d, 0xf5, 0x89, 0x2e, 0x49, 0x6d, 0x1c, 0xce, 0x76, 0xed, 0x3a, 0x5c, 0x9b, 0xed, 0xe7, 0x07, - 0x98, 0xed, 0x7c, 0x00, 0x4e, 0x9e, 0xed, 0x3d, 0x6b, 0x21, 0x9b, 0x30, 0x2e, 0xb4, 0x6b, 0xde, - 0x61, 0xcf, 0x6b, 0x69, 0x39, 0xd5, 0x22, 0x7e, 0xe4, 0x11, 0x99, 0x87, 0x13, 0x5f, 0xa8, 0x71, - 0x21, 0x6d, 0x98, 0xe1, 0xbf, 0x75, 0x5b, 0xc7, 0x42, 0x4f, 0x5b, 0xc7, 0x15, 0xf1, 0x45, 0x17, - 0x05, 0xff, 0x98, 0xc9, 0x43, 0xcd, 0x8c, 0x90, 0xc2, 0x98, 0x74, 0x80, 0x68, 0x60, 0xbe, 0x68, - 0x2f, 0xf6, 0xb7, 0x70, 0xbc, 0x2c, 0xea, 0x5c, 0x88, 0xd7, 0x19, 0x5f, 0xb9, 0x29, 0xbc, 0x89, - 0x0d, 0x53, 0x02, 0xca, 0xce, 0xd2, 0x28, 0xe1, 0x5f, 0xd0, 0x72, 0x53, 0xc4, 0x4a, 0xb9, 0x62, - 0x2e, 0x6b, 0xc2, 0xdc, 0x21, 0x31, 0x81, 0x1e, 0xe7, 0x47, 0xd6, 0x61, 0xba, 0xd4, 0xe9, 0x34, - 0x1d, 0xda, 0xc0, 0xaf, 0xe4, 0x4f, 0x86, 0x1a, 0xd1, 0x33, 0x11, 0x36, 0x2f, 0x14, 0xa7, 0x85, - 0xf8, 0x7b, 0xa1, 0x49, 0x5a, 0xe3, 0xdb, 0x99, 0x44, 0xa3, 0xc9, 0x6b, 0x30, 0x8a, 0x3f, 0x94, - 0x00, 0x69, 0x34, 0x02, 0xf0, 0x26, 0xa2, 0x31, 0x22, 0x42, 0x60, 0xca, 0x92, 0x9a, 0xf2, 0x28, - 0xc7, 0x95, 0x25, 0x71, 0x52, 0x8d, 0xce, 0xa6, 0x0b, 0xd2, 0xcf, 0x32, 0x17, 0x29, 0x5d, 0xe8, - 0x67, 0x29, 0xbc, 0x2b, 0x8d, 0x1f, 0xce, 0xea, 0xd3, 0x8e, 0x5c, 0x51, 0xf4, 0x76, 0x25, 0xe9, - 0x92, 0xd4, 0xdb, 0x15, 0x6d, 0xfd, 0x6f, 0x67, 0x60, 0x66, 0xdd, 0xdb, 0xb3, 0xdb, 0xce, 0xb7, - 0x78, 0xf2, 0x46, 0x17, 0xc7, 0xa5, 0xff, 0x8b, 0x3b, 0x4f, 0xea, 0xe5, 0x10, 0x57, 0xa9, 0x98, - 0xcd, 0x14, 0x9c, 0x32, 0x66, 0x5a, 0x7b, 0xd0, 0x73, 0x1d, 0x1b, 0xa6, 0x3c, 0xe0, 0xc2, 0xd1, - 0x39, 0xdc, 0xf8, 0xc9, 0x2c, 0x8c, 0x29, 0x4b, 0x80, 0x7c, 0x1e, 0xc6, 0x55, 0x3e, 0xaa, 0x01, - 0x49, 0xad, 0xd6, 0xd4, 0xb0, 0xd0, 0x82, 0x44, 0xed, 0x96, 0x66, 0x41, 0x62, 0x13, 0x1d, 0xa1, - 0xa7, 0x3c, 0xda, 0xbc, 0x97, 0x72, 0xb4, 0x39, 0xd5, 0xdb, 0xb2, 0x6f, 0x27, 0x0f, 0x38, 0x83, - 0x3f, 0x05, 0x6b, 0xfc, 0x4c, 0x06, 0x8a, 0xf1, 0x45, 0xfa, 0x99, 0xf4, 0xca, 0x29, 0x6e, 0x0b, - 0x7e, 0x22, 0x1b, 0xe6, 0xd5, 0x96, 0xf1, 0x38, 0x4f, 0xab, 0x4b, 0xcc, 0x3b, 0x9a, 0x21, 0xff, - 0x59, 0x3d, 0x51, 0x8c, 0x1a, 0xc9, 0x9a, 0x9e, 0x1d, 0x2a, 0xff, 0xdd, 0x5f, 0x5c, 0x78, 0xc6, - 0xf8, 0x00, 0x66, 0xe3, 0xdd, 0x81, 0xc6, 0xfc, 0x12, 0x4c, 0xe9, 0xf0, 0x78, 0x56, 0xfe, 0x38, - 0x95, 0x19, 0xc7, 0x37, 0x7e, 0x3f, 0x1b, 0xe7, 0x2d, 0xdc, 0x63, 0x98, 0xd0, 0x69, 0xdb, 0x3b, - 0xcd, 0x30, 0x2b, 0x37, 0x17, 0x3a, 0x1c, 0x64, 0xca, 0xb2, 0xd3, 0x3c, 0x53, 0x11, 0x46, 0x95, - 0xe4, 0xd2, 0xa3, 0x4a, 0xc8, 0xad, 0x98, 0x8f, 0x99, 0x92, 0x02, 0xe1, 0x90, 0xee, 0x58, 0x91, - 0x9f, 0x59, 0xcc, 0xb5, 0xac, 0x0c, 0xb3, 0x5a, 0x76, 0x4e, 0x49, 0x3f, 0x14, 0xd9, 0x6e, 0x03, - 0x2c, 0xe0, 0xc4, 0xa9, 0xc8, 0x64, 0x05, 0x46, 0x58, 0x33, 0xef, 0xdb, 0x1d, 0x61, 0xa3, 0x27, - 0x61, 0x8c, 0x59, 0x33, 0x3c, 0xf0, 0x29, 0x61, 0x66, 0x4d, 0xca, 0xb6, 0x7c, 0xed, 0x69, 0x66, - 0x8e, 0x68, 0xfc, 0x69, 0x86, 0xad, 0xff, 0xfa, 0xc1, 0xf7, 0xd9, 0x5b, 0x17, 0xec, 0x93, 0xfa, - 0x78, 0x6f, 0xfd, 0x51, 0x96, 0x27, 0x56, 0x17, 0xd3, 0xe7, 0x4d, 0x18, 0xde, 0xb4, 0xbd, 0x3d, - 0x1a, 0x88, 0x94, 0xe3, 0x2a, 0x17, 0x5e, 0x10, 0x25, 0x68, 0x08, 0xf0, 0xb7, 0x29, 0x08, 0x54, - 0x5b, 0x58, 0x76, 0x20, 0x5b, 0x98, 0x62, 0xe9, 0xcd, 0x3d, 0x31, 0x4b, 0xef, 0x0f, 0x84, 0x39, - 0xd4, 0x4b, 0xc1, 0x00, 0xc9, 0x1f, 0x2f, 0xc6, 0xdf, 0x20, 0x48, 0xa4, 0xe9, 0x8c, 0xd8, 0x91, - 0x5b, 0xea, 0xab, 0x06, 0x4a, 0xa0, 0xc6, 0x09, 0xef, 0x17, 0x18, 0x7f, 0x94, 0xe3, 0x7d, 0x2c, - 0x3a, 0xea, 0xb2, 0x16, 0xc4, 0x85, 0xeb, 0x84, 0x09, 0x7a, 0x35, 0x9e, 0x16, 0x1d, 0x3b, 0x2e, - 0x43, 0x9e, 0xcd, 0x4d, 0xd1, 0x9b, 0x88, 0xc7, 0xe6, 0xaf, 0x8a, 0xc7, 0xca, 0xd9, 0x5a, 0xc6, - 0x3d, 0x49, 0x7d, 0x47, 0x06, 0xb7, 0x2d, 0x75, 0x2d, 0x23, 0x06, 0xb9, 0x02, 0xf9, 0x35, 0xb7, - 0x21, 0x93, 0x8c, 0xce, 0x62, 0x28, 0xaf, 0xdb, 0x50, 0x58, 0xce, 0x65, 0x4c, 0xc4, 0x60, 0xdf, - 0x1a, 0xa6, 0x25, 0x57, 0xbf, 0xb5, 0xb5, 0x6b, 0x8b, 0x4c, 0x58, 0xea, 0xb7, 0x46, 0x19, 0xcc, - 0x97, 0x61, 0x52, 0x7f, 0x49, 0x52, 0xf8, 0xb6, 0xa1, 0xc5, 0x36, 0xf6, 0x20, 0xa5, 0x6a, 0x68, - 0xd7, 0x89, 0xc8, 0x12, 0x4c, 0x68, 0xc9, 0xcd, 0xc4, 0x65, 0x19, 0x9a, 0x37, 0xf5, 0xd4, 0x68, - 0xaa, 0x79, 0x53, 0x23, 0x61, 0xfb, 0xb9, 0x68, 0xbf, 0x72, 0x65, 0x96, 0x68, 0xbb, 0xc0, 0x21, - 0x37, 0xa1, 0xc0, 0x63, 0x66, 0xab, 0x15, 0xf5, 0xe2, 0xc3, 0x47, 0x58, 0x2c, 0xe6, 0x5c, 0x22, - 0x2a, 0x31, 0x92, 0x9f, 0x83, 0xa2, 0x10, 0x49, 0xd1, 0x9b, 0x8d, 0xcf, 0x41, 0xbe, 0x5c, 0xad, - 0x98, 0xaa, 0x18, 0xa9, 0x3b, 0x0d, 0xcf, 0x44, 0xa8, 0xf1, 0x9d, 0x0c, 0x9c, 0x5f, 0xa3, 0xc1, - 0xa1, 0xeb, 0x1d, 0x98, 0xd4, 0x0f, 0x3c, 0x87, 0x3f, 0x43, 0x84, 0x0b, 0xf1, 0xf3, 0xe4, 0x6d, - 0x18, 0x42, 0x27, 0xab, 0xd8, 0xce, 0x10, 0xaf, 0x63, 0x69, 0x42, 0x4c, 0xe0, 0x21, 0xf4, 0xd8, - 0x32, 0x39, 0x11, 0x79, 0x13, 0xf2, 0x15, 0xda, 0x3e, 0x8a, 0x3d, 0xc4, 0x92, 0x20, 0x0e, 0x05, - 0x42, 0x83, 0xb6, 0x8f, 0x4c, 0x24, 0x31, 0x7e, 0x26, 0x0b, 0x67, 0x52, 0x9a, 0xb5, 0xf5, 0xf9, - 0xa7, 0x54, 0x2a, 0x2e, 0x69, 0x52, 0x51, 0xde, 0x77, 0xf6, 0xec, 0xf8, 0x54, 0x21, 0xf9, 0xf3, - 0x19, 0x38, 0xa7, 0x4f, 0x50, 0xe1, 0x55, 0xb9, 0x75, 0x93, 0xbc, 0x05, 0xc3, 0x2b, 0xd4, 0x6e, - 0x50, 0xf9, 0x48, 0xc3, 0x99, 0x30, 0xbb, 0x0d, 0x0f, 0x08, 0xe4, 0x85, 0x9c, 0x6d, 0x14, 0x3e, - 0xc2, 0xa1, 0xa4, 0x22, 0x1a, 0xc7, 0xf5, 0x71, 0x43, 0x06, 0xe7, 0xa6, 0x55, 0xd5, 0xc7, 0x6b, - 0xe0, 0x7b, 0x19, 0x78, 0xb6, 0x0f, 0x0d, 0x1b, 0x38, 0x36, 0xf4, 0xea, 0xc0, 0xe1, 0x8e, 0x8a, - 0x50, 0xf2, 0x2e, 0x4c, 0x6d, 0x0a, 0x7d, 0x5e, 0x0e, 0x47, 0x36, 0x5a, 0x2f, 0x52, 0xd5, 0xb7, - 0xe4, 0xb8, 0xc4, 0x91, 0xb5, 0xa8, 0xf1, 0x5c, 0xdf, 0xa8, 0x71, 0x35, 0x08, 0x3b, 0x3f, 0x68, - 0x10, 0xf6, 0x07, 0xf1, 0xf7, 0xd7, 0x45, 0x2e, 0xbc, 0x28, 0x04, 0x3d, 0xd3, 0x3b, 0x04, 0xbd, - 0x6f, 0xc6, 0x2d, 0xe3, 0x27, 0x33, 0x50, 0xd4, 0x79, 0x7f, 0xda, 0xf1, 0x7c, 0x47, 0x1b, 0xcf, - 0x67, 0xd3, 0xc7, 0xb3, 0xf7, 0x40, 0xfe, 0xaf, 0x99, 0xf8, 0xc7, 0x0e, 0x34, 0x82, 0x06, 0x0c, - 0x57, 0xdc, 0x96, 0xed, 0xb4, 0xd5, 0x27, 0x40, 0x1b, 0x08, 0x31, 0x45, 0xc9, 0x60, 0x11, 0xfb, - 0x17, 0x61, 0x68, 0xcd, 0x6d, 0x97, 0x2a, 0xc2, 0xe9, 0x10, 0xf9, 0xb4, 0xdd, 0xb6, 0x65, 0x37, - 0x4c, 0x5e, 0x40, 0x56, 0x01, 0x6a, 0x75, 0x8f, 0xd2, 0x76, 0xcd, 0xf9, 0x16, 0x8d, 0x69, 0x1a, - 0xac, 0x87, 0x9a, 0x5d, 0x14, 0x2c, 0x78, 0xc7, 0xe3, 0x23, 0xa2, 0xe5, 0x3b, 0xdf, 0x52, 0xe5, - 0xad, 0x42, 0x6f, 0x50, 0x80, 0x88, 0x08, 0xdf, 0x43, 0x73, 0x1a, 0xe2, 0x8d, 0xdb, 0x09, 0xf1, - 0x1e, 0x1a, 0x03, 0x68, 0xef, 0xa1, 0x31, 0x00, 0x13, 0xed, 0x2b, 0xd4, 0xd9, 0xdb, 0xe7, 0xde, - 0x27, 0x13, 0x7c, 0xaa, 0xee, 0x23, 0x44, 0x15, 0xed, 0x1c, 0xc7, 0xf8, 0xf1, 0x21, 0x38, 0x6f, - 0xd2, 0x3d, 0x87, 0xa9, 0xc9, 0x0f, 0x7c, 0xa7, 0xbd, 0xa7, 0xc5, 0x54, 0x1b, 0xb1, 0x89, 0x24, - 0xd2, 0x09, 0x33, 0x48, 0xd8, 0x31, 0x57, 0xa1, 0xc0, 0x76, 0x45, 0x65, 0x2e, 0xe1, 0x1d, 0x0a, - 0x3e, 0xe0, 0xcd, 0x27, 0xb9, 0x2c, 0x26, 0xaf, 0x88, 0x5d, 0x5b, 0x49, 0xf8, 0xce, 0x76, 0xed, - 0x8f, 0x8f, 0x17, 0xa0, 0x76, 0xe4, 0x07, 0x14, 0x4f, 0x6c, 0x62, 0xe7, 0x0e, 0x55, 0xeb, 0x7c, - 0x0f, 0xd5, 0xfa, 0x3e, 0xcc, 0x96, 0x1a, 0x5c, 0x58, 0xdb, 0xcd, 0x0d, 0xcf, 0x69, 0xd7, 0x9d, - 0x8e, 0xdd, 0x94, 0xc7, 0x45, 0xec, 0x65, 0x3b, 0x2c, 0xb7, 0x3a, 0x21, 0x82, 0x99, 0x4a, 0xc6, - 0x3e, 0xa3, 0xb2, 0x56, 0xc3, 0xd0, 0x63, 0x71, 0x3d, 0x86, 0x9f, 0xd1, 0x68, 0xfb, 0xf8, 0x15, - 0xbe, 0x19, 0x16, 0xa3, 0x52, 0x8f, 0xee, 0x0c, 0x9b, 0xab, 0xb5, 0x28, 0x3a, 0x89, 0xe7, 0xa3, - 0xe5, 0x2e, 0x0f, 0x41, 0xd3, 0x47, 0xb7, 0x07, 0x0d, 0x2f, 0xa2, 0xab, 0xd5, 0x56, 0x18, 0x5d, - 0x21, 0x41, 0xe7, 0xfb, 0xfb, 0x2a, 0x1d, 0xc7, 0x23, 0xd7, 0xd9, 0x54, 0x68, 0xb9, 0x01, 0xc5, - 0x79, 0x3e, 0x1a, 0x1d, 0x01, 0x3c, 0x84, 0xf2, 0x23, 0x80, 0x82, 0x42, 0xde, 0x86, 0x99, 0xe5, - 0xf2, 0xa2, 0x34, 0x6a, 0x56, 0xdc, 0x7a, 0x17, 0x2f, 0xa8, 0x01, 0xeb, 0xc3, 0x31, 0xa4, 0xf5, - 0x45, 0x36, 0xb9, 0xd3, 0xd0, 0xc8, 0x65, 0x18, 0xa9, 0x56, 0x78, 0xdf, 0x8f, 0xa9, 0x8f, 0x2e, - 0x08, 0xc7, 0x0f, 0x59, 0x48, 0xd6, 0x23, 0x1d, 0x75, 0xfc, 0x44, 0x65, 0xf2, 0xfc, 0xc9, 0xfa, - 0xa9, 0x78, 0x9b, 0x81, 0xbf, 0x01, 0x54, 0x76, 0x1b, 0xd4, 0xdf, 0xba, 0xf1, 0x7d, 0xf6, 0x36, - 0x83, 0xf2, 0x6d, 0x28, 0xbd, 0x6e, 0xa4, 0x8a, 0xba, 0x7f, 0x1d, 0xdf, 0x66, 0x48, 0xe0, 0x92, - 0x2f, 0xc2, 0x10, 0xfe, 0x14, 0x7a, 0xcf, 0x4c, 0x0a, 0xdb, 0x48, 0xe7, 0xa9, 0xf3, 0x27, 0x7c, - 0x91, 0x80, 0x54, 0x61, 0x44, 0xa8, 0xdc, 0xa7, 0xc9, 0x30, 0x2e, 0x74, 0x77, 0x3e, 0x48, 0x82, - 0xde, 0x68, 0xc0, 0xb8, 0x5a, 0x21, 0x9b, 0x9c, 0x2b, 0xb6, 0xbf, 0x4f, 0x1b, 0xec, 0x97, 0x78, - 0x1c, 0x04, 0x27, 0xe7, 0x3e, 0x42, 0x2d, 0xd6, 0x0e, 0x53, 0x41, 0x61, 0xd2, 0xb6, 0xea, 0x3f, - 0xf0, 0x45, 0x53, 0xc4, 0x21, 0xdc, 0x41, 0x83, 0x4e, 0xc3, 0x14, 0x45, 0xc6, 0x0f, 0xc0, 0xec, - 0x5a, 0xb7, 0xd9, 0x64, 0x07, 0x72, 0x99, 0x3c, 0x3a, 0xb0, 0x03, 0x4a, 0x96, 0x60, 0xa8, 0xa6, - 0x3c, 0x0a, 0x38, 0x13, 0x66, 0xe7, 0x8e, 0x70, 0xd0, 0xdd, 0x2d, 0x83, 0x11, 0xd9, 0xb1, 0xe7, - 0x00, 0x39, 0xa9, 0xf1, 0xbb, 0xd1, 0x63, 0xd2, 0x9b, 0x9e, 0x5d, 0x3f, 0x08, 0x1f, 0x86, 0x1c, - 0xf4, 0x5d, 0xec, 0xbb, 0xb2, 0x11, 0xfa, 0x56, 0x96, 0xd6, 0xe0, 0x93, 0x1a, 0x43, 0xde, 0x86, - 0x31, 0xb1, 0x9d, 0x29, 0x79, 0x84, 0x30, 0x59, 0x83, 0x7c, 0x99, 0x3e, 0xe6, 0x6e, 0xa0, 0xa2, - 0xe3, 0x2e, 0xad, 0x7f, 0xca, 0xd6, 0x8d, 0xcf, 0x62, 0x97, 0xd6, 0xeb, 0xe8, 0x33, 0x75, 0xff, - 0xc1, 0x58, 0xbc, 0x6f, 0xc5, 0xdc, 0xbd, 0xa5, 0x66, 0x0e, 0xc9, 0x44, 0x67, 0xa6, 0x28, 0x73, - 0x88, 0x7a, 0x66, 0x0a, 0x51, 0xc3, 0x31, 0xc9, 0x9e, 0x30, 0x26, 0xef, 0xca, 0x31, 0xc9, 0xf5, - 0x9e, 0x18, 0x33, 0x7d, 0xc6, 0xa1, 0x16, 0xad, 0x90, 0xfc, 0x40, 0x07, 0xee, 0x67, 0x30, 0x45, - 0x2a, 0x27, 0x89, 0x0b, 0x34, 0xc1, 0x49, 0x3d, 0xc5, 0x0f, 0x0d, 0xce, 0xf4, 0x84, 0x53, 0xfc, - 0x97, 0x60, 0xbc, 0x14, 0x04, 0x76, 0x7d, 0x9f, 0x36, 0x2a, 0x4c, 0x3c, 0x29, 0x49, 0x0e, 0x6c, - 0x01, 0x57, 0xaf, 0x53, 0x54, 0x5c, 0x9e, 0xb4, 0xcb, 0xf6, 0x85, 0xe3, 0x5c, 0x98, 0xb4, 0x8b, - 0x41, 0xf4, 0xa4, 0x5d, 0x0c, 0x42, 0xae, 0xc3, 0x48, 0xb5, 0xfd, 0xd0, 0x61, 0x7d, 0x52, 0x50, - 0x9e, 0xbf, 0xe7, 0x20, 0x55, 0xb8, 0x0a, 0x2c, 0xf2, 0xa6, 0xa2, 0xee, 0x8e, 0x46, 0x47, 0x5b, - 0x6e, 0x0c, 0x09, 0xe3, 0xa3, 0x55, 0x55, 0x36, 0xd4, 0x7f, 0x6f, 0xc1, 0x88, 0xb4, 0x71, 0x41, - 0x74, 0x9c, 0x15, 0x94, 0xc9, 0x40, 0x4c, 0x89, 0x8c, 0x6f, 0x09, 0x2a, 0x8f, 0x9c, 0x8c, 0x29, - 0x6f, 0x09, 0x2a, 0x8f, 0x9c, 0x68, 0x6f, 0x09, 0x2a, 0xcf, 0x9d, 0x84, 0xe6, 0x81, 0xf1, 0x13, - 0xcd, 0x03, 0x5b, 0x30, 0xbe, 0x61, 0x7b, 0x81, 0xc3, 0xd4, 0x85, 0x76, 0xe0, 0xcf, 0x4d, 0x68, - 0x16, 0x35, 0xa5, 0x68, 0xe9, 0x79, 0xf9, 0xfc, 0x5d, 0x47, 0xc1, 0xd7, 0xdf, 0x69, 0x8b, 0xe0, - 0xe9, 0x6e, 0x73, 0x93, 0x9f, 0xc6, 0x6d, 0x0e, 0x3b, 0x15, 0xad, 0x28, 0x53, 0xd1, 0x59, 0x1d, - 0xd5, 0xd9, 0x98, 0x29, 0x25, 0x44, 0x24, 0x5f, 0x85, 0x71, 0xf6, 0x37, 0xbe, 0x38, 0xef, 0x50, - 0x7f, 0xae, 0x88, 0x1f, 0xf7, 0x7c, 0xea, 0xea, 0xe7, 0xcf, 0xd2, 0xd7, 0x68, 0xc0, 0x17, 0x30, - 0x32, 0x8e, 0x9b, 0x47, 0x35, 0x6e, 0xe4, 0x3d, 0x18, 0x67, 0xb3, 0x6f, 0xc7, 0xf6, 0xb9, 0x96, - 0x38, 0x1d, 0x39, 0x3e, 0x36, 0x04, 0x3c, 0x91, 0x37, 0x4f, 0x25, 0x60, 0xdb, 0x7c, 0xa9, 0xc3, - 0x05, 0x24, 0x51, 0x66, 0x7b, 0x27, 0x21, 0x1c, 0x25, 0x1a, 0x79, 0x1f, 0xc6, 0x4b, 0x9d, 0x4e, - 0x24, 0x71, 0x66, 0x14, 0x13, 0x49, 0xa7, 0x63, 0xa5, 0x4a, 0x1d, 0x8d, 0x22, 0x2e, 0x98, 0x67, - 0x4f, 0x25, 0x98, 0xc9, 0xeb, 0xa1, 0xe2, 0x7c, 0x26, 0xb2, 0xf7, 0x89, 0x23, 0x85, 0xa6, 0x85, - 0x73, 0x1d, 0xba, 0x0c, 0x13, 0xdc, 0x00, 0x26, 0xb5, 0x99, 0xb3, 0x89, 0xd5, 0x93, 0xa2, 0xd4, - 0xe8, 0x34, 0x64, 0x19, 0x26, 0x79, 0xcc, 0x59, 0x53, 0x24, 0x34, 0x9c, 0x3b, 0x17, 0xbd, 0x6b, - 0xcc, 0x43, 0xd5, 0x9a, 0x98, 0xe7, 0xda, 0xd6, 0xb8, 0xc4, 0x88, 0x8c, 0x3f, 0xce, 0xc0, 0xb9, - 0x1e, 0x23, 0x1e, 0xa6, 0xbb, 0xcb, 0xf4, 0x4f, 0x77, 0xc7, 0x24, 0x87, 0x7e, 0x5e, 0xc6, 0xef, - 0x17, 0x5a, 0x96, 0x3a, 0x5e, 0x52, 0xdf, 0x72, 0x81, 0x88, 0xc4, 0xf0, 0xa2, 0xea, 0xbb, 0x2e, - 0x1a, 0xed, 0x72, 0xc9, 0x4d, 0x48, 0xe0, 0xf1, 0x46, 0x2d, 0x19, 0x8f, 0x8f, 0x17, 0x9e, 0x17, - 0x79, 0xe7, 0xc3, 0x61, 0xfd, 0xc8, 0xd5, 0x56, 0x70, 0x0a, 0x6b, 0xe3, 0x38, 0x03, 0x63, 0xca, - 0x3a, 0x24, 0x17, 0x95, 0x08, 0xb6, 0x22, 0x7f, 0xb9, 0x40, 0xe1, 0x90, 0xe5, 0x3b, 0x11, 0x2e, - 0xaa, 0xec, 0xc9, 0xa6, 0xc9, 0xfb, 0x4c, 0x15, 0x52, 0x52, 0x02, 0xb6, 0x34, 0x3b, 0xa2, 0x89, - 0xe5, 0xf8, 0x6a, 0xa7, 0xed, 0x07, 0xa5, 0x7a, 0xe0, 0x3c, 0xa4, 0x03, 0x6c, 0x3a, 0xd1, 0xab, - 0x9d, 0xb6, 0x1f, 0x58, 0x36, 0x92, 0x25, 0x5e, 0xed, 0x0c, 0x19, 0x1a, 0x3f, 0x92, 0x01, 0x78, - 0x50, 0x2d, 0x63, 0x4e, 0xcf, 0x4f, 0xab, 0x14, 0xa4, 0xe7, 0x49, 0x93, 0xdc, 0xfb, 0xa8, 0x03, - 0xff, 0x4d, 0x06, 0x26, 0x75, 0x34, 0xf2, 0x2e, 0x4c, 0xd5, 0xea, 0x9e, 0xdb, 0x6c, 0xee, 0xd8, - 0xf5, 0x83, 0x55, 0xa7, 0x4d, 0x79, 0x86, 0xaa, 0x21, 0xbe, 0x17, 0xf9, 0x61, 0x91, 0xd5, 0x64, - 0x65, 0x66, 0x1c, 0x99, 0xfc, 0x68, 0x06, 0x26, 0x6a, 0xfb, 0xee, 0x61, 0xf4, 0x98, 0x3a, 0x1f, - 0x90, 0xaf, 0xb1, 0xb5, 0xed, 0xef, 0xbb, 0x87, 0x56, 0xca, 0x8b, 0xea, 0x1f, 0x1f, 0x2f, 0xbc, - 0x33, 0xd8, 0x8d, 0x6d, 0xdd, 0x6d, 0xfb, 0x01, 0x13, 0xcc, 0xd7, 0xb4, 0x4a, 0x4c, 0xbd, 0x4e, - 0xe3, 0xcf, 0x32, 0x30, 0x56, 0x65, 0x98, 0xcd, 0x26, 0xea, 0x5c, 0xdf, 0x4f, 0x6f, 0xe8, 0x84, - 0xdf, 0xd5, 0x67, 0x60, 0xdf, 0x80, 0xa9, 0x18, 0x1a, 0x31, 0x60, 0xb8, 0x86, 0x51, 0xcb, 0xaa, - 0xad, 0x80, 0xc7, 0x31, 0x9b, 0xa2, 0xc4, 0x58, 0x56, 0xc8, 0xb6, 0x6e, 0xe0, 0x85, 0xdf, 0x22, - 0x80, 0x23, 0x41, 0xf2, 0x64, 0x43, 0xe2, 0x2d, 0xd9, 0xba, 0x61, 0x2a, 0x58, 0xc6, 0x1a, 0x0c, - 0xd7, 0x5c, 0x2f, 0x58, 0x3a, 0xe2, 0x87, 0x89, 0x0a, 0xf5, 0xeb, 0xea, 0x8d, 0x9e, 0x83, 0x56, - 0xf4, 0xba, 0x29, 0x8a, 0xc8, 0x02, 0x0c, 0xdd, 0x76, 0x68, 0xb3, 0xa1, 0xba, 0x6e, 0xee, 0x32, - 0x80, 0xc9, 0xe1, 0xec, 0xc0, 0x75, 0x36, 0x4a, 0x7d, 0x1d, 0xf9, 0x88, 0x7e, 0xda, 0x75, 0x53, - 0xd6, 0xfa, 0xf7, 0x05, 0xfd, 0x89, 0x5a, 0xad, 0xa6, 0x3e, 0x5d, 0xfd, 0xef, 0x65, 0x60, 0xbe, - 0x37, 0x89, 0xea, 0x76, 0x9a, 0xe9, 0xe3, 0x76, 0xfa, 0x52, 0xfc, 0x06, 0x0a, 0xd1, 0xc4, 0x0d, - 0x54, 0x74, 0xef, 0x54, 0x41, 0xaf, 0xdf, 0x7a, 0xf8, 0x82, 0xf8, 0xc5, 0x3e, 0x6d, 0x46, 0x44, - 0x3e, 0xcc, 0x01, 0xd2, 0x98, 0x82, 0xd6, 0xf8, 0xcd, 0x3c, 0x9c, 0xef, 0x49, 0x41, 0x56, 0x94, - 0x2c, 0xfa, 0x93, 0x61, 0xfe, 0xee, 0x9e, 0xf8, 0xd7, 0xf0, 0x5f, 0x74, 0xec, 0x8a, 0xc7, 0xb5, - 0xac, 0x87, 0xd9, 0xd3, 0xb3, 0xc8, 0xeb, 0xd5, 0x13, 0x79, 0x71, 0x74, 0x64, 0x06, 0xc9, 0x44, - 0xea, 0x18, 0x01, 0x45, 0x03, 0xdb, 0x69, 0xfa, 0xea, 0xb2, 0x6b, 0x70, 0x90, 0x29, 0xcb, 0x22, - 0x5f, 0xe0, 0x7c, 0xba, 0x2f, 0xb0, 0xf1, 0xff, 0x64, 0x60, 0x34, 0x6c, 0x36, 0x99, 0x87, 0xb3, - 0x9b, 0x66, 0xa9, 0xbc, 0x6c, 0x6d, 0x7e, 0xb0, 0xb1, 0x6c, 0x3d, 0x58, 0xab, 0x6d, 0x2c, 0x97, - 0xab, 0xb7, 0xab, 0xcb, 0x95, 0xe2, 0x33, 0x64, 0x1a, 0x26, 0x1e, 0xac, 0xdd, 0x5b, 0x5b, 0xdf, - 0x5e, 0xb3, 0x96, 0x4d, 0x73, 0xdd, 0x2c, 0x66, 0xc8, 0x04, 0x8c, 0x9a, 0x4b, 0xa5, 0xb2, 0xb5, - 0xb6, 0x5e, 0x59, 0x2e, 0x66, 0x49, 0x11, 0xc6, 0xcb, 0xeb, 0x6b, 0x6b, 0xcb, 0xe5, 0xcd, 0xea, - 0x56, 0x75, 0xf3, 0x83, 0x62, 0x8e, 0x10, 0x98, 0x44, 0x84, 0x0d, 0xb3, 0xba, 0x56, 0xae, 0x6e, - 0x94, 0x56, 0x8b, 0x79, 0x06, 0x63, 0xf8, 0x0a, 0x6c, 0x28, 0x64, 0x74, 0xef, 0xc1, 0xd2, 0x72, - 0x71, 0x98, 0xa1, 0xb0, 0xbf, 0x14, 0x94, 0x11, 0x56, 0x3d, 0xa2, 0x54, 0x4a, 0x9b, 0xa5, 0xa5, - 0x52, 0x6d, 0xb9, 0x58, 0x20, 0xe7, 0x60, 0x46, 0x03, 0x59, 0xab, 0xeb, 0x77, 0xaa, 0x6b, 0xc5, - 0x51, 0x32, 0x0b, 0xc5, 0x10, 0x56, 0x59, 0xb2, 0x1e, 0xd4, 0x96, 0xcd, 0x22, 0xc4, 0xa1, 0x6b, - 0xa5, 0xfb, 0xcb, 0xc5, 0x31, 0xe3, 0x1d, 0x1e, 0x71, 0xc4, 0xbb, 0x9a, 0x9c, 0x05, 0x52, 0xdb, - 0x2c, 0x6d, 0x3e, 0xa8, 0xc5, 0x3e, 0x7e, 0x0c, 0x46, 0x6a, 0x0f, 0xca, 0xe5, 0xe5, 0x5a, 0xad, - 0x98, 0x21, 0x00, 0xc3, 0xb7, 0x4b, 0xd5, 0xd5, 0xe5, 0x4a, 0x31, 0x6b, 0xfc, 0x74, 0x06, 0xa6, - 0xa5, 0x06, 0x28, 0xaf, 0x13, 0x3e, 0xe5, 0x5a, 0x7c, 0x57, 0x3b, 0xd8, 0xca, 0x80, 0x90, 0x58, - 0x25, 0x7d, 0x96, 0xa1, 0x07, 0x67, 0x52, 0x91, 0xc9, 0x07, 0x50, 0x94, 0x0d, 0xb8, 0x6f, 0x07, - 0xf5, 0xfd, 0x48, 0x8c, 0x3d, 0x1f, 0xab, 0x24, 0x86, 0xc6, 0x0d, 0x8c, 0xd1, 0x23, 0x7d, 0x09, - 0x36, 0xc6, 0x77, 0x33, 0x70, 0xae, 0x07, 0x31, 0x29, 0xc3, 0x70, 0x98, 0x54, 0xbc, 0x8f, 0xc3, - 0xd2, 0xec, 0xf7, 0x8e, 0x17, 0x04, 0x22, 0xbe, 0x55, 0x86, 0x7f, 0x99, 0xc3, 0x61, 0x96, 0x70, - 0x4c, 0xd5, 0xcd, 0xfb, 0xe4, 0x7c, 0xac, 0x3b, 0x45, 0x4d, 0xa5, 0xed, 0xda, 0xd2, 0x98, 0xe8, - 0x90, 0x9c, 0x7d, 0xe8, 0x63, 0xae, 0x6e, 0xe3, 0x3b, 0x19, 0xa6, 0xb1, 0xc5, 0x11, 0x99, 0x22, - 0x5b, 0xf2, 0xfd, 0x6e, 0x8b, 0x9a, 0x6e, 0x93, 0x96, 0xcc, 0x35, 0xb1, 0x17, 0xa0, 0x0a, 0x6a, - 0x63, 0x01, 0x9e, 0x15, 0x2c, 0xdb, 0x6b, 0x6b, 0x97, 0x93, 0x2a, 0x0d, 0x79, 0x13, 0x20, 0x7c, - 0x33, 0x5e, 0x26, 0x0d, 0xe0, 0x49, 0x33, 0x04, 0x54, 0x57, 0xa2, 0x15, 0x64, 0xe3, 0xaf, 0x64, - 0x60, 0x5c, 0x9c, 0x84, 0x4a, 0x4d, 0xea, 0x05, 0x9f, 0x6e, 0xce, 0xbc, 0xa9, 0xcd, 0x99, 0xd0, - 0x3f, 0x5f, 0xe1, 0xcf, 0x8a, 0x53, 0xa7, 0xcb, 0x7f, 0x96, 0x81, 0x62, 0x1c, 0x91, 0xbc, 0x0b, - 0x85, 0x1a, 0x7d, 0x48, 0x3d, 0x27, 0x38, 0x12, 0xd2, 0x4f, 0x3e, 0xbf, 0xc2, 0x71, 0x44, 0x19, - 0x37, 0xb8, 0xfa, 0xe2, 0x97, 0x19, 0xd2, 0x0c, 0x2a, 0xc4, 0x15, 0x5b, 0x46, 0xee, 0x49, 0xd9, - 0x32, 0x8c, 0xff, 0x31, 0x0b, 0xe7, 0xee, 0xd0, 0x40, 0xfd, 0xa6, 0xf0, 0x36, 0xf9, 0x73, 0x83, - 0x7d, 0x97, 0xf2, 0x25, 0x73, 0x30, 0x82, 0x45, 0x72, 0x7c, 0x4d, 0xf9, 0x93, 0x2c, 0x85, 0xf3, - 0x3a, 0xa7, 0xbd, 0xef, 0xd0, 0xa3, 0xee, 0x6b, 0x4a, 0xc6, 0xf7, 0x70, 0x5a, 0x5f, 0x86, 0x49, - 0x4c, 0x69, 0xda, 0x65, 0xcb, 0x81, 0x36, 0x84, 0x4d, 0xa7, 0x60, 0xc6, 0xa0, 0xe4, 0x15, 0x28, - 0x32, 0x48, 0xa9, 0x7e, 0xd0, 0x76, 0x0f, 0x9b, 0xb4, 0xb1, 0x47, 0xf9, 0x23, 0xdf, 0x05, 0x33, - 0x01, 0x97, 0x3c, 0x1f, 0xb4, 0xf9, 0x79, 0x8c, 0x36, 0xd0, 0xf0, 0x22, 0x78, 0x46, 0xd0, 0xf9, - 0x37, 0x61, 0xec, 0x13, 0xbe, 0xde, 0x60, 0xfc, 0x0f, 0x19, 0x98, 0xc5, 0x8f, 0x53, 0x2a, 0x46, - 0x8b, 0xfc, 0xe7, 0xa2, 0xde, 0x52, 0x12, 0x9a, 0xdb, 0x0c, 0xa4, 0x2f, 0x85, 0xb0, 0x17, 0x23, - 0x43, 0x4f, 0x76, 0x00, 0x43, 0x4f, 0xed, 0x34, 0x6f, 0x82, 0x0e, 0x68, 0xa7, 0xe2, 0x2f, 0xb9, - 0x47, 0x43, 0x6e, 0xfc, 0x68, 0x16, 0x46, 0x4c, 0x8a, 0x8f, 0x25, 0x92, 0xcb, 0x30, 0xb2, 0xe6, - 0x06, 0xd4, 0xbf, 0xaf, 0xbd, 0x8c, 0xd9, 0x66, 0x20, 0xab, 0xd5, 0x30, 0x65, 0x21, 0x9b, 0xf0, - 0x1b, 0x9e, 0xdb, 0xe8, 0xd6, 0x03, 0x75, 0xc2, 0x77, 0x38, 0xc8, 0x94, 0x65, 0xe4, 0x35, 0x18, - 0x15, 0x9c, 0xc3, 0x3b, 0x3c, 0xf4, 0x3d, 0xf5, 0x68, 0xf8, 0xd8, 0x66, 0x84, 0x80, 0x8a, 0x2a, - 0xd7, 0x1a, 0xf2, 0x8a, 0xa2, 0x9a, 0x50, 0x04, 0xa4, 0xfe, 0x3d, 0xd4, 0x47, 0xff, 0xfe, 0x1c, - 0x0c, 0x97, 0x7c, 0x9f, 0x06, 0x32, 0x08, 0x7a, 0x3c, 0xcc, 0x48, 0xe3, 0xd3, 0x80, 0x33, 0xb6, - 0xb1, 0xdc, 0x14, 0x78, 0xc6, 0x9f, 0x66, 0x61, 0x08, 0xff, 0xc4, 0x7b, 0x4b, 0xaf, 0xbe, 0xaf, - 0xdd, 0x5b, 0x7a, 0xf5, 0x7d, 0x13, 0xa1, 0xe4, 0x06, 0x9a, 0x1f, 0x64, 0xee, 0x7d, 0xf1, 0xf5, - 0x68, 0x57, 0x6f, 0x44, 0x60, 0x53, 0xc5, 0x09, 0x2f, 0x74, 0x73, 0xa9, 0xa9, 0x0f, 0xce, 0x42, - 0x76, 0xbd, 0x26, 0xbe, 0x18, 0x53, 0xb4, 0xb8, 0xbe, 0x99, 0x5d, 0xaf, 0x61, 0x6f, 0xac, 0x94, - 0x16, 0xdf, 0xb8, 0xa5, 0x3e, 0xe2, 0xea, 0xef, 0xdb, 0x8b, 0x6f, 0xdc, 0x32, 0x45, 0x09, 0xeb, - 0x5f, 0x6c, 0x33, 0x5e, 0x6c, 0xf2, 0xa0, 0x5d, 0xec, 0x5f, 0xfc, 0x36, 0xbc, 0xc4, 0x34, 0x23, - 0x04, 0xb2, 0x08, 0x63, 0x22, 0x54, 0x1c, 0xf1, 0x95, 0x50, 0x6e, 0x11, 0x4a, 0xce, 0x29, 0x54, - 0x24, 0x7e, 0xc5, 0x25, 0x06, 0x48, 0xbe, 0x10, 0x26, 0xae, 0xb8, 0xe4, 0x10, 0xfa, 0xa6, 0x82, - 0x12, 0xc5, 0x1c, 0x47, 0xc1, 0xb8, 0x6a, 0xcc, 0x31, 0xa6, 0xa8, 0x0d, 0x11, 0x8c, 0x5f, 0xce, - 0x42, 0x61, 0xa3, 0xd9, 0xdd, 0x73, 0xda, 0x5b, 0x37, 0x08, 0x01, 0x3c, 0x9b, 0xc9, 0x1c, 0xc6, - 0xec, 0x6f, 0x72, 0x1e, 0x0a, 0xf2, 0x38, 0x26, 0x05, 0x92, 0x2f, 0x8e, 0x62, 0x73, 0x20, 0xc7, - 0x5d, 0xbc, 0xf8, 0x2e, 0x7f, 0x92, 0x1b, 0x10, 0x1e, 0xaa, 0x7a, 0x9d, 0xbe, 0xf2, 0x6c, 0xb1, - 0x98, 0x21, 0x1a, 0x79, 0x1d, 0x70, 0x93, 0x10, 0x27, 0x02, 0x69, 0xa5, 0xe6, 0x4d, 0x13, 0xca, - 0x07, 0x27, 0x41, 0x34, 0x72, 0x13, 0xc4, 0xc4, 0x14, 0xef, 0x4a, 0x9e, 0xd1, 0x09, 0xf8, 0xdb, - 0x3e, 0x92, 0x44, 0xa0, 0x92, 0xb7, 0x61, 0x2c, 0x7a, 0xd1, 0x3d, 0x7a, 0x2e, 0x52, 0xa5, 0x2c, - 0x47, 0xe5, 0x5b, 0x37, 0x4c, 0x15, 0xdd, 0xf8, 0x4f, 0x86, 0x61, 0x5c, 0x6d, 0x0f, 0x31, 0x61, - 0xc6, 0x6f, 0xb2, 0x03, 0xb9, 0xf0, 0x2d, 0xea, 0x60, 0xa1, 0xd8, 0x4e, 0x2f, 0xea, 0x0d, 0x62, - 0x78, 0xdc, 0xd1, 0x48, 0xc6, 0xb8, 0xaf, 0x3c, 0x63, 0x4e, 0xfb, 0x11, 0x98, 0xe3, 0x91, 0x12, - 0x14, 0xdc, 0x8e, 0xbf, 0x47, 0xdb, 0x8e, 0xbc, 0x44, 0xb9, 0xa4, 0x31, 0x5a, 0x17, 0x85, 0x09, - 0x5e, 0x21, 0x19, 0x79, 0x03, 0x86, 0xdd, 0x0e, 0x6d, 0xdb, 0x8e, 0xd8, 0xe3, 0x9e, 0x8d, 0x31, - 0xa0, 0xed, 0x52, 0x55, 0x21, 0x14, 0xc8, 0xe4, 0x3a, 0xe4, 0xdd, 0x83, 0x70, 0xbc, 0xce, 0xeb, - 0x44, 0x07, 0x81, 0xad, 0x90, 0x20, 0x22, 0x23, 0xf8, 0xc8, 0x6e, 0xed, 0x8a, 0x11, 0xd3, 0x09, - 0xee, 0xda, 0xad, 0x5d, 0x95, 0x80, 0x21, 0x92, 0xf7, 0x00, 0x3a, 0xf6, 0x1e, 0xf5, 0xac, 0x46, - 0x37, 0x38, 0x12, 0xe3, 0xf6, 0xbc, 0x46, 0xb6, 0xc1, 0x8a, 0x2b, 0xdd, 0xe0, 0x48, 0xa1, 0x1d, - 0xed, 0x48, 0x20, 0x29, 0x01, 0xb4, 0xec, 0x20, 0xa0, 0x5e, 0xcb, 0x15, 0xce, 0x5d, 0x63, 0xe1, - 0x73, 0x8c, 0x9c, 0xc1, 0xfd, 0xb0, 0x58, 0xe1, 0xa0, 0x10, 0x61, 0xa3, 0x1d, 0xcf, 0x16, 0xaf, - 0x7b, 0xc6, 0x1a, 0xed, 0x78, 0xda, 0x57, 0x32, 0x44, 0xf2, 0x45, 0x18, 0x69, 0x38, 0x7e, 0xdd, - 0xf5, 0x1a, 0x22, 0xf9, 0xc1, 0x73, 0x1a, 0x4d, 0x85, 0x97, 0x29, 0x64, 0x12, 0x9d, 0xb5, 0x56, - 0xe4, 0x57, 0x5b, 0x73, 0x0f, 0xd1, 0x76, 0x1f, 0x6f, 0x6d, 0x2d, 0x2c, 0x56, 0x5b, 0x1b, 0x11, - 0xb1, 0xa1, 0xdc, 0x73, 0x82, 0xa6, 0xbd, 0x23, 0xee, 0x91, 0xf5, 0xa1, 0xbc, 0x83, 0x45, 0xea, - 0x50, 0x72, 0x64, 0xf2, 0x26, 0x14, 0x68, 0x3b, 0xf0, 0x6c, 0xcb, 0x69, 0x88, 0xa0, 0x38, 0xbd, - 0xd1, 0x6c, 0x03, 0xb6, 0xab, 0x15, 0xb5, 0xd1, 0x88, 0x5f, 0x6d, 0xb0, 0xfe, 0xf1, 0xeb, 0x4e, - 0x4b, 0xc4, 0xb2, 0xe9, 0xfd, 0x53, 0x2b, 0x57, 0xef, 0xab, 0xfd, 0xc3, 0x10, 0xc9, 0xf3, 0x00, - 0x7b, 0xb4, 0x4d, 0x79, 0x60, 0x29, 0xbf, 0x65, 0x30, 0x15, 0xc8, 0x97, 0xf2, 0xff, 0xf3, 0x2f, - 0x2e, 0x64, 0x96, 0x00, 0x0a, 0x32, 0xfb, 0x83, 0xb1, 0x0a, 0xe7, 0x7b, 0x2e, 0x0a, 0x72, 0x15, - 0x8a, 0xbb, 0xb6, 0xb0, 0x73, 0xd5, 0xf7, 0xed, 0x76, 0x9b, 0x36, 0x85, 0x38, 0x9a, 0x92, 0xf0, - 0x32, 0x07, 0x73, 0xce, 0xc6, 0x7b, 0x30, 0x9b, 0xd6, 0x1b, 0xe4, 0x05, 0x18, 0x57, 0x13, 0x5d, - 0x08, 0x26, 0x63, 0x76, 0xc7, 0x91, 0xa9, 0x2e, 0x04, 0x83, 0xdf, 0xc8, 0xc0, 0x73, 0xfd, 0xd6, - 0x16, 0x99, 0x87, 0x42, 0xc7, 0x73, 0x5c, 0xd4, 0xe1, 0xb8, 0x04, 0x0c, 0x7f, 0x93, 0x0b, 0x00, - 0x5c, 0xd9, 0x08, 0xec, 0x3d, 0xe1, 0xec, 0x6e, 0x8e, 0x22, 0x64, 0xd3, 0xde, 0xf3, 0xc9, 0xab, - 0x30, 0xdd, 0xa0, 0xbb, 0x76, 0xb7, 0x19, 0x58, 0x7e, 0x7d, 0x9f, 0x36, 0x30, 0xbe, 0x04, 0x9d, - 0x98, 0xcc, 0xa2, 0x28, 0xa8, 0x49, 0x78, 0xa2, 0xc5, 0x43, 0x3d, 0x5a, 0x7c, 0x37, 0x5f, 0xc8, - 0x14, 0xb3, 0x26, 0xfa, 0xf2, 0x18, 0x3f, 0x94, 0x85, 0xb9, 0x5e, 0x93, 0x89, 0xbc, 0x93, 0xd6, - 0x07, 0xdc, 0x54, 0xaf, 0xc2, 0x55, 0x53, 0xbd, 0x52, 0x1b, 0x59, 0x84, 0x30, 0x3a, 0xe4, 0xa4, - 0x48, 0x6f, 0x09, 0x63, 0x34, 0x1d, 0xdb, 0xf7, 0x0f, 0xd9, 0x7a, 0xc9, 0x29, 0x89, 0xec, 0x04, - 0x4c, 0xa5, 0x91, 0x30, 0xf2, 0x05, 0x80, 0x7a, 0xd3, 0xf5, 0x29, 0xde, 0x88, 0x8b, 0x8d, 0x98, - 0xbb, 0xc8, 0x86, 0x50, 0xf5, 0x0a, 0x14, 0xa1, 0x65, 0xb7, 0x41, 0xc5, 0x00, 0xda, 0x70, 0xae, - 0x87, 0xf4, 0x60, 0xc3, 0x13, 0x3d, 0x7b, 0x29, 0x93, 0xe8, 0x77, 0xc3, 0xc7, 0x2f, 0xe3, 0x3d, - 0x9e, 0xed, 0x35, 0x47, 0x8e, 0x80, 0x24, 0x45, 0x04, 0xe3, 0x2e, 0x1c, 0x3d, 0xbb, 0x5e, 0xc8, - 0x9d, 0x43, 0x1e, 0x78, 0x4d, 0xb2, 0x00, 0x63, 0xf2, 0x91, 0x1c, 0xa6, 0xe8, 0x72, 0xe6, 0x20, - 0x40, 0xf7, 0x28, 0x4e, 0x1e, 0xcc, 0xb7, 0x88, 0x31, 0x40, 0x62, 0x0b, 0x1d, 0x45, 0xc8, 0xe6, - 0x51, 0x47, 0x7e, 0xdd, 0x73, 0x72, 0x7e, 0xeb, 0x82, 0x5b, 0x94, 0xfe, 0x6c, 0x46, 0x0e, 0x7f, - 0x52, 0xf2, 0x9d, 0xd4, 0x3e, 0x02, 0x18, 0xb1, 0x21, 0x1a, 0x86, 0x7f, 0xb3, 0x2d, 0x5d, 0xae, - 0x3a, 0xb1, 0xa5, 0x8b, 0x9f, 0xe4, 0x32, 0x4c, 0x79, 0xdc, 0xa7, 0x2f, 0x70, 0x45, 0x7f, 0xe2, - 0x48, 0x99, 0x13, 0x1c, 0xbc, 0xe9, 0x62, 0x9f, 0x8a, 0x76, 0xdd, 0x0d, 0x3b, 0x4c, 0xd9, 0x08, - 0xc8, 0x35, 0x18, 0x65, 0x1b, 0x01, 0xe6, 0x91, 0x88, 0xb9, 0x8a, 0x23, 0x1e, 0x6e, 0xab, 0x66, - 0xe1, 0x23, 0xf1, 0xb7, 0xe0, 0xf5, 0x0f, 0x33, 0x92, 0x99, 0xba, 0x0d, 0x91, 0x73, 0x30, 0xe2, - 0x7a, 0x7b, 0xca, 0xa7, 0x0d, 0xbb, 0xde, 0x1e, 0xfb, 0xae, 0x2b, 0x50, 0xe4, 0x91, 0x0b, 0x3c, - 0x24, 0xdc, 0x3f, 0x6a, 0xf3, 0x73, 0x6a, 0xc1, 0x9c, 0xe4, 0x70, 0x7c, 0x09, 0xf4, 0xa8, 0x5d, - 0x67, 0x98, 0xbe, 0xef, 0x5a, 0x6a, 0xf2, 0x18, 0xf1, 0xd9, 0x93, 0xbe, 0xef, 0x46, 0x59, 0x64, - 0x1a, 0x64, 0x09, 0x26, 0x18, 0x9f, 0x30, 0x85, 0x8d, 0xd8, 0x25, 0x2f, 0x24, 0x77, 0xc9, 0xa3, - 0x76, 0x5d, 0x36, 0xd1, 0x1c, 0xf7, 0x95, 0x5f, 0xe2, 0x6b, 0x7e, 0x2e, 0x0b, 0x67, 0xd3, 0xd1, - 0x71, 0xbc, 0x58, 0x25, 0x18, 0xc0, 0xc3, 0x6d, 0x96, 0xe6, 0x28, 0x83, 0xf0, 0x1c, 0x05, 0x69, - 0xad, 0xcd, 0xa6, 0xb6, 0xf6, 0x15, 0x98, 0x46, 0x46, 0x42, 0x2f, 0x69, 0x3a, 0x7e, 0x20, 0x42, - 0xef, 0xcd, 0x29, 0x56, 0xc0, 0x05, 0xdc, 0x2a, 0x03, 0x93, 0x97, 0x60, 0x52, 0x8a, 0x28, 0xf7, - 0xb0, 0xcd, 0x2a, 0xe6, 0xf2, 0x69, 0x42, 0x40, 0xd7, 0x11, 0x48, 0xce, 0xc0, 0xb0, 0xdd, 0xe9, - 0xb0, 0x2a, 0xb9, 0x58, 0x1a, 0xb2, 0x3b, 0x9d, 0x6a, 0x83, 0x5c, 0x82, 0x09, 0x0c, 0x57, 0xb2, - 0x76, 0xd1, 0x51, 0x44, 0x38, 0x88, 0x99, 0xe3, 0x08, 0xe4, 0xce, 0x23, 0x3e, 0x5b, 0x08, 0x8c, - 0x56, 0xa2, 0x8c, 0x20, 0x0a, 0xd8, 0x1d, 0x89, 0x20, 0x7a, 0xe6, 0x8b, 0x30, 0x25, 0x76, 0x53, - 0x21, 0xe1, 0x91, 0x52, 0xcc, 0x3f, 0xa6, 0xe6, 0x8a, 0xec, 0xe1, 0x20, 0x40, 0xd5, 0x86, 0xa4, - 0xfc, 0x83, 0x0c, 0x9c, 0x49, 0xdd, 0x8e, 0xc9, 0x37, 0x80, 0x47, 0x6f, 0x04, 0xae, 0xe5, 0xd1, - 0xba, 0xd3, 0x71, 0x30, 0xbe, 0x9d, 0x1b, 0xa1, 0x16, 0xfb, 0x6d, 0xe4, 0x18, 0x09, 0xb2, 0xe9, - 0x9a, 0x21, 0x11, 0x3f, 0x47, 0x17, 0xbd, 0x18, 0x78, 0xfe, 0x43, 0x38, 0x93, 0x8a, 0x9a, 0x72, - 0xbe, 0x7d, 0x4d, 0x7f, 0x64, 0x4d, 0xde, 0x2a, 0xc4, 0x3e, 0x5a, 0x39, 0xf7, 0x8a, 0xcf, 0xfb, - 0xad, 0xf0, 0xf3, 0x62, 0x1b, 0x37, 0x59, 0x8e, 0x4f, 0xcb, 0x34, 0xdd, 0x53, 0x12, 0xf5, 0x9c, - 0x99, 0xe4, 0x43, 0x38, 0x23, 0xa6, 0xca, 0x9e, 0x67, 0x77, 0xf6, 0x23, 0x76, 0xbc, 0xa1, 0x2f, - 0xa7, 0xb1, 0xe3, 0x73, 0xe8, 0x0e, 0xc3, 0x0f, 0xb9, 0xce, 0xd8, 0x49, 0xa0, 0xf8, 0x06, 0x4f, - 0x6e, 0xfa, 0x29, 0xad, 0x49, 0x99, 0x83, 0x99, 0xb4, 0x39, 0x38, 0xf0, 0x02, 0x10, 0x75, 0xfe, - 0x70, 0x06, 0x2e, 0x9e, 0xd4, 0x66, 0xb2, 0x0d, 0x67, 0xf1, 0xde, 0xdb, 0x77, 0xc3, 0xcf, 0xb6, - 0xea, 0x76, 0x7d, 0x9f, 0x8a, 0x59, 0x62, 0xa4, 0x7e, 0x7c, 0xa7, 0x53, 0xab, 0xad, 0x2b, 0xdf, - 0xdd, 0xe9, 0xd4, 0x7c, 0x57, 0xfe, 0x2e, 0x33, 0x72, 0xd1, 0x86, 0x06, 0x3c, 0xdb, 0x87, 0x52, - 0x59, 0x56, 0x19, 0x75, 0x59, 0x5d, 0x81, 0xe2, 0x2e, 0x6d, 0x30, 0x15, 0x8a, 0x36, 0xb0, 0x69, - 0x0f, 0x17, 0xf9, 0x4b, 0x85, 0xe6, 0x64, 0x08, 0xaf, 0xf9, 0xee, 0xd6, 0xa2, 0xa8, 0xa5, 0x25, - 0x25, 0xa4, 0xaa, 0xa2, 0x91, 0x6b, 0x30, 0x13, 0x8b, 0xd5, 0x8f, 0x82, 0x3f, 0xcd, 0x69, 0x56, - 0xa4, 0x67, 0x76, 0x79, 0x01, 0xc6, 0xe5, 0x30, 0x78, 0x61, 0x08, 0x89, 0x39, 0x26, 0x60, 0x6c, - 0x96, 0x8b, 0xea, 0xfe, 0x4e, 0x56, 0xaa, 0x4c, 0x4b, 0xae, 0x1b, 0xf8, 0x81, 0x67, 0x77, 0xb4, - 0x73, 0x13, 0x69, 0xc1, 0x79, 0xd7, 0xee, 0x06, 0xfb, 0x8b, 0x16, 0xfb, 0xd7, 0xf5, 0x64, 0x3c, - 0x67, 0x5d, 0x7a, 0xc2, 0x8d, 0x2d, 0x5e, 0xd7, 0x45, 0x67, 0x89, 0x61, 0x97, 0x54, 0x64, 0xb6, - 0xc3, 0x2b, 0x5c, 0x57, 0x9e, 0x31, 0xcf, 0x71, 0x9e, 0x09, 0x2c, 0xb2, 0x02, 0xe3, 0x3b, 0xd4, - 0xf6, 0xa8, 0x67, 0x45, 0x4f, 0xa2, 0xc7, 0x0f, 0x4e, 0x4b, 0x88, 0x80, 0xfe, 0x99, 0x3a, 0xd7, - 0xb1, 0x9d, 0xa8, 0x84, 0xbc, 0x0b, 0xa3, 0x4e, 0x43, 0xa4, 0xa2, 0x13, 0xc7, 0x27, 0x5d, 0x65, - 0xaf, 0x36, 0x78, 0x66, 0xba, 0x88, 0x07, 0x3b, 0x7b, 0x39, 0x02, 0xba, 0x34, 0xa1, 0x9d, 0x30, - 0x8d, 0x25, 0xb9, 0x3b, 0x27, 0xc9, 0x12, 0x0f, 0xba, 0x9f, 0x85, 0x61, 0x5f, 0xc9, 0x8d, 0x67, - 0x8a, 0x5f, 0xc6, 0x5f, 0x80, 0x2b, 0x83, 0xf6, 0x11, 0x79, 0x1d, 0x48, 0x8f, 0x0e, 0x1f, 0x35, - 0xa7, 0xed, 0x44, 0xbf, 0xbd, 0x00, 0x6a, 0x72, 0x2f, 0x47, 0x0e, 0xb8, 0x84, 0x3d, 0xf0, 0x1c, - 0xe3, 0xbf, 0xc8, 0xc2, 0xa4, 0x7e, 0xa6, 0x26, 0xaf, 0x42, 0x3e, 0x64, 0x3b, 0x19, 0xda, 0x7e, - 0x55, 0x24, 0xc6, 0xdc, 0x44, 0x24, 0xb6, 0x41, 0xe0, 0xfd, 0x8f, 0xd5, 0x52, 0xcd, 0xb3, 0xe6, - 0x38, 0x02, 0xa5, 0x59, 0xf6, 0x2e, 0xf0, 0x87, 0x71, 0x51, 0x96, 0x05, 0x83, 0x3d, 0x03, 0x5f, - 0x60, 0x27, 0x7b, 0xb4, 0xab, 0x8d, 0x33, 0x5a, 0x26, 0x4f, 0xf0, 0xe5, 0xf7, 0xe8, 0xc8, 0x94, - 0xef, 0x7d, 0x64, 0x12, 0x9f, 0xd2, 0xe3, 0xc8, 0x34, 0xd4, 0xe7, 0xc8, 0x14, 0x51, 0x86, 0x47, - 0xa6, 0x17, 0x45, 0xeb, 0x3d, 0xfb, 0xd0, 0xc2, 0xcf, 0xe2, 0x8e, 0x67, 0xbc, 0x5d, 0xa6, 0x7d, - 0x88, 0x17, 0x5f, 0x4b, 0xa3, 0x20, 0x6f, 0xcb, 0x8c, 0xbf, 0x9e, 0x89, 0x9d, 0x59, 0x64, 0xcf, - 0xbe, 0x04, 0x93, 0x4e, 0x8b, 0x29, 0x53, 0xb4, 0xa1, 0x28, 0x01, 0x13, 0xe6, 0x84, 0x84, 0x72, - 0x45, 0xe0, 0x65, 0x98, 0x0a, 0xd1, 0x78, 0xb0, 0x30, 0x77, 0x68, 0x37, 0x43, 0x6a, 0x11, 0x2c, - 0xfc, 0x2a, 0x4c, 0x87, 0x88, 0x42, 0xef, 0xe4, 0x7a, 0xc0, 0x84, 0x59, 0x94, 0x05, 0xe2, 0xc5, - 0x46, 0xdf, 0xd8, 0x8b, 0x6f, 0x32, 0x9f, 0x51, 0xab, 0x8c, 0x7f, 0x92, 0x85, 0x99, 0x14, 0x63, - 0x0b, 0xf9, 0x10, 0x66, 0xa4, 0xd0, 0xe0, 0x9b, 0x11, 0x5f, 0xcc, 0x5c, 0x5c, 0x5c, 0x4d, 0x13, - 0x17, 0x88, 0x96, 0xb2, 0xa4, 0xa7, 0x85, 0xa0, 0x88, 0xca, 0xff, 0xfc, 0x88, 0x08, 0xf2, 0x01, - 0x9c, 0x15, 0x0f, 0x2d, 0x2b, 0x92, 0xc2, 0xf2, 0xe8, 0xae, 0x98, 0xb0, 0x2f, 0x24, 0x16, 0x94, - 0x53, 0x57, 0x9a, 0x63, 0xd2, 0xdd, 0x95, 0x67, 0xcc, 0x59, 0x3f, 0x05, 0x1e, 0x97, 0x3e, 0xff, - 0x6e, 0x06, 0x8c, 0x93, 0xfb, 0x0b, 0x4f, 0x41, 0xf1, 0x0e, 0x67, 0xa7, 0x20, 0xa5, 0xf7, 0x2e, - 0xc1, 0x84, 0x47, 0x77, 0x3d, 0xea, 0xef, 0x2b, 0xdd, 0x37, 0x6a, 0x8e, 0x0b, 0xa0, 0xec, 0x18, - 0x99, 0xa6, 0xe0, 0x54, 0xcb, 0x57, 0x12, 0x19, 0xb7, 0xc3, 0x4d, 0x25, 0x75, 0x1c, 0xc8, 0x2c, - 0x0c, 0xa9, 0x0d, 0xe4, 0x3f, 0xee, 0xe6, 0x0b, 0xd9, 0x62, 0xce, 0x14, 0xc9, 0x14, 0x76, 0x9d, - 0x26, 0x35, 0x7e, 0x3d, 0x03, 0xf3, 0xbd, 0x3b, 0x8f, 0x7c, 0xa8, 0x5c, 0x0f, 0xe6, 0x78, 0x5a, - 0xba, 0x13, 0xfa, 0x5b, 0xbd, 0x49, 0x11, 0xf1, 0xfd, 0xf1, 0x37, 0x86, 0x05, 0xcb, 0x4f, 0x73, - 0xc7, 0xf1, 0xa6, 0xb4, 0x2e, 0x32, 0xbd, 0x7c, 0xeb, 0x06, 0xb9, 0x0a, 0x23, 0xdc, 0xa0, 0x28, - 0x1b, 0x3a, 0xa5, 0x35, 0x74, 0xeb, 0x86, 0x29, 0xcb, 0x8d, 0xef, 0x66, 0x42, 0x93, 0x4a, 0xbc, - 0xf9, 0x5b, 0x37, 0xc8, 0x17, 0x06, 0xbb, 0xe8, 0x2b, 0xc8, 0x8b, 0xbe, 0xf0, 0x92, 0xef, 0x8b, - 0xda, 0x25, 0xdf, 0x8b, 0xfd, 0xfb, 0x49, 0x1c, 0xde, 0xe2, 0xaf, 0x40, 0xfe, 0xb3, 0x0c, 0x5c, - 0xe8, 0x4b, 0x41, 0x9e, 0x83, 0x42, 0x69, 0xa3, 0xba, 0x19, 0x8d, 0x2c, 0x5b, 0x2d, 0x12, 0x42, - 0xee, 0xc0, 0xe8, 0x92, 0xed, 0x3b, 0x75, 0x36, 0x81, 0x53, 0xd5, 0xd1, 0x04, 0xdb, 0x10, 0x7d, - 0xe5, 0x19, 0x33, 0xa2, 0x25, 0x16, 0x4c, 0xe3, 0x2a, 0x48, 0xbc, 0xb2, 0x16, 0x57, 0x45, 0x12, - 0x0c, 0x13, 0x64, 0x4c, 0xc2, 0x24, 0x80, 0xf1, 0xc5, 0xf7, 0x50, 0xea, 0x9e, 0xbd, 0x1b, 0x78, - 0x8a, 0x94, 0x1c, 0x57, 0xa0, 0xb0, 0x21, 0xcd, 0x2a, 0xca, 0x23, 0xab, 0xd2, 0x84, 0x62, 0x86, - 0xa5, 0xc6, 0x5f, 0xcb, 0x48, 0x7d, 0xe1, 0xe4, 0x0f, 0x51, 0x12, 0xf8, 0x36, 0xfa, 0x27, 0xf0, - 0x6d, 0x7c, 0xc2, 0x04, 0xbe, 0xc6, 0x2f, 0x8b, 0x84, 0x59, 0xd5, 0xc6, 0x46, 0xec, 0x4d, 0x89, - 0x4f, 0xeb, 0xb6, 0xb0, 0xac, 0xcd, 0xce, 0x4b, 0x4a, 0x52, 0xf1, 0x64, 0x5d, 0xbd, 0xbd, 0x17, - 0x94, 0xa9, 0xfa, 0x4f, 0xb2, 0xf0, 0x5c, 0x3f, 0xf2, 0xd4, 0xe7, 0x2f, 0x32, 0xa7, 0x7b, 0xfe, - 0xe2, 0x2a, 0x14, 0x38, 0x4c, 0x7f, 0x11, 0x50, 0x90, 0xb2, 0x0e, 0x97, 0xc5, 0xe4, 0x12, 0x0c, - 0x97, 0xca, 0xb5, 0x28, 0xeb, 0x31, 0xde, 0xb3, 0xd9, 0x75, 0x1f, 0x6f, 0x70, 0x44, 0x11, 0xf9, - 0x7a, 0x32, 0xd1, 0xb7, 0x48, 0x77, 0xfc, 0xac, 0xd2, 0x21, 0x89, 0x5c, 0x76, 0xd8, 0xde, 0x28, - 0xf7, 0x9a, 0x48, 0x67, 0x64, 0x26, 0x93, 0x86, 0x1b, 0x30, 0xbc, 0xe1, 0x51, 0x9f, 0x06, 0xea, - 0x1d, 0x58, 0x07, 0x21, 0xa6, 0x28, 0x11, 0x37, 0x54, 0xf6, 0x11, 0x8f, 0x32, 0x18, 0x56, 0x83, - 0xb0, 0xf0, 0x4a, 0x8b, 0x81, 0x4d, 0x05, 0xc5, 0xf8, 0x76, 0x06, 0x66, 0xd3, 0x9a, 0x45, 0x9e, - 0x83, 0x7c, 0x3b, 0x35, 0x45, 0x79, 0x9b, 0xfb, 0x3a, 0x8f, 0xe1, 0x6b, 0x6c, 0xbb, 0xae, 0xd7, - 0xb2, 0x03, 0xf5, 0xe2, 0x4f, 0x01, 0x9b, 0xc0, 0x7e, 0xdc, 0xc6, 0xbf, 0xc9, 0x82, 0x14, 0xb6, - 0xb9, 0x44, 0x52, 0x73, 0xfc, 0xcf, 0x28, 0x01, 0x54, 0x1b, 0x1b, 0xeb, 0x1d, 0x9e, 0x1a, 0xed, - 0x26, 0xe4, 0x59, 0xb3, 0x62, 0x93, 0x91, 0x4d, 0x87, 0xd2, 0xfd, 0x55, 0x81, 0xc4, 0x5b, 0xc5, - 0xce, 0x4e, 0x26, 0x22, 0x1b, 0xdb, 0x30, 0xa9, 0x63, 0x90, 0x65, 0x3d, 0x99, 0x46, 0xf4, 0x50, - 0xfc, 0x92, 0xeb, 0x72, 0xe7, 0x93, 0xa5, 0xf3, 0xdf, 0x3b, 0x5e, 0x00, 0xf6, 0x93, 0xd3, 0xa4, - 0x25, 0xdb, 0x30, 0x7e, 0x2a, 0x0b, 0xb3, 0x91, 0x13, 0xbb, 0x5c, 0x12, 0x4f, 0xad, 0x47, 0x65, - 0x49, 0xf3, 0xf8, 0x5b, 0x48, 0xbc, 0xc5, 0x2c, 0x3f, 0xb0, 0x8f, 0xa3, 0xd1, 0x1d, 0x98, 0xeb, - 0x85, 0x4f, 0x5e, 0x4d, 0xbc, 0x96, 0x2a, 0x82, 0x2d, 0xc3, 0x67, 0x55, 0x95, 0xc7, 0x53, 0xff, - 0x51, 0x06, 0xe6, 0x85, 0xcb, 0xc4, 0x7d, 0xdb, 0x69, 0xe3, 0x0b, 0xf1, 0x75, 0xfa, 0x64, 0x3c, - 0x82, 0xef, 0x68, 0x62, 0xe9, 0x25, 0xdd, 0x33, 0x26, 0x51, 0x5b, 0xef, 0xaf, 0x25, 0x57, 0x31, - 0xac, 0xb6, 0xce, 0x27, 0x6f, 0x9e, 0x47, 0x60, 0xb4, 0x19, 0x40, 0x8d, 0xc0, 0x40, 0x0c, 0xe3, - 0x2f, 0xc1, 0xf3, 0xfd, 0x2b, 0x20, 0x5f, 0x83, 0x09, 0x4c, 0x45, 0xfb, 0xa0, 0xb3, 0xe7, 0xd9, - 0x0d, 0x2a, 0x0d, 0x45, 0xf2, 0x7e, 0x47, 0x2d, 0xe3, 0xa1, 0xc4, 0x22, 0x22, 0x60, 0x0f, 0x93, - 0xdc, 0x0a, 0x22, 0xcd, 0x2f, 0x49, 0xe5, 0x66, 0xfc, 0x50, 0x06, 0x48, 0x92, 0x07, 0xb9, 0x05, - 0xe3, 0x0f, 0x36, 0xcb, 0xb5, 0xc0, 0xf6, 0x82, 0x15, 0xb7, 0xeb, 0x89, 0x10, 0x5d, 0xee, 0x20, - 0x1e, 0xd4, 0x99, 0x64, 0xf0, 0x02, 0x6b, 0xdf, 0xed, 0x7a, 0xa6, 0x86, 0x87, 0xf9, 0x6e, 0x29, - 0x3d, 0x68, 0xd8, 0x47, 0x7a, 0xbe, 0x5b, 0x01, 0xd3, 0xf2, 0xdd, 0x0a, 0x98, 0xf1, 0xb7, 0x32, - 0xf0, 0xac, 0xbc, 0x4b, 0x69, 0xa4, 0xb4, 0xa5, 0x8c, 0x61, 0x50, 0x9e, 0x4c, 0x51, 0xd2, 0x4f, - 0x37, 0x9d, 0x96, 0x91, 0x82, 0xd8, 0x40, 0x54, 0x52, 0x39, 0x2d, 0x79, 0x1f, 0xf2, 0xb5, 0xc0, - 0xed, 0x0c, 0x10, 0x2a, 0x58, 0x0c, 0x47, 0x34, 0x70, 0x3b, 0xc8, 0x02, 0x29, 0x0d, 0x0a, 0xb3, - 0x6a, 0xe3, 0x64, 0x8b, 0xc9, 0x7d, 0x18, 0x11, 0x31, 0xdc, 0x31, 0xbb, 0x53, 0x9f, 0x6f, 0x5a, - 0x9a, 0x92, 0xf1, 0x88, 0x22, 0x45, 0x86, 0x29, 0x79, 0x18, 0x3f, 0x99, 0x81, 0x31, 0xa6, 0x3c, - 0xe0, 0x91, 0xeb, 0xd3, 0x4e, 0x69, 0x5d, 0x0f, 0x94, 0x66, 0xcb, 0x90, 0xfd, 0x40, 0x9b, 0xeb, - 0x1b, 0x30, 0x15, 0x23, 0x20, 0x06, 0x46, 0xa2, 0x34, 0x9d, 0xba, 0xcd, 0xd3, 0x67, 0x72, 0x9b, - 0x9f, 0x06, 0x33, 0xfe, 0x95, 0x0c, 0xcc, 0xae, 0x1f, 0x04, 0x76, 0x15, 0x8f, 0x90, 0x66, 0xb7, - 0x29, 0xd7, 0x3b, 0x53, 0x88, 0xe4, 0xa5, 0x1c, 0xf7, 0x92, 0xe7, 0x0a, 0x91, 0x80, 0x99, 0x61, - 0x29, 0x59, 0x81, 0x82, 0xd8, 0x5f, 0x7c, 0x91, 0xd9, 0x42, 0xde, 0x39, 0xeb, 0x8c, 0x05, 0x12, - 0xfb, 0x12, 0x14, 0x61, 0x82, 0xc6, 0x0c, 0xa9, 0x8d, 0x3f, 0xcd, 0xc0, 0xb9, 0x1e, 0x34, 0xe4, - 0x1d, 0x18, 0x42, 0x67, 0x3f, 0x31, 0x7a, 0xcf, 0xf5, 0xa8, 0x22, 0xa8, 0xef, 0x6f, 0xdd, 0xe0, - 0x1b, 0x51, 0x8b, 0xfd, 0x30, 0x39, 0x15, 0xf9, 0x10, 0x46, 0x4b, 0x8d, 0x86, 0x38, 0x97, 0x64, - 0xb5, 0x73, 0x49, 0x8f, 0x1a, 0xaf, 0x85, 0xf8, 0xfc, 0x5c, 0xc2, 0xdd, 0x4e, 0x1a, 0x0d, 0x4b, - 0x38, 0x32, 0x46, 0xfc, 0xe6, 0xdf, 0x86, 0x49, 0x1d, 0xf9, 0x54, 0xe7, 0x92, 0xef, 0x66, 0xa0, - 0xa8, 0xb7, 0xe1, 0xb3, 0x89, 0xa4, 0x4c, 0x1b, 0xe6, 0x13, 0x26, 0xd5, 0xcf, 0x64, 0xe1, 0x4c, - 0x6a, 0x0f, 0x93, 0xd7, 0x61, 0xb8, 0xd4, 0xe9, 0x54, 0x2b, 0x62, 0x56, 0x09, 0x85, 0x07, 0x2d, - 0xad, 0xda, 0xb1, 0x8d, 0x23, 0x91, 0x9b, 0x50, 0xc0, 0x99, 0xc9, 0x08, 0xb2, 0x51, 0x8e, 0x09, - 0x7e, 0xb5, 0x11, 0xcb, 0x31, 0x21, 0x11, 0xc9, 0x6d, 0x98, 0x14, 0x41, 0x55, 0x26, 0xdd, 0xa3, - 0x8f, 0xc2, 0x64, 0x67, 0x98, 0x8f, 0x4d, 0x86, 0x60, 0x59, 0x1e, 0x2f, 0x53, 0xc3, 0x8a, 0x74, - 0x2a, 0x7c, 0xbd, 0x97, 0xf1, 0x54, 0x39, 0xf1, 0x44, 0x17, 0xfc, 0xf5, 0x5e, 0x6c, 0x44, 0x0f, - 0x5e, 0x09, 0xca, 0x70, 0xb8, 0x4a, 0xbe, 0xef, 0xec, 0xb5, 0x5b, 0xb4, 0x1d, 0x7c, 0x76, 0xc3, - 0x15, 0xd5, 0x31, 0xd0, 0x70, 0x7d, 0x27, 0xcf, 0x17, 0x73, 0x9c, 0xec, 0x84, 0x07, 0xea, 0x2b, - 0x30, 0xc2, 0xc3, 0xb9, 0xe4, 0xca, 0xb8, 0x90, 0xda, 0x04, 0x8e, 0xb3, 0x75, 0x83, 0xab, 0x2f, - 0xdc, 0xeb, 0xd0, 0x37, 0x25, 0x29, 0xd9, 0x82, 0xb1, 0x72, 0x93, 0xda, 0xed, 0x6e, 0x67, 0x73, - 0x30, 0x03, 0xe3, 0x9c, 0xf8, 0x96, 0xf1, 0x3a, 0x27, 0x43, 0xc3, 0x24, 0x4a, 0x72, 0x95, 0x11, - 0xd9, 0x0c, 0x1d, 0x91, 0xf2, 0x68, 0x0f, 0xfd, 0x5c, 0x9f, 0xfe, 0x89, 0x03, 0xff, 0x3f, 0xea, - 0xae, 0xa7, 0xc7, 0x6d, 0xe3, 0x8a, 0x2f, 0x29, 0xed, 0x7a, 0xf7, 0x69, 0xff, 0x70, 0x27, 0xce, - 0x7a, 0xbb, 0xb6, 0x37, 0xa9, 0x9a, 0x3a, 0x8d, 0xd2, 0x24, 0x4d, 0xd2, 0x34, 0xb1, 0x8b, 0xd4, - 0xe5, 0x4a, 0xd4, 0x8a, 0x5e, 0x89, 0xa4, 0x49, 0xca, 0x1b, 0xbb, 0x69, 0x09, 0x79, 0x97, 0x5e, - 0xab, 0x95, 0x29, 0x45, 0xd2, 0xda, 0xb5, 0x6f, 0xbd, 0xe4, 0x52, 0x04, 0x28, 0x72, 0x6d, 0x81, - 0xa2, 0x40, 0xbe, 0x45, 0xbf, 0x40, 0x80, 0xa0, 0x40, 0x0e, 0xbd, 0x15, 0x08, 0x5a, 0x03, 0xbd, - 0xf4, 0xde, 0x4b, 0x4e, 0xc5, 0xbc, 0x99, 0x21, 0x87, 0xa4, 0xa4, 0xec, 0xda, 0x46, 0x8b, 0xde, - 0xc4, 0x37, 0x6f, 0x46, 0x43, 0xce, 0xcc, 0x9b, 0x79, 0xf3, 0xde, 0xfb, 0x3d, 0xac, 0x97, 0xf6, - 0xb2, 0xe3, 0x9e, 0x4a, 0x01, 0xac, 0x36, 0x3b, 0xa3, 0xb1, 0x3f, 0xec, 0x44, 0x23, 0x44, 0x64, - 0x38, 0x41, 0x98, 0xac, 0xc8, 0x6c, 0xb7, 0x86, 0xb7, 0x91, 0xe3, 0xb8, 0x2a, 0xf6, 0x39, 0xd3, - 0x1c, 0x3d, 0x2f, 0xd5, 0xbb, 0x51, 0xa7, 0xd7, 0x7d, 0x24, 0xfc, 0x35, 0xd9, 0x79, 0xe9, 0x8e, - 0x20, 0xba, 0x49, 0x79, 0xf9, 0xc3, 0xdc, 0xb8, 0xb1, 0x5e, 0x96, 0xe0, 0x0c, 0x77, 0xd1, 0x67, - 0x2e, 0xeb, 0x8e, 0x61, 0xd5, 0x4c, 0x6b, 0x57, 0x53, 0xc8, 0x2a, 0x80, 0xe3, 0xda, 0x55, 0xc3, - 0xf3, 0xe8, 0xb3, 0x4a, 0x9f, 0xb9, 0x3f, 0x7b, 0xbd, 0xdd, 0xd4, 0x0a, 0x92, 0x4b, 0x7b, 0xb1, - 0xfc, 0x85, 0x02, 0x1b, 0x93, 0x87, 0x92, 0xf8, 0x80, 0x41, 0x0d, 0xfc, 0xaa, 0xf9, 0x47, 0x33, - 0xc7, 0x7d, 0x22, 0x39, 0x1b, 0x1c, 0x31, 0x66, 0x4e, 0xf7, 0xaa, 0xb0, 0x1c, 0x25, 0x39, 0xd9, - 0xba, 0x87, 0xe5, 0x2a, 0x6c, 0x4e, 0x6b, 0x23, 0xfd, 0xaa, 0x6b, 0x50, 0xd2, 0x1d, 0xa7, 0x69, - 0x56, 0x75, 0xdf, 0xb4, 0x2d, 0x4d, 0x21, 0x4b, 0x30, 0xbf, 0xeb, 0xda, 0x6d, 0x47, 0x53, 0xcb, - 0x9f, 0x2a, 0xb0, 0x62, 0x46, 0xe3, 0xf0, 0x88, 0xf9, 0xbf, 0x3c, 0xed, 0xe2, 0xbb, 0x92, 0x5a, - 0x7c, 0x9b, 0x71, 0xf8, 0x4f, 0xfc, 0x07, 0x27, 0x5a, 0x79, 0x7f, 0x55, 0x60, 0x3d, 0x57, 0x87, - 0x78, 0x70, 0x46, 0xdf, 0xf7, 0x6c, 0xb3, 0x56, 0xe5, 0x3d, 0x13, 0xa7, 0x72, 0x4e, 0xcd, 0xff, - 0x0b, 0xf3, 0xae, 0x7d, 0x30, 0x0a, 0xfa, 0xdd, 0x43, 0x29, 0x13, 0x44, 0x63, 0xce, 0x15, 0x2d, - 0xe1, 0x4e, 0xf6, 0xe8, 0x78, 0x18, 0x62, 0xb3, 0x6a, 0xea, 0x46, 0x33, 0xa6, 0xe7, 0x1b, 0x66, - 0xa9, 0xeb, 0x69, 0x79, 0xbe, 0xe9, 0xa4, 0xbd, 0x9d, 0x15, 0x28, 0x71, 0xad, 0x05, 0x15, 0x82, - 0x4f, 0x14, 0xd8, 0x9c, 0xd6, 0x57, 0xaa, 0x08, 0xa5, 0x5d, 0xed, 0x37, 0x62, 0x2c, 0xbf, 0xb4, - 0x8f, 0xbd, 0x60, 0x23, 0x57, 0xa1, 0xc4, 0x12, 0x5d, 0x7a, 0x6f, 0xb7, 0x5d, 0x93, 0x4f, 0x90, - 0x8b, 0xff, 0xfa, 0xea, 0x85, 0x73, 0x3c, 0xbd, 0xff, 0xe8, 0xed, 0x74, 0xae, 0xf7, 0x4d, 0xc5, - 0x95, 0x6b, 0x94, 0x3f, 0x56, 0x60, 0x6b, 0xfa, 0x4b, 0xd2, 0x5d, 0xc6, 0xa7, 0x67, 0xf3, 0xc4, - 0x5b, 0x19, 0x77, 0x19, 0x3c, 0xaf, 0x67, 0xdc, 0x95, 0x63, 0x46, 0x5a, 0x29, 0xce, 0xb1, 0xa4, - 0xe6, 0x52, 0xab, 0xa4, 0x2b, 0x09, 0xc6, 0xf2, 0xef, 0x55, 0xd8, 0xa0, 0x13, 0xa8, 0x17, 0x8e, - 0x46, 0xfa, 0xf1, 0xf8, 0x6e, 0x18, 0x8d, 0xf9, 0x91, 0x8a, 0xbc, 0x0b, 0x0b, 0x77, 0x4f, 0x77, - 0x1b, 0xc8, 0xd8, 0x09, 0x01, 0x14, 0xca, 0xc2, 0x5d, 0x84, 0xfe, 0x26, 0x17, 0x41, 0x4a, 0x65, - 0x83, 0x32, 0x75, 0xd9, 0x5d, 0x1a, 0xc4, 0x09, 0x6d, 0xde, 0x83, 0x79, 0xd4, 0xfe, 0xb9, 0x68, - 0x14, 0x47, 0xda, 0xc9, 0x3d, 0xc3, 0xbb, 0x01, 0x97, 0x55, 0x20, 0x6f, 0x00, 0x24, 0x98, 0x71, - 0x5c, 0xf6, 0x09, 0x35, 0x3a, 0x86, 0x8d, 0x73, 0x97, 0xee, 0xdd, 0xe9, 0x70, 0x20, 0xb6, 0x0a, - 0xac, 0x8b, 0x4f, 0x32, 0x10, 0x51, 0xf1, 0xdc, 0x0e, 0xb3, 0xc6, 0x0a, 0xcc, 0x01, 0x8f, 0x8c, - 0x2f, 0xff, 0x53, 0x85, 0xa5, 0x7d, 0x7a, 0x50, 0x40, 0xf5, 0x77, 0xb6, 0x3a, 0xfd, 0x16, 0x94, - 0x9a, 0xfd, 0x0e, 0xbf, 0xbb, 0x1f, 0x71, 0x60, 0x0e, 0x74, 0xd9, 0xed, 0xf5, 0x3b, 0xc2, 0x0c, - 0x30, 0x72, 0x65, 0xa6, 0x6f, 0x70, 0x37, 0xbe, 0x06, 0x0b, 0xcc, 0xef, 0x81, 0x5f, 0xd4, 0x88, - 0xa3, 0x62, 0xdc, 0xa3, 0xd7, 0x59, 0xb1, 0x74, 0xdd, 0xcc, 0x3c, 0x27, 0xe4, 0x73, 0x0b, 0xc7, - 0xe5, 0x90, 0x94, 0xfd, 0xf9, 0x93, 0x29, 0xfb, 0x52, 0xfc, 0xf1, 0xc2, 0x49, 0xe2, 0x8f, 0xb7, - 0x2e, 0x43, 0x49, 0xea, 0xcf, 0xa9, 0x4e, 0x8e, 0xbf, 0x51, 0x61, 0x05, 0xdf, 0x2a, 0x36, 0x25, - 0xfd, 0x7f, 0x5e, 0x5d, 0x5c, 0x49, 0x5d, 0x5d, 0x6c, 0xca, 0xe3, 0xc5, 0xde, 0x6c, 0xc6, 0x9d, - 0xc5, 0x35, 0x58, 0xcf, 0x31, 0x92, 0x77, 0x60, 0x9e, 0x76, 0x5f, 0xa8, 0x7a, 0x5a, 0x76, 0x06, - 0x24, 0x58, 0x35, 0xf4, 0xc5, 0x47, 0x2e, 0xe3, 0x2e, 0xff, 0x5b, 0x81, 0x65, 0x0e, 0x22, 0x18, - 0xdd, 0xe9, 0x7f, 0xe3, 0xe7, 0xbc, 0x94, 0xfd, 0x9c, 0x2c, 0x78, 0x86, 0x7f, 0xce, 0xff, 0xf6, - 0x47, 0xbc, 0x9c, 0xfa, 0x88, 0xe7, 0xe2, 0xc8, 0x75, 0xf1, 0x3a, 0x33, 0xbe, 0xe1, 0x9f, 0x11, - 0xcb, 0x25, 0xcd, 0x48, 0x7e, 0x01, 0x4b, 0x56, 0xf8, 0x20, 0xa5, 0x31, 0x5d, 0x9a, 0xd2, 0xe8, - 0xeb, 0x31, 0x23, 0x5b, 0x53, 0xb8, 0xd9, 0x44, 0xe1, 0x83, 0x20, 0x67, 0xc6, 0x49, 0x9a, 0xa4, - 0x4a, 0x53, 0xba, 0xda, 0x69, 0xa6, 0x3e, 0x77, 0xd1, 0xc4, 0x78, 0xb0, 0x3f, 0x15, 0x01, 0x12, - 0xef, 0x36, 0xba, 0x00, 0xc3, 0x14, 0xd4, 0x2e, 0xbf, 0x3b, 0x46, 0x92, 0x3c, 0xc7, 0x39, 0x89, - 0x5c, 0xe2, 0x97, 0xa2, 0xea, 0x74, 0x64, 0x01, 0xbc, 0x1e, 0xad, 0x72, 0xef, 0xb1, 0xc3, 0xb0, - 0xd7, 0x61, 0xb2, 0xb8, 0xb0, 0xf3, 0x12, 0x02, 0xc9, 0xc4, 0xd4, 0x29, 0xd9, 0x60, 0xd0, 0xc7, - 0xac, 0x46, 0x19, 0x72, 0x1e, 0xa3, 0xc5, 0x27, 0xf7, 0x18, 0x9d, 0x7f, 0x02, 0x8f, 0xd1, 0x85, - 0x13, 0x7a, 0x8c, 0x3a, 0xb0, 0xd4, 0x8d, 0xee, 0x87, 0xd1, 0xb8, 0x3f, 0x7c, 0x88, 0xfe, 0x64, - 0xc9, 0x55, 0x16, 0xfd, 0xd4, 0xa6, 0x28, 0x63, 0xe3, 0x8d, 0x1b, 0x66, 0xcc, 0x2f, 0x0f, 0x77, - 0x4c, 0x24, 0x3f, 0x84, 0xc4, 0xea, 0xc1, 0x91, 0x3f, 0xa7, 0xef, 0xb3, 0x07, 0xc2, 0x28, 0xf2, - 0x53, 0x48, 0x1b, 0x3f, 0x78, 0xbc, 0x05, 0xcb, 0x5c, 0x26, 0x17, 0xc8, 0x60, 0x1a, 0x07, 0x92, - 0x7d, 0x84, 0x3b, 0xd4, 0x7c, 0xad, 0x02, 0xc9, 0x77, 0x9c, 0x5c, 0x81, 0x12, 0x13, 0xfd, 0xc1, - 0x70, 0xf4, 0x11, 0x77, 0x73, 0x64, 0xf1, 0x7e, 0x12, 0x59, 0x8e, 0xf7, 0x63, 0x64, 0x77, 0xf4, - 0x51, 0x8f, 0xfc, 0x1c, 0x9e, 0xc3, 0x81, 0x1f, 0x84, 0xc3, 0x6e, 0xff, 0x30, 0x40, 0xc4, 0x95, - 0x4e, 0x8f, 0x63, 0xca, 0xbf, 0x86, 0xc9, 0x4f, 0xf2, 0xc5, 0x53, 0x26, 0x08, 0x7a, 0x13, 0x3a, - 0xc8, 0xe9, 0x30, 0x46, 0xe2, 0x83, 0x26, 0xd7, 0xbf, 0x73, 0xdc, 0xeb, 0xf1, 0x39, 0x57, 0xc1, - 0xd4, 0xd7, 0x99, 0xb2, 0x29, 0x0d, 0xaf, 0x26, 0x0d, 0xd7, 0x8f, 0x7b, 0x3d, 0xf2, 0x2e, 0x40, - 0x3f, 0x0a, 0xee, 0x75, 0x47, 0x23, 0x66, 0xc8, 0x88, 0x3d, 0x81, 0x13, 0xaa, 0x3c, 0x7c, 0xfd, - 0xa8, 0xc5, 0x88, 0x74, 0xf8, 0x06, 0x9d, 0xa3, 0x10, 0xe3, 0x67, 0x70, 0xe6, 0xcd, 0x73, 0x94, - 0x48, 0x41, 0x4c, 0x4f, 0xa3, 0xa3, 0xd0, 0xeb, 0x3e, 0x12, 0xde, 0x4c, 0xb7, 0x60, 0x9d, 0x3b, - 0xa2, 0xec, 0x77, 0xc7, 0x77, 0xf9, 0xb9, 0xfb, 0x69, 0x0e, 0xed, 0xd2, 0xc1, 0xfb, 0x6f, 0x45, - 0x00, 0x7d, 0xdf, 0x13, 0xa1, 0xa9, 0xaf, 0xc0, 0x3c, 0xd5, 0x26, 0xc4, 0xad, 0x04, 0xde, 0xe9, - 0x62, 0xbb, 0xf2, 0x9d, 0x2e, 0x72, 0x50, 0x39, 0xe1, 0x86, 0x47, 0x78, 0x31, 0xa6, 0x26, 0x57, - 0x18, 0x43, 0x46, 0x4a, 0x9d, 0x5e, 0x19, 0x89, 0x34, 0x01, 0x92, 0x60, 0x51, 0xae, 0xdf, 0xae, - 0x27, 0x51, 0x57, 0xbc, 0x80, 0xc3, 0xff, 0x25, 0x01, 0xa7, 0xf2, 0xf4, 0x49, 0xd8, 0xc8, 0x1e, - 0x14, 0xfd, 0x4e, 0xec, 0xe7, 0x3a, 0x25, 0x84, 0xf6, 0x45, 0x8e, 0xf9, 0x9f, 0x84, 0xd1, 0xae, - 0x8e, 0x3b, 0xa9, 0xd4, 0x28, 0xd8, 0x08, 0x31, 0x60, 0x81, 0xe7, 0x73, 0x9a, 0x82, 0xa7, 0xc0, - 0xd3, 0x39, 0x71, 0x14, 0x25, 0x24, 0xca, 0xa7, 0x1d, 0x9e, 0xb9, 0xe9, 0x2d, 0x28, 0x78, 0x5e, - 0x8b, 0x07, 0x8e, 0xac, 0x24, 0xba, 0x8a, 0xe7, 0xb5, 0x44, 0xfa, 0xbb, 0x7b, 0x52, 0x35, 0xca, - 0x4c, 0x7e, 0x0c, 0x25, 0xe9, 0x20, 0xce, 0x43, 0xae, 0xf0, 0x1b, 0x74, 0x13, 0xb2, 0x2c, 0xce, - 0x24, 0x6e, 0xd2, 0x04, 0x6d, 0xef, 0xf8, 0x76, 0xa8, 0x0f, 0x06, 0xe8, 0xa3, 0x79, 0x3f, 0x1c, - 0x32, 0x68, 0xc2, 0xc5, 0x04, 0x80, 0x28, 0xe8, 0x0c, 0x06, 0xc1, 0xa1, 0x28, 0x95, 0x6f, 0x66, - 0xb2, 0x35, 0x89, 0x03, 0xeb, 0x5e, 0x38, 0x3e, 0x1e, 0x30, 0x37, 0x8c, 0x7a, 0x7f, 0x48, 0x55, - 0x13, 0x26, 0x30, 0x10, 0xab, 0x65, 0x44, 0x0b, 0x85, 0xef, 0xcb, 0x9d, 0xfe, 0x30, 0xa3, 0xa6, - 0xe4, 0x2b, 0x97, 0x43, 0x79, 0xc8, 0xe9, 0x7e, 0x9f, 0x56, 0x78, 0x70, 0xbf, 0x17, 0x0a, 0x4f, - 0xa2, 0xe6, 0xbc, 0x31, 0x21, 0x88, 0x18, 0xcd, 0x68, 0x52, 0x10, 0x71, 0x2a, 0x74, 0xf8, 0xb3, - 0xa2, 0x04, 0x4e, 0xc1, 0xc7, 0xe2, 0x7d, 0x80, 0x6b, 0xfd, 0x6e, 0xd4, 0x0a, 0xc7, 0x77, 0xfb, - 0x87, 0x52, 0x2c, 0x73, 0xe9, 0x97, 0xfd, 0x6e, 0x14, 0xdc, 0x43, 0xf2, 0xd7, 0x5f, 0xbd, 0x20, - 0x31, 0xb9, 0xd2, 0x6f, 0xf2, 0x7d, 0x58, 0xa2, 0x4f, 0x7e, 0xe2, 0x4c, 0xc2, 0x2e, 0x30, 0xb1, - 0x36, 0x4f, 0xa3, 0x19, 0x33, 0x90, 0xcb, 0x88, 0x1f, 0xda, 0x1d, 0x8c, 0xa5, 0x63, 0xb5, 0x00, - 0x0b, 0xed, 0x0e, 0xc6, 0x59, 0xbc, 0x21, 0x89, 0x99, 0x34, 0xe2, 0xae, 0x0b, 0x04, 0x5a, 0x0e, - 0x53, 0x8a, 0xb7, 0x74, 0x7c, 0xae, 0x05, 0x02, 0xe8, 0x44, 0xce, 0x15, 0x92, 0xa9, 0x86, 0x9d, - 0xf0, 0x1a, 0x35, 0x66, 0x56, 0xe1, 0xbb, 0x1b, 0xeb, 0xc4, 0xe8, 0xee, 0x61, 0x70, 0x80, 0xe4, - 0x54, 0x27, 0x62, 0x66, 0xb2, 0x03, 0x6b, 0x2c, 0xe2, 0x2e, 0x46, 0xb2, 0xe7, 0x3b, 0x1d, 0xca, - 0xb6, 0x04, 0xea, 0x5e, 0xfe, 0xfb, 0x4c, 0x05, 0x52, 0x87, 0x79, 0x54, 0x2d, 0x79, 0xd8, 0xd3, - 0x79, 0x59, 0xa7, 0xce, 0xae, 0x23, 0x94, 0x2b, 0xa8, 0x4d, 0xcb, 0x72, 0x05, 0x59, 0xc9, 0x07, - 0x00, 0x46, 0x34, 0xec, 0xf7, 0x7a, 0x08, 0xc5, 0xb3, 0x88, 0x8a, 0xd9, 0xc5, 0xf4, 0x7a, 0xc4, - 0x56, 0x12, 0x26, 0x1e, 0x61, 0x8e, 0xcf, 0x41, 0x06, 0xb0, 0x47, 0x6a, 0xab, 0x6c, 0xc2, 0x02, - 0x5b, 0x8c, 0x08, 0x6b, 0xc5, 0x31, 0x33, 0x25, 0x50, 0x24, 0x06, 0x6b, 0xc5, 0xe9, 0x79, 0x58, - 0x2b, 0xa9, 0x42, 0x79, 0x0f, 0xce, 0x4e, 0x7a, 0xb1, 0x94, 0x32, 0xac, 0x9c, 0x54, 0x19, 0xfe, - 0x63, 0x01, 0x96, 0xb1, 0x35, 0x21, 0x85, 0x75, 0x58, 0xf1, 0x8e, 0x6f, 0xc7, 0xe1, 0xa1, 0x42, - 0x1a, 0x63, 0xff, 0x46, 0x72, 0x81, 0x6c, 0xf0, 0x4a, 0xd5, 0x20, 0x06, 0xac, 0x8a, 0x9d, 0x60, - 0x57, 0xf8, 0xba, 0xc5, 0x88, 0x52, 0x02, 0xb8, 0x20, 0x9f, 0xc9, 0x23, 0x53, 0x29, 0xd9, 0x0f, - 0x0a, 0xa7, 0xd9, 0x0f, 0x8a, 0x27, 0xda, 0x0f, 0x7e, 0x06, 0xcb, 0xe2, 0xdf, 0x50, 0x92, 0xcf, - 0x3f, 0x9d, 0x24, 0x4f, 0x35, 0x46, 0x9a, 0xb1, 0x44, 0x5f, 0x98, 0x29, 0xd1, 0xd1, 0x8a, 0x28, - 0x56, 0x59, 0x2e, 0x39, 0x1f, 0x6f, 0x03, 0xa1, 0xee, 0x77, 0xab, 0xce, 0x13, 0xec, 0x92, 0xef, - 0xc0, 0x52, 0xb3, 0x2f, 0x0c, 0x48, 0xd2, 0xcd, 0x7d, 0x4f, 0x10, 0xe5, 0xe3, 0x42, 0xcc, 0x19, - 0xef, 0x6e, 0x85, 0x67, 0xb1, 0xbb, 0x5d, 0x06, 0xe0, 0x4e, 0x94, 0x09, 0x44, 0x35, 0x2e, 0x19, - 0x11, 0xfd, 0x93, 0x36, 0x20, 0x48, 0xcc, 0x54, 0x3a, 0x71, 0x57, 0x13, 0xfd, 0xe0, 0xa0, 0x7f, - 0x1c, 0x8d, 0x53, 0x39, 0x5d, 0x78, 0x20, 0x20, 0xdd, 0x12, 0xb0, 0x4c, 0x16, 0x0f, 0x99, 0x6a, - 0xcf, 0x76, 0x40, 0xc8, 0xf5, 0xd8, 0x47, 0x6e, 0x66, 0x8a, 0xcb, 0x72, 0xee, 0x0b, 0x4d, 0xf5, - 0x8c, 0x2b, 0x7f, 0xa1, 0xc8, 0x70, 0x7e, 0x4f, 0x30, 0xd4, 0xef, 0x01, 0xc4, 0x16, 0x7c, 0x31, - 0xd6, 0x4c, 0x93, 0x8b, 0xa9, 0xf2, 0x57, 0x4e, 0x78, 0xa5, 0xb7, 0x29, 0x3c, 0xab, 0xb7, 0xf1, - 0xa1, 0x64, 0xff, 0x6a, 0xdc, 0x49, 0x5c, 0x3e, 0xc0, 0x8b, 0x4f, 0xb2, 0x28, 0x99, 0x44, 0x2a, - 0xce, 0xe4, 0x1c, 0x3c, 0x35, 0x15, 0x67, 0x5c, 0xb1, 0x7c, 0x1d, 0xd6, 0xe4, 0x10, 0x85, 0x87, - 0xd1, 0x01, 0xf9, 0x09, 0xc3, 0x21, 0x51, 0x52, 0x3a, 0x8e, 0xc4, 0x44, 0x25, 0xee, 0xc3, 0xe8, - 0x80, 0x9d, 0x7f, 0x3a, 0x0f, 0xe4, 0xbe, 0xa2, 0xf6, 0xf9, 0xa5, 0x02, 0x24, 0xcf, 0x2e, 0x4b, - 0x13, 0xe5, 0x7f, 0x70, 0xba, 0xcc, 0x9c, 0xca, 0x8a, 0xa7, 0x39, 0x95, 0x55, 0x7e, 0xa7, 0xc0, - 0x9a, 0xa9, 0xb7, 0x38, 0xf6, 0x1e, 0xb3, 0x44, 0x7c, 0x1b, 0x2e, 0x9a, 0x7a, 0x2b, 0x70, 0xec, - 0xa6, 0x59, 0xbd, 0x19, 0x4c, 0x84, 0xd4, 0xb9, 0x08, 0xdf, 0xca, 0xb3, 0x24, 0x16, 0x8b, 0x0b, - 0xb0, 0x99, 0x2f, 0x16, 0xb0, 0x3b, 0x93, 0x2b, 0x0b, 0x84, 0x9e, 0x42, 0xe5, 0x2a, 0xac, 0x09, - 0x34, 0x1a, 0xbf, 0xe9, 0x21, 0x88, 0xdd, 0x1a, 0x94, 0x6e, 0x18, 0xae, 0x59, 0xbf, 0x19, 0xd4, - 0xdb, 0xcd, 0xa6, 0x36, 0x47, 0x56, 0x60, 0x89, 0x13, 0xaa, 0xba, 0xa6, 0x90, 0x65, 0x58, 0x34, - 0x2d, 0xcf, 0xa8, 0xb6, 0x5d, 0x43, 0x53, 0x2b, 0x57, 0x61, 0xd5, 0x19, 0x76, 0xef, 0x77, 0xc6, - 0xe1, 0x5e, 0xf8, 0x10, 0x0d, 0x0e, 0x67, 0xa0, 0xe0, 0xea, 0xfb, 0xda, 0x1c, 0x01, 0x58, 0x70, - 0xf6, 0xaa, 0xde, 0x9b, 0x6f, 0x6a, 0x0a, 0x29, 0xc1, 0x99, 0xdd, 0xaa, 0x13, 0xec, 0xb5, 0x3c, - 0x4d, 0xa5, 0x0f, 0xfa, 0xbe, 0x87, 0x0f, 0x85, 0xca, 0x0f, 0x60, 0x1d, 0xcf, 0x0a, 0xcd, 0xee, - 0x68, 0x1c, 0x46, 0xe1, 0x10, 0xfb, 0xb0, 0x0c, 0x8b, 0x5e, 0x48, 0x17, 0xf9, 0x38, 0x64, 0x1d, - 0x68, 0x1d, 0xf7, 0xc6, 0xdd, 0x41, 0x2f, 0xfc, 0xb5, 0xa6, 0x54, 0x2e, 0xc3, 0x9a, 0xdb, 0x3f, - 0x1e, 0x77, 0xa3, 0x23, 0x6f, 0x4c, 0x39, 0x8e, 0x1e, 0x92, 0xe7, 0x61, 0xbd, 0x6d, 0xe9, 0xad, - 0x1d, 0x73, 0xb7, 0x6d, 0xb7, 0xbd, 0xa0, 0xa5, 0xfb, 0xd5, 0x06, 0x33, 0x77, 0xb4, 0x6c, 0xcf, - 0x0f, 0x5c, 0xa3, 0x6a, 0x58, 0xbe, 0xa6, 0x54, 0x7e, 0xab, 0xc0, 0x6a, 0x7b, 0xc4, 0x5d, 0x74, - 0xdb, 0xe8, 0xc2, 0xff, 0x22, 0x5c, 0x68, 0x7b, 0x86, 0x1b, 0xf8, 0xf6, 0x9e, 0x61, 0x05, 0x6d, - 0x4f, 0xdf, 0xcd, 0xe2, 0x39, 0xbd, 0x00, 0xe7, 0x25, 0x0e, 0xd7, 0xa8, 0xda, 0x37, 0x0c, 0x37, - 0x70, 0x74, 0xcf, 0xdb, 0xb7, 0xdd, 0x9a, 0xa6, 0x90, 0x2d, 0xd8, 0x98, 0xc0, 0xd0, 0xaa, 0xeb, - 0x9a, 0x9a, 0x2b, 0xb3, 0x8c, 0x7d, 0xbd, 0x19, 0xec, 0xd8, 0xbe, 0x56, 0xa8, 0xb4, 0xe8, 0x46, - 0x87, 0x90, 0x27, 0x0c, 0xb0, 0x76, 0x11, 0x8a, 0x96, 0x6d, 0x19, 0x59, 0x93, 0xd4, 0x32, 0x2c, - 0xea, 0x8e, 0xe3, 0xda, 0x37, 0x70, 0x40, 0x01, 0x16, 0x6a, 0x86, 0x45, 0x7b, 0x56, 0xa0, 0x25, - 0x8e, 0x6b, 0xb7, 0x6c, 0xdf, 0xa8, 0x69, 0xc5, 0x8a, 0x2b, 0x16, 0x8c, 0x68, 0xf4, 0xa0, 0xcf, - 0xec, 0x3f, 0x35, 0xa3, 0xae, 0xb7, 0x9b, 0x3e, 0xff, 0x20, 0x37, 0x03, 0xd7, 0xb8, 0xde, 0x36, - 0x3c, 0xdf, 0xd3, 0x14, 0xa2, 0xc1, 0xb2, 0x65, 0x18, 0x35, 0x2f, 0x70, 0x8d, 0x1b, 0xa6, 0xb1, - 0xaf, 0xa9, 0xb4, 0x4d, 0xf6, 0x9b, 0xfe, 0x43, 0xe5, 0x33, 0x05, 0x08, 0x83, 0x8b, 0x11, 0xc0, - 0xa2, 0x38, 0x3e, 0xdb, 0xb0, 0xd5, 0xa0, 0x1f, 0x16, 0x5f, 0xad, 0x65, 0xd7, 0xb2, 0x9f, 0x6c, - 0x03, 0x48, 0xa6, 0xdc, 0xae, 0xd7, 0x35, 0x85, 0x9c, 0x87, 0xe7, 0x32, 0xf4, 0x9a, 0x6b, 0x3b, - 0x9a, 0xba, 0xa5, 0x2e, 0x2a, 0xe4, 0x5c, 0xae, 0x70, 0xcf, 0x30, 0x1c, 0xad, 0x40, 0x87, 0x28, - 0x53, 0x20, 0x26, 0x20, 0xab, 0x5e, 0xac, 0x7c, 0xac, 0xc0, 0x06, 0xeb, 0xa6, 0x98, 0xcd, 0x71, - 0x57, 0x2f, 0xc0, 0x26, 0x47, 0xb6, 0x9a, 0xd4, 0xd1, 0xb3, 0xa0, 0xa5, 0x4a, 0x59, 0x37, 0x9f, - 0x87, 0xf5, 0x14, 0x15, 0xfb, 0xa1, 0xd2, 0xb5, 0x9a, 0x22, 0xef, 0x18, 0x9e, 0x1f, 0x18, 0xf5, - 0xba, 0xed, 0xfa, 0xac, 0x23, 0x85, 0x4a, 0x19, 0xd6, 0xab, 0xe1, 0x70, 0x4c, 0x75, 0x90, 0x68, - 0xd4, 0xed, 0x47, 0xd8, 0x85, 0x15, 0x58, 0x32, 0x3e, 0xf0, 0x0d, 0xcb, 0x33, 0x6d, 0x4b, 0x9b, - 0xab, 0x5c, 0xc8, 0xf0, 0x88, 0x55, 0xe3, 0x79, 0x0d, 0x6d, 0xae, 0xd2, 0x81, 0x15, 0xe1, 0x12, - 0xcb, 0x66, 0xc5, 0x36, 0x6c, 0x89, 0xb9, 0x86, 0xeb, 0x37, 0xfb, 0x0a, 0x9b, 0x70, 0x36, 0x5f, - 0x6e, 0xf8, 0x9a, 0x42, 0x47, 0x21, 0x53, 0x42, 0xe9, 0x6a, 0xe5, 0x0f, 0x0a, 0x6c, 0xf2, 0x6c, - 0x5a, 0xdc, 0x1e, 0xc1, 0xc0, 0x34, 0x11, 0x98, 0xa6, 0x02, 0x97, 0x7c, 0xb7, 0xed, 0xf9, 0x46, - 0x2d, 0xa8, 0x19, 0x37, 0xcc, 0xaa, 0x81, 0xd3, 0xc5, 0x74, 0x8d, 0x96, 0x61, 0xf9, 0x99, 0xbf, - 0x7e, 0x15, 0x5e, 0x9e, 0xc1, 0x6b, 0xd9, 0xbe, 0x78, 0xa6, 0xab, 0xe4, 0x65, 0xf8, 0xce, 0x0c, - 0xe6, 0x98, 0x51, 0xad, 0x7c, 0x08, 0xcb, 0x29, 0x80, 0xf0, 0x73, 0xf0, 0x9c, 0xfc, 0xec, 0x84, - 0xd1, 0x61, 0x37, 0x3a, 0xd2, 0xe6, 0xb2, 0x05, 0xee, 0x71, 0x14, 0xd1, 0x02, 0x5c, 0x90, 0x72, - 0x81, 0x1f, 0x0e, 0xef, 0x75, 0xa3, 0xce, 0x38, 0x3c, 0xd4, 0xd4, 0xca, 0xeb, 0xb0, 0x92, 0x42, - 0x30, 0xa2, 0x5f, 0xbe, 0x69, 0x73, 0x79, 0xd5, 0x32, 0x6a, 0x66, 0xbb, 0xa5, 0xcd, 0xd3, 0xa5, - 0xd8, 0x30, 0x77, 0x1b, 0x1a, 0x54, 0x3e, 0x55, 0xe8, 0x89, 0x19, 0xbf, 0x4f, 0xab, 0xae, 0x8b, - 0xb1, 0xa2, 0xf3, 0x84, 0x81, 0x9d, 0x19, 0x9e, 0xc7, 0x4c, 0xa9, 0x17, 0x60, 0x93, 0x3f, 0x04, - 0xba, 0x55, 0x0b, 0x1a, 0xba, 0x5b, 0xdb, 0xd7, 0x5d, 0x3a, 0x79, 0x6e, 0x6a, 0x2a, 0xae, 0x08, - 0x89, 0x12, 0xf8, 0x76, 0xbb, 0xda, 0xd0, 0x0a, 0x74, 0x02, 0xa6, 0xe8, 0x8e, 0x69, 0x69, 0x45, - 0x5c, 0x5f, 0x39, 0x6e, 0x6c, 0x96, 0x96, 0xcf, 0x57, 0xba, 0xa0, 0x65, 0xc3, 0x96, 0x72, 0x36, - 0x6d, 0xb7, 0x6d, 0x59, 0x4c, 0x80, 0xac, 0x41, 0xc9, 0xf6, 0x1b, 0x86, 0xcb, 0xe1, 0xe8, 0x10, - 0x7f, 0xae, 0x6d, 0xe9, 0x6d, 0xbf, 0x61, 0xbb, 0xe6, 0x2d, 0x94, 0x24, 0x9b, 0x70, 0xd6, 0x6b, - 0xea, 0xd5, 0x3d, 0x1c, 0x34, 0xd3, 0x0a, 0xaa, 0x0d, 0xdd, 0xb2, 0x8c, 0xa6, 0x06, 0x95, 0xbf, - 0x28, 0x70, 0x7e, 0x86, 0xdd, 0x8b, 0xbc, 0x06, 0xaf, 0x34, 0x0c, 0xbd, 0xd6, 0x34, 0x3c, 0x2f, - 0xa0, 0x4d, 0x1a, 0x96, 0xcf, 0xcd, 0xcb, 0x13, 0x67, 0xeb, 0x2b, 0xf0, 0xdd, 0xd9, 0xec, 0x89, - 0xdc, 0xfb, 0x1e, 0xbc, 0x34, 0x9b, 0x95, 0xcb, 0x41, 0x95, 0xce, 0xd9, 0xd9, 0x9c, 0xb1, 0xfc, - 0x2c, 0x54, 0x3e, 0x51, 0x60, 0x63, 0xb2, 0xba, 0x48, 0xfb, 0x66, 0x5a, 0x9e, 0xaf, 0x37, 0x9b, - 0x81, 0xa3, 0xbb, 0x7a, 0x2b, 0x30, 0x2c, 0xd7, 0x6e, 0x36, 0x27, 0xc9, 0x8d, 0x97, 0xe0, 0xc5, - 0xe9, 0xac, 0x5e, 0xd5, 0x35, 0x1d, 0xba, 0x00, 0xcb, 0xb0, 0x3d, 0x9d, 0xcb, 0x30, 0xab, 0x86, - 0xa6, 0xee, 0xbc, 0xff, 0xf9, 0x3f, 0xb6, 0xe7, 0x3e, 0x7f, 0xbc, 0xad, 0x7c, 0xf9, 0x78, 0x5b, - 0xf9, 0xfb, 0xe3, 0x6d, 0xe5, 0xd6, 0xab, 0xa7, 0x48, 0x44, 0x79, 0x7b, 0x01, 0xfd, 0x29, 0xde, - 0xfe, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x89, 0xcb, 0xc3, 0xdf, 0xfb, 0x85, 0x01, 0x00, + // 26493 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xfd, 0x7b, 0x70, 0x1c, 0x49, + 0x7a, 0x20, 0x86, 0x4f, 0x3f, 0x00, 0x34, 0x3e, 0xbc, 0x1a, 0x09, 0x90, 0x04, 0x31, 0xe4, 0x80, + 0x53, 0x9c, 0xe1, 0x90, 0xf3, 0x20, 0x97, 0xe0, 0x0e, 0x77, 0x67, 0xe7, 0xd9, 0x78, 0x90, 0x68, + 0x12, 0x04, 0xb0, 0xd5, 0x20, 0xb1, 0xa3, 0xd9, 0xd9, 0xda, 0x42, 0x57, 0x02, 0xa8, 0x41, 0x77, + 0x57, 0x6f, 0x55, 0x35, 0x41, 0xac, 0xee, 0x7e, 0xa7, 0xc7, 0xe9, 0xf6, 0x27, 0xdf, 0xe9, 0xe5, + 0x5b, 0x59, 0x7b, 0x0e, 0x9d, 0x42, 0x21, 0xdf, 0x9d, 0xe5, 0xc7, 0x29, 0x1c, 0x92, 0x2e, 0x7c, + 0x0e, 0x85, 0xe5, 0x93, 0x43, 0x56, 0xc8, 0xba, 0x38, 0x5b, 0x0e, 0xbf, 0xd7, 0x0a, 0xc8, 0xb2, + 0x2e, 0x2e, 0x1c, 0x0c, 0xdb, 0xa1, 0xb3, 0x1c, 0x17, 0xf6, 0x38, 0x64, 0x3b, 0xf2, 0xcb, 0xcc, + 0xaa, 0xcc, 0xaa, 0xea, 0x46, 0x63, 0x86, 0x73, 0x27, 0x4e, 0xdc, 0x3f, 0x24, 0xfa, 0xcb, 0xef, + 0xfb, 0x32, 0x2b, 0x9f, 0x5f, 0x7e, 0xf9, 0x3d, 0xe0, 0xf9, 0x90, 0x36, 0x68, 0xdb, 0xf3, 0xc3, + 0x6b, 0x0d, 0xba, 0x6b, 0xd7, 0x0f, 0xaf, 0x85, 0x87, 0x6d, 0x1a, 0xf0, 0x7f, 0xaf, 0xb6, 0x7d, + 0x2f, 0xf4, 0xc8, 0x00, 0xfe, 0x98, 0x9d, 0xde, 0xf5, 0x76, 0x3d, 0x84, 0x5c, 0x63, 0x7f, 0xf1, + 0xc2, 0xd9, 0xb9, 0x5d, 0xcf, 0xdb, 0x6d, 0xd0, 0x6b, 0xf8, 0x6b, 0xbb, 0xb3, 0x73, 0x2d, 0x74, + 0x9b, 0x34, 0x08, 0xed, 0x66, 0x5b, 0x20, 0x5c, 0x89, 0x2a, 0xb0, 0xc3, 0x90, 0x95, 0x84, 0xae, + 0xd7, 0xba, 0xf6, 0xf0, 0xba, 0xfa, 0x53, 0xa0, 0xbe, 0x96, 0xdd, 0x96, 0x03, 0xdf, 0x6e, 0xb7, + 0xa9, 0x1f, 0xff, 0xc1, 0xd1, 0x8d, 0x5f, 0x28, 0xc0, 0xf0, 0x5d, 0x4a, 0xdb, 0x95, 0x86, 0xfb, + 0x90, 0x92, 0x8b, 0x50, 0x5c, 0xb3, 0x9b, 0x74, 0x26, 0x77, 0x21, 0x77, 0x79, 0x78, 0x61, 0xe2, + 0xf1, 0xd1, 0xdc, 0x48, 0x40, 0xfd, 0x87, 0xd4, 0xb7, 0x5a, 0x76, 0x93, 0x9a, 0x58, 0x48, 0x5e, + 0x81, 0x61, 0xf6, 0x7f, 0xd0, 0xb6, 0xeb, 0x74, 0x26, 0x8f, 0x98, 0x63, 0x8f, 0x8f, 0xe6, 0x86, + 0x5b, 0x12, 0x68, 0xc6, 0xe5, 0xa4, 0x0a, 0x43, 0xcb, 0x8f, 0xda, 0xae, 0x4f, 0x83, 0x99, 0xe2, + 0x85, 0xdc, 0xe5, 0x91, 0xf9, 0xd9, 0xab, 0xfc, 0x63, 0xaf, 0xca, 0x8f, 0xbd, 0xba, 0x29, 0x3f, + 0x76, 0x61, 0xea, 0x77, 0x8f, 0xe6, 0x9e, 0x79, 0x7c, 0x34, 0x37, 0x44, 0x39, 0xc9, 0x4f, 0xff, + 0xe1, 0x5c, 0xce, 0x94, 0xf4, 0xe4, 0x2d, 0x28, 0x6e, 0x1e, 0xb6, 0xe9, 0xcc, 0xf0, 0x85, 0xdc, + 0xe5, 0xf1, 0xf9, 0xe7, 0xae, 0xf2, 0xee, 0x8d, 0x1a, 0x1f, 0xff, 0xc5, 0xb0, 0x16, 0x4a, 0x8f, + 0x8f, 0xe6, 0x8a, 0x0c, 0xc5, 0x44, 0x2a, 0xf2, 0x1a, 0x0c, 0xae, 0x78, 0x41, 0x58, 0x5d, 0x9a, + 0x01, 0x6c, 0xf2, 0xa9, 0xc7, 0x47, 0x73, 0x93, 0x7b, 0x5e, 0x10, 0x5a, 0xae, 0xf3, 0xaa, 0xd7, + 0x74, 0x43, 0xda, 0x6c, 0x87, 0x87, 0xa6, 0x40, 0x32, 0x1e, 0xc1, 0x98, 0xc6, 0x8f, 0x8c, 0xc0, + 0xd0, 0xfd, 0xb5, 0xbb, 0x6b, 0xeb, 0x5b, 0x6b, 0xe5, 0x67, 0x48, 0x09, 0x8a, 0x6b, 0xeb, 0x4b, + 0xcb, 0xe5, 0x1c, 0x19, 0x82, 0x42, 0x65, 0x63, 0xa3, 0x9c, 0x27, 0xa3, 0x50, 0x5a, 0xaa, 0x6c, + 0x56, 0x16, 0x2a, 0xb5, 0xe5, 0x72, 0x81, 0x4c, 0xc1, 0xc4, 0x56, 0x75, 0x6d, 0x69, 0x7d, 0xab, + 0x66, 0x2d, 0x2d, 0xd7, 0xee, 0x6e, 0xae, 0x6f, 0x94, 0x8b, 0x64, 0x1c, 0xe0, 0xee, 0xfd, 0x85, + 0x65, 0x73, 0x6d, 0x79, 0x73, 0xb9, 0x56, 0x1e, 0x20, 0xd3, 0x50, 0x96, 0x24, 0x56, 0x6d, 0xd9, + 0x7c, 0x50, 0x5d, 0x5c, 0x2e, 0x0f, 0xde, 0x29, 0x96, 0x0a, 0xe5, 0xa2, 0x39, 0xb4, 0x4a, 0xed, + 0x80, 0x56, 0x97, 0x8c, 0x7f, 0xa3, 0x00, 0xa5, 0x7b, 0x34, 0xb4, 0x1d, 0x3b, 0xb4, 0xc9, 0x39, + 0x6d, 0x7c, 0xf0, 0x13, 0x95, 0x81, 0xb9, 0x98, 0x1e, 0x98, 0x81, 0xc7, 0x47, 0x73, 0xb9, 0xd7, + 0xd4, 0x01, 0x79, 0x13, 0x46, 0x96, 0x68, 0x50, 0xf7, 0xdd, 0x36, 0x9b, 0x34, 0x33, 0x05, 0x44, + 0x3b, 0xfb, 0xf8, 0x68, 0xee, 0x94, 0x13, 0x83, 0x95, 0x0e, 0x51, 0xb1, 0x49, 0x15, 0x06, 0x57, + 0xed, 0x6d, 0xda, 0x08, 0x66, 0x06, 0x2e, 0x14, 0x2e, 0x8f, 0xcc, 0x3f, 0x2b, 0x06, 0x41, 0x36, + 0xf0, 0x2a, 0x2f, 0x5d, 0x6e, 0x85, 0xfe, 0xe1, 0xc2, 0xf4, 0xe3, 0xa3, 0xb9, 0x72, 0x03, 0x01, + 0x6a, 0x07, 0x73, 0x14, 0x52, 0x8b, 0x27, 0xc6, 0xe0, 0xb1, 0x13, 0xe3, 0xfc, 0xef, 0x1e, 0xcd, + 0xe5, 0xd8, 0x80, 0x89, 0x89, 0x11, 0xf3, 0xd3, 0xa7, 0xc8, 0x3c, 0x94, 0x4c, 0xfa, 0xd0, 0x0d, + 0xd8, 0x97, 0x95, 0xf0, 0xcb, 0x4e, 0x3f, 0x3e, 0x9a, 0x23, 0xbe, 0x80, 0x29, 0xcd, 0x88, 0xf0, + 0x66, 0xdf, 0x80, 0x11, 0xa5, 0xd5, 0xa4, 0x0c, 0x85, 0x7d, 0x7a, 0xc8, 0x7b, 0xd8, 0x64, 0x7f, + 0x92, 0x69, 0x18, 0x78, 0x68, 0x37, 0x3a, 0xa2, 0x4b, 0x4d, 0xfe, 0xe3, 0x2b, 0xf9, 0x2f, 0xe7, + 0xee, 0x14, 0x4b, 0x43, 0xe5, 0x92, 0x99, 0xaf, 0x2e, 0x19, 0xff, 0x6a, 0x11, 0x4a, 0xa6, 0xc7, + 0x17, 0x22, 0xb9, 0x02, 0x03, 0xb5, 0xd0, 0x0e, 0xe5, 0x30, 0x4d, 0x3d, 0x3e, 0x9a, 0x9b, 0x60, + 0x8b, 0x94, 0x2a, 0xf5, 0x73, 0x0c, 0x86, 0xba, 0xb1, 0x67, 0x07, 0x72, 0xb8, 0x10, 0xb5, 0xcd, + 0x00, 0x2a, 0x2a, 0x62, 0x90, 0x4b, 0x50, 0xbc, 0xe7, 0x39, 0x54, 0x8c, 0x18, 0x79, 0x7c, 0x34, + 0x37, 0xde, 0xf4, 0x1c, 0x15, 0x11, 0xcb, 0xc9, 0xab, 0x30, 0xbc, 0xd8, 0xf1, 0x7d, 0xda, 0x62, + 0x73, 0xbd, 0x88, 0xc8, 0xe3, 0x8f, 0x8f, 0xe6, 0xa0, 0xce, 0x81, 0x96, 0xeb, 0x98, 0x31, 0x02, + 0x1b, 0x86, 0x5a, 0x68, 0xfb, 0x21, 0x75, 0x66, 0x06, 0xfa, 0x1a, 0x06, 0xb6, 0x3e, 0x27, 0x03, + 0x4e, 0x92, 0x1c, 0x06, 0xc1, 0x89, 0xac, 0xc0, 0xc8, 0x6d, 0xdf, 0xae, 0xd3, 0x0d, 0xea, 0xbb, + 0x9e, 0x83, 0xe3, 0x5b, 0x58, 0xb8, 0xf4, 0xf8, 0x68, 0xee, 0xf4, 0x2e, 0x03, 0x5b, 0x6d, 0x84, + 0xc7, 0xd4, 0x1f, 0x1f, 0xcd, 0x95, 0x96, 0x3a, 0x3e, 0xf6, 0x9e, 0xa9, 0x92, 0x92, 0x6f, 0xb2, + 0xc1, 0x09, 0x42, 0xec, 0x5a, 0xea, 0xcc, 0x0c, 0x1d, 0xdb, 0x44, 0x43, 0x34, 0xf1, 0x74, 0xc3, + 0x0e, 0x42, 0xcb, 0xe7, 0x74, 0x89, 0x76, 0xaa, 0x2c, 0xc9, 0x3a, 0x94, 0x6a, 0xf5, 0x3d, 0xea, + 0x74, 0x1a, 0x14, 0xa7, 0xcc, 0xc8, 0xfc, 0x19, 0x31, 0xa9, 0xe5, 0x78, 0xca, 0xe2, 0x85, 0x59, + 0xc1, 0x9b, 0x04, 0x02, 0xa2, 0xce, 0x27, 0x89, 0xf5, 0x95, 0xd2, 0xf7, 0x7e, 0x71, 0xee, 0x99, + 0x1f, 0xfa, 0x83, 0x0b, 0xcf, 0x18, 0xff, 0x7e, 0x1e, 0xca, 0x49, 0x26, 0x64, 0x07, 0xc6, 0xee, + 0xb7, 0x1d, 0x3b, 0xa4, 0x8b, 0x0d, 0x97, 0xb6, 0xc2, 0x00, 0x27, 0x49, 0xef, 0x6f, 0x7a, 0x41, + 0xd4, 0x3b, 0xd3, 0x41, 0x42, 0xab, 0xce, 0x29, 0x13, 0x5f, 0xa5, 0xb3, 0x8d, 0xeb, 0xa9, 0xe1, + 0x06, 0x1e, 0xe0, 0x0c, 0x3b, 0x59, 0x3d, 0x7c, 0xeb, 0xef, 0x52, 0x8f, 0x60, 0x2b, 0x26, 0x50, + 0xcb, 0xd9, 0x3e, 0xc4, 0x99, 0xd9, 0xff, 0x04, 0x62, 0x24, 0x19, 0x13, 0x88, 0x81, 0x8d, 0x7f, + 0x9c, 0x83, 0x71, 0x93, 0x06, 0x5e, 0xc7, 0xaf, 0xd3, 0x15, 0x6a, 0x3b, 0xd4, 0x67, 0xd3, 0xff, + 0xae, 0xdb, 0x72, 0xc4, 0x9a, 0xc2, 0xe9, 0xbf, 0xef, 0xb6, 0xd4, 0xad, 0x1b, 0xcb, 0xc9, 0x17, + 0x60, 0xa8, 0xd6, 0xd9, 0x46, 0xd4, 0x7c, 0xbc, 0x03, 0x04, 0x9d, 0x6d, 0x2b, 0x81, 0x2e, 0xd1, + 0xc8, 0x35, 0x18, 0x7a, 0x40, 0xfd, 0x20, 0xde, 0x0d, 0xf1, 0x68, 0x78, 0xc8, 0x41, 0x2a, 0x81, + 0xc0, 0x22, 0xb7, 0xe3, 0x1d, 0x59, 0x1c, 0x6a, 0x13, 0x89, 0x7d, 0x30, 0x9e, 0x2a, 0x4d, 0x01, + 0x51, 0xa7, 0x8a, 0xc4, 0x32, 0x7e, 0x26, 0x0f, 0xe5, 0x25, 0x3b, 0xb4, 0xb7, 0xed, 0x40, 0xf4, + 0xe7, 0x83, 0x1b, 0x6c, 0x8f, 0x57, 0x3e, 0x14, 0xf7, 0x78, 0xd6, 0xf2, 0x4f, 0xfc, 0x79, 0x2f, + 0x26, 0x3f, 0x6f, 0x84, 0x9d, 0xb0, 0xe2, 0xf3, 0xe2, 0x8f, 0x7a, 0xfb, 0xf8, 0x8f, 0x2a, 0x8b, + 0x8f, 0x2a, 0xc9, 0x8f, 0x8a, 0x3f, 0x85, 0xbc, 0x0d, 0xc5, 0x5a, 0x9b, 0xd6, 0xc5, 0x26, 0x22, + 0xcf, 0x05, 0xfd, 0xe3, 0x18, 0xc2, 0x83, 0x1b, 0x0b, 0xa3, 0x82, 0x4d, 0x31, 0x68, 0xd3, 0xba, + 0x89, 0x64, 0xca, 0xa2, 0xf9, 0xfb, 0x05, 0x98, 0xce, 0x22, 0x53, 0xbf, 0x63, 0xb0, 0xc7, 0x77, + 0x5c, 0x86, 0x12, 0x3b, 0xc2, 0xd9, 0xb1, 0x88, 0xdb, 0xc5, 0xf0, 0xc2, 0x28, 0x6b, 0xf2, 0x9e, + 0x80, 0x99, 0x51, 0x29, 0xb9, 0x18, 0x49, 0x04, 0xa5, 0x98, 0x9f, 0x90, 0x08, 0xa4, 0x1c, 0xc0, + 0xc6, 0x5a, 0x2e, 0x61, 0x14, 0x1c, 0xe2, 0x6e, 0x91, 0xe0, 0x78, 0xac, 0x7d, 0x01, 0xd1, 0x8e, + 0x19, 0x79, 0x28, 0x2c, 0x43, 0x49, 0x7e, 0xd6, 0xcc, 0x28, 0x32, 0x9a, 0x4c, 0x74, 0xd2, 0x83, + 0x1b, 0x7c, 0x30, 0x1d, 0xf1, 0x5b, 0x65, 0x23, 0x71, 0xc8, 0x0d, 0x28, 0x6d, 0xf8, 0xde, 0xa3, + 0xc3, 0xea, 0x52, 0x30, 0x33, 0x76, 0xa1, 0x70, 0x79, 0x78, 0xe1, 0xcc, 0xe3, 0xa3, 0xb9, 0xa9, + 0x36, 0x83, 0x59, 0xae, 0xa3, 0x9e, 0xb4, 0x11, 0xe2, 0x9d, 0x62, 0x29, 0x57, 0xce, 0xdf, 0x29, + 0x96, 0xf2, 0xe5, 0x02, 0x17, 0x2f, 0xee, 0x14, 0x4b, 0xc5, 0xf2, 0xc0, 0x9d, 0x62, 0x69, 0x00, + 0x05, 0x8e, 0xe1, 0x32, 0xdc, 0x29, 0x96, 0x46, 0xca, 0xa3, 0xda, 0x69, 0x8f, 0x0c, 0x42, 0xaf, + 0xee, 0x35, 0xcc, 0xc2, 0x7d, 0xb3, 0x6a, 0x0e, 0x2e, 0x56, 0x16, 0xa9, 0x1f, 0x9a, 0x85, 0xca, + 0x56, 0xcd, 0x1c, 0x5b, 0x3a, 0x6c, 0xd9, 0x4d, 0xb7, 0xce, 0x8f, 0x4e, 0xb3, 0x70, 0x7b, 0x71, + 0xc3, 0xa8, 0xc0, 0x78, 0xfc, 0x2d, 0xab, 0x6e, 0x10, 0x92, 0x6b, 0x30, 0x2c, 0x21, 0x6c, 0xa3, + 0x2b, 0x64, 0x7e, 0xb5, 0x19, 0xe3, 0x18, 0xbf, 0x93, 0x07, 0x88, 0x4b, 0x9e, 0xd2, 0xb5, 0xf0, + 0x25, 0x6d, 0x2d, 0x9c, 0x4a, 0xae, 0x85, 0xae, 0xab, 0x80, 0xbc, 0x0b, 0x83, 0x4c, 0x2c, 0xe8, + 0x48, 0x91, 0xe8, 0x4c, 0x92, 0x14, 0x0b, 0x1f, 0xdc, 0x58, 0x18, 0x17, 0xc4, 0x83, 0x01, 0x42, + 0x4c, 0x41, 0xa6, 0x2c, 0xa3, 0x5f, 0x18, 0x8a, 0x07, 0x43, 0x2c, 0xa0, 0xcb, 0x10, 0x0d, 0xa8, + 0xe8, 0x50, 0x5c, 0x19, 0x6d, 0x39, 0xc8, 0x51, 0x29, 0x39, 0x0b, 0x6c, 0xc0, 0x45, 0xa7, 0x0e, + 0x3d, 0x3e, 0x9a, 0x2b, 0x74, 0x7c, 0x17, 0x27, 0x01, 0xb9, 0x06, 0x62, 0x1a, 0x88, 0x0e, 0x64, + 0xb3, 0x6f, 0xb2, 0x6e, 0x5b, 0x75, 0xea, 0x87, 0x71, 0x8f, 0xcf, 0xe4, 0xe4, 0x6c, 0x21, 0x6d, + 0xd0, 0xa7, 0xca, 0x4c, 0x11, 0xa7, 0xc1, 0xe5, 0xcc, 0x5e, 0xb9, 0xaa, 0xa1, 0x72, 0x31, 0xf2, + 0x82, 0x3c, 0x95, 0x1c, 0x5e, 0x66, 0xa5, 0x44, 0x4a, 0xbd, 0x02, 0x72, 0x03, 0xd8, 0x0c, 0x15, + 0xbd, 0x0f, 0xa2, 0x9e, 0xca, 0x56, 0x6d, 0xe1, 0x94, 0xe0, 0x34, 0x66, 0x1f, 0xa8, 0xe4, 0x0c, + 0x9b, 0xbc, 0x09, 0x6c, 0x0a, 0x8b, 0x7e, 0x27, 0x82, 0xe8, 0xf6, 0xe2, 0xc6, 0x62, 0xc3, 0xeb, + 0x38, 0xb5, 0xaf, 0xae, 0xc6, 0xc4, 0xbb, 0xf5, 0xb6, 0x4a, 0x7c, 0x7b, 0x71, 0x83, 0xbc, 0x09, + 0x03, 0x95, 0x6f, 0x77, 0x7c, 0x2a, 0xe4, 0x93, 0x51, 0x59, 0x27, 0x83, 0x2d, 0x9c, 0x11, 0x84, + 0x13, 0x36, 0xfb, 0xa9, 0xca, 0x75, 0x58, 0xce, 0x6a, 0xde, 0x5c, 0xad, 0x09, 0xd9, 0x83, 0x24, + 0xba, 0x65, 0x73, 0x55, 0x69, 0x76, 0xa8, 0x7d, 0x35, 0xa3, 0x22, 0xd7, 0x20, 0x5f, 0x59, 0xc2, + 0x1b, 0xd1, 0xc8, 0xfc, 0xb0, 0xac, 0x76, 0x69, 0x61, 0x5a, 0x90, 0x8c, 0xda, 0xea, 0x32, 0xc8, + 0x57, 0x96, 0xc8, 0x02, 0x0c, 0xdc, 0x3b, 0xac, 0x7d, 0x75, 0x55, 0x6c, 0x66, 0x53, 0x72, 0x5e, + 0x33, 0xd8, 0x3a, 0x2e, 0xfb, 0x20, 0x6e, 0x71, 0xf3, 0x30, 0xf8, 0x56, 0x43, 0x6d, 0x31, 0xa2, + 0x91, 0x0d, 0x18, 0xae, 0x38, 0x4d, 0xb7, 0x75, 0x3f, 0xa0, 0xfe, 0xcc, 0x08, 0xf2, 0x99, 0x49, + 0xb4, 0x3b, 0x2a, 0x5f, 0x98, 0x79, 0x7c, 0x34, 0x37, 0x6d, 0xb3, 0x9f, 0x56, 0x27, 0xa0, 0xbe, + 0xc2, 0x2d, 0x66, 0x42, 0x36, 0x00, 0xee, 0x79, 0xad, 0x5d, 0xaf, 0x12, 0x36, 0xec, 0x20, 0xb1, + 0x3d, 0xc6, 0x05, 0x91, 0xf8, 0x70, 0xaa, 0xc9, 0x60, 0x96, 0xcd, 0x80, 0x0a, 0x43, 0x85, 0x07, + 0xb9, 0x05, 0x83, 0xeb, 0xbe, 0x5d, 0x6f, 0xd0, 0x99, 0x31, 0xe4, 0x36, 0x2d, 0xb8, 0x71, 0xa0, + 0xfc, 0xd2, 0x19, 0xc1, 0xb0, 0xec, 0x21, 0x58, 0xbd, 0xa6, 0x70, 0xc4, 0xd9, 0x2d, 0x20, 0xe9, + 0x39, 0x99, 0x71, 0x49, 0x78, 0x45, 0xbd, 0x24, 0xc4, 0x8b, 0x7e, 0xd1, 0x6b, 0x36, 0xed, 0x96, + 0x83, 0xb4, 0x0f, 0xe6, 0x95, 0xbb, 0x83, 0xf1, 0x2d, 0x98, 0x4c, 0x75, 0xd6, 0x31, 0xf7, 0xbb, + 0x77, 0x60, 0x62, 0x89, 0xee, 0xd8, 0x9d, 0x46, 0x18, 0x9d, 0x24, 0x7c, 0x89, 0xe2, 0x4d, 0xcb, + 0xe1, 0x45, 0x96, 0x3c, 0x3e, 0xcc, 0x24, 0xb2, 0xf1, 0x36, 0x8c, 0x69, 0x9f, 0xcf, 0xae, 0x0a, + 0x95, 0x8e, 0xe3, 0x86, 0x38, 0x90, 0xb9, 0xf8, 0xaa, 0x60, 0x33, 0x20, 0x0e, 0x97, 0x19, 0x23, + 0x18, 0x7f, 0x4b, 0x95, 0x56, 0xc4, 0x4e, 0xc4, 0xae, 0xd5, 0x62, 0x3f, 0xc8, 0xc5, 0xb2, 0x53, + 0x6a, 0x3f, 0x88, 0x76, 0x83, 0x2b, 0x7c, 0x6d, 0xe6, 0x53, 0x6b, 0x73, 0x44, 0x8c, 0x44, 0xc1, + 0x3e, 0x08, 0xf8, 0x8a, 0x8c, 0x66, 0x6a, 0xe1, 0x93, 0xcf, 0xd4, 0x77, 0x61, 0xf4, 0x9e, 0xdd, + 0xb2, 0x77, 0xa9, 0xc3, 0xbe, 0x80, 0xef, 0x3d, 0xc3, 0x0b, 0xcf, 0x3e, 0x3e, 0x9a, 0x3b, 0xd3, + 0xe4, 0x70, 0xfc, 0x4a, 0x75, 0x12, 0x69, 0x04, 0xe4, 0xba, 0x5c, 0xd9, 0x03, 0x19, 0x2b, 0x7b, + 0x4c, 0xd4, 0x3e, 0x80, 0x2b, 0x5b, 0xac, 0x67, 0xe3, 0xff, 0x28, 0xe1, 0x37, 0x92, 0x57, 0x61, + 0xd0, 0xa4, 0xbb, 0xec, 0xa8, 0xc9, 0xc5, 0x83, 0xe4, 0x23, 0x44, 0xed, 0x18, 0x8e, 0x83, 0x72, + 0x06, 0x75, 0x82, 0x3d, 0x77, 0x27, 0x14, 0xbd, 0x13, 0xc9, 0x19, 0x02, 0xac, 0xc8, 0x19, 0x02, + 0xa2, 0x5f, 0x67, 0x39, 0x8c, 0xed, 0x7e, 0xe6, 0x52, 0x4d, 0x74, 0x9a, 0xec, 0x61, 0x73, 0x49, + 0xd9, 0x46, 0x7c, 0x4d, 0x4a, 0x60, 0xd8, 0xe4, 0x26, 0x0c, 0x57, 0xea, 0x75, 0xaf, 0xa3, 0xdc, + 0x19, 0xf9, 0xba, 0xe5, 0x40, 0x5d, 0x45, 0x12, 0xa3, 0x92, 0x1a, 0x8c, 0x2c, 0xb3, 0x8b, 0x96, + 0xbb, 0x68, 0xd7, 0xf7, 0x64, 0x27, 0xc9, 0x3d, 0x4c, 0x29, 0x89, 0x57, 0x2e, 0x45, 0x60, 0x9d, + 0x01, 0x55, 0x25, 0x83, 0x82, 0x4b, 0x36, 0x61, 0xa4, 0x46, 0xeb, 0x3e, 0x0d, 0x6b, 0xa1, 0xe7, + 0xd3, 0xc4, 0x96, 0xac, 0x94, 0x2c, 0x3c, 0x27, 0xef, 0x7a, 0x01, 0x02, 0xad, 0x80, 0x41, 0x55, + 0xae, 0x0a, 0x32, 0x17, 0xda, 0x9b, 0x9e, 0x7f, 0xb8, 0xb4, 0x20, 0xb6, 0xe9, 0xf8, 0x4c, 0xe7, + 0x60, 0x55, 0x68, 0x67, 0x10, 0x67, 0x5b, 0x17, 0xda, 0x39, 0x16, 0x8e, 0xd4, 0x52, 0x0d, 0x65, + 0x2b, 0xb1, 0x69, 0x4f, 0xc4, 0xbd, 0x8c, 0x60, 0x65, 0xa4, 0x9c, 0x00, 0x25, 0x33, 0x6d, 0xa4, + 0x04, 0x16, 0x69, 0x03, 0x91, 0xa3, 0xc6, 0x05, 0xdd, 0x06, 0x0d, 0x02, 0xb1, 0x97, 0x9f, 0x4d, + 0x0c, 0x7e, 0x8c, 0xb0, 0xf0, 0xa2, 0x60, 0x7e, 0x5e, 0x4e, 0x03, 0x71, 0x4f, 0x63, 0x85, 0x4a, + 0x3d, 0x19, 0xbc, 0xc9, 0x1b, 0x00, 0xcb, 0x8f, 0x42, 0xea, 0xb7, 0xec, 0x46, 0xa4, 0x07, 0x43, + 0xd5, 0x0f, 0x15, 0x50, 0x7d, 0xa0, 0x15, 0x64, 0xb2, 0x08, 0x63, 0x95, 0x20, 0xe8, 0x34, 0xa9, + 0xe9, 0x35, 0x68, 0xc5, 0x5c, 0xc3, 0x7d, 0x7f, 0x78, 0xe1, 0xfc, 0xe3, 0xa3, 0xb9, 0xb3, 0x36, + 0x16, 0x58, 0xbe, 0xd7, 0xa0, 0x96, 0xed, 0xab, 0xb3, 0x5b, 0xa7, 0x21, 0xeb, 0x00, 0xeb, 0x6d, + 0xda, 0xaa, 0x51, 0xdb, 0xaf, 0xef, 0x25, 0xb6, 0xf9, 0xb8, 0x60, 0xe1, 0x9c, 0xf8, 0xc2, 0x69, + 0xaf, 0x4d, 0x5b, 0x01, 0xc2, 0xd4, 0x56, 0xc5, 0x98, 0x64, 0x0b, 0x26, 0xaa, 0x95, 0x7b, 0x1b, + 0x5e, 0xc3, 0xad, 0x1f, 0x0a, 0xc9, 0x69, 0x1c, 0xb5, 0x83, 0xa7, 0x05, 0xd7, 0x44, 0x29, 0xdf, + 0x9e, 0x5c, 0xbb, 0x69, 0xb5, 0x11, 0x6a, 0x09, 0xf9, 0x29, 0xc9, 0x85, 0xbc, 0xcf, 0xe6, 0x60, + 0xc0, 0x84, 0xc1, 0x4d, 0x7b, 0x37, 0x98, 0x99, 0xd0, 0xb4, 0x5d, 0x95, 0xad, 0xda, 0x55, 0xa5, + 0x94, 0x8b, 0x29, 0xb3, 0x7c, 0x22, 0x22, 0xd4, 0x0a, 0xed, 0xdd, 0x40, 0x9f, 0x88, 0x11, 0xf6, + 0xec, 0x3b, 0x50, 0x4e, 0x12, 0x9f, 0x50, 0xe9, 0x34, 0x56, 0x1e, 0x57, 0x5a, 0xbc, 0xfc, 0xc8, + 0x0d, 0xc2, 0xc0, 0xf8, 0x41, 0x6d, 0xd5, 0xb0, 0x15, 0x7d, 0x97, 0x1e, 0x6e, 0xf8, 0x74, 0xc7, + 0x7d, 0x24, 0x36, 0x20, 0x5c, 0xd1, 0xfb, 0xf4, 0xd0, 0x6a, 0x23, 0x54, 0x5d, 0xd1, 0x11, 0x2a, + 0xf9, 0x22, 0x94, 0xee, 0xde, 0xab, 0xdd, 0xa5, 0x87, 0xd5, 0x25, 0x71, 0xb8, 0x70, 0xb2, 0x66, + 0x60, 0x31, 0x52, 0x6d, 0x7e, 0x44, 0x98, 0xc6, 0x42, 0xbc, 0x7b, 0xb1, 0x9a, 0x17, 0x1b, 0x9d, + 0x20, 0xa4, 0x7e, 0x75, 0x49, 0xad, 0xb9, 0xce, 0x81, 0x89, 0xbd, 0x24, 0x42, 0x35, 0xfe, 0x7e, + 0x1e, 0x77, 0x2e, 0x36, 0x49, 0xab, 0xad, 0x20, 0xb4, 0x5b, 0x75, 0x1a, 0x31, 0xc0, 0x49, 0xea, + 0x0a, 0x68, 0x62, 0x92, 0xc6, 0xc8, 0x7a, 0xd5, 0xf9, 0xbe, 0xab, 0x66, 0x55, 0x4a, 0x6d, 0x43, + 0x75, 0x49, 0x55, 0x89, 0xfa, 0x02, 0x9a, 0xa8, 0x32, 0x46, 0x26, 0x97, 0x60, 0xa8, 0x5a, 0xb9, + 0x57, 0xe9, 0x84, 0x7b, 0xb8, 0x6f, 0x96, 0xb8, 0x4c, 0xcd, 0x66, 0x98, 0xdd, 0x09, 0xf7, 0x4c, + 0x59, 0x48, 0xae, 0xe1, 0x5d, 0xa5, 0x45, 0x43, 0xae, 0x3a, 0x15, 0x07, 0x65, 0xc0, 0x41, 0x89, + 0xab, 0x0a, 0x03, 0x91, 0x97, 0x61, 0xe0, 0xc1, 0xc6, 0x62, 0x75, 0x49, 0x5c, 0x76, 0xf1, 0xf4, + 0x78, 0xd8, 0xae, 0xeb, 0x2d, 0xe1, 0x28, 0xc6, 0x6f, 0xe5, 0xe2, 0x3d, 0x89, 0x5c, 0xd2, 0x64, + 0x08, 0x54, 0x94, 0x30, 0x19, 0x42, 0x55, 0x94, 0xa0, 0x34, 0x61, 0x02, 0x59, 0xec, 0x04, 0xa1, + 0xd7, 0x5c, 0x6e, 0x39, 0x6d, 0xcf, 0x6d, 0x85, 0x48, 0xc5, 0x7b, 0xcd, 0x78, 0x7c, 0x34, 0xf7, + 0x5c, 0x1d, 0x4b, 0x2d, 0x2a, 0x8a, 0xad, 0x04, 0x97, 0x0c, 0xea, 0x4f, 0xd1, 0x91, 0xc6, 0xef, + 0xe5, 0xb5, 0xb3, 0x84, 0x35, 0xcf, 0xa4, 0xed, 0x86, 0x5b, 0xc7, 0xeb, 0xf3, 0x6d, 0xdf, 0xeb, + 0xb4, 0xa3, 0xe9, 0x80, 0xcd, 0xf3, 0xe3, 0x52, 0x6b, 0x97, 0x15, 0xeb, 0xbc, 0x33, 0xa8, 0xc9, + 0x7b, 0x30, 0xca, 0x8e, 0x75, 0xf1, 0x33, 0x98, 0xc9, 0xe3, 0x48, 0x9c, 0x43, 0x95, 0x57, 0x40, + 0xfd, 0x88, 0x8d, 0x26, 0x0f, 0xa8, 0x14, 0xc4, 0x81, 0x99, 0x4d, 0xdf, 0x6e, 0x05, 0x6e, 0xb8, + 0xdc, 0xaa, 0xfb, 0x87, 0x28, 0x86, 0x2c, 0xb7, 0xec, 0xed, 0x06, 0x75, 0xf0, 0x73, 0x4b, 0x0b, + 0x97, 0x1f, 0x1f, 0xcd, 0xbd, 0x10, 0x72, 0x1c, 0x8b, 0x46, 0x48, 0x16, 0xe5, 0x58, 0x0a, 0xe7, + 0xae, 0x9c, 0x98, 0xd8, 0x22, 0xbb, 0x15, 0x5f, 0x3c, 0xf8, 0x89, 0x8c, 0x62, 0x4b, 0x34, 0x1a, + 0x6c, 0x2b, 0x52, 0x9b, 0xa9, 0x12, 0x18, 0xff, 0x2c, 0x17, 0x9f, 0x76, 0xe4, 0x2d, 0x18, 0x11, + 0x53, 0x5d, 0x99, 0x17, 0xb8, 0x5d, 0xc9, 0x75, 0x91, 0x18, 0x59, 0x15, 0x9d, 0x5d, 0xb2, 0x2b, + 0x8b, 0xab, 0xca, 0xdc, 0xc0, 0x4b, 0xb6, 0x5d, 0x6f, 0x24, 0xa9, 0x24, 0x1a, 0x9b, 0x04, 0x9b, + 0xab, 0x35, 0xbd, 0x57, 0x70, 0x12, 0x84, 0x8d, 0x20, 0xa3, 0x1b, 0x14, 0xe4, 0x4f, 0xff, 0xe1, + 0xff, 0x6d, 0x2e, 0xeb, 0x50, 0x25, 0x0b, 0x30, 0xb6, 0xe5, 0xf9, 0xfb, 0x38, 0xbe, 0x4a, 0x27, + 0xe0, 0xc8, 0x1f, 0xc8, 0x82, 0xe4, 0x07, 0xe9, 0x24, 0x6a, 0xdb, 0x94, 0xde, 0xd0, 0xdb, 0x96, + 0xe0, 0xa0, 0x11, 0xb0, 0x71, 0x88, 0x38, 0x46, 0xab, 0x03, 0xc7, 0x21, 0x6e, 0x82, 0x36, 0x85, + 0x55, 0x74, 0xe3, 0x3f, 0xcc, 0xa9, 0x87, 0x27, 0xeb, 0xe4, 0x25, 0xaf, 0x69, 0xbb, 0x2d, 0xe5, + 0x73, 0xf8, 0x2b, 0x0e, 0x42, 0x93, 0x2d, 0x51, 0x90, 0xc9, 0x0d, 0x28, 0xf1, 0x5f, 0xd1, 0x26, + 0x89, 0x2a, 0x24, 0x41, 0xa8, 0xef, 0xf0, 0x12, 0x31, 0x35, 0x32, 0x85, 0x93, 0x8e, 0xcc, 0x0f, + 0xe5, 0x60, 0x44, 0xb9, 0x4f, 0xb3, 0xbd, 0x7a, 0xc3, 0xf7, 0x3e, 0xa2, 0xf5, 0x50, 0x3f, 0x26, + 0xda, 0x1c, 0x98, 0xd8, 0xab, 0x23, 0xd4, 0xc4, 0xf1, 0x90, 0x3f, 0xc1, 0xf1, 0x60, 0xfc, 0xd3, + 0x9c, 0x90, 0xe6, 0xfb, 0xde, 0x23, 0xf5, 0xfd, 0x2c, 0x7f, 0x92, 0x83, 0xe1, 0x3d, 0x18, 0x30, + 0xa9, 0xe3, 0x06, 0x42, 0x12, 0x9f, 0x54, 0x6f, 0x0e, 0x58, 0x10, 0x5f, 0x5e, 0x7c, 0xf6, 0x53, + 0xdd, 0xd5, 0xb1, 0x9c, 0x89, 0x5c, 0xd5, 0xe0, 0x56, 0x83, 0x3e, 0x72, 0xf9, 0x4c, 0x16, 0x07, + 0x0c, 0x8a, 0x5c, 0x6e, 0x60, 0xed, 0xb0, 0x12, 0x21, 0xfb, 0xa9, 0xb3, 0x56, 0xa3, 0x31, 0xde, + 0x07, 0x88, 0xab, 0x24, 0x77, 0xa1, 0x2c, 0xd6, 0xb6, 0xdb, 0xda, 0xe5, 0xe2, 0x83, 0xe8, 0x83, + 0xb9, 0xc7, 0x47, 0x73, 0xcf, 0xd6, 0xa3, 0x32, 0x21, 0x1f, 0x29, 0x7c, 0x53, 0x84, 0xc6, 0xbf, + 0x99, 0x87, 0x7c, 0x05, 0x07, 0xe4, 0x2e, 0x3d, 0x0c, 0xed, 0xed, 0x5b, 0x6e, 0x43, 0x9b, 0x89, + 0xfb, 0x08, 0xb5, 0x76, 0x5c, 0xed, 0x62, 0xad, 0x20, 0xb3, 0x99, 0x78, 0xd7, 0xdf, 0x7e, 0x1d, + 0x09, 0x95, 0x99, 0xb8, 0xef, 0x6f, 0xbf, 0x9e, 0x24, 0x8b, 0x10, 0x89, 0x01, 0x83, 0x7c, 0x56, + 0x8a, 0x39, 0x08, 0x8f, 0x8f, 0xe6, 0x06, 0xf9, 0xe4, 0x35, 0x45, 0x09, 0x39, 0x0b, 0x85, 0xda, + 0xc6, 0x9a, 0xd8, 0x3e, 0x50, 0x81, 0x15, 0xb4, 0x5b, 0x26, 0x83, 0xb1, 0x3a, 0x57, 0x97, 0x2a, + 0x1b, 0x78, 0x65, 0x1d, 0x88, 0xeb, 0x6c, 0x38, 0x76, 0x3b, 0x79, 0x69, 0x8d, 0x10, 0xc9, 0xdb, + 0x30, 0x72, 0x77, 0x69, 0x71, 0xc5, 0x0b, 0xf8, 0xd2, 0x1f, 0x8c, 0x27, 0xff, 0xbe, 0x53, 0xb7, + 0x50, 0x67, 0x9c, 0xdc, 0x43, 0x15, 0x7c, 0xe3, 0xc7, 0xf2, 0x30, 0xa2, 0x68, 0x74, 0xc8, 0x17, + 0xc5, 0x53, 0x5e, 0x4e, 0x93, 0x55, 0x15, 0x0c, 0x56, 0xca, 0xaf, 0xff, 0x4d, 0xcf, 0xa1, 0xe2, + 0x61, 0x2f, 0xbe, 0x6a, 0xe7, 0xfb, 0xb9, 0x6a, 0xbf, 0x01, 0xc0, 0xe7, 0x00, 0x36, 0x59, 0x39, + 0x8b, 0x95, 0x17, 0x7d, 0x75, 0x5c, 0x62, 0x64, 0xf2, 0x00, 0xa6, 0x36, 0xfd, 0x4e, 0x10, 0xd6, + 0x0e, 0x83, 0x90, 0x36, 0x19, 0xb7, 0x0d, 0xcf, 0x6b, 0x88, 0xf9, 0xf7, 0xc2, 0xe3, 0xa3, 0xb9, + 0x0b, 0x21, 0x2b, 0xb6, 0x02, 0x2c, 0xc7, 0x06, 0x58, 0x6d, 0xcf, 0x53, 0x2f, 0xe0, 0x59, 0x0c, + 0x0c, 0x13, 0x46, 0xd5, 0xeb, 0x3b, 0xdb, 0x96, 0xc5, 0xb3, 0x87, 0x50, 0xca, 0x2a, 0xdb, 0xb2, + 0x68, 0x65, 0xfa, 0x19, 0x46, 0x27, 0x31, 0xbe, 0xa8, 0xaa, 0x8e, 0xfa, 0x5d, 0xd8, 0xc6, 0x8f, + 0xe4, 0xe2, 0x6d, 0xe4, 0xc1, 0x75, 0xf2, 0x26, 0x0c, 0xf2, 0x67, 0x26, 0xf1, 0x1a, 0x77, 0x2a, + 0xba, 0x7e, 0xa9, 0x6f, 0x50, 0x5c, 0x67, 0xfb, 0xfb, 0xfc, 0x29, 0xfa, 0x19, 0x53, 0x90, 0x44, + 0xea, 0x5e, 0x5d, 0xf3, 0x23, 0xb9, 0xa3, 0x62, 0xf3, 0x7a, 0x96, 0xba, 0xd7, 0xf8, 0xed, 0x22, + 0x8c, 0xeb, 0x68, 0xea, 0x5b, 0x54, 0xae, 0xaf, 0xb7, 0xa8, 0xf7, 0xa0, 0xc4, 0xfa, 0xc3, 0xad, + 0x53, 0x29, 0xce, 0xbc, 0x80, 0x4a, 0x70, 0x01, 0xd3, 0xde, 0x58, 0x81, 0x0f, 0x07, 0xbb, 0x8d, + 0x99, 0x11, 0x15, 0x99, 0x57, 0x1e, 0x4c, 0x0a, 0xf1, 0x09, 0x2f, 0x1f, 0x4c, 0xd4, 0xf5, 0x10, + 0x3d, 0x9d, 0xbc, 0x06, 0x83, 0x4c, 0xaa, 0x8d, 0x94, 0x05, 0xd8, 0x4a, 0x26, 0xf0, 0x26, 0x8c, + 0x29, 0x38, 0x12, 0xd9, 0x82, 0xd2, 0xaa, 0x1d, 0x84, 0x35, 0x4a, 0x5b, 0x7d, 0xbc, 0x32, 0xcf, + 0x89, 0xae, 0x9a, 0xc2, 0x27, 0xdc, 0x80, 0xd2, 0x56, 0xe2, 0x99, 0x30, 0x62, 0x46, 0x3e, 0x04, + 0x58, 0xf4, 0x5a, 0xa1, 0xef, 0x35, 0x56, 0xbd, 0xdd, 0x99, 0x41, 0xbc, 0xa5, 0x3d, 0x97, 0x18, + 0x80, 0x18, 0x81, 0x5f, 0xd4, 0x22, 0x55, 0x44, 0x9d, 0x17, 0x58, 0x0d, 0x6f, 0x57, 0x5d, 0x07, + 0x31, 0x3e, 0xb9, 0x05, 0x65, 0x79, 0x05, 0xbe, 0xdf, 0xde, 0xf5, 0x71, 0x82, 0x0c, 0xc5, 0xc7, + 0x36, 0x7d, 0x14, 0x5a, 0x1d, 0x01, 0x57, 0x77, 0xca, 0x24, 0x0d, 0xf9, 0x3a, 0x9c, 0x49, 0xc2, + 0xe4, 0x28, 0x97, 0x62, 0x81, 0x56, 0x65, 0x97, 0x31, 0xef, 0xbb, 0xb1, 0x30, 0x3e, 0xce, 0xc3, + 0x99, 0x2e, 0x1f, 0xcb, 0xd6, 0x03, 0x1e, 0xd7, 0xca, 0x7a, 0x48, 0x9c, 0xd2, 0xdc, 0x3a, 0xe6, + 0x02, 0xe4, 0xc5, 0x01, 0x57, 0x5c, 0x28, 0x3f, 0x3e, 0x9a, 0x1b, 0xd5, 0xc6, 0x31, 0x5f, 0x5d, + 0x22, 0x77, 0xa0, 0xc8, 0x86, 0xa8, 0x8f, 0x47, 0x5e, 0xa9, 0xfd, 0x18, 0x0f, 0x5d, 0x75, 0xfa, + 0xe0, 0xd0, 0x21, 0x0f, 0xf2, 0x45, 0x28, 0x6c, 0x6e, 0xae, 0xe2, 0xdc, 0x29, 0xe0, 0xb7, 0x8f, + 0x85, 0x61, 0x43, 0x9b, 0xaa, 0x63, 0x8c, 0xf6, 0x6a, 0x64, 0x13, 0xc0, 0xd0, 0xc9, 0xd7, 0x12, + 0xc6, 0x27, 0x2f, 0xf7, 0x1e, 0xe8, 0xfe, 0x6d, 0x51, 0x3e, 0x85, 0x09, 0x88, 0xf1, 0xf3, 0xf9, + 0x78, 0x0d, 0xdf, 0x72, 0x1b, 0x21, 0xf5, 0xc9, 0x2c, 0x5f, 0x92, 0xf1, 0xfd, 0xd7, 0x8c, 0x7e, + 0x93, 0x99, 0x78, 0x7d, 0x73, 0x56, 0xd1, 0x42, 0x7e, 0x59, 0x59, 0xc8, 0x05, 0x5c, 0xc8, 0xe3, + 0x5d, 0x97, 0xec, 0xcb, 0x19, 0xf3, 0x12, 0x17, 0x62, 0xc6, 0xdc, 0x7b, 0x01, 0xc6, 0xd6, 0xbc, + 0xe5, 0x47, 0x61, 0x84, 0xc8, 0x16, 0x60, 0xc9, 0xd4, 0x81, 0x8c, 0xe3, 0x7a, 0xc3, 0xa1, 0xfe, + 0xe6, 0x9e, 0xdd, 0xd2, 0x5e, 0x59, 0xcd, 0x14, 0x9c, 0xe1, 0xae, 0xd1, 0x03, 0x1d, 0x77, 0x88, + 0xe3, 0x26, 0xe1, 0xc6, 0x0f, 0xe7, 0x65, 0x67, 0x3c, 0x98, 0x7f, 0x4a, 0x5f, 0xf3, 0x5e, 0xd7, + 0x5e, 0xf3, 0xa6, 0x22, 0x3d, 0x64, 0xf4, 0x34, 0x3d, 0x7f, 0xcc, 0x8b, 0xf6, 0x7f, 0x37, 0x00, + 0xa3, 0x2a, 0x3a, 0xeb, 0x87, 0x8a, 0xe3, 0xf8, 0x6a, 0x3f, 0xd8, 0x8e, 0xe3, 0x9b, 0x08, 0xd5, + 0x1e, 0xb0, 0x0b, 0x3d, 0x1f, 0xb0, 0xbf, 0x01, 0xc3, 0x8b, 0x4d, 0x47, 0x7b, 0x56, 0x33, 0x32, + 0x9a, 0x77, 0x35, 0x42, 0xe2, 0x6b, 0x21, 0x52, 0xaf, 0xd5, 0x9b, 0x4e, 0xfa, 0x31, 0x2d, 0x66, + 0xa9, 0xbd, 0x7d, 0x0f, 0x7c, 0x9a, 0xb7, 0xef, 0x9b, 0x30, 0x7c, 0x3f, 0xa0, 0x9b, 0x9d, 0x56, + 0x8b, 0x36, 0x70, 0x5a, 0x95, 0xb8, 0xac, 0xdf, 0x09, 0xa8, 0x15, 0x22, 0x54, 0x6d, 0x40, 0x84, + 0xaa, 0x0e, 0xf0, 0x50, 0x8f, 0x01, 0xbe, 0x01, 0xa5, 0x0d, 0x4a, 0x7d, 0xec, 0xd3, 0x91, 0x58, + 0xa4, 0x6b, 0x53, 0xea, 0x5b, 0xac, 0x63, 0xb5, 0x37, 0x71, 0x81, 0xa8, 0x3d, 0xa4, 0x8f, 0xf6, + 0xf9, 0x90, 0x4e, 0x9e, 0x87, 0xd1, 0x76, 0x67, 0xbb, 0xe1, 0xd6, 0x91, 0xaf, 0x78, 0x81, 0x37, + 0x47, 0x38, 0x8c, 0xb1, 0x0d, 0xc8, 0xd7, 0x60, 0x0c, 0xef, 0x38, 0xd1, 0x94, 0x1b, 0xd7, 0xde, + 0x9f, 0xb4, 0x32, 0x2e, 0xe9, 0xd4, 0x19, 0xc8, 0xca, 0x30, 0x14, 0xd1, 0x19, 0xcd, 0xd6, 0x60, + 0x5c, 0x1f, 0xc9, 0x27, 0xf0, 0x0c, 0x15, 0x19, 0x05, 0x94, 0xca, 0xc3, 0x77, 0x8a, 0x25, 0x28, + 0x8f, 0x70, 0x73, 0x00, 0x13, 0x36, 0xa2, 0x6f, 0x32, 0xc9, 0xdd, 0xce, 0x36, 0xf5, 0x5b, 0x34, + 0xa4, 0x81, 0xb8, 0x04, 0x04, 0x66, 0xb1, 0xd2, 0x6e, 0x07, 0xc6, 0xaf, 0xe7, 0x61, 0xa8, 0xb2, + 0x55, 0xab, 0xb6, 0x76, 0x3c, 0x7c, 0x4c, 0x8a, 0xde, 0x10, 0xd4, 0xc7, 0xa4, 0xe8, 0x0d, 0x41, + 0x7d, 0x39, 0xb8, 0x96, 0x71, 0x8d, 0x43, 0x7b, 0x53, 0xe5, 0x1a, 0xa7, 0xe9, 0xf6, 0xe2, 0xe7, + 0x94, 0x42, 0x1f, 0xcf, 0x29, 0x91, 0xf6, 0xac, 0x78, 0xac, 0xf6, 0x8c, 0xbc, 0x09, 0x23, 0xd5, + 0x56, 0x48, 0x77, 0xfd, 0x78, 0xa6, 0x47, 0x57, 0xca, 0x08, 0xac, 0x8a, 0xf6, 0x0a, 0x36, 0x9b, + 0x46, 0x5c, 0x63, 0x17, 0x69, 0xea, 0x70, 0x1a, 0x71, 0xc5, 0x5e, 0xe2, 0x32, 0x2d, 0x11, 0x8d, + 0xa5, 0xc4, 0x1c, 0x91, 0x4f, 0xd6, 0x5c, 0xf8, 0x1c, 0x8f, 0xd5, 0xcc, 0xac, 0x63, 0x17, 0x26, + 0xb3, 0x9f, 0xac, 0x8d, 0xef, 0xe4, 0x61, 0xa4, 0xd2, 0x6e, 0x3f, 0xe5, 0x86, 0x43, 0x5f, 0xd6, + 0xb6, 0x57, 0x79, 0x17, 0x8a, 0xbe, 0xab, 0x2f, 0x9b, 0xa1, 0x5f, 0xc9, 0xc3, 0x44, 0x82, 0x42, + 0x6d, 0x7d, 0xae, 0x4f, 0x73, 0xa1, 0x7c, 0x9f, 0xe6, 0x42, 0x85, 0xfe, 0xcc, 0x85, 0x8a, 0x9f, + 0x66, 0xcb, 0x7c, 0x09, 0x0a, 0x95, 0x76, 0x3b, 0xf9, 0xec, 0xd8, 0x6e, 0x3f, 0xb8, 0xc1, 0xef, + 0xb3, 0x76, 0xbb, 0x6d, 0x32, 0x0c, 0x6d, 0x1f, 0x1b, 0xec, 0x73, 0x1f, 0x33, 0x5e, 0x83, 0x61, + 0xe4, 0x85, 0x46, 0x3a, 0x17, 0x00, 0x17, 0xb3, 0xb0, 0xcf, 0xd1, 0xea, 0x12, 0xcb, 0xfc, 0xff, + 0xce, 0xc1, 0x00, 0xfe, 0x7e, 0x4a, 0xe7, 0xd8, 0xbc, 0x36, 0xc7, 0xca, 0xca, 0x1c, 0xeb, 0x67, + 0x76, 0xfd, 0x6f, 0x45, 0xec, 0x2d, 0x31, 0xaf, 0x84, 0x6d, 0x4c, 0x2e, 0xc3, 0x36, 0xe6, 0x0d, + 0x50, 0x76, 0x4d, 0x55, 0x5b, 0xa4, 0x9c, 0x19, 0xea, 0x4d, 0x23, 0x46, 0x26, 0xfb, 0x49, 0x2b, + 0x99, 0x02, 0x0e, 0xc6, 0xc5, 0x64, 0x53, 0x9f, 0x88, 0x81, 0xcc, 0x0a, 0x90, 0x6a, 0x2b, 0xa0, + 0xf5, 0x8e, 0x4f, 0x6b, 0xfb, 0x6e, 0xfb, 0x01, 0xf5, 0xdd, 0x9d, 0x43, 0x71, 0xbb, 0xc7, 0x73, + 0xd9, 0x15, 0xa5, 0x56, 0xb0, 0xef, 0xb6, 0xd9, 0x55, 0xc4, 0xdd, 0x39, 0x34, 0x33, 0x68, 0xc8, + 0xbb, 0x30, 0x64, 0xd2, 0x03, 0xdf, 0x0d, 0xe5, 0xdb, 0xef, 0x78, 0x74, 0x71, 0x46, 0x28, 0xbf, + 0x18, 0xfa, 0xfc, 0x87, 0x3a, 0xfe, 0xa2, 0x9c, 0xcc, 0xf3, 0x8d, 0x8f, 0xbf, 0xf1, 0x8e, 0xc5, + 0x5f, 0x5b, 0xd9, 0xaa, 0x75, 0xdb, 0xf7, 0xc8, 0x15, 0x18, 0xc0, 0xdd, 0x53, 0xc8, 0x04, 0x68, + 0x33, 0x8d, 0x67, 0xa8, 0xba, 0xb5, 0x23, 0x06, 0x79, 0x0e, 0x20, 0x52, 0xdf, 0x07, 0x33, 0x25, + 0x3c, 0xad, 0x15, 0x48, 0x72, 0xeb, 0x1f, 0x3e, 0xc9, 0xd6, 0xff, 0xd9, 0x99, 0x86, 0xfc, 0x4a, + 0x1e, 0x2e, 0x46, 0xdb, 0xd9, 0xba, 0x5f, 0xab, 0xdc, 0x5b, 0xad, 0x3a, 0x1b, 0x42, 0xfa, 0xdf, + 0xf0, 0xbd, 0x87, 0x2e, 0xbb, 0xfd, 0x5d, 0x3f, 0x66, 0x31, 0xae, 0xf2, 0x59, 0xcb, 0x55, 0x87, + 0x79, 0xed, 0x11, 0x5d, 0x39, 0x35, 0xc4, 0x3b, 0x7f, 0xbb, 0x9d, 0xd2, 0x24, 0xae, 0x3c, 0x63, + 0xc6, 0x0c, 0xc8, 0x8f, 0xe4, 0xe0, 0x74, 0x76, 0x43, 0xc4, 0x8d, 0x70, 0x4e, 0x4a, 0x9e, 0x5d, + 0x5a, 0xbb, 0xf0, 0xd2, 0xe3, 0xa3, 0xb9, 0x8b, 0x81, 0xdd, 0x6c, 0x58, 0xae, 0xc3, 0x6b, 0x73, + 0xeb, 0xd4, 0x6a, 0x0b, 0x04, 0xad, 0xde, 0x2e, 0x35, 0x7d, 0x05, 0xe4, 0x9a, 0x9c, 0xc9, 0x2d, + 0x00, 0x94, 0xa4, 0x76, 0xc6, 0xf8, 0x7b, 0x39, 0x50, 0x66, 0x54, 0xc9, 0xa4, 0x8e, 0xeb, 0xd3, + 0x7a, 0x88, 0x3b, 0x5a, 0xe4, 0x02, 0xc0, 0x61, 0x09, 0x9b, 0x09, 0x84, 0x91, 0x77, 0x60, 0x88, + 0xeb, 0x72, 0xb8, 0x0e, 0x25, 0x9e, 0x89, 0x42, 0xef, 0xc3, 0x7d, 0x45, 0x38, 0x86, 0x3a, 0x8b, + 0x05, 0x11, 0x93, 0x6f, 0xef, 0x6c, 0x6d, 0x2e, 0x36, 0x6c, 0xb7, 0x19, 0x88, 0x7d, 0x0c, 0xbb, + 0xf5, 0xa3, 0x83, 0xd0, 0xaa, 0x23, 0x54, 0x95, 0x6f, 0x23, 0x54, 0xe3, 0xb6, 0x54, 0x3b, 0x1d, + 0x63, 0xf8, 0x33, 0x07, 0x03, 0x0f, 0xe2, 0xeb, 0xe7, 0xc2, 0xf0, 0xe3, 0xa3, 0x39, 0x3e, 0x5d, + 0x4c, 0x0e, 0x37, 0xfe, 0x6a, 0x0e, 0xc6, 0xf5, 0xf9, 0x44, 0xae, 0xc2, 0xa0, 0x30, 0xbf, 0xcf, + 0xe1, 0x35, 0x9b, 0xf5, 0xc2, 0x20, 0x37, 0xbc, 0xd7, 0xcc, 0xed, 0x05, 0x16, 0xdb, 0x89, 0x05, + 0x07, 0xa1, 0x47, 0xc2, 0x9d, 0xb8, 0xce, 0x41, 0xa6, 0x2c, 0x23, 0x06, 0x13, 0xc3, 0x82, 0x4e, + 0x23, 0x54, 0xb5, 0xaf, 0x3e, 0x42, 0x4c, 0x51, 0x62, 0x2c, 0xc2, 0x20, 0x5f, 0xc2, 0x09, 0x83, + 0x83, 0xdc, 0x09, 0x0c, 0x0e, 0x8c, 0xa3, 0x1c, 0x40, 0xad, 0xb6, 0x72, 0x97, 0x1e, 0x6e, 0xd8, + 0xae, 0x8f, 0xcf, 0x05, 0xb8, 0x5d, 0xde, 0x15, 0x8b, 0x6b, 0x54, 0x3c, 0x17, 0xf0, 0xad, 0x75, + 0x9f, 0x1e, 0x6a, 0xcf, 0x05, 0x12, 0x15, 0xf7, 0x64, 0xdf, 0x7d, 0x68, 0x87, 0x94, 0x11, 0xe6, + 0x91, 0x90, 0xef, 0xc9, 0x1c, 0x9a, 0xa0, 0x54, 0x90, 0xc9, 0x87, 0x30, 0x1e, 0xff, 0x8a, 0x1e, + 0x3d, 0xc6, 0xa3, 0x05, 0xac, 0x17, 0x2e, 0x3c, 0xf7, 0xf8, 0x68, 0x6e, 0x56, 0xe1, 0x9a, 0x7c, + 0x0e, 0x49, 0x30, 0x33, 0x7e, 0x29, 0x87, 0xef, 0x64, 0xf2, 0x03, 0x2f, 0x41, 0x31, 0x32, 0xa3, + 0x1a, 0xe5, 0x9a, 0x9a, 0x84, 0x62, 0x17, 0xcb, 0xc9, 0x45, 0x28, 0xc4, 0x5f, 0x82, 0x5b, 0xa4, + 0xfe, 0x05, 0xac, 0x94, 0xdc, 0x86, 0xa1, 0xbe, 0xda, 0x8c, 0x4b, 0x23, 0xa3, 0xad, 0x92, 0x1a, + 0x47, 0xe1, 0xce, 0xd6, 0xe6, 0xe7, 0x77, 0x14, 0x7e, 0x2a, 0x0f, 0x13, 0xac, 0x5f, 0x2b, 0x9d, + 0x70, 0xcf, 0xf3, 0xdd, 0xf0, 0xf0, 0xa9, 0xd5, 0x53, 0xbc, 0xa5, 0x09, 0x39, 0xb3, 0xf2, 0x94, + 0x51, 0xbf, 0xad, 0x2f, 0x75, 0xc5, 0xef, 0x0c, 0xc0, 0x54, 0x06, 0x15, 0x79, 0x55, 0x53, 0x25, + 0xce, 0x48, 0xf7, 0xba, 0x8f, 0x8f, 0xe6, 0x46, 0x25, 0xfa, 0x66, 0xec, 0x6e, 0x37, 0xaf, 0x3f, + 0x3a, 0xf3, 0x9e, 0x42, 0xcd, 0xa2, 0xfa, 0xe8, 0xac, 0x3f, 0x35, 0x5f, 0x81, 0x01, 0xd3, 0x6b, + 0x50, 0x69, 0x21, 0x81, 0x07, 0xbb, 0xcf, 0x00, 0xda, 0xdb, 0x18, 0x03, 0x90, 0x15, 0x18, 0x62, + 0x7f, 0xdc, 0xb3, 0xdb, 0x42, 0xeb, 0x4b, 0x22, 0x31, 0x1b, 0xa1, 0x6d, 0xb7, 0xb5, 0xab, 0x4a, + 0xda, 0x0d, 0x6a, 0x35, 0xed, 0xb6, 0x26, 0x81, 0x70, 0x44, 0x4d, 0x62, 0x2f, 0x75, 0x97, 0xd8, + 0x73, 0xc7, 0x4a, 0xec, 0x0e, 0x40, 0xcd, 0xdd, 0x6d, 0xb9, 0xad, 0xdd, 0x4a, 0x63, 0x57, 0x38, + 0x29, 0x5e, 0xe9, 0x3e, 0x0a, 0x57, 0x63, 0x64, 0x9c, 0xb8, 0xfc, 0x69, 0x86, 0xc3, 0x2c, 0xbb, + 0xa1, 0xa9, 0xa4, 0x63, 0x54, 0xb2, 0x06, 0x50, 0xa9, 0x87, 0xee, 0x43, 0x36, 0x81, 0x03, 0x61, + 0x7c, 0x2b, 0x1b, 0xbc, 0x58, 0xb9, 0x4b, 0x0f, 0x6b, 0x34, 0x8c, 0x55, 0xdc, 0x36, 0xa2, 0xb2, + 0x75, 0xa0, 0xd9, 0xc9, 0xc6, 0x1c, 0x48, 0x1b, 0x4e, 0x55, 0x1c, 0xc7, 0x65, 0x5f, 0x60, 0x37, + 0xf0, 0xcd, 0x86, 0x3a, 0xc8, 0x7a, 0x34, 0x9b, 0xf5, 0x15, 0xc1, 0xfa, 0x79, 0x3b, 0xa2, 0xb2, + 0x42, 0x4e, 0x96, 0xac, 0x26, 0x9b, 0xb1, 0xb1, 0x0e, 0xe3, 0xfa, 0xa7, 0xeb, 0xae, 0x95, 0xa3, + 0x50, 0x32, 0x6b, 0x15, 0xab, 0xb6, 0x52, 0xb9, 0x5e, 0xce, 0x91, 0x32, 0x8c, 0x8a, 0x5f, 0xf3, + 0xd6, 0xfc, 0xeb, 0x37, 0xcb, 0x79, 0x0d, 0xf2, 0xfa, 0xf5, 0xf9, 0x94, 0x47, 0xc3, 0x50, 0xb9, + 0xc4, 0x15, 0x19, 0xc6, 0xaf, 0xe6, 0xa0, 0x24, 0xdb, 0x4d, 0x6e, 0x42, 0xa1, 0x56, 0x5b, 0x49, + 0xf8, 0x20, 0xc4, 0xe7, 0x0b, 0xdf, 0x49, 0x83, 0x40, 0x35, 0x34, 0x63, 0x04, 0x8c, 0x6e, 0x73, + 0xb5, 0x26, 0xc4, 0x02, 0x49, 0x17, 0x6f, 0xdb, 0x9c, 0x2e, 0xc3, 0x30, 0xfb, 0x26, 0x14, 0xee, + 0x6c, 0x6d, 0x0a, 0x31, 0x5e, 0xd2, 0xc5, 0x3b, 0x29, 0xa7, 0xfb, 0xe8, 0x40, 0xdd, 0xdf, 0x19, + 0x81, 0x61, 0xc2, 0x88, 0x32, 0x85, 0xf9, 0x71, 0xdb, 0xf4, 0x22, 0x5f, 0x42, 0x71, 0xdc, 0x32, + 0x88, 0x29, 0x4a, 0x98, 0x74, 0xb0, 0xea, 0xd5, 0xed, 0x86, 0x38, 0xb7, 0x51, 0x3a, 0x68, 0x30, + 0x80, 0xc9, 0xe1, 0xc6, 0x6f, 0xe5, 0xa0, 0x8c, 0x32, 0x14, 0x1a, 0x9d, 0x79, 0xfb, 0xb4, 0xf5, + 0xe0, 0x3a, 0x79, 0x4d, 0x2e, 0xb6, 0x5c, 0x74, 0x69, 0x1c, 0xc0, 0xc5, 0x96, 0xd0, 0x3a, 0x8b, + 0x05, 0xa7, 0xb8, 0x6b, 0xe6, 0xfb, 0x77, 0xf3, 0x3a, 0xc6, 0x5d, 0x73, 0x0e, 0x06, 0xb0, 0x39, + 0x62, 0x5b, 0xc4, 0x96, 0x87, 0x0c, 0x60, 0x72, 0xb8, 0xb2, 0x2b, 0xfd, 0x4c, 0x3e, 0xf5, 0x0d, + 0xf3, 0x9f, 0x2b, 0x57, 0x29, 0xfd, 0xe3, 0xfa, 0xda, 0xa9, 0xdf, 0x87, 0xe9, 0x64, 0x97, 0xe0, + 0x85, 0xbe, 0x02, 0x13, 0x3a, 0x5c, 0xde, 0xed, 0xcf, 0x64, 0xd6, 0xf5, 0x60, 0xde, 0x4c, 0xe2, + 0x1b, 0xff, 0x53, 0x0e, 0x86, 0xf1, 0x4f, 0xb3, 0xd3, 0x40, 0x33, 0x88, 0xca, 0x56, 0x4d, 0x28, + 0xef, 0x54, 0x31, 0xce, 0x3e, 0x08, 0x2c, 0xa1, 0xdf, 0xd3, 0xf6, 0x97, 0x08, 0x59, 0x90, 0x72, + 0xad, 0x9c, 0x7c, 0xa1, 0x8c, 0x48, 0xb9, 0xfa, 0x2e, 0x48, 0x90, 0x0a, 0x64, 0xb4, 0x3c, 0xda, + 0xaa, 0xb1, 0xe9, 0xa7, 0xbe, 0x4b, 0x22, 0x9d, 0xd7, 0xd0, 0x2d, 0x8f, 0x38, 0x1a, 0x3e, 0x4b, + 0x6e, 0xd5, 0x2a, 0xe6, 0x9a, 0xf6, 0x2c, 0xc9, 0xda, 0xa8, 0x59, 0xa5, 0x0a, 0x24, 0xe3, 0x1f, + 0x0d, 0x27, 0x3b, 0x50, 0x1c, 0x75, 0x27, 0x5c, 0x1b, 0x6f, 0xc2, 0x40, 0xa5, 0xd1, 0xf0, 0x0e, + 0xc4, 0x2e, 0x21, 0xf5, 0x0b, 0x51, 0xff, 0xf1, 0x93, 0xcc, 0x66, 0x28, 0x9a, 0xfb, 0x07, 0x03, + 0x90, 0x45, 0x18, 0xae, 0x6c, 0xd5, 0xaa, 0xd5, 0xa5, 0xcd, 0x4d, 0x6e, 0xea, 0x5e, 0x58, 0x78, + 0x51, 0xf6, 0x8f, 0xeb, 0x3a, 0x56, 0xf2, 0x65, 0x2c, 0x96, 0xdc, 0x63, 0x3a, 0xf2, 0x36, 0xc0, + 0x1d, 0xcf, 0x6d, 0xdd, 0xa3, 0xe1, 0x9e, 0xe7, 0x88, 0x8f, 0x3f, 0xff, 0xf8, 0x68, 0x6e, 0xe4, + 0x23, 0xcf, 0x6d, 0x59, 0x4d, 0x04, 0xb3, 0xb6, 0xc7, 0x48, 0xa6, 0xf2, 0x37, 0xeb, 0xe9, 0x05, + 0x8f, 0x9b, 0x36, 0x0c, 0xc4, 0x3d, 0xbd, 0xed, 0xa5, 0xac, 0x1a, 0x24, 0x1a, 0x69, 0xc2, 0x44, + 0xad, 0xb3, 0xbb, 0x4b, 0xd9, 0xae, 0x2e, 0x34, 0x16, 0x83, 0xe2, 0x76, 0x1b, 0x05, 0x18, 0xe0, + 0x37, 0x11, 0x76, 0x3f, 0x09, 0x16, 0x5e, 0x65, 0x13, 0xf9, 0xfb, 0x47, 0x73, 0xe2, 0xc5, 0x8d, + 0x09, 0x69, 0x81, 0xa4, 0x4f, 0xeb, 0x2b, 0x92, 0xbc, 0xc9, 0x3a, 0x0c, 0xde, 0x76, 0xc3, 0x95, + 0xce, 0xb6, 0x30, 0xdd, 0x7e, 0xbe, 0xc7, 0xa2, 0xe1, 0x88, 0x5c, 0xe5, 0xbb, 0xeb, 0x86, 0x7b, + 0x1d, 0xd5, 0x8c, 0x5b, 0xb0, 0x21, 0x5b, 0x50, 0x5a, 0x74, 0xfd, 0x7a, 0x83, 0x2e, 0x56, 0xc5, + 0xa9, 0x7f, 0xb1, 0x07, 0x4b, 0x89, 0xca, 0xfb, 0xa5, 0x8e, 0xbf, 0xea, 0xae, 0x2a, 0x05, 0x48, + 0x0c, 0xf2, 0xd7, 0x73, 0xf0, 0x6c, 0xd4, 0xfa, 0xca, 0x2e, 0x6d, 0x85, 0xf7, 0xec, 0xb0, 0xbe, + 0x47, 0x7d, 0xd1, 0x4b, 0xc3, 0xbd, 0x7a, 0xe9, 0x2b, 0xa9, 0x5e, 0xba, 0x1c, 0xf7, 0x92, 0xcd, + 0x98, 0x59, 0x4d, 0xce, 0x2d, 0xdd, 0x67, 0xbd, 0x6a, 0x25, 0x16, 0x40, 0xac, 0xc3, 0x17, 0xae, + 0x3f, 0x2f, 0xf6, 0xf8, 0xe0, 0x18, 0x59, 0x98, 0xff, 0x46, 0xbf, 0x35, 0x4b, 0x9e, 0x08, 0x4a, + 0xee, 0x4a, 0x3f, 0x09, 0x2e, 0x91, 0x5c, 0xe8, 0xc1, 0x9b, 0xfb, 0x4e, 0x4c, 0xf5, 0xf0, 0x88, + 0xe2, 0xa3, 0xbd, 0x6a, 0x6f, 0x0b, 0x21, 0xe4, 0x98, 0xd1, 0x5e, 0xb5, 0xe3, 0xd1, 0x6e, 0xd8, + 0xc9, 0xd1, 0x5e, 0xb5, 0xb7, 0xc9, 0x22, 0x77, 0xee, 0xe2, 0x9e, 0x40, 0xcf, 0xf5, 0xe2, 0xb6, + 0xb8, 0xc1, 0x4f, 0xe6, 0x0c, 0x27, 0xaf, 0x0f, 0x60, 0xb8, 0xd6, 0xb6, 0xeb, 0xb4, 0xe1, 0xee, + 0x84, 0xe2, 0x51, 0xe7, 0x85, 0x1e, 0xac, 0x22, 0x5c, 0xf1, 0x20, 0x20, 0x7f, 0xaa, 0x17, 0xa4, + 0x08, 0x87, 0xb5, 0x70, 0x73, 0xe3, 0xde, 0xcc, 0xc4, 0xb1, 0x2d, 0xdc, 0xdc, 0xb8, 0x27, 0x64, + 0x8e, 0x76, 0x53, 0x93, 0x39, 0x36, 0xee, 0x19, 0xbf, 0x51, 0x80, 0x33, 0x5d, 0x68, 0xc8, 0x9a, + 0xdc, 0xa3, 0x72, 0x9a, 0x62, 0xb1, 0x0b, 0xfa, 0xd5, 0x63, 0xb7, 0xad, 0x55, 0x28, 0x2f, 0xdf, + 0x45, 0xb1, 0x96, 0xfd, 0xa4, 0xce, 0x62, 0x45, 0xee, 0xee, 0x17, 0x1e, 0x1f, 0xcd, 0x9d, 0xa3, + 0xfb, 0x68, 0x14, 0x64, 0xf3, 0x42, 0xab, 0xae, 0xf9, 0x69, 0xa5, 0x28, 0x67, 0x7f, 0x38, 0x0f, + 0x45, 0x3c, 0x69, 0x12, 0xd1, 0x29, 0x72, 0x27, 0x8a, 0x4e, 0xf1, 0x1e, 0x8c, 0x2e, 0xdf, 0xe5, + 0x97, 0xce, 0x15, 0x3b, 0xd8, 0x13, 0xfb, 0x20, 0xbe, 0xb1, 0xd1, 0x7d, 0x4b, 0xdc, 0x51, 0xf7, + 0x6c, 0x4d, 0xc8, 0xd3, 0x28, 0xc8, 0x7d, 0x98, 0xe2, 0x6d, 0x73, 0x77, 0xdc, 0x3a, 0x77, 0x72, + 0x77, 0xed, 0x86, 0xd8, 0x14, 0x2f, 0x3e, 0x3e, 0x9a, 0x9b, 0xa3, 0xfb, 0x68, 0xee, 0x24, 0xca, + 0xad, 0x00, 0x11, 0x54, 0xbb, 0xa7, 0x0c, 0x7a, 0xd5, 0xf3, 0xd6, 0x1c, 0xc6, 0x0a, 0x59, 0x6d, + 0xac, 0x6e, 0x86, 0xcb, 0x91, 0x8c, 0xbf, 0x37, 0x00, 0xb3, 0xdd, 0xf7, 0x33, 0xf2, 0x55, 0x7d, + 0x00, 0x2f, 0x1d, 0xbb, 0x03, 0x1e, 0x3f, 0x86, 0x5f, 0x83, 0xe9, 0xe5, 0x56, 0x48, 0xfd, 0xb6, + 0xef, 0x4a, 0x5f, 0xeb, 0x15, 0x2f, 0x90, 0xe6, 0x65, 0x68, 0xe7, 0x45, 0xa3, 0x72, 0xa1, 0x1f, + 0x44, 0x63, 0x37, 0x85, 0x55, 0x26, 0x07, 0xb2, 0x0c, 0xe3, 0x0a, 0xbc, 0xd1, 0xd9, 0x15, 0x27, + 0x38, 0xda, 0x2e, 0xaa, 0x3c, 0x1b, 0x1d, 0xf5, 0xa2, 0x93, 0x20, 0x9a, 0xfd, 0xa5, 0x82, 0x98, + 0x16, 0x17, 0xa1, 0x50, 0xeb, 0x6c, 0x8b, 0xe9, 0xc0, 0x45, 0x75, 0x6d, 0x5b, 0x67, 0xa5, 0xe4, + 0xcb, 0x00, 0x26, 0x6d, 0x7b, 0x81, 0x1b, 0x7a, 0xfe, 0xa1, 0x6a, 0xfe, 0xef, 0x47, 0x50, 0xdd, + 0x56, 0x53, 0x42, 0xc9, 0x0a, 0x4c, 0xc4, 0xbf, 0xd6, 0x0f, 0x5a, 0x42, 0xa9, 0x39, 0xcc, 0xb5, + 0x09, 0x31, 0xb9, 0xe5, 0xb1, 0x32, 0xf5, 0xa0, 0x4a, 0x90, 0x91, 0x79, 0x28, 0x6d, 0x79, 0xfe, + 0xfe, 0x0e, 0x1b, 0xa8, 0x62, 0x7c, 0x94, 0x1e, 0x08, 0x98, 0x7a, 0x64, 0x48, 0x3c, 0x36, 0xe7, + 0x97, 0x5b, 0x0f, 0x5d, 0xdf, 0x6b, 0x35, 0x69, 0x2b, 0x54, 0xdf, 0x1f, 0x69, 0x0c, 0xd6, 0x9c, + 0xa5, 0x62, 0x30, 0xbb, 0x33, 0x57, 0xea, 0xa1, 0xe7, 0x8b, 0xc7, 0x47, 0x3e, 0xdc, 0x0c, 0xa0, + 0x0d, 0x37, 0x03, 0xb0, 0x4e, 0x34, 0xe9, 0x8e, 0xd0, 0x9a, 0x63, 0x27, 0xfa, 0x74, 0x47, 0xf3, + 0x04, 0xa3, 0x3b, 0x4c, 0x14, 0x30, 0xe9, 0x0e, 0x5e, 0xf4, 0xb5, 0x00, 0x2a, 0x3b, 0x29, 0x15, + 0x91, 0x40, 0x33, 0x7e, 0x77, 0xb8, 0xeb, 0xbc, 0x65, 0x7b, 0xef, 0xc9, 0xe6, 0xed, 0xaa, 0xdd, + 0xc7, 0xbc, 0x7d, 0x35, 0xb2, 0x00, 0x55, 0xdd, 0x1f, 0x11, 0xa2, 0x6e, 0xfe, 0x1c, 0x67, 0xf6, + 0x97, 0x4b, 0x27, 0x99, 0x44, 0xa2, 0x93, 0xf2, 0xfd, 0x76, 0x52, 0xa1, 0xaf, 0x4e, 0x22, 0x0b, + 0x30, 0x16, 0x85, 0xe0, 0xd9, 0xb0, 0x43, 0x6d, 0x6f, 0x8a, 0xe2, 0x26, 0x59, 0x6d, 0x3b, 0x54, + 0xf7, 0x26, 0x9d, 0x84, 0xbc, 0x05, 0x23, 0xc2, 0x0c, 0x1a, 0x39, 0x0c, 0xc4, 0x86, 0x68, 0xd2, + 0x66, 0x3a, 0x41, 0xaf, 0xa2, 0xb3, 0x25, 0xb9, 0xe1, 0xb6, 0x69, 0xc3, 0x6d, 0xd1, 0x1a, 0x6a, + 0xcd, 0xc5, 0x8c, 0xc1, 0x25, 0xd9, 0x16, 0x25, 0x16, 0x57, 0xa8, 0x6b, 0xfa, 0x32, 0x8d, 0x28, + 0x39, 0x59, 0x87, 0x4e, 0x34, 0x59, 0xb9, 0x1d, 0x88, 0xbf, 0xea, 0xed, 0xba, 0xd2, 0xf2, 0x4d, + 0xda, 0x81, 0xf8, 0x56, 0x83, 0x41, 0x13, 0x76, 0x20, 0x1c, 0x95, 0xc9, 0xf5, 0xec, 0x47, 0x75, + 0x49, 0xbc, 0xd0, 0xa0, 0x5c, 0x8f, 0x44, 0xba, 0xb9, 0x21, 0x47, 0x92, 0xd5, 0x2c, 0x37, 0x6d, + 0xb7, 0x21, 0xbc, 0xdc, 0xe2, 0x6a, 0x28, 0x83, 0x26, 0xab, 0x41, 0x54, 0x52, 0x87, 0x51, 0x93, + 0xee, 0x6c, 0xf8, 0x5e, 0x48, 0xeb, 0x21, 0x75, 0x84, 0x2c, 0x23, 0xc5, 0xf9, 0x05, 0xcf, 0xe3, + 0x72, 0xda, 0xc2, 0x6b, 0xbf, 0x7b, 0x34, 0x97, 0xfb, 0xfe, 0xd1, 0x1c, 0x30, 0x10, 0xb7, 0x65, + 0x7d, 0x7c, 0x34, 0x77, 0x86, 0x8d, 0x7f, 0x5b, 0x12, 0xab, 0x47, 0x8c, 0xca, 0x94, 0xfc, 0x20, + 0xdb, 0x74, 0xa3, 0x2e, 0x89, 0x2b, 0x1b, 0xed, 0x52, 0xd9, 0xeb, 0x99, 0x95, 0xcd, 0x29, 0xbd, + 0x9d, 0x59, 0x69, 0x66, 0x25, 0xe4, 0x6d, 0x18, 0x59, 0xac, 0x2e, 0x7a, 0xad, 0x1d, 0x77, 0xb7, + 0xb6, 0x52, 0x41, 0x81, 0x48, 0xd8, 0x31, 0xd7, 0x5d, 0xab, 0x8e, 0x70, 0x2b, 0xd8, 0xb3, 0x35, + 0x5f, 0x90, 0x18, 0x9f, 0xdc, 0x86, 0x71, 0xf9, 0xd3, 0xa4, 0x3b, 0xf7, 0xcd, 0x2a, 0xca, 0x41, + 0xd2, 0x78, 0x3c, 0xe2, 0xc0, 0x3a, 0xa2, 0xe3, 0xab, 0xf2, 0x71, 0x82, 0x8c, 0x4d, 0xc6, 0x25, + 0xda, 0x6e, 0x78, 0x87, 0xac, 0x79, 0x9b, 0x2e, 0xf5, 0x51, 0xf2, 0x11, 0x93, 0xd1, 0x89, 0x4a, + 0xac, 0xd0, 0xd5, 0xb6, 0xdb, 0x04, 0x11, 0x59, 0x83, 0x49, 0x31, 0xc5, 0x1f, 0xb8, 0x81, 0xbb, + 0xed, 0x36, 0xdc, 0xf0, 0x70, 0xa6, 0x8c, 0x9c, 0x50, 0x0a, 0x91, 0xeb, 0xe2, 0x61, 0x54, 0xaa, + 0x30, 0x4b, 0x93, 0x1a, 0xbf, 0x9a, 0x87, 0x73, 0xbd, 0xe4, 0x7f, 0x52, 0xd3, 0x37, 0xb3, 0xcb, + 0x7d, 0xdc, 0x19, 0x8e, 0xdf, 0xce, 0x96, 0x61, 0x7c, 0xdd, 0xdf, 0xb5, 0x5b, 0xee, 0xb7, 0xf1, + 0x5e, 0x17, 0x99, 0xc3, 0x60, 0x67, 0x78, 0x4a, 0x89, 0x3e, 0xdb, 0x13, 0x44, 0xb3, 0x0f, 0xc5, + 0x36, 0xf7, 0x49, 0x1d, 0x2b, 0x6e, 0xc2, 0xf0, 0xa2, 0xd7, 0x0a, 0xe9, 0xa3, 0x30, 0xe1, 0x3c, + 0xc7, 0x81, 0x49, 0xe7, 0x39, 0x89, 0x6a, 0xfc, 0xbf, 0x79, 0x38, 0xdf, 0x53, 0x00, 0x26, 0x9b, + 0x7a, 0xaf, 0x5d, 0xe9, 0x47, 0x6a, 0x3e, 0xbe, 0xdb, 0xe6, 0x53, 0x96, 0x1b, 0xc7, 0xda, 0x2d, + 0xcf, 0xfe, 0x97, 0x39, 0xd1, 0x49, 0x5f, 0x80, 0x21, 0xac, 0x2a, 0xea, 0x22, 0xae, 0x1b, 0xc2, + 0x5d, 0xd8, 0xd5, 0x75, 0x43, 0x1c, 0x8d, 0xdc, 0x80, 0xd2, 0xa2, 0xdd, 0x68, 0x28, 0xae, 0x85, + 0x28, 0xd7, 0xd7, 0x11, 0x96, 0x30, 0xf4, 0x91, 0x88, 0xe4, 0x0d, 0x00, 0xfe, 0xb7, 0x72, 0x56, + 0xe0, 0x66, 0x29, 0xc8, 0x12, 0xc7, 0x85, 0x82, 0x8c, 0x41, 0xc4, 0xea, 0x5e, 0xe4, 0x03, 0xc5, + 0x83, 0x88, 0x31, 0x80, 0x16, 0x44, 0x8c, 0x01, 0x8c, 0x5f, 0x2b, 0xc0, 0x73, 0xbd, 0x6f, 0x71, + 0xe4, 0xbe, 0x3e, 0x04, 0x2f, 0xf7, 0x75, 0xf7, 0x3b, 0x7e, 0x0c, 0x64, 0x48, 0x3e, 0xde, 0x21, + 0x97, 0xd3, 0xe6, 0xc5, 0x1f, 0x1f, 0xcd, 0x29, 0xd6, 0x63, 0x77, 0x3c, 0xb7, 0xa5, 0xbc, 0x11, + 0x7c, 0x0b, 0xa0, 0x16, 0xda, 0xa1, 0x5b, 0xbf, 0xb3, 0x75, 0x57, 0x7a, 0xac, 0xdf, 0xec, 0xaf, + 0x65, 0x31, 0x1d, 0xdf, 0x57, 0x84, 0xfa, 0x1c, 0xa1, 0xd6, 0x47, 0x07, 0xfb, 0xda, 0x3d, 0x35, + 0x46, 0x9e, 0xfd, 0x0a, 0x94, 0x93, 0xa4, 0xe4, 0x12, 0x14, 0xb1, 0x01, 0x8a, 0x8d, 0x74, 0x82, + 0x03, 0x96, 0xcf, 0xde, 0x13, 0x73, 0x67, 0x19, 0xc6, 0xc5, 0xc3, 0xb4, 0xae, 0x11, 0xc3, 0xf5, + 0x2a, 0xdf, 0xb5, 0xd3, 0x5a, 0xb1, 0x04, 0x91, 0xf1, 0x67, 0x39, 0x38, 0xdb, 0xf5, 0x7e, 0x4c, + 0x36, 0xf4, 0x01, 0x7b, 0xf1, 0xb8, 0x0b, 0xf5, 0xb1, 0x63, 0x35, 0xfb, 0x13, 0x72, 0xee, 0xbf, + 0x03, 0xa3, 0xb5, 0xce, 0x76, 0xf2, 0x92, 0xc5, 0xfd, 0x97, 0x15, 0xb8, 0x7a, 0x82, 0xa9, 0xf8, + 0xec, 0xfb, 0xe5, 0xcb, 0xbb, 0x30, 0xac, 0xe0, 0x17, 0x3f, 0xfc, 0xfe, 0xc8, 0x31, 0x0a, 0xfd, + 0xd6, 0xd4, 0x4e, 0x4c, 0x10, 0x19, 0xbf, 0x92, 0xcf, 0xbe, 0xad, 0xb2, 0xbb, 0xf6, 0x09, 0x6e, + 0xab, 0xb7, 0x17, 0x37, 0x8e, 0xff, 0xf6, 0xff, 0x58, 0x7e, 0x3b, 0x3e, 0x44, 0x8a, 0x1d, 0x4f, + 0xaa, 0xf7, 0xc4, 0x43, 0xa4, 0xdc, 0x1d, 0x03, 0xfd, 0x21, 0x52, 0x22, 0x93, 0xd7, 0x61, 0x78, + 0xd5, 0xe3, 0xfe, 0xa4, 0xf2, 0x8b, 0xb9, 0xe7, 0x90, 0x04, 0xaa, 0xdb, 0x63, 0x84, 0xc9, 0xee, + 0x16, 0xfa, 0xc0, 0x4b, 0xf3, 0x6e, 0xbc, 0x5b, 0x24, 0xa6, 0x8b, 0xae, 0x04, 0xd3, 0xc9, 0x8c, + 0x9f, 0xc8, 0xc3, 0x38, 0x9f, 0xbc, 0x5c, 0x49, 0xfb, 0xd4, 0x2a, 0xc0, 0xdf, 0xd4, 0x14, 0xe0, + 0x32, 0xd4, 0x81, 0xfa, 0x69, 0x7d, 0xa9, 0xbf, 0xf7, 0x80, 0xa4, 0x69, 0x88, 0x09, 0xa3, 0x2a, + 0xb4, 0xb7, 0xe6, 0xfb, 0x7a, 0x1c, 0x15, 0x43, 0xec, 0x1d, 0xf8, 0xfc, 0x10, 0x98, 0x1a, 0x0f, + 0xe3, 0xaf, 0xe6, 0x61, 0x4c, 0x79, 0xa8, 0x7c, 0x6a, 0x3b, 0xfe, 0x2b, 0x5a, 0xc7, 0xcf, 0x44, + 0x26, 0xc9, 0xd1, 0x97, 0xf5, 0xd5, 0xef, 0x1d, 0x98, 0x4c, 0x91, 0x24, 0xdf, 0x7b, 0x73, 0xfd, + 0xbc, 0xf7, 0xbe, 0x9a, 0x76, 0xd7, 0xe7, 0x91, 0x2a, 0x23, 0x77, 0x7d, 0x35, 0x3e, 0xc0, 0x4f, + 0xe5, 0x61, 0x5a, 0xfc, 0xc2, 0x98, 0x34, 0x7c, 0xf7, 0x7e, 0x6a, 0xc7, 0xa2, 0xa2, 0x8d, 0xc5, + 0x9c, 0x3e, 0x16, 0xca, 0x07, 0x76, 0x1f, 0x12, 0xe3, 0x2f, 0x03, 0xcc, 0x74, 0x23, 0xe8, 0xdb, + 0xf3, 0x27, 0xb6, 0xab, 0xce, 0xf7, 0x61, 0x57, 0xbd, 0x0a, 0x65, 0xac, 0x4a, 0x44, 0xb0, 0x08, + 0xd8, 0x1d, 0xa0, 0x10, 0x0b, 0xdc, 0x3c, 0x70, 0x90, 0x88, 0x82, 0x11, 0x24, 0x2e, 0x01, 0x29, + 0x4a, 0xf2, 0x4b, 0x39, 0x18, 0x47, 0xe0, 0xf2, 0x43, 0xda, 0x0a, 0x91, 0x59, 0x51, 0x98, 0x01, + 0x47, 0xfa, 0xf1, 0x5a, 0xe8, 0xbb, 0xad, 0x5d, 0xa1, 0x20, 0xdf, 0x16, 0x0a, 0xf2, 0xb7, 0xb8, + 0x62, 0xff, 0x6a, 0xdd, 0x6b, 0x5e, 0xdb, 0xf5, 0xed, 0x87, 0x2e, 0x7f, 0x83, 0xb7, 0x1b, 0xd7, + 0xe2, 0x40, 0xc9, 0x6d, 0x37, 0x11, 0xfa, 0x58, 0xb0, 0xc2, 0xc7, 0x07, 0xde, 0x50, 0x8a, 0xd5, + 0x26, 0xef, 0x2a, 0x7a, 0x8b, 0xc8, 0x0f, 0xc0, 0x19, 0xee, 0x9e, 0xce, 0x44, 0x5e, 0xb7, 0xd5, + 0xf1, 0x3a, 0xc1, 0x82, 0x5d, 0xdf, 0x67, 0xe7, 0x1e, 0x77, 0x65, 0xc0, 0x2f, 0xaf, 0x47, 0x85, + 0xd6, 0x36, 0x2f, 0xd5, 0x5c, 0xb7, 0xb2, 0x19, 0x90, 0x15, 0x98, 0xe4, 0x45, 0x95, 0x4e, 0xe8, + 0xd5, 0xea, 0x76, 0xc3, 0x6d, 0xed, 0xe2, 0x9d, 0xba, 0xc4, 0xcf, 0x63, 0xbb, 0x13, 0x7a, 0x56, + 0xc0, 0xe1, 0xea, 0xd5, 0x25, 0x45, 0x44, 0xaa, 0x30, 0x61, 0x52, 0xdb, 0xb9, 0x67, 0x3f, 0x5a, + 0xb4, 0xdb, 0x76, 0x9d, 0x5d, 0x84, 0x4a, 0xf8, 0x98, 0x84, 0x77, 0x33, 0x9f, 0xda, 0x8e, 0xd5, + 0xb4, 0x1f, 0x59, 0x75, 0x51, 0xa8, 0xeb, 0xb0, 0x34, 0xba, 0x88, 0x95, 0xdb, 0x8a, 0x58, 0x0d, + 0x27, 0x59, 0xb9, 0xad, 0xee, 0xac, 0x62, 0x3a, 0xc9, 0x6a, 0xd3, 0xf6, 0x77, 0x69, 0xc8, 0x4d, + 0xd8, 0xd8, 0x7d, 0x3c, 0xa7, 0xb0, 0x0a, 0xb1, 0xcc, 0x42, 0x73, 0xb6, 0x24, 0x2b, 0x85, 0x8e, + 0xcd, 0xbc, 0x2d, 0xdf, 0x0d, 0xa9, 0xfa, 0x85, 0x23, 0xd8, 0x2c, 0xec, 0x7f, 0x34, 0xfe, 0xeb, + 0xf6, 0x89, 0x29, 0xca, 0x98, 0x9b, 0xf2, 0x91, 0xa3, 0x29, 0x6e, 0xd9, 0x5f, 0x99, 0xa2, 0x8c, + 0xb8, 0xa9, 0xdf, 0x39, 0x86, 0xdf, 0xa9, 0x70, 0xeb, 0xf2, 0xa1, 0x29, 0x4a, 0xb2, 0xc6, 0x3a, + 0x2d, 0xa4, 0x2d, 0x36, 0xa3, 0x85, 0x09, 0xdf, 0x38, 0x36, 0xed, 0x05, 0x61, 0x87, 0x52, 0xf6, + 0x65, 0xb1, 0x95, 0x61, 0xd0, 0x97, 0x24, 0x26, 0x7f, 0x01, 0x26, 0xee, 0x07, 0xf4, 0x56, 0x75, + 0xa3, 0x26, 0x1d, 0xf2, 0xf1, 0xb6, 0x3d, 0x3e, 0x7f, 0xfd, 0x98, 0x4d, 0xe7, 0xaa, 0x4a, 0x83, + 0xf1, 0x8a, 0xf9, 0xb8, 0x75, 0x02, 0x6a, 0xed, 0xb8, 0xed, 0x20, 0x0a, 0x0d, 0xa2, 0x8e, 0x5b, + 0xa2, 0x2a, 0x63, 0x05, 0x26, 0x53, 0x6c, 0xc8, 0x38, 0x00, 0x03, 0x5a, 0xf7, 0xd7, 0x6a, 0xcb, + 0x9b, 0xe5, 0x67, 0x48, 0x19, 0x46, 0xf1, 0xf7, 0xf2, 0x5a, 0x65, 0x61, 0x75, 0x79, 0xa9, 0x9c, + 0x23, 0x93, 0x30, 0x86, 0x90, 0xa5, 0x6a, 0x8d, 0x83, 0xf2, 0x3c, 0x5a, 0xa5, 0x59, 0xe6, 0x4b, + 0x37, 0x64, 0x0b, 0x00, 0xcf, 0x14, 0xe3, 0x6f, 0xe4, 0xe1, 0xac, 0x3c, 0x56, 0x68, 0x78, 0xe0, + 0xf9, 0xfb, 0x6e, 0x6b, 0xf7, 0x29, 0x3f, 0x1d, 0x6e, 0x69, 0xa7, 0xc3, 0x0b, 0x89, 0x93, 0x3a, + 0xf1, 0x95, 0x3d, 0x8e, 0x88, 0xff, 0xa5, 0x04, 0xe7, 0x7b, 0x52, 0x91, 0xaf, 0xb2, 0xd3, 0xdc, + 0xa5, 0xad, 0xb0, 0xea, 0x34, 0xe8, 0xa6, 0xdb, 0xa4, 0x5e, 0x27, 0x14, 0x26, 0xa3, 0x17, 0xf1, + 0x82, 0x8b, 0x85, 0x96, 0xeb, 0x34, 0xa8, 0x15, 0xf2, 0x62, 0x6d, 0xba, 0xa5, 0xa9, 0x19, 0xcb, + 0x28, 0x76, 0x7a, 0xb5, 0x15, 0x52, 0xff, 0x21, 0x1a, 0xa7, 0x44, 0x2c, 0xf7, 0x29, 0x6d, 0x5b, + 0x36, 0x2b, 0xb5, 0x5c, 0x51, 0xac, 0xb3, 0x4c, 0x51, 0x93, 0x5b, 0x0a, 0xcb, 0x45, 0x26, 0x0e, + 0xdf, 0xb3, 0x1f, 0x89, 0xd7, 0x72, 0x11, 0xd6, 0x28, 0x62, 0xc9, 0xbd, 0x8d, 0x9a, 0xf6, 0x23, + 0x33, 0x4d, 0x42, 0x3e, 0x84, 0x53, 0xe2, 0x00, 0x12, 0xde, 0xa2, 0xf2, 0x8b, 0xb9, 0x2f, 0xea, + 0x4b, 0x8f, 0x8f, 0xe6, 0xce, 0xc8, 0x20, 0x4e, 0xd2, 0x3f, 0x38, 0xeb, 0xab, 0xb3, 0xb9, 0x90, + 0x4d, 0x76, 0x20, 0x27, 0xba, 0xe3, 0x1e, 0x0d, 0x02, 0x7b, 0x57, 0xbe, 0xac, 0x73, 0xfb, 0x7a, + 0xa5, 0x33, 0xad, 0x26, 0x2f, 0x37, 0xbb, 0x52, 0x92, 0x15, 0x18, 0xdf, 0xa2, 0xdb, 0xea, 0xf8, + 0x0c, 0x46, 0x5b, 0x55, 0xf9, 0x80, 0x6e, 0x77, 0x1f, 0x9c, 0x04, 0x1d, 0x71, 0x51, 0x61, 0xf6, + 0xe8, 0x70, 0xd5, 0x0d, 0x42, 0xda, 0xa2, 0x3e, 0x46, 0x21, 0x18, 0xc2, 0xcd, 0x60, 0x26, 0x96, + 0x90, 0xf5, 0xf2, 0x85, 0xe7, 0x1f, 0x1f, 0xcd, 0x9d, 0xe7, 0xfe, 0x24, 0x0d, 0x01, 0xb7, 0x12, + 0x91, 0xc7, 0xd3, 0x5c, 0xc9, 0x37, 0x61, 0xc2, 0xf4, 0x3a, 0xa1, 0xdb, 0xda, 0xad, 0x85, 0xbe, + 0x1d, 0xd2, 0x5d, 0x7e, 0x20, 0xc5, 0xe1, 0x0e, 0x12, 0xa5, 0xe2, 0xad, 0x85, 0x03, 0xad, 0x40, + 0x40, 0xb5, 0x13, 0x41, 0x27, 0x20, 0xdf, 0x80, 0x71, 0xee, 0x27, 0x18, 0x55, 0x30, 0xac, 0x45, + 0x4d, 0xd5, 0x0b, 0x1f, 0x5c, 0xe7, 0x17, 0x54, 0xee, 0x6f, 0x98, 0x55, 0x41, 0x82, 0x1b, 0xf9, + 0x40, 0x74, 0xd6, 0x86, 0xdb, 0xda, 0x8d, 0xa6, 0x31, 0x60, 0xcf, 0xbf, 0x16, 0x77, 0x49, 0x9b, + 0x35, 0x57, 0x4e, 0xe3, 0x2e, 0x96, 0x1a, 0x69, 0x3e, 0x24, 0x84, 0xf3, 0x95, 0x20, 0x70, 0x83, + 0x50, 0x18, 0x56, 0x2f, 0x3f, 0xa2, 0xf5, 0x0e, 0x43, 0xde, 0xf2, 0xfc, 0x7d, 0xea, 0x73, 0xd3, + 0xbe, 0x81, 0x85, 0xab, 0x8f, 0x8f, 0xe6, 0x5e, 0xb6, 0x11, 0xd1, 0x12, 0xb6, 0xd8, 0x16, 0x95, + 0xa8, 0xd6, 0x01, 0xc7, 0x55, 0xbe, 0xa1, 0x37, 0x53, 0xf2, 0x0d, 0x38, 0xbd, 0x68, 0x07, 0xb4, + 0xda, 0x0a, 0x68, 0x2b, 0x70, 0x43, 0xf7, 0x21, 0x15, 0x9d, 0x8a, 0x87, 0x5f, 0x09, 0x63, 0xb4, + 0x1b, 0x75, 0x3b, 0x60, 0x0b, 0x33, 0x42, 0xb1, 0xc4, 0xa0, 0x28, 0xd5, 0x74, 0xe1, 0x62, 0x1c, + 0xe5, 0xa0, 0x9c, 0xec, 0x76, 0xf2, 0x35, 0x18, 0xe6, 0x26, 0x09, 0x34, 0xd8, 0x13, 0x2e, 0x6e, + 0xf2, 0x85, 0x3b, 0x82, 0xeb, 0x44, 0xc2, 0x29, 0x81, 0x1b, 0x3c, 0x50, 0xf5, 0xbd, 0x16, 0x9d, + 0x12, 0x24, 0x11, 0x71, 0x60, 0x94, 0xf7, 0x2c, 0xc5, 0xb8, 0x24, 0xc2, 0x32, 0xed, 0x79, 0x75, + 0x26, 0x8b, 0xa2, 0x04, 0x7f, 0x54, 0x79, 0x8b, 0xf1, 0xe3, 0x08, 0x5a, 0x15, 0x1a, 0xd7, 0x05, + 0x80, 0x92, 0x24, 0x34, 0xce, 0xc2, 0x99, 0x2e, 0x6d, 0x36, 0x1e, 0xe2, 0x33, 0x58, 0x97, 0x1a, + 0xc9, 0xd7, 0x60, 0x1a, 0x09, 0x17, 0xbd, 0x56, 0x8b, 0xd6, 0x43, 0xdc, 0x3a, 0xa4, 0xea, 0xa8, + 0xc0, 0xdf, 0x5a, 0xf9, 0xf7, 0xd6, 0x23, 0x04, 0x2b, 0xa9, 0x41, 0xca, 0xe4, 0x60, 0xfc, 0x5c, + 0x1e, 0x66, 0xc4, 0x6e, 0x64, 0xd2, 0xba, 0xe7, 0x3b, 0x4f, 0xff, 0xe9, 0xb7, 0xac, 0x9d, 0x7e, + 0x17, 0x23, 0x9f, 0xe6, 0xac, 0x8f, 0xec, 0x71, 0xf8, 0xfd, 0x4a, 0x0e, 0xce, 0xf5, 0x22, 0x62, + 0xbd, 0x13, 0xc5, 0x61, 0x19, 0x4e, 0xc5, 0x5b, 0x69, 0xc3, 0x14, 0x0e, 0xe8, 0xe2, 0x1e, 0xad, + 0xef, 0x07, 0x2b, 0x5e, 0x10, 0xa2, 0x61, 0x6c, 0xbe, 0xcb, 0x43, 0xcd, 0xab, 0x99, 0x0f, 0x35, + 0xa7, 0xf9, 0x2c, 0xab, 0x23, 0x0f, 0x1e, 0x29, 0x66, 0x9f, 0x1e, 0x06, 0x66, 0x16, 0x6b, 0x34, + 0x72, 0xac, 0x74, 0xc2, 0xbd, 0x0d, 0x9f, 0xee, 0x50, 0x9f, 0xb6, 0xea, 0xf4, 0x73, 0x66, 0xe4, + 0xa8, 0x7f, 0x5c, 0x5f, 0xda, 0x86, 0x5f, 0x19, 0x85, 0xe9, 0x2c, 0x32, 0xd6, 0x2f, 0xca, 0x05, + 0x37, 0x99, 0xee, 0xe5, 0x47, 0x73, 0x30, 0x5a, 0xa3, 0x75, 0xaf, 0xe5, 0xdc, 0xc2, 0xe7, 0x70, + 0xd1, 0x3b, 0x16, 0x3f, 0xe0, 0x19, 0xdc, 0xda, 0x49, 0xbc, 0x93, 0x7f, 0x7c, 0x34, 0xf7, 0x5e, + 0x7f, 0xf7, 0xca, 0xba, 0x87, 0x7e, 0xc9, 0x21, 0x86, 0x23, 0x8d, 0xaa, 0x40, 0xcd, 0xb6, 0x56, + 0x29, 0x59, 0x80, 0x31, 0xb1, 0x5c, 0x3d, 0x35, 0x0c, 0x0f, 0x77, 0xfb, 0x96, 0x05, 0xa9, 0xb8, + 0x63, 0x1a, 0x09, 0xb9, 0x01, 0x85, 0xfb, 0xf3, 0xb7, 0xc4, 0x18, 0xc8, 0x80, 0xae, 0xf7, 0xe7, + 0x6f, 0xa1, 0xea, 0x8a, 0x5d, 0x07, 0xc6, 0x3a, 0xf3, 0xda, 0x0b, 0xf5, 0xfd, 0xf9, 0x5b, 0xe4, + 0x2f, 0xc1, 0xa9, 0x25, 0x37, 0x10, 0x55, 0x70, 0x73, 0x5b, 0x07, 0xdd, 0x4b, 0x06, 0xbb, 0xcc, + 0xde, 0x2f, 0x65, 0xce, 0xde, 0xe7, 0x9d, 0x88, 0x89, 0xc5, 0x6d, 0x79, 0x9d, 0x64, 0xb8, 0xa1, + 0xec, 0x7a, 0xc8, 0x47, 0x30, 0x8e, 0xaa, 0x57, 0xb4, 0x40, 0xc6, 0xf0, 0x88, 0x43, 0x5d, 0x6a, + 0xfe, 0x42, 0x66, 0xcd, 0xb3, 0xa8, 0xc9, 0xb5, 0xd0, 0x8e, 0x19, 0x43, 0x29, 0x6a, 0x37, 0x74, + 0x8d, 0x33, 0xb9, 0x03, 0x13, 0x42, 0x54, 0x5a, 0xdf, 0xd9, 0xdc, 0xa3, 0x4b, 0xf6, 0xa1, 0x78, + 0x5c, 0xc6, 0xdb, 0x97, 0x90, 0xaf, 0x2c, 0x6f, 0xc7, 0x0a, 0xf7, 0xa8, 0xe5, 0xd8, 0x9a, 0x50, + 0x91, 0x20, 0x24, 0x3f, 0x08, 0x23, 0xab, 0x5e, 0x9d, 0x49, 0xc9, 0xb8, 0x33, 0xf0, 0xf7, 0xe6, + 0xf7, 0x31, 0xa1, 0x08, 0x07, 0x27, 0x44, 0x9f, 0x8f, 0x8f, 0xe6, 0xde, 0x3c, 0xe9, 0xa4, 0x51, + 0x2a, 0x30, 0xd5, 0xda, 0xc8, 0x22, 0x94, 0xb6, 0xe8, 0x36, 0xfb, 0xda, 0x64, 0xb2, 0x01, 0x09, + 0x16, 0xe6, 0x24, 0xe2, 0x97, 0x66, 0x4e, 0x22, 0x60, 0xc4, 0x87, 0x49, 0xec, 0x9f, 0x0d, 0x3b, + 0x08, 0x0e, 0x3c, 0xdf, 0xc1, 0xa8, 0xb2, 0xdd, 0x9e, 0xb2, 0xe7, 0x33, 0x3b, 0xff, 0x1c, 0xef, + 0xfc, 0xb6, 0xc2, 0x41, 0x15, 0xf6, 0x52, 0xec, 0xc9, 0x37, 0x61, 0xdc, 0xa4, 0xdf, 0xea, 0xb8, + 0x3e, 0xbd, 0x77, 0xab, 0x82, 0xab, 0x72, 0x54, 0x73, 0xd2, 0xd1, 0x0b, 0xb9, 0x44, 0xe9, 0x73, + 0x98, 0xd4, 0x16, 0x59, 0xcd, 0x1d, 0x5b, 0x7f, 0x2d, 0x50, 0x49, 0xc8, 0x06, 0x8c, 0x2c, 0xd1, + 0x87, 0x6e, 0x9d, 0xa2, 0x2b, 0x81, 0x30, 0xe5, 0x8b, 0xa2, 0xa5, 0xc7, 0x25, 0x5c, 0x6f, 0xe2, + 0x20, 0x80, 0x3b, 0x26, 0xe8, 0xd6, 0x62, 0x11, 0x22, 0xb9, 0x09, 0x85, 0xea, 0xd2, 0x86, 0xb0, + 0xe4, 0x93, 0x16, 0xfa, 0x55, 0x67, 0x43, 0xc6, 0x96, 0x46, 0xe3, 0x0f, 0xd7, 0xd1, 0xec, 0x00, + 0xab, 0x4b, 0x1b, 0x64, 0x07, 0xc6, 0xb0, 0x03, 0x56, 0xa8, 0xcd, 0xfb, 0x76, 0xa2, 0x4b, 0xdf, + 0x5e, 0xcd, 0xec, 0xdb, 0x19, 0xde, 0xb7, 0x7b, 0x82, 0x5a, 0x0b, 0x96, 0xab, 0xb2, 0x65, 0xe2, + 0xa7, 0x08, 0xe0, 0x2d, 0xc3, 0xc5, 0x6e, 0xae, 0xe2, 0xe3, 0xb6, 0x10, 0x3f, 0x65, 0xbc, 0xef, + 0x28, 0xe6, 0x6c, 0x57, 0x43, 0xe1, 0x34, 0x1f, 0xf2, 0x15, 0x28, 0xae, 0xef, 0x87, 0xf6, 0xcc, + 0xa4, 0xd6, 0x8f, 0x0c, 0x24, 0x3f, 0x1f, 0x35, 0x86, 0xde, 0xbe, 0x16, 0x90, 0x02, 0x69, 0xc8, + 0x3c, 0x0c, 0x6d, 0x54, 0x1f, 0xd4, 0x1a, 0x5e, 0x38, 0x43, 0xa2, 0x3b, 0x0d, 0x69, 0xbb, 0x0f, + 0xad, 0xa0, 0xe1, 0xe9, 0x49, 0x00, 0x24, 0x22, 0x1b, 0xbe, 0x15, 0xdb, 0x77, 0x0e, 0x6c, 0x1f, + 0x3d, 0xc0, 0xa6, 0xb4, 0x6a, 0x95, 0x12, 0x3e, 0x7c, 0x7b, 0x02, 0x90, 0x70, 0x0b, 0x53, 0x59, + 0x08, 0x6d, 0xc0, 0xa4, 0x98, 0x26, 0xe2, 0xd3, 0xee, 0xdd, 0xaa, 0x18, 0xff, 0x41, 0x0e, 0x37, + 0x4c, 0xf2, 0x32, 0xfa, 0xac, 0x47, 0x0f, 0xbc, 0xa8, 0xd7, 0xb4, 0xdb, 0x89, 0x10, 0x8b, 0x1c, + 0x85, 0xbc, 0x0a, 0x83, 0xb7, 0xec, 0x3a, 0x0d, 0xe5, 0xc3, 0x0e, 0x22, 0xef, 0x20, 0x44, 0x55, + 0x82, 0x72, 0x1c, 0x26, 0xcb, 0xf1, 0x89, 0x54, 0x89, 0xb3, 0xaf, 0x2d, 0x56, 0xe4, 0xbb, 0x0e, + 0xca, 0x72, 0x62, 0x02, 0x2a, 0xe9, 0xd9, 0x12, 0x36, 0x90, 0x99, 0x1c, 0x8c, 0x3f, 0xc9, 0xc5, + 0x3b, 0x00, 0x79, 0x09, 0x8a, 0xe6, 0x46, 0xd4, 0x7e, 0xee, 0x0d, 0x95, 0x68, 0x3e, 0x22, 0x90, + 0x0f, 0xe0, 0x94, 0xc2, 0x27, 0x65, 0x90, 0xf9, 0x22, 0xba, 0xeb, 0x28, 0x2d, 0xc9, 0xb6, 0xca, + 0xcc, 0xe6, 0x81, 0x82, 0x6b, 0x5c, 0xb0, 0x44, 0x5b, 0x2e, 0xe7, 0xad, 0x7c, 0xac, 0xca, 0xdb, + 0x41, 0x84, 0xe4, 0xc7, 0x66, 0x71, 0xe0, 0x1e, 0x3b, 0xc6, 0x6f, 0xe6, 0xb4, 0x95, 0x1d, 0xa5, + 0xb9, 0xca, 0x1d, 0x93, 0xe6, 0xea, 0x0d, 0x80, 0x4a, 0x27, 0xf4, 0x96, 0x5b, 0xbe, 0xd7, 0xe0, + 0xda, 0x05, 0x11, 0x65, 0x14, 0x75, 0xa6, 0x14, 0xc1, 0x9a, 0x63, 0x41, 0x84, 0x9c, 0x69, 0xbb, + 0x5a, 0xf8, 0xa4, 0xb6, 0xab, 0xc6, 0xef, 0xe5, 0xb4, 0xb9, 0xcd, 0x24, 0x32, 0xb9, 0x3c, 0x14, + 0xd3, 0x82, 0xf4, 0xf2, 0x88, 0x17, 0xc7, 0xff, 0x3f, 0x07, 0xa7, 0xb9, 0x11, 0xe8, 0x5a, 0xa7, + 0xb9, 0x4d, 0xfd, 0x07, 0x76, 0xc3, 0x75, 0xb8, 0x47, 0x1a, 0x17, 0x36, 0x2f, 0xa7, 0x17, 0x4a, + 0x36, 0x3e, 0xbf, 0xc0, 0x71, 0xa3, 0x54, 0xab, 0x85, 0x85, 0xd6, 0xc3, 0xa8, 0x54, 0xbd, 0xc0, + 0x65, 0xd3, 0x1b, 0xbf, 0x9a, 0x83, 0xe7, 0x8f, 0xad, 0x85, 0x5c, 0x83, 0x21, 0x19, 0xde, 0x35, + 0x87, 0x1d, 0x8f, 0x06, 0x59, 0xe9, 0xd0, 0xae, 0x12, 0x8b, 0x7c, 0x1d, 0x4e, 0xa9, 0xac, 0x36, + 0x7d, 0xdb, 0x55, 0x83, 0xa8, 0x66, 0xb4, 0x3a, 0x64, 0x28, 0x49, 0xc9, 0x28, 0x9b, 0x89, 0xf1, + 0x7f, 0xe5, 0x94, 0xc4, 0x77, 0x4f, 0xa9, 0xbc, 0x7c, 0x53, 0x93, 0x97, 0x65, 0xb4, 0xa0, 0xe8, + 0xab, 0x58, 0x59, 0xe6, 0x1d, 0x67, 0x42, 0x31, 0x2c, 0x44, 0xc0, 0x77, 0xf2, 0x30, 0x72, 0x3f, + 0xa0, 0x3e, 0x7f, 0xe0, 0xfc, 0x7c, 0x45, 0x85, 0x89, 0xbe, 0xab, 0xaf, 0xb8, 0x1d, 0x7f, 0x94, + 0x43, 0xc5, 0xb7, 0x4a, 0xc1, 0x7a, 0x43, 0x49, 0x76, 0x81, 0xbd, 0x81, 0x69, 0x2e, 0x10, 0xca, + 0x63, 0x7b, 0xac, 0xea, 0x79, 0x6f, 0x30, 0xf9, 0xd1, 0x2a, 0x79, 0x0f, 0x06, 0xee, 0xa3, 0x1a, + 0x4f, 0xf7, 0x3e, 0x8e, 0xf8, 0x63, 0x21, 0xdf, 0xa4, 0x3b, 0xec, 0x4f, 0xf5, 0x8c, 0xc1, 0x32, + 0x52, 0x83, 0xa1, 0x45, 0x9f, 0x62, 0x1a, 0xbb, 0x62, 0xff, 0x1e, 0x74, 0x75, 0x4e, 0x92, 0xf4, + 0xa0, 0x13, 0x9c, 0x8c, 0x9f, 0xcd, 0x03, 0x89, 0xbf, 0x11, 0xe3, 0xbf, 0x07, 0x4f, 0xed, 0xa0, + 0xbf, 0xab, 0x0d, 0xfa, 0xf9, 0xd4, 0xa0, 0xf3, 0xcf, 0xeb, 0x6b, 0xec, 0x7f, 0x2b, 0x07, 0xa7, + 0xb3, 0x09, 0xc9, 0x45, 0x18, 0x5c, 0xdf, 0xdc, 0x90, 0x0e, 0xec, 0xe2, 0x53, 0xbc, 0x36, 0xde, + 0xcb, 0x4d, 0x51, 0x44, 0x5e, 0x83, 0xc1, 0xaf, 0x9a, 0x8b, 0xec, 0x1c, 0x52, 0x62, 0xad, 0x7e, + 0xcb, 0xb7, 0xea, 0xfa, 0x51, 0x24, 0x90, 0xd4, 0xb1, 0x2d, 0x3c, 0xb1, 0xb1, 0xfd, 0xa9, 0x3c, + 0x4c, 0x54, 0xea, 0x75, 0x1a, 0x04, 0x4c, 0xc8, 0xa1, 0x41, 0xf8, 0xd4, 0x0e, 0x6c, 0xb6, 0x6b, + 0xba, 0xf6, 0x6d, 0x7d, 0x8d, 0xea, 0xef, 0xe4, 0xe0, 0x94, 0xa4, 0x7a, 0xe8, 0xd2, 0x83, 0xcd, + 0x3d, 0x9f, 0x06, 0x7b, 0x5e, 0xc3, 0xe9, 0x3b, 0xa0, 0x33, 0x13, 0xf4, 0x30, 0x4a, 0xa3, 0xfa, + 0xda, 0xbd, 0x83, 0x10, 0x4d, 0xd0, 0xe3, 0x91, 0x1c, 0xaf, 0xc1, 0x50, 0xa5, 0xdd, 0xf6, 0xbd, + 0x87, 0x7c, 0xd9, 0x8f, 0x09, 0x87, 0x42, 0x0e, 0xd2, 0x1c, 0x10, 0x39, 0x88, 0x35, 0x63, 0x89, + 0xb6, 0x78, 0x2c, 0x9d, 0x31, 0xde, 0x0c, 0x87, 0xb6, 0x54, 0x19, 0x16, 0xcb, 0x8d, 0x1a, 0x90, + 0x0d, 0xdf, 0x6b, 0x7a, 0x21, 0x75, 0xf8, 0xf7, 0xa0, 0xdf, 0xe6, 0xb1, 0x41, 0x40, 0x36, 0xdd, + 0xb0, 0xa1, 0x05, 0x01, 0x09, 0x19, 0xc0, 0xe4, 0x70, 0xe3, 0x7f, 0x1f, 0x80, 0x51, 0xb5, 0x77, + 0x88, 0xc1, 0xa3, 0xb4, 0x7a, 0xbe, 0xea, 0x3c, 0x6c, 0x23, 0xc4, 0x14, 0x25, 0xb1, 0xcf, 0x7d, + 0xfe, 0x58, 0x9f, 0xfb, 0x2d, 0x18, 0xdb, 0xf0, 0xbd, 0xb6, 0x17, 0x50, 0x87, 0xa7, 0x37, 0xe5, + 0x5b, 0xe1, 0x94, 0x72, 0xc7, 0x63, 0x03, 0x89, 0xef, 0x84, 0xa8, 0xe1, 0x68, 0x0b, 0x6c, 0x2b, + 0x99, 0xfc, 0x54, 0xe7, 0xc3, 0x4d, 0x10, 0xec, 0x40, 0x84, 0xcc, 0x8a, 0x4c, 0x10, 0x18, 0x44, + 0x37, 0x41, 0x60, 0x10, 0x75, 0xad, 0x0d, 0x3c, 0xa9, 0xb5, 0x46, 0x7e, 0x36, 0x07, 0x23, 0x95, + 0x56, 0x4b, 0xf8, 0xf2, 0x1f, 0xe3, 0xcc, 0xf8, 0x75, 0x61, 0x85, 0xf0, 0xe6, 0x27, 0xb2, 0x42, + 0x40, 0xb9, 0x25, 0x40, 0x49, 0x35, 0xae, 0x50, 0xbd, 0xe5, 0x28, 0xed, 0x20, 0x6f, 0x42, 0x39, + 0x9a, 0xe4, 0xd5, 0x96, 0x43, 0x1f, 0xd1, 0x60, 0x66, 0xe8, 0x42, 0xe1, 0xf2, 0x98, 0x08, 0x96, + 0xa7, 0x4a, 0xa6, 0x49, 0x44, 0xb2, 0x09, 0x60, 0x47, 0xb3, 0x2b, 0x91, 0x58, 0x26, 0x3d, 0xfd, + 0x84, 0xf4, 0x8c, 0xbf, 0xf1, 0xa1, 0x47, 0x95, 0x9e, 0x63, 0x3e, 0xa4, 0x09, 0x13, 0x3c, 0xab, + 0x0b, 0x66, 0x7b, 0xc5, 0x98, 0xb0, 0x70, 0xec, 0x38, 0xbc, 0x24, 0x74, 0x55, 0xcf, 0x8a, 0x5c, + 0x31, 0x98, 0x40, 0xd6, 0xca, 0x08, 0x10, 0x9b, 0xe4, 0xcd, 0x43, 0x13, 0x9a, 0x67, 0xd2, 0xed, + 0xe5, 0x93, 0xfe, 0xa7, 0x72, 0x70, 0x5a, 0x9d, 0xf4, 0xb5, 0xce, 0x76, 0xd3, 0xc5, 0xbb, 0x20, + 0xb9, 0x0a, 0xc3, 0x62, 0x4e, 0x46, 0x97, 0xa8, 0x74, 0x68, 0xdb, 0x18, 0x85, 0x2c, 0xb3, 0x69, + 0xc8, 0x78, 0x08, 0xa9, 0x7b, 0x2a, 0xb1, 0x4f, 0xb1, 0xa2, 0x38, 0x63, 0x98, 0x8f, 0xbf, 0xf5, + 0xf9, 0xc9, 0x20, 0xc6, 0x3b, 0x30, 0xa9, 0x8f, 0x44, 0x8d, 0x86, 0xe4, 0x0a, 0x0c, 0xc9, 0xe1, + 0xcb, 0x65, 0x0f, 0x9f, 0x2c, 0x37, 0xb6, 0x80, 0xa4, 0xe8, 0x03, 0x34, 0x17, 0xa2, 0xa1, 0x34, + 0x67, 0x93, 0x8f, 0x75, 0x29, 0xc4, 0x28, 0x85, 0xf6, 0x88, 0x66, 0xbf, 0xca, 0x48, 0x8d, 0x3f, + 0x19, 0x87, 0xa9, 0x8c, 0x3d, 0xf7, 0x18, 0x99, 0x68, 0x4e, 0xdf, 0x20, 0x86, 0x23, 0x5f, 0x68, + 0xb9, 0x2d, 0xbc, 0x23, 0xb3, 0x1d, 0xf7, 0xd8, 0x0e, 0x7a, 0xa5, 0x40, 0xfe, 0x2c, 0xe4, 0x22, + 0x35, 0x5c, 0xc1, 0xc0, 0x13, 0x0b, 0x57, 0xb0, 0x00, 0x63, 0xe2, 0xab, 0xc4, 0x76, 0x35, 0x18, + 0x6b, 0x73, 0x7d, 0x5e, 0x60, 0xa5, 0xb6, 0x2d, 0x9d, 0x84, 0xf3, 0x08, 0xbc, 0xc6, 0x43, 0x2a, + 0x78, 0x0c, 0xa9, 0x3c, 0xb0, 0x20, 0x93, 0x87, 0x42, 0x42, 0xfe, 0x1d, 0x4c, 0x72, 0x81, 0x10, + 0x75, 0xcf, 0x2a, 0xf5, 0xda, 0xb3, 0x9c, 0x27, 0xb3, 0x67, 0x9d, 0x97, 0x6d, 0xcc, 0xde, 0xbb, + 0x32, 0x9a, 0x45, 0x7e, 0x39, 0x07, 0x93, 0xdc, 0x67, 0x5e, 0x6d, 0x6c, 0x4f, 0x3f, 0xe8, 0xfa, + 0x93, 0x69, 0xec, 0x39, 0x11, 0x9f, 0x3e, 0xbb, 0xad, 0xe9, 0x46, 0x91, 0x1f, 0x00, 0x88, 0x56, + 0x54, 0x30, 0x03, 0xb8, 0xd4, 0xce, 0x65, 0xec, 0x02, 0x11, 0x52, 0x1c, 0x4b, 0x37, 0x8c, 0xe8, + 0xb4, 0xd4, 0x26, 0x11, 0x94, 0xfc, 0x25, 0x98, 0x66, 0xeb, 0x25, 0x82, 0x88, 0x08, 0x1f, 0x33, + 0x23, 0x58, 0xcb, 0x17, 0xbb, 0xcb, 0x44, 0x57, 0xb3, 0xc8, 0x78, 0xe4, 0xbf, 0x38, 0xa5, 0x5b, + 0xa8, 0x3a, 0x03, 0x67, 0x56, 0x84, 0x21, 0x73, 0xb0, 0xf5, 0x3c, 0xde, 0x6d, 0x97, 0xfd, 0xed, + 0xac, 0x5c, 0x0b, 0x7c, 0x7f, 0x0b, 0x74, 0x67, 0x36, 0x04, 0x91, 0xaf, 0x02, 0x89, 0x9c, 0xcd, + 0x39, 0x8c, 0xca, 0x58, 0xb8, 0x5c, 0xb5, 0x1b, 0x3b, 0xad, 0xfb, 0xb2, 0x58, 0x9d, 0x24, 0x69, + 0x62, 0x42, 0x61, 0x5a, 0x7c, 0x34, 0x83, 0xca, 0x24, 0x1a, 0xc1, 0xcc, 0xb8, 0x16, 0x3f, 0x25, + 0x2e, 0x89, 0x73, 0xbf, 0x29, 0x99, 0x38, 0x34, 0x95, 0x53, 0x16, 0x3b, 0x72, 0x13, 0x86, 0xd1, + 0xa3, 0x6c, 0x45, 0x1a, 0x41, 0x09, 0x83, 0x0c, 0xf4, 0x3d, 0xb3, 0xf6, 0x74, 0x53, 0xa6, 0x18, + 0x95, 0x5d, 0x07, 0x96, 0xfc, 0x43, 0xb3, 0xd3, 0x42, 0x05, 0xac, 0xd0, 0x77, 0x38, 0xfe, 0xa1, + 0xe5, 0x77, 0x74, 0x97, 0x43, 0x44, 0x22, 0xdf, 0x84, 0x91, 0x7b, 0xf6, 0x23, 0xa9, 0x7f, 0x15, + 0x4a, 0xd6, 0xbe, 0xb2, 0x96, 0x37, 0xed, 0x47, 0x96, 0xd3, 0x49, 0xc6, 0x1d, 0xe4, 0x59, 0xcb, + 0x15, 0x96, 0xe4, 0x43, 0x00, 0x45, 0x2b, 0x4c, 0x8e, 0xad, 0xe0, 0x79, 0x19, 0x11, 0x28, 0x53, + 0x5b, 0x8c, 0xfc, 0x15, 0x86, 0x09, 0xc9, 0x61, 0xfa, 0xb3, 0x93, 0x1c, 0x4e, 0x7d, 0x76, 0x92, + 0xc3, 0xec, 0x36, 0x9c, 0xed, 0xba, 0x74, 0x32, 0xc2, 0x34, 0x5e, 0xd3, 0xc3, 0x34, 0x9e, 0xed, + 0x76, 0xc4, 0x06, 0x7a, 0xf8, 0xe4, 0xa9, 0xf2, 0x74, 0x77, 0xe9, 0xe4, 0xfb, 0xf9, 0xc4, 0x91, + 0x2b, 0x2e, 0x16, 0x3c, 0xdc, 0x7e, 0x37, 0x99, 0x24, 0x8f, 0x79, 0xc5, 0xf8, 0xa1, 0x9c, 0x8f, + 0x2f, 0x34, 0x89, 0xf4, 0xa9, 0xfc, 0x78, 0xfe, 0xb4, 0xa7, 0xef, 0x5b, 0x30, 0xce, 0x33, 0x0a, + 0xdd, 0xa5, 0x87, 0x07, 0x9e, 0xef, 0xc8, 0x1c, 0x99, 0x28, 0x83, 0xa7, 0x72, 0xef, 0x25, 0x70, + 0xc9, 0x92, 0x74, 0x52, 0x1a, 0xc0, 0xda, 0xcf, 0x66, 0xee, 0x62, 0x0c, 0xa1, 0x97, 0xff, 0x12, + 0x79, 0x3d, 0x12, 0xd4, 0xa8, 0xaf, 0x06, 0x51, 0xf6, 0x25, 0x30, 0x43, 0x5e, 0xa3, 0xbe, 0xf1, + 0x07, 0x05, 0x20, 0xbc, 0xa6, 0x45, 0xbb, 0x6d, 0xa3, 0x0b, 0x9f, 0x8b, 0xa1, 0x28, 0xca, 0x02, + 0xc7, 0xde, 0x6e, 0x50, 0x35, 0x8e, 0x8b, 0x30, 0x3a, 0x8d, 0xca, 0xac, 0xe4, 0x45, 0x27, 0x45, + 0xd8, 0x65, 0xab, 0xcb, 0x7f, 0x9a, 0xad, 0xee, 0x9b, 0xf0, 0x6c, 0xa5, 0x8d, 0xa9, 0xc9, 0x64, + 0x2d, 0xb7, 0x3c, 0x5f, 0x6e, 0x52, 0x9a, 0x73, 0x88, 0x1d, 0xa1, 0xa5, 0x5a, 0xda, 0x8b, 0x85, + 0x22, 0xa7, 0xb0, 0x79, 0xd9, 0x0e, 0x55, 0x67, 0x63, 0x29, 0xa7, 0xb4, 0xb1, 0x24, 0x43, 0x4e, + 0xe1, 0x24, 0x92, 0x87, 0xeb, 0x4b, 0x39, 0x05, 0xd3, 0x06, 0xc4, 0x3c, 0x5c, 0x9f, 0x76, 0x91, + 0x75, 0x22, 0x12, 0xf2, 0x16, 0x8c, 0x54, 0x3a, 0xa1, 0x27, 0x18, 0x0b, 0x6b, 0xe9, 0xd8, 0xae, + 0x59, 0x34, 0x45, 0xbb, 0xfa, 0xc4, 0xe8, 0xc6, 0x1f, 0x17, 0xe0, 0x6c, 0x7a, 0x78, 0x45, 0x69, + 0xb4, 0x3e, 0x72, 0xc7, 0xac, 0x8f, 0xac, 0xd9, 0xc0, 0x1f, 0x0b, 0x9e, 0xd8, 0x6c, 0xe0, 0x19, + 0xce, 0x3e, 0xe1, 0x6c, 0xa8, 0xc1, 0x88, 0x7a, 0xde, 0x15, 0x3f, 0xe9, 0x79, 0xa7, 0x72, 0x61, + 0x97, 0x7a, 0xee, 0x63, 0x3d, 0x10, 0x3f, 0x1d, 0x25, 0xdd, 0xab, 0x39, 0x06, 0xf9, 0xff, 0xc1, + 0x05, 0xbe, 0x27, 0x25, 0x3f, 0x76, 0xe1, 0x50, 0x72, 0x14, 0x03, 0x37, 0xff, 0xf8, 0x68, 0xee, + 0x2a, 0x57, 0x95, 0x58, 0xa9, 0x6e, 0xb3, 0xb6, 0x0f, 0x2d, 0xd9, 0x32, 0xa5, 0x92, 0x63, 0x79, + 0x63, 0x5a, 0x33, 0x25, 0x6b, 0xd6, 0x6b, 0x59, 0x6e, 0x24, 0x3c, 0x12, 0x29, 0x07, 0xeb, 0x1e, + 0x24, 0x52, 0x1d, 0x96, 0xcf, 0x54, 0x87, 0x49, 0x7d, 0x4a, 0x21, 0x53, 0x9f, 0xb2, 0x04, 0x13, + 0xb5, 0xce, 0xb6, 0xac, 0x1b, 0x11, 0x8b, 0x9a, 0x27, 0x5c, 0xd6, 0x07, 0x25, 0x49, 0x8c, 0x1f, + 0xcf, 0xc3, 0xe8, 0x46, 0xa3, 0xb3, 0xeb, 0xb6, 0x96, 0xec, 0xd0, 0x7e, 0x6a, 0x35, 0x74, 0x6f, + 0x68, 0x1a, 0xba, 0xc8, 0x5b, 0x2a, 0xfa, 0xb0, 0xbe, 0xd4, 0x73, 0xdf, 0xcd, 0xc1, 0x44, 0x4c, + 0xc2, 0xcf, 0xd9, 0x15, 0x28, 0xb2, 0x1f, 0xe2, 0xde, 0x7a, 0x21, 0xc5, 0x98, 0xa7, 0x6a, 0x89, + 0xfe, 0x12, 0x3a, 0x33, 0x3d, 0x0f, 0x02, 0x72, 0x98, 0xfd, 0x12, 0x0c, 0xc7, 0x6c, 0x4f, 0x92, + 0xa2, 0xe5, 0xd7, 0x72, 0x50, 0x4e, 0x7e, 0x09, 0xb9, 0x0b, 0x43, 0x8c, 0x93, 0x4b, 0xe5, 0x95, + 0xfa, 0x85, 0x2e, 0xdf, 0x7c, 0x55, 0xa0, 0xf1, 0xe6, 0x61, 0xe7, 0x53, 0x0e, 0x31, 0x25, 0x87, + 0x59, 0x13, 0x46, 0x55, 0xac, 0x8c, 0xd6, 0xbd, 0xaa, 0x0b, 0x17, 0xa7, 0xb3, 0xfb, 0x41, 0x4b, + 0x2c, 0xa3, 0xb5, 0x5a, 0xc8, 0x0d, 0x97, 0xb4, 0xc9, 0x85, 0x7d, 0x95, 0x98, 0x37, 0x7c, 0x9a, + 0xcd, 0xc7, 0xc1, 0x91, 0xd5, 0x79, 0x96, 0x31, 0xa1, 0x23, 0x3c, 0xf2, 0x2a, 0x0c, 0xf2, 0xfa, + 0xd4, 0x04, 0x0b, 0x6d, 0x84, 0xa8, 0x22, 0x2e, 0xc7, 0x31, 0xfe, 0x66, 0x01, 0x4e, 0xc7, 0xcd, + 0xbb, 0xdf, 0x76, 0xec, 0x90, 0x6e, 0xd8, 0xbe, 0xdd, 0x0c, 0x8e, 0x59, 0x01, 0x97, 0x53, 0x4d, + 0xc3, 0x80, 0xfb, 0xb2, 0x69, 0x4a, 0x83, 0x8c, 0x44, 0x83, 0x50, 0x7d, 0xc9, 0x1b, 0x24, 0x9b, + 0x41, 0xee, 0x42, 0xa1, 0x46, 0x43, 0xb1, 0x6d, 0x5e, 0x4a, 0xf5, 0xaa, 0xda, 0xae, 0xab, 0x35, + 0x1a, 0xf2, 0x41, 0xe4, 0xb1, 0x3f, 0xa8, 0x16, 0x7b, 0xb1, 0x46, 0x43, 0xb2, 0x05, 0x83, 0xcb, + 0x8f, 0xda, 0xb4, 0x1e, 0x8a, 0x04, 0x43, 0x57, 0x7a, 0xf3, 0xe3, 0xb8, 0x4a, 0x7e, 0x21, 0x8a, + 0x00, 0xb5, 0xb3, 0x38, 0xca, 0xec, 0x4d, 0x28, 0xc9, 0xca, 0x4f, 0x32, 0x73, 0x67, 0xdf, 0x80, + 0x11, 0xa5, 0x92, 0x13, 0x4d, 0xfa, 0x5f, 0x60, 0xfb, 0xaa, 0xd7, 0x90, 0x39, 0x89, 0x96, 0x53, + 0x62, 0x5e, 0x2e, 0xf6, 0xd9, 0xe5, 0x62, 0x9e, 0xb5, 0x2f, 0x8a, 0x7a, 0xc8, 0x7b, 0x55, 0x98, + 0xa8, 0xed, 0xbb, 0xed, 0x38, 0x04, 0x9e, 0x76, 0x98, 0x62, 0xb4, 0x78, 0x71, 0xe7, 0x4e, 0x1e, + 0xa6, 0x49, 0x3a, 0xe3, 0xcf, 0x72, 0x30, 0xc8, 0xfe, 0x7a, 0x70, 0xf3, 0x29, 0xdd, 0x32, 0x6f, + 0x68, 0x5b, 0xe6, 0xa4, 0x12, 0x7f, 0x16, 0x37, 0x8e, 0x9b, 0xc7, 0x6c, 0x96, 0x47, 0x62, 0x80, + 0x38, 0x32, 0xb9, 0x0d, 0x43, 0xc2, 0xf2, 0x46, 0x98, 0x48, 0xab, 0x01, 0x6d, 0xa5, 0x4d, 0x4e, + 0x74, 0x39, 0xf7, 0xda, 0x49, 0x6d, 0x86, 0xa4, 0x66, 0x22, 0xb9, 0x0c, 0x46, 0xa8, 0x65, 0xb2, + 0xf3, 0xd0, 0xff, 0x8c, 0x07, 0x64, 0x55, 0x72, 0x4f, 0x76, 0x71, 0xec, 0xaf, 0x88, 0x87, 0x8c, + 0x42, 0x2f, 0x26, 0xa7, 0x65, 0xa2, 0xaf, 0xcc, 0x37, 0x8e, 0x3f, 0x9c, 0xe2, 0xa1, 0x4c, 0x65, + 0xc3, 0xde, 0x86, 0xd1, 0x5b, 0x9e, 0x7f, 0x60, 0xfb, 0x3c, 0x40, 0x9d, 0xb0, 0x1c, 0x60, 0x57, + 0xc7, 0xb1, 0x1d, 0x0e, 0xe7, 0x21, 0xee, 0x3e, 0x3e, 0x9a, 0x2b, 0x2e, 0x78, 0x5e, 0xc3, 0xd4, + 0xd0, 0xc9, 0x3a, 0x8c, 0xdd, 0xb3, 0x1f, 0x29, 0x97, 0x5e, 0xee, 0x50, 0x72, 0x85, 0x4d, 0x60, + 0x76, 0x6b, 0x3e, 0xde, 0x0c, 0x4a, 0xa7, 0x27, 0x2e, 0x8c, 0x6f, 0x78, 0x7e, 0x28, 0x2a, 0x71, + 0x5b, 0xbb, 0xe2, 0x63, 0xd3, 0x86, 0x5c, 0xd7, 0x32, 0x0d, 0xb9, 0xce, 0xb6, 0x3d, 0x3f, 0xb4, + 0x76, 0x22, 0x72, 0x2d, 0x68, 0x8e, 0xc6, 0x98, 0xbc, 0x0d, 0x93, 0x4a, 0x50, 0xb0, 0x5b, 0x9e, + 0xdf, 0xb4, 0xa5, 0x50, 0x8e, 0x7a, 0x60, 0xb4, 0x37, 0xd9, 0x41, 0xb0, 0x99, 0xc6, 0x24, 0x1f, + 0x64, 0xb9, 0xe8, 0x0c, 0xc4, 0x96, 0x60, 0x19, 0x2e, 0x3a, 0xdd, 0x2c, 0xc1, 0xd2, 0xce, 0x3a, + 0xbb, 0xbd, 0x2c, 0x45, 0x4b, 0x0b, 0xd7, 0xc5, 0xf5, 0xfb, 0x78, 0x4b, 0xd0, 0x68, 0xdc, 0xba, + 0x58, 0x84, 0xce, 0x43, 0x61, 0x61, 0xe3, 0x16, 0xbe, 0x5e, 0x48, 0x43, 0x9b, 0xd6, 0x9e, 0xdd, + 0xaa, 0xa3, 0xb0, 0x2c, 0xac, 0xb3, 0xd5, 0x1d, 0x79, 0x61, 0xe3, 0x16, 0xb1, 0x61, 0x6a, 0x83, + 0xfa, 0x4d, 0x37, 0xfc, 0xda, 0xf5, 0xeb, 0xca, 0x40, 0x95, 0xb0, 0x69, 0xd7, 0x44, 0xd3, 0xe6, + 0xda, 0x88, 0x62, 0x3d, 0xba, 0x7e, 0x3d, 0x73, 0x38, 0xa2, 0x86, 0x65, 0xf1, 0x62, 0x3b, 0xe3, + 0x3d, 0xfb, 0x51, 0x6c, 0x54, 0x1f, 0x08, 0x67, 0xc7, 0xf3, 0x72, 0x62, 0xc5, 0x06, 0xf9, 0xda, + 0xce, 0xa8, 0x13, 0xb1, 0xbb, 0x4e, 0x3c, 0xbd, 0x02, 0xe1, 0x26, 0x32, 0x2b, 0x55, 0x3a, 0xd2, + 0x23, 0x56, 0x15, 0xd8, 0x15, 0x74, 0x72, 0x3f, 0xba, 0xb1, 0xf1, 0x1b, 0x8f, 0x48, 0x63, 0x75, + 0x4d, 0xbd, 0xb1, 0x71, 0x45, 0x8a, 0xf6, 0x59, 0x13, 0xd1, 0x35, 0x9f, 0x7b, 0x19, 0x98, 0x3a, + 0x97, 0xf4, 0x45, 0x70, 0xf4, 0xe4, 0x17, 0x41, 0x0a, 0xc5, 0x55, 0xaf, 0xbe, 0x2f, 0x22, 0xfd, + 0x7c, 0x95, 0x2d, 0xf7, 0x86, 0x57, 0xdf, 0x7f, 0x72, 0x16, 0xb0, 0xc8, 0x9e, 0xac, 0xb1, 0xa6, + 0xb2, 0x59, 0x20, 0xfa, 0x44, 0x58, 0x55, 0x4e, 0x47, 0x37, 0x21, 0xa5, 0x8c, 0x0b, 0x3e, 0x7c, + 0xd2, 0xc8, 0xae, 0x35, 0x75, 0x72, 0x42, 0xa1, 0xbc, 0x44, 0x83, 0xfd, 0xd0, 0x6b, 0x2f, 0x36, + 0xdc, 0xf6, 0xb6, 0x67, 0xfb, 0x0e, 0xea, 0xee, 0xb2, 0xd6, 0xf7, 0x4b, 0x99, 0xeb, 0x7b, 0xd2, + 0xe1, 0xf4, 0x56, 0x5d, 0x32, 0x30, 0x53, 0x2c, 0xc9, 0x07, 0x30, 0xce, 0x26, 0xf7, 0xf2, 0xa3, + 0x90, 0xb6, 0xf8, 0xc8, 0x4f, 0xa2, 0xe8, 0x30, 0xad, 0x04, 0xfe, 0x8e, 0x0a, 0xf9, 0x9c, 0xc2, + 0xc5, 0x4e, 0x23, 0x02, 0x2d, 0x4a, 0x92, 0xc6, 0x8a, 0x38, 0x30, 0x73, 0xcf, 0x7e, 0xa4, 0x24, + 0xdf, 0x52, 0x26, 0x29, 0xc1, 0x09, 0x86, 0xc9, 0xc6, 0xd9, 0x04, 0x8b, 0x03, 0x74, 0x76, 0x99, + 0xaf, 0x5d, 0x39, 0x91, 0x1f, 0x84, 0x33, 0xe2, 0xb3, 0x96, 0x30, 0x1b, 0x86, 0xe7, 0x1f, 0xd6, + 0xf6, 0x6c, 0xf4, 0xa7, 0x99, 0x3a, 0xd9, 0x86, 0x28, 0x3b, 0xcc, 0x91, 0x7c, 0xac, 0x80, 0x33, + 0x32, 0xbb, 0xd5, 0x40, 0x3e, 0x82, 0x71, 0xfe, 0x64, 0xb3, 0xe2, 0x05, 0x21, 0x5e, 0xe8, 0xa7, + 0x4f, 0x66, 0x26, 0xce, 0xdf, 0x81, 0xb8, 0x63, 0x45, 0x42, 0x01, 0x90, 0xe0, 0x4c, 0xde, 0x84, + 0x91, 0x0d, 0xb7, 0xc5, 0xe3, 0x98, 0x55, 0x37, 0x50, 0xf5, 0x28, 0xce, 0x9f, 0xb6, 0xdb, 0xb2, + 0xe4, 0xad, 0xba, 0x1d, 0x6d, 0x17, 0x2a, 0x36, 0xd9, 0x82, 0x91, 0x5a, 0x6d, 0xe5, 0x96, 0xcb, + 0x0e, 0xc0, 0xf6, 0xe1, 0xcc, 0xe9, 0x2e, 0xad, 0xbc, 0x98, 0xd9, 0xca, 0xb1, 0x20, 0xd8, 0xc3, + 0x84, 0xc6, 0x56, 0xdd, 0x6b, 0x1f, 0x9a, 0x2a, 0xa7, 0x0c, 0xd3, 0xe9, 0x33, 0x4f, 0xd8, 0x74, + 0xba, 0x0a, 0x13, 0x8a, 0x81, 0x25, 0x1a, 0x57, 0xce, 0xc4, 0x61, 0xbb, 0x54, 0x53, 0xe9, 0xa4, + 0x5b, 0x5f, 0x92, 0x4e, 0xda, 0x4c, 0x9f, 0x3d, 0xa9, 0xcd, 0xb4, 0x0b, 0x93, 0x7c, 0x30, 0xc4, + 0x3c, 0xc0, 0x91, 0x9e, 0xed, 0xd2, 0x87, 0x57, 0x32, 0xfb, 0x70, 0x4a, 0x8c, 0xb4, 0x9c, 0x64, + 0xf8, 0x44, 0x99, 0xe6, 0x4a, 0x76, 0x80, 0x08, 0xa0, 0x48, 0xa7, 0x8c, 0x75, 0x3d, 0xdb, 0xa5, + 0xae, 0x17, 0x32, 0xeb, 0x1a, 0x97, 0x75, 0x6d, 0xf3, 0x6a, 0x32, 0x38, 0x92, 0x96, 0xac, 0x47, + 0xce, 0x2f, 0xec, 0xd8, 0x73, 0x9a, 0x1e, 0x34, 0x8d, 0xc0, 0x83, 0x88, 0x26, 0x27, 0x6d, 0xb2, + 0xdf, 0x33, 0x38, 0x93, 0x47, 0x70, 0x3a, 0xdd, 0x0a, 0xac, 0xf3, 0x3c, 0xd6, 0x79, 0x5e, 0xab, + 0x33, 0x89, 0xc4, 0xe7, 0x8d, 0xfe, 0x59, 0xc9, 0x5a, 0xbb, 0xf0, 0xbf, 0x53, 0x2c, 0x8d, 0x95, + 0xc7, 0xb3, 0x2c, 0xad, 0xff, 0x41, 0x3e, 0xb1, 0x69, 0x93, 0x2a, 0x0c, 0x89, 0xb1, 0x10, 0x52, + 0x6c, 0xba, 0xc7, 0xcf, 0x67, 0xf6, 0xf8, 0x90, 0x18, 0x56, 0x53, 0xd2, 0x93, 0x03, 0xc6, 0x0a, + 0xcd, 0xd6, 0x85, 0xd8, 0xff, 0x21, 0xdf, 0x93, 0x11, 0xa4, 0x9d, 0x3e, 0x4b, 0x27, 0x77, 0xda, + 0xd1, 0x7d, 0xc2, 0xf0, 0x18, 0x92, 0xb5, 0x91, 0x7d, 0x9e, 0x29, 0xa0, 0x10, 0x79, 0x7e, 0xe8, + 0x69, 0x01, 0x9e, 0x58, 0x85, 0xac, 0x16, 0xe3, 0x37, 0x73, 0x30, 0xa6, 0xed, 0xfa, 0xe4, 0xa6, + 0xe2, 0xd6, 0x14, 0x7b, 0xe5, 0x6a, 0x38, 0xb8, 0x11, 0x24, 0x1d, 0x9e, 0x6e, 0x0a, 0xbb, 0xe9, + 0x7c, 0x77, 0xba, 0xcc, 0xac, 0xe2, 0xbd, 0x95, 0x64, 0x51, 0xe6, 0xa1, 0x62, 0x97, 0xcc, 0x43, + 0xbf, 0xfe, 0x2c, 0x8c, 0xeb, 0xd7, 0x02, 0xf2, 0x2a, 0x0c, 0xa2, 0x6e, 0x51, 0xde, 0x31, 0x79, + 0xee, 0x5d, 0x84, 0x68, 0xb9, 0x77, 0x11, 0x42, 0x5e, 0x04, 0x88, 0x0c, 0x58, 0xa5, 0x66, 0x7d, + 0xe0, 0xf1, 0xd1, 0x5c, 0xee, 0x35, 0x53, 0x29, 0x20, 0xdf, 0x00, 0x58, 0xf3, 0x1c, 0x1a, 0x65, + 0x47, 0xeb, 0xf1, 0x7a, 0xfc, 0x52, 0x2a, 0x8a, 0xf6, 0xa9, 0x96, 0xe7, 0xd0, 0x74, 0xc8, 0x6c, + 0x85, 0x23, 0xf9, 0x0a, 0x0c, 0x98, 0x1d, 0x76, 0x9f, 0xe5, 0xaa, 0x84, 0x11, 0xb9, 0xfb, 0x76, + 0x1a, 0x54, 0x49, 0xd4, 0xdf, 0x49, 0x1a, 0x46, 0x31, 0x00, 0x79, 0x97, 0x47, 0xd7, 0x16, 0xc1, + 0xb0, 0x06, 0xe2, 0xb7, 0x06, 0xe5, 0x54, 0x4e, 0x85, 0xc3, 0x52, 0x48, 0xc8, 0x3a, 0x0c, 0xa9, + 0x4a, 0x72, 0xc5, 0x3f, 0x56, 0x7d, 0x48, 0x51, 0x6e, 0x5e, 0x22, 0xad, 0x5a, 0x52, 0x7f, 0x2e, + 0xb9, 0x90, 0xb7, 0x60, 0x98, 0xb1, 0x67, 0x4b, 0x38, 0x10, 0x12, 0x37, 0xbe, 0x28, 0x28, 0x0d, + 0x62, 0x3b, 0x80, 0x16, 0xb2, 0x2a, 0x22, 0x20, 0x1f, 0x60, 0xe6, 0x30, 0xd1, 0xd5, 0x3d, 0xad, + 0x0a, 0x2e, 0xa5, 0xba, 0x1a, 0x53, 0x89, 0xa5, 0x93, 0xca, 0x46, 0xfc, 0xc8, 0x6e, 0x14, 0x4a, + 0xa9, 0x9f, 0x88, 0xe8, 0x2f, 0xa7, 0x2a, 0x98, 0x91, 0xd1, 0x81, 0xd2, 0x59, 0xee, 0x34, 0xbe, + 0xa4, 0x0d, 0xe5, 0x58, 0xe0, 0x11, 0x75, 0x41, 0xaf, 0xba, 0x5e, 0x4b, 0xd5, 0xa5, 0x0e, 0x60, + 0xaa, 0xba, 0x14, 0x77, 0xe2, 0xc0, 0xb8, 0xdc, 0x3c, 0x45, 0x7d, 0x23, 0xbd, 0xea, 0x7b, 0x31, + 0x55, 0xdf, 0x94, 0xb3, 0x9d, 0xae, 0x27, 0xc1, 0x93, 0xbc, 0x05, 0x63, 0x12, 0x82, 0xeb, 0x43, + 0x64, 0xaf, 0x45, 0xad, 0x88, 0xb3, 0x8d, 0x26, 0xf3, 0x7a, 0xee, 0x3f, 0x15, 0x59, 0xa5, 0xe6, + 0xb3, 0x63, 0x4c, 0xa3, 0x4e, 0xce, 0x0a, 0x1d, 0x99, 0xbc, 0x0f, 0x23, 0xd5, 0x26, 0xfb, 0x10, + 0xaf, 0x65, 0x87, 0x54, 0xf8, 0x4e, 0x49, 0x0b, 0x09, 0xa5, 0x44, 0x99, 0xaa, 0x3c, 0x9b, 0x5e, + 0x5c, 0xa4, 0x65, 0xd3, 0x8b, 0xc1, 0xac, 0xf3, 0xf8, 0xab, 0x88, 0x98, 0xc3, 0xd2, 0xaf, 0xea, + 0x7c, 0x86, 0x95, 0x82, 0xc2, 0x5e, 0x04, 0x9d, 0x63, 0x50, 0xf9, 0x2a, 0x91, 0x08, 0x3a, 0xa7, + 0xf2, 0x24, 0x6f, 0xc3, 0x88, 0x48, 0x16, 0x51, 0x31, 0xd7, 0x82, 0x99, 0x32, 0x7e, 0x3c, 0x7a, + 0x83, 0xcb, 0xbc, 0x12, 0x96, 0xed, 0x27, 0xcc, 0xf1, 0x62, 0x7c, 0xf2, 0x35, 0x98, 0xde, 0x72, + 0x5b, 0x8e, 0x77, 0x10, 0x88, 0x63, 0x4a, 0x6c, 0x74, 0x93, 0xb1, 0x33, 0xcc, 0x01, 0x2f, 0x8f, + 0xe4, 0x94, 0xd4, 0xc6, 0x97, 0xc9, 0x81, 0xfc, 0xc5, 0x14, 0x67, 0x3e, 0x83, 0x48, 0xaf, 0x19, + 0x34, 0x9f, 0x9a, 0x41, 0xe9, 0xea, 0x93, 0xd3, 0x29, 0xb3, 0x1a, 0xe2, 0x01, 0xd1, 0xcf, 0xf7, + 0x3b, 0x9e, 0xdb, 0x9a, 0x99, 0xc2, 0xbd, 0xf0, 0xd9, 0xa4, 0xff, 0x35, 0xe2, 0x6d, 0x78, 0x0d, + 0xb7, 0x7e, 0xc8, 0x33, 0xd7, 0x27, 0xe5, 0xd1, 0x8f, 0x3c, 0x4d, 0x67, 0x9c, 0xc1, 0x9a, 0xbc, + 0x0f, 0xa3, 0xec, 0xff, 0xe8, 0xc2, 0x3c, 0xad, 0xd9, 0xb5, 0x29, 0x98, 0xa2, 0x1e, 0x1c, 0x23, + 0xcc, 0x66, 0x91, 0x71, 0x97, 0xd6, 0x58, 0x91, 0x37, 0x00, 0x98, 0xe4, 0x24, 0xb6, 0xe3, 0x53, + 0x71, 0x8c, 0x3f, 0x94, 0xb7, 0xd2, 0x1b, 0x71, 0x8c, 0xcc, 0x6e, 0xf1, 0xec, 0x57, 0xad, 0xe3, + 0x78, 0x6c, 0x6d, 0x9c, 0x46, 0x5a, 0xee, 0x92, 0xc6, 0x68, 0x03, 0x0e, 0xd7, 0x5c, 0xd2, 0x62, + 0x74, 0xb2, 0x02, 0x13, 0x18, 0x8b, 0xb1, 0xea, 0xd0, 0x56, 0x88, 0xaf, 0x95, 0x33, 0x67, 0x94, + 0xd7, 0x5c, 0x56, 0x64, 0xb9, 0x51, 0x99, 0x2a, 0x67, 0x27, 0xc8, 0x48, 0x00, 0x53, 0xf1, 0xee, + 0x12, 0xbf, 0x0d, 0xcf, 0x60, 0x27, 0x49, 0xe9, 0x32, 0x8d, 0xc1, 0xf7, 0x63, 0x36, 0x22, 0xca, + 0xc6, 0x25, 0x35, 0xeb, 0x6a, 0x85, 0x59, 0xdc, 0x89, 0x09, 0xe4, 0xf6, 0xe2, 0x46, 0x32, 0x58, + 0xe1, 0x59, 0xfc, 0x02, 0x1c, 0xe6, 0xdd, 0x7a, 0x9c, 0xb7, 0x31, 0x23, 0x60, 0x61, 0x06, 0x35, + 0xf9, 0x36, 0x9c, 0x92, 0x3b, 0x88, 0x28, 0x12, 0xf3, 0x7a, 0xf6, 0x84, 0x3b, 0xb1, 0xb3, 0x1d, + 0x55, 0x9d, 0x9a, 0xd2, 0xd9, 0x55, 0x10, 0x1b, 0x46, 0x70, 0x58, 0x45, 0x8d, 0xcf, 0xf6, 0xaa, + 0xf1, 0x72, 0xaa, 0xc6, 0xd3, 0x38, 0x51, 0xd2, 0x95, 0xa9, 0x3c, 0xc9, 0x02, 0x8c, 0x89, 0x75, + 0x24, 0x66, 0xdb, 0x39, 0xec, 0x2d, 0x54, 0xb0, 0xc8, 0x15, 0x98, 0x9a, 0x70, 0x3a, 0x89, 0xba, + 0x23, 0x73, 0x8d, 0xfa, 0x79, 0x6d, 0x47, 0x4e, 0x2a, 0xd2, 0x75, 0x64, 0xb6, 0x23, 0xc5, 0x52, + 0xcc, 0xf2, 0xa3, 0xb6, 0x2f, 0xd4, 0x27, 0xcf, 0xc5, 0x31, 0xfc, 0x15, 0xe1, 0xc7, 0xa2, 0x11, + 0x86, 0xba, 0x25, 0x64, 0x71, 0x20, 0xf7, 0x61, 0x2a, 0x3a, 0xb5, 0x15, 0xc6, 0x73, 0x71, 0x2e, + 0x84, 0xf8, 0xa8, 0xcf, 0xe6, 0x9b, 0x45, 0x4f, 0x6c, 0x38, 0xa3, 0x9d, 0xd3, 0x0a, 0xeb, 0x0b, + 0xc8, 0x1a, 0xf3, 0x84, 0xea, 0x87, 0x7c, 0x36, 0xfb, 0x6e, 0x7c, 0xc8, 0x47, 0x30, 0x9b, 0x3c, + 0x9b, 0x95, 0x5a, 0x9e, 0xc7, 0x5a, 0x5e, 0x7e, 0x7c, 0x34, 0x77, 0x29, 0x75, 0xbc, 0x67, 0x57, + 0xd4, 0x83, 0x1b, 0xf9, 0x06, 0xcc, 0xe8, 0xe7, 0xb3, 0x52, 0x93, 0x81, 0x35, 0xe1, 0xd2, 0x89, + 0x0e, 0xf6, 0xec, 0x1a, 0xba, 0xf2, 0x20, 0x21, 0xcc, 0x65, 0xce, 0x6e, 0xa5, 0x9a, 0x8b, 0xf1, + 0x07, 0xa5, 0x56, 0x49, 0x76, 0x75, 0xc7, 0xb1, 0x24, 0x07, 0xf0, 0x5c, 0xd6, 0x31, 0xa1, 0x54, + 0xfa, 0x42, 0xa4, 0xa0, 0x7c, 0x25, 0xfb, 0xc8, 0xc9, 0xae, 0xf9, 0x18, 0xb6, 0xe4, 0x03, 0x38, + 0xa5, 0xac, 0x2f, 0xa5, 0xbe, 0x17, 0xb1, 0x3e, 0x74, 0x65, 0x55, 0x17, 0x66, 0x76, 0x2d, 0xd9, + 0x3c, 0x48, 0x13, 0xa6, 0xe4, 0x87, 0xa3, 0x26, 0x58, 0x1c, 0x3d, 0x97, 0xb4, 0x5d, 0x35, 0x8d, + 0xa1, 0x24, 0x58, 0xde, 0xb6, 0xda, 0x31, 0xa1, 0x3a, 0xd3, 0x33, 0xf8, 0x92, 0x15, 0x18, 0xac, + 0x6d, 0x54, 0x6f, 0xdd, 0x5a, 0x9e, 0x79, 0x09, 0x6b, 0x90, 0x7e, 0x2f, 0x1c, 0xa8, 0x5d, 0x9a, + 0x84, 0xb9, 0x55, 0xdb, 0xdd, 0xd9, 0xd1, 0xdc, 0x8b, 0x38, 0xea, 0x9d, 0x62, 0xe9, 0x72, 0xf9, + 0xca, 0x9d, 0x62, 0xe9, 0x4a, 0xf9, 0x65, 0xf3, 0x5c, 0x76, 0x6e, 0x5c, 0xfe, 0xb1, 0xe6, 0xa5, + 0x5e, 0xa5, 0x71, 0x57, 0x18, 0xbf, 0x90, 0x83, 0xa9, 0x8c, 0x76, 0x90, 0x4b, 0x50, 0xc4, 0xe4, + 0x02, 0xca, 0x03, 0x73, 0x22, 0xa9, 0x00, 0x96, 0x93, 0x2f, 0xc0, 0xd0, 0xd2, 0x5a, 0xad, 0x56, + 0x59, 0x93, 0x57, 0x36, 0xbe, 0x5d, 0xb5, 0x02, 0x2b, 0xb0, 0xf5, 0x77, 0x29, 0x81, 0x46, 0x5e, + 0x83, 0xc1, 0xea, 0x06, 0x12, 0x70, 0x0b, 0x27, 0xbc, 0xc2, 0xb8, 0xed, 0x24, 0xbe, 0x40, 0x32, + 0x7e, 0x22, 0x07, 0x24, 0xdd, 0xa9, 0xe4, 0x3a, 0x8c, 0xa8, 0x43, 0xc7, 0x2f, 0x98, 0xf8, 0x86, + 0xa2, 0x0c, 0x8c, 0xa9, 0xe2, 0x90, 0x25, 0x18, 0xc0, 0x64, 0x48, 0xd1, 0x83, 0x58, 0xe6, 0x01, + 0x70, 0x26, 0x75, 0x00, 0x0c, 0x60, 0xaa, 0x25, 0x93, 0x13, 0x1b, 0xbf, 0x93, 0x03, 0x92, 0x3e, + 0x34, 0xfb, 0x7e, 0x90, 0x7f, 0x5d, 0xf1, 0x50, 0x55, 0xc3, 0x87, 0x47, 0xb9, 0x1f, 0xd4, 0xcb, + 0x52, 0xec, 0xcb, 0x7a, 0x49, 0xbb, 0x9c, 0x77, 0x77, 0x6b, 0xba, 0x02, 0x03, 0x0f, 0xa8, 0xbf, + 0x2d, 0x8d, 0xf7, 0xd0, 0xe0, 0xe7, 0x21, 0x03, 0xa8, 0x97, 0x55, 0xc4, 0x30, 0xfe, 0x38, 0x07, + 0xd3, 0x59, 0x92, 0xdc, 0x31, 0xde, 0x47, 0x46, 0xc2, 0x71, 0x0a, 0x1f, 0xe3, 0xb9, 0x35, 0x50, + 0xe4, 0x2e, 0x35, 0x07, 0x03, 0xec, 0x63, 0xe5, 0x08, 0xa3, 0xb2, 0x80, 0xf5, 0x46, 0x60, 0x72, + 0x38, 0x43, 0xe0, 0x51, 0x8f, 0x8a, 0x18, 0xdc, 0x0a, 0x11, 0x50, 0x50, 0x30, 0x39, 0x9c, 0x21, + 0xdc, 0xf3, 0x9c, 0x28, 0x03, 0x28, 0x22, 0x34, 0x19, 0xc0, 0xe4, 0x70, 0x72, 0x09, 0x86, 0xd6, + 0x5b, 0xab, 0xd4, 0x7e, 0x28, 0xd3, 0x57, 0xa0, 0xf1, 0x80, 0xd7, 0xb2, 0x1a, 0x0c, 0x66, 0xca, + 0x42, 0xe3, 0xbb, 0x39, 0x98, 0x4c, 0x09, 0x91, 0xc7, 0x3b, 0x58, 0xf5, 0xf6, 0x74, 0xe8, 0xe7, + 0xfb, 0x78, 0xf3, 0x8b, 0xd9, 0xcd, 0x37, 0xfe, 0xcf, 0x22, 0x9c, 0xe9, 0x72, 0xa7, 0x8f, 0x3d, + 0xb1, 0x72, 0xc7, 0x7a, 0x62, 0x7d, 0x9d, 0xdd, 0xa1, 0x6d, 0xb7, 0x19, 0x6c, 0x7a, 0x71, 0x8b, + 0x63, 0x83, 0x6e, 0x2c, 0x93, 0x49, 0x50, 0xa5, 0xe5, 0xef, 0x59, 0x9e, 0x88, 0xda, 0x0a, 0xbd, + 0xb4, 0x48, 0xa1, 0x31, 0x4b, 0xf9, 0x42, 0x15, 0xfe, 0x9c, 0xf8, 0x42, 0xe9, 0xd6, 0xf9, 0xc5, + 0x27, 0x6a, 0x9d, 0x9f, 0x6d, 0xd9, 0x37, 0xf0, 0x69, 0xec, 0x3c, 0x17, 0x61, 0x8c, 0x5b, 0x4f, + 0x54, 0x02, 0x3e, 0x48, 0x83, 0x29, 0x8b, 0x0b, 0x3b, 0x48, 0x8f, 0x85, 0x46, 0x43, 0x56, 0x74, + 0x4b, 0xf2, 0x21, 0x7c, 0xf5, 0xb9, 0xd4, 0xdd, 0x52, 0x5c, 0x7b, 0xed, 0x55, 0x49, 0x8d, 0xef, + 0xe6, 0x75, 0x47, 0xa9, 0x3f, 0x8f, 0x33, 0xef, 0x0a, 0x0c, 0x6c, 0xed, 0x51, 0x5f, 0xee, 0x77, + 0xd8, 0x90, 0x03, 0x06, 0x50, 0x1b, 0x82, 0x18, 0xe4, 0x16, 0x8c, 0x6f, 0xf0, 0x91, 0x90, 0xdd, + 0x5b, 0x8c, 0xaf, 0x5a, 0x6d, 0xa1, 0x10, 0xc8, 0xe8, 0xdf, 0x04, 0x95, 0x71, 0x1b, 0xce, 0x6b, + 0x0b, 0x52, 0x04, 0x76, 0xe0, 0x06, 0xdd, 0xfc, 0x44, 0x1c, 0x8f, 0x4d, 0xd8, 0xe3, 0xdd, 0xc3, + 0x4c, 0x40, 0x8d, 0x1d, 0x78, 0xae, 0x27, 0x23, 0x76, 0x10, 0x41, 0x3b, 0xfa, 0x95, 0xb0, 0x3a, + 0xeb, 0x49, 0x6a, 0x2a, 0x74, 0xc6, 0x0f, 0xc2, 0xa8, 0xda, 0xcb, 0xb8, 0xa7, 0xb2, 0xdf, 0x62, + 0x53, 0xe3, 0x7b, 0x2a, 0x03, 0x98, 0x1c, 0x7e, 0x6c, 0xf2, 0xf8, 0x78, 0xf8, 0x0b, 0xc7, 0x0d, + 0x3f, 0xab, 0x1c, 0x97, 0xac, 0x52, 0x39, 0xfe, 0x56, 0x2b, 0xc7, 0xc8, 0x0d, 0x26, 0x87, 0x3f, + 0xd1, 0xca, 0x7f, 0x5b, 0x06, 0xf1, 0x47, 0x7b, 0x71, 0x79, 0x27, 0x8e, 0x53, 0x74, 0x4e, 0x65, + 0xdd, 0x74, 0x63, 0xcc, 0xf8, 0x90, 0xcc, 0x1f, 0x77, 0x48, 0x9e, 0x64, 0x22, 0x5e, 0x83, 0xa1, + 0x8a, 0x78, 0x93, 0x2d, 0xc6, 0x82, 0x8d, 0x9d, 0x7a, 0x80, 0x95, 0x58, 0xc6, 0xf7, 0x72, 0x70, + 0x2a, 0x53, 0x55, 0xc6, 0x6a, 0xe5, 0x3a, 0x39, 0x65, 0x1d, 0x26, 0x15, 0x72, 0x1c, 0xe3, 0x24, + 0x6e, 0xbb, 0xfd, 0x7f, 0x8b, 0xf1, 0x3c, 0x0c, 0x47, 0x0f, 0x35, 0x64, 0x5a, 0x0e, 0x1d, 0x1a, + 0xea, 0x48, 0x7d, 0x7f, 0x0d, 0x80, 0xb5, 0xe0, 0x89, 0x9a, 0x95, 0x19, 0xbf, 0x9d, 0xe7, 0x09, + 0x9e, 0x9e, 0xda, 0x68, 0x77, 0xd9, 0xb6, 0x60, 0xec, 0x93, 0xba, 0xc7, 0xb8, 0x23, 0xcb, 0x30, + 0x58, 0x0b, 0xed, 0xb0, 0x23, 0xbd, 0x8d, 0xa7, 0x54, 0x32, 0x2c, 0x78, 0x30, 0x1f, 0xfb, 0x9b, + 0x06, 0x08, 0xd1, 0x2e, 0x07, 0x08, 0x51, 0x4c, 0xca, 0x5c, 0x18, 0x55, 0x69, 0xc9, 0xfb, 0x30, + 0x2e, 0x43, 0x78, 0x71, 0x17, 0x6c, 0xf1, 0xa8, 0x24, 0x8d, 0x13, 0x64, 0x08, 0x2f, 0xd5, 0x65, + 0x5b, 0xc3, 0x57, 0x77, 0xea, 0xb6, 0x8a, 0x6c, 0xfc, 0xc9, 0x20, 0x9f, 0x07, 0x22, 0x16, 0xdf, + 0x36, 0x8c, 0xaf, 0x57, 0x97, 0x16, 0x15, 0xc5, 0x97, 0x9e, 0x76, 0x61, 0xf9, 0x51, 0x48, 0xfd, + 0x96, 0xdd, 0x10, 0x08, 0x87, 0xf1, 0xd9, 0xe0, 0xb9, 0x4e, 0x3d, 0x5b, 0x29, 0x96, 0xe0, 0xc8, + 0xea, 0xe0, 0x97, 0x9b, 0xa8, 0x8e, 0x7c, 0x9f, 0x75, 0x04, 0x76, 0xb3, 0xd1, 0xa5, 0x0e, 0x9d, + 0x23, 0xd9, 0x83, 0xf2, 0x6d, 0x94, 0x63, 0x94, 0x5a, 0x0a, 0xbd, 0x6b, 0xb9, 0x28, 0x6a, 0x79, + 0x96, 0x0b, 0x40, 0xd9, 0xf5, 0xa4, 0xb8, 0xc6, 0x0b, 0xb8, 0x78, 0xec, 0x02, 0xfe, 0x2b, 0x39, + 0x18, 0xe4, 0x82, 0x92, 0x98, 0x5f, 0x5d, 0x44, 0xb1, 0xad, 0x27, 0x23, 0x8a, 0x95, 0x71, 0x03, + 0xd7, 0x66, 0x1a, 0x2f, 0x23, 0x4b, 0x89, 0x09, 0x2b, 0x4d, 0x14, 0x51, 0x85, 0xcd, 0x4b, 0x8e, + 0x9f, 0xaf, 0xa4, 0x1a, 0xbb, 0xe6, 0x0e, 0x1d, 0xeb, 0xfd, 0x25, 0xdd, 0x99, 0x87, 0x84, 0x6b, + 0xae, 0xee, 0x90, 0xbb, 0x0a, 0xc3, 0xc2, 0xe1, 0x77, 0xe1, 0x50, 0x3c, 0x54, 0x95, 0xb5, 0x67, + 0x70, 0x67, 0xe1, 0x30, 0x16, 0x02, 0x85, 0xcb, 0xb0, 0xb5, 0x7d, 0xa8, 0x25, 0xb2, 0x92, 0x88, + 0x64, 0x9d, 0x27, 0x78, 0xe1, 0xd1, 0x0a, 0xf5, 0x50, 0xc2, 0x11, 0x5c, 0x84, 0x12, 0x91, 0x5e, + 0x83, 0x19, 0xc1, 0x09, 0x63, 0x1e, 0x64, 0x15, 0xca, 0x22, 0xf1, 0x3d, 0xb7, 0xa3, 0xa8, 0x2e, + 0x71, 0xa7, 0x52, 0x61, 0xfe, 0x26, 0xd3, 0xe6, 0x0b, 0x0b, 0x0c, 0xdd, 0x9f, 0x23, 0x45, 0xc9, + 0x2e, 0x6e, 0xe5, 0xe4, 0xec, 0x23, 0x6f, 0xc1, 0x48, 0x14, 0x2d, 0x32, 0xf2, 0x28, 0x43, 0x85, + 0x75, 0x1c, 0x5e, 0x52, 0xf3, 0x2d, 0x53, 0xd1, 0xc9, 0x3c, 0x94, 0xd8, 0x22, 0x4e, 0xa6, 0xd0, + 0xea, 0x08, 0x98, 0x6a, 0x26, 0x2e, 0xf1, 0x48, 0x0d, 0xa6, 0xd8, 0xa2, 0xa9, 0xb9, 0xad, 0xdd, + 0x06, 0x5d, 0xf5, 0x76, 0xbd, 0x4e, 0x78, 0xdf, 0x5c, 0x15, 0x9b, 0x2b, 0x17, 0x95, 0xed, 0x66, + 0x43, 0x2b, 0xf6, 0xb5, 0x04, 0xa9, 0x19, 0xd4, 0xca, 0x1e, 0xf6, 0x87, 0x79, 0x18, 0x51, 0xe6, + 0x13, 0xb9, 0x02, 0xa5, 0x6a, 0xb0, 0xea, 0xd5, 0xf7, 0xa3, 0x58, 0x53, 0x63, 0x8f, 0x8f, 0xe6, + 0x86, 0xdd, 0xc0, 0x6a, 0x20, 0xd0, 0x8c, 0x8a, 0xc9, 0x02, 0x8c, 0xf1, 0xbf, 0x64, 0xc4, 0xed, + 0x7c, 0x6c, 0xed, 0xc6, 0x91, 0x65, 0xac, 0x6d, 0x75, 0x5f, 0xd3, 0x48, 0xc8, 0x87, 0x00, 0x1c, + 0x80, 0xde, 0x89, 0x85, 0xfe, 0xfd, 0x2a, 0x45, 0x05, 0x19, 0x7e, 0x89, 0x0a, 0x43, 0xf2, 0x4d, + 0x1e, 0x5d, 0x52, 0xce, 0xff, 0x62, 0xff, 0x8e, 0xa1, 0x8c, 0xbf, 0x95, 0xed, 0x9f, 0xae, 0xb2, + 0x14, 0x61, 0xf1, 0x66, 0x4d, 0x5a, 0xf7, 0x1e, 0x52, 0xff, 0xb0, 0x12, 0x22, 0xa2, 0x82, 0x61, + 0xfc, 0xf7, 0x39, 0x65, 0xd5, 0x90, 0x35, 0xcc, 0xfa, 0xc6, 0x67, 0x84, 0xb0, 0xd9, 0x88, 0x84, + 0x79, 0x09, 0x37, 0xe9, 0xce, 0xc2, 0xb3, 0xc2, 0xd8, 0x72, 0x2a, 0x9a, 0x57, 0x89, 0x6c, 0x70, + 0x1c, 0x48, 0xde, 0x83, 0x22, 0x76, 0x5d, 0xfe, 0xd8, 0x4f, 0x93, 0xe7, 0x69, 0x91, 0xf5, 0x19, + 0x7e, 0x08, 0x52, 0x92, 0x2f, 0x08, 0xcf, 0x2e, 0xde, 0xf9, 0xe3, 0xca, 0xa1, 0xc8, 0xda, 0x11, + 0x1d, 0xa4, 0x71, 0x88, 0x02, 0x65, 0xf6, 0xfc, 0x6b, 0x79, 0x28, 0x27, 0xd7, 0x2a, 0x79, 0x17, + 0x46, 0xe5, 0x49, 0x87, 0x69, 0x81, 0xd9, 0x57, 0x8e, 0x8a, 0x10, 0xd0, 0xf2, 0xb8, 0x4b, 0x66, + 0x05, 0x56, 0x09, 0x98, 0xd4, 0xb1, 0x29, 0x42, 0x06, 0x29, 0xab, 0x24, 0xf4, 0xc2, 0x76, 0x22, + 0x40, 0xa1, 0x44, 0x23, 0xaf, 0x43, 0xe1, 0xde, 0xad, 0x8a, 0x70, 0x23, 0x90, 0x5b, 0xd2, 0xbd, + 0x5b, 0x15, 0xbe, 0x9a, 0xb9, 0x99, 0x94, 0x6e, 0xb4, 0xc5, 0xf0, 0xc9, 0xaa, 0x12, 0xff, 0x73, + 0x50, 0xcb, 0xd1, 0x23, 0xc1, 0xd1, 0xc7, 0x1d, 0x1f, 0x08, 0x94, 0xe7, 0x1b, 0x16, 0x51, 0xf6, + 0xfe, 0xad, 0x02, 0x0c, 0x47, 0xf5, 0x13, 0x02, 0x28, 0x54, 0x89, 0x9b, 0x0c, 0xfe, 0x4d, 0xce, + 0x42, 0x49, 0xca, 0x51, 0xc2, 0x9b, 0x60, 0x28, 0x10, 0x32, 0xd4, 0x0c, 0x48, 0x81, 0x89, 0x2f, + 0x73, 0x53, 0xfe, 0x24, 0xd7, 0x21, 0x92, 0x86, 0xba, 0x89, 0x4d, 0x45, 0x36, 0x60, 0x66, 0x84, + 0x46, 0xc6, 0x21, 0xef, 0xf2, 0xc8, 0x2d, 0xc3, 0x66, 0xde, 0x75, 0xc8, 0xbb, 0x50, 0xb2, 0x1d, + 0x87, 0x3a, 0x96, 0x2d, 0x8d, 0x1f, 0x7a, 0x4d, 0x9a, 0x12, 0xe3, 0xc6, 0x0f, 0x01, 0xa4, 0xaa, + 0x84, 0xa4, 0x02, 0xc3, 0x0d, 0x9b, 0x1b, 0x52, 0x39, 0x7d, 0x9c, 0x28, 0x31, 0x87, 0x12, 0x23, + 0xbb, 0x1f, 0x50, 0x87, 0xbc, 0x04, 0x45, 0x36, 0x9a, 0xe2, 0x08, 0x91, 0xe2, 0x1b, 0x1b, 0x4c, + 0xde, 0x61, 0x2b, 0xcf, 0x98, 0x88, 0x40, 0x5e, 0x80, 0x42, 0x67, 0x7e, 0x47, 0x1c, 0x0e, 0xe5, + 0x38, 0x16, 0x6f, 0x84, 0xc6, 0x8a, 0xc9, 0x0d, 0x28, 0x1d, 0xe8, 0x61, 0x5c, 0x4f, 0x25, 0x86, + 0x31, 0xc2, 0x8f, 0x10, 0x17, 0x4a, 0x30, 0xc8, 0x0f, 0x02, 0xe3, 0x39, 0x80, 0xb8, 0xea, 0xb4, + 0xd3, 0x87, 0xf1, 0x21, 0x0c, 0x47, 0x55, 0x92, 0xf3, 0x00, 0xfb, 0xf4, 0xd0, 0xda, 0xb3, 0x5b, + 0x4e, 0x83, 0xcb, 0x77, 0xa3, 0xe6, 0xf0, 0x3e, 0x3d, 0x5c, 0x41, 0x00, 0x39, 0x03, 0x43, 0x6d, + 0x36, 0xaa, 0x62, 0xea, 0x8e, 0x9a, 0x83, 0xed, 0xce, 0x36, 0x9b, 0xa1, 0x33, 0x30, 0x84, 0x9a, + 0x37, 0xb1, 0xd0, 0xc6, 0x4c, 0xf9, 0xd3, 0xf8, 0x4f, 0xf3, 0x98, 0x6e, 0x40, 0x69, 0x27, 0xb9, + 0x08, 0x63, 0x75, 0x9f, 0xe2, 0x99, 0x63, 0x33, 0x49, 0x4a, 0xd4, 0x33, 0x1a, 0x03, 0xab, 0x0e, + 0xb9, 0x04, 0x13, 0x22, 0xc5, 0x36, 0x6b, 0x50, 0x7d, 0x5b, 0xc4, 0x5c, 0x1e, 0x35, 0xc7, 0x38, + 0xf8, 0x2e, 0x3d, 0x5c, 0xdc, 0xc6, 0x88, 0x43, 0x65, 0x35, 0x60, 0x64, 0x18, 0x65, 0x46, 0x34, + 0x27, 0x14, 0x38, 0xda, 0x34, 0x9d, 0x86, 0x41, 0xdb, 0xde, 0xed, 0xb8, 0x3c, 0x32, 0xc8, 0xa8, + 0x29, 0x7e, 0x91, 0x57, 0x60, 0x32, 0x70, 0x77, 0x5b, 0x76, 0xd8, 0xf1, 0x45, 0xbe, 0x07, 0xea, + 0xe3, 0x94, 0x1a, 0x33, 0xcb, 0x51, 0xc1, 0x22, 0x87, 0x93, 0xd7, 0x80, 0xa8, 0xf5, 0x79, 0xdb, + 0x1f, 0xd1, 0x3a, 0x9f, 0x6a, 0xa3, 0xe6, 0xa4, 0x52, 0xb2, 0x8e, 0x05, 0xe4, 0x79, 0x18, 0xf5, + 0x69, 0x80, 0x52, 0x1c, 0x76, 0x1b, 0x66, 0xe3, 0x31, 0x47, 0x24, 0x8c, 0xf5, 0xdd, 0x65, 0x28, + 0x2b, 0xdd, 0x81, 0x31, 0x39, 0x79, 0xc0, 0x61, 0x73, 0x3c, 0x86, 0x9b, 0xed, 0xaa, 0x63, 0x2c, + 0xc0, 0x64, 0x6a, 0xe5, 0x2a, 0xd9, 0x6c, 0xf9, 0x4e, 0xd4, 0x3b, 0x9b, 0xad, 0xd1, 0x82, 0x51, + 0x75, 0x27, 0x3e, 0x26, 0xee, 0xf5, 0x69, 0xf4, 0x2c, 0xe7, 0xdb, 0xd4, 0xe0, 0xe3, 0xa3, 0xb9, + 0xbc, 0xeb, 0xa0, 0x3f, 0xf9, 0x65, 0x28, 0x49, 0xa1, 0x41, 0x9c, 0xd5, 0xa8, 0x39, 0x15, 0xd2, + 0xea, 0xa1, 0x19, 0x95, 0x1a, 0x2f, 0xc1, 0x90, 0xd8, 0x6c, 0x7b, 0xeb, 0x4b, 0x8d, 0x1f, 0xcb, + 0xc3, 0x84, 0x49, 0xd9, 0x56, 0x40, 0x79, 0xb0, 0xfb, 0xa7, 0xf6, 0xfa, 0x96, 0x1d, 0x9f, 0x4c, + 0xfb, 0xb6, 0x1e, 0x61, 0xe6, 0xff, 0x6e, 0x0e, 0xa6, 0x32, 0x70, 0x3f, 0x51, 0x4a, 0xb4, 0x9b, + 0x30, 0xbc, 0xe4, 0xda, 0x8d, 0x8a, 0xe3, 0x44, 0x6e, 0xe6, 0x28, 0x6a, 0x3a, 0x6c, 0xa6, 0xd9, + 0x0c, 0xaa, 0x1e, 0xbb, 0x11, 0x2a, 0x79, 0x59, 0x4c, 0x8a, 0x38, 0x1d, 0x35, 0x4e, 0x8a, 0x8f, + 0x8f, 0xe6, 0x80, 0xb7, 0x29, 0x4e, 0xbb, 0x89, 0x31, 0x03, 0x39, 0x30, 0x36, 0x03, 0x7f, 0x6a, + 0x87, 0x2e, 0x3b, 0x66, 0x60, 0xf2, 0xf3, 0xfa, 0x8a, 0x34, 0xff, 0x93, 0x79, 0x38, 0x9d, 0x4d, + 0xf8, 0x49, 0xb3, 0xdb, 0x61, 0x8c, 0x7f, 0x25, 0xce, 0x29, 0x66, 0xb7, 0xe3, 0x09, 0x01, 0x10, + 0x3f, 0x46, 0x20, 0x3b, 0x30, 0xb6, 0x6a, 0x07, 0xe1, 0x0a, 0xb5, 0xfd, 0x70, 0x9b, 0xda, 0x61, + 0x1f, 0xb2, 0xe7, 0x0b, 0xf2, 0x59, 0x12, 0x8f, 0xbf, 0x3d, 0x49, 0x99, 0x90, 0x0e, 0x75, 0xb6, + 0xd1, 0x44, 0x29, 0xf6, 0x31, 0x51, 0xbe, 0x05, 0x13, 0x35, 0xda, 0xb4, 0xdb, 0x7b, 0x9e, 0x2f, + 0xfd, 0x08, 0xaf, 0xc2, 0x58, 0x04, 0xca, 0x9c, 0x2d, 0x7a, 0xb1, 0x86, 0xaf, 0x74, 0x44, 0xbc, + 0x95, 0xe8, 0xc5, 0xc6, 0xdf, 0xc8, 0xc3, 0x99, 0x4a, 0x5d, 0x58, 0x0b, 0x89, 0x02, 0x69, 0xd4, + 0xf8, 0x19, 0xd7, 0x4d, 0xae, 0xc1, 0xf0, 0x3d, 0xfb, 0xd1, 0x2a, 0xb5, 0x03, 0x1a, 0x88, 0xdc, + 0x42, 0x5c, 0x50, 0xb3, 0x1f, 0xc5, 0x46, 0x34, 0x66, 0x8c, 0xa3, 0xde, 0x64, 0x8b, 0x9f, 0xf2, + 0x26, 0x6b, 0xc0, 0xe0, 0x8a, 0xd7, 0x70, 0xc4, 0x31, 0x26, 0x9e, 0xd7, 0xf6, 0x10, 0x62, 0x8a, + 0x12, 0x76, 0x01, 0x1c, 0x8f, 0x5a, 0x8c, 0x4d, 0xf8, 0xcc, 0xbb, 0xe4, 0x12, 0x0c, 0x61, 0x45, + 0xd5, 0x25, 0xf5, 0xd0, 0x68, 0x50, 0xcc, 0x10, 0xe3, 0x98, 0xb2, 0x50, 0xed, 0x89, 0x81, 0x4f, + 0xd7, 0x13, 0xc6, 0xbf, 0x8d, 0x2f, 0x77, 0xea, 0x57, 0xb2, 0x93, 0x48, 0x69, 0x48, 0xae, 0xcf, + 0x86, 0xe4, 0x9f, 0xd8, 0x90, 0x14, 0xba, 0x0e, 0xc9, 0x77, 0xf2, 0x30, 0x12, 0x35, 0xf6, 0x73, + 0x16, 0x6c, 0x37, 0xfa, 0xae, 0xbe, 0x7c, 0xff, 0x6b, 0xca, 0x5e, 0x21, 0x5c, 0xec, 0xdf, 0x83, + 0x41, 0xb1, 0x98, 0x72, 0x09, 0xe3, 0xbe, 0xc4, 0xe8, 0x2e, 0x8c, 0x0b, 0xd6, 0x83, 0x38, 0xa0, + 0x81, 0x29, 0xe8, 0x30, 0xb8, 0xc2, 0x16, 0xdd, 0x16, 0x0f, 0xb9, 0x4f, 0xed, 0x19, 0x95, 0x1d, + 0x5c, 0x21, 0xfe, 0xb0, 0xbe, 0x4e, 0xa7, 0x9f, 0x2f, 0x41, 0x39, 0x49, 0x72, 0x7c, 0x38, 0xe3, + 0x8d, 0xce, 0x36, 0x97, 0xc2, 0x79, 0x38, 0xe3, 0x76, 0x67, 0xdb, 0x64, 0x30, 0xb4, 0xf3, 0xf0, + 0xdd, 0x87, 0xf8, 0xd5, 0xa3, 0xc2, 0xce, 0xc3, 0x77, 0x1f, 0x6a, 0x76, 0x1e, 0xbe, 0xfb, 0x10, + 0xaf, 0xbe, 0xab, 0x35, 0xf4, 0x07, 0x45, 0x11, 0x5c, 0x5c, 0x7d, 0x1b, 0x41, 0x32, 0x0d, 0x88, + 0x44, 0x63, 0x47, 0xe5, 0x02, 0xb5, 0x7d, 0x11, 0x7a, 0x57, 0x6c, 0x67, 0x78, 0x54, 0x6e, 0x23, + 0x98, 0x67, 0xd8, 0x35, 0x55, 0x24, 0xd2, 0x00, 0xa2, 0xfc, 0x94, 0x0b, 0xf8, 0xf8, 0xdb, 0xa0, + 0x34, 0xcc, 0x99, 0x56, 0x59, 0x5b, 0xea, 0x6a, 0xce, 0xe0, 0xfb, 0x24, 0x15, 0x90, 0x1b, 0x22, + 0x9e, 0x18, 0xaa, 0x3c, 0x4a, 0xc7, 0x32, 0x93, 0x0e, 0xd3, 0xc0, 0xe3, 0x8d, 0x45, 0x8a, 0x8f, + 0x98, 0x09, 0x79, 0x07, 0x46, 0x54, 0x2f, 0x5f, 0xee, 0x8b, 0x7a, 0x8e, 0x87, 0x88, 0xea, 0x92, + 0xe4, 0x4d, 0x25, 0x20, 0xdb, 0x70, 0x66, 0xd1, 0x6b, 0x05, 0x9d, 0xa6, 0x0c, 0x46, 0x15, 0x87, + 0xc0, 0x84, 0x28, 0x49, 0xfb, 0x0b, 0x75, 0x81, 0x22, 0x9c, 0x4a, 0xa5, 0xe5, 0xb4, 0x7e, 0x01, + 0xe9, 0xc6, 0x88, 0x6c, 0xc2, 0x08, 0x2a, 0xf1, 0x84, 0x69, 0xd6, 0x88, 0xbe, 0x6d, 0xc4, 0x25, + 0x4b, 0x6c, 0x61, 0xf0, 0x68, 0x2a, 0x76, 0xb3, 0x21, 0x0d, 0x77, 0x55, 0x65, 0xa4, 0x82, 0x4c, + 0x3e, 0x84, 0x71, 0x7e, 0xdd, 0xdc, 0xa2, 0xdb, 0x7c, 0xee, 0x8c, 0x6a, 0x77, 0x67, 0xbd, 0x90, + 0x3f, 0xf4, 0x0a, 0xd5, 0xe9, 0x01, 0xdd, 0xe6, 0x63, 0xaf, 0x99, 0xcd, 0x6b, 0xf8, 0xe4, 0x3e, + 0x4c, 0xad, 0xd8, 0x01, 0x07, 0x2a, 0xee, 0x9a, 0x63, 0xa8, 0x53, 0x44, 0x73, 0xc6, 0x3d, 0x3b, + 0x90, 0xba, 0xd8, 0x4c, 0xf7, 0xcc, 0x2c, 0x7a, 0xf2, 0x63, 0x39, 0x98, 0xd1, 0x54, 0xb5, 0xc2, + 0xa8, 0xa6, 0x49, 0x5b, 0x21, 0xda, 0xc7, 0x8f, 0x47, 0xb9, 0x7d, 0xbb, 0xa1, 0xf1, 0x21, 0x49, + 0x68, 0x83, 0xfd, 0xb8, 0x5c, 0xb5, 0x13, 0xec, 0xc6, 0xc3, 0xb8, 0x99, 0xec, 0x3d, 0xa1, 0x68, + 0xc9, 0x45, 0x8a, 0x96, 0x69, 0x18, 0xc0, 0x3e, 0x92, 0xb1, 0x22, 0xf0, 0x87, 0xf1, 0x05, 0x75, + 0x57, 0x11, 0x42, 0x5e, 0xcf, 0x5d, 0xc5, 0xf8, 0xaf, 0x07, 0x61, 0x22, 0x31, 0xc8, 0xe2, 0xd6, + 0x99, 0x4b, 0xdd, 0x3a, 0x6b, 0x00, 0x5c, 0xd5, 0xd8, 0xa7, 0x4e, 0x50, 0x7a, 0xda, 0x8c, 0x08, + 0x4f, 0xb5, 0x68, 0x85, 0x28, 0x6c, 0x18, 0x53, 0xbe, 0xfe, 0xfa, 0xd4, 0xd1, 0x46, 0x4c, 0xf9, + 0x12, 0x56, 0x98, 0xc6, 0x6c, 0xc8, 0x1c, 0x0c, 0x60, 0x80, 0x37, 0xd5, 0xd1, 0xc9, 0x65, 0x00, + 0x93, 0xc3, 0xc9, 0x45, 0x18, 0x64, 0x22, 0x51, 0x75, 0x49, 0x6c, 0x69, 0x78, 0x52, 0x30, 0x99, + 0x89, 0xc9, 0x1f, 0xa2, 0x88, 0xdc, 0x84, 0x51, 0xfe, 0x97, 0xf0, 0xf1, 0x1f, 0xd4, 0xed, 0xb6, + 0x2c, 0xd7, 0x91, 0x6e, 0xfe, 0x1a, 0x1e, 0xbb, 0x2b, 0xd4, 0x3a, 0xdb, 0x3c, 0xd3, 0xbc, 0x88, + 0x08, 0x8a, 0x77, 0x85, 0x80, 0x03, 0x31, 0x13, 0x76, 0x84, 0xc0, 0x24, 0x13, 0x61, 0x6e, 0x5c, + 0xc2, 0x1b, 0x22, 0x4a, 0x26, 0xdc, 0xcc, 0xd8, 0x14, 0x25, 0xe4, 0x0a, 0x57, 0xed, 0xa3, 0x90, + 0xc7, 0x93, 0x18, 0xa1, 0xde, 0x1c, 0xd5, 0x0c, 0x28, 0xe9, 0x45, 0xc5, 0xac, 0x72, 0xf6, 0xf7, + 0x72, 0xd3, 0x76, 0x1b, 0x62, 0x93, 0xc0, 0xca, 0x11, 0x97, 0x32, 0xa8, 0x19, 0x23, 0x90, 0xb7, + 0x60, 0x9c, 0xfd, 0x58, 0xf4, 0x9a, 0x4d, 0xaf, 0x85, 0xec, 0x47, 0xe2, 0x70, 0x31, 0x48, 0x52, + 0xc7, 0x22, 0x5e, 0x4b, 0x02, 0x97, 0x9d, 0x0e, 0xf8, 0x6c, 0xd8, 0xe1, 0x8f, 0x0e, 0xa3, 0xf1, + 0xe9, 0x80, 0xa4, 0x01, 0x87, 0x9b, 0x2a, 0x12, 0x79, 0x03, 0xc6, 0xd8, 0xcf, 0xdb, 0xee, 0x43, + 0xca, 0x2b, 0x1c, 0x8b, 0x1f, 0xb2, 0x91, 0x6a, 0x97, 0x95, 0xf0, 0xfa, 0x74, 0x4c, 0xf2, 0x55, + 0x38, 0x85, 0x9c, 0xea, 0x5e, 0x9b, 0x3a, 0x95, 0x9d, 0x1d, 0xb7, 0xe1, 0x72, 0x43, 0x1a, 0xee, + 0xcd, 0x8e, 0x3a, 0x60, 0x5e, 0x31, 0x62, 0x58, 0x76, 0x8c, 0x62, 0x66, 0x53, 0x92, 0x2d, 0x28, + 0x2f, 0x76, 0x82, 0xd0, 0x6b, 0x56, 0xc2, 0xd0, 0x77, 0xb7, 0x3b, 0x21, 0x0d, 0x66, 0x26, 0x34, + 0x9f, 0x6f, 0xb6, 0x38, 0xa2, 0x42, 0xae, 0xdd, 0xa9, 0x23, 0x85, 0x65, 0x47, 0x24, 0x66, 0x8a, + 0x89, 0xf1, 0x5f, 0xe5, 0x60, 0x4c, 0x23, 0x25, 0xaf, 0xc3, 0xe8, 0x2d, 0xdf, 0xa5, 0x2d, 0xa7, + 0x71, 0xa8, 0x5c, 0x3b, 0xf1, 0x4e, 0xb2, 0x23, 0xe0, 0xfc, 0xab, 0x35, 0xb4, 0x48, 0x6b, 0x93, + 0xcf, 0xb4, 0x72, 0xbb, 0xc6, 0xfd, 0xed, 0xc4, 0x04, 0x2d, 0xc4, 0x41, 0x28, 0x70, 0x82, 0x8a, + 0xd9, 0xa9, 0xa0, 0x90, 0xb7, 0x61, 0x90, 0x3f, 0x30, 0x0a, 0x93, 0xab, 0xb3, 0x59, 0x9f, 0xc9, + 0x7d, 0x3b, 0x71, 0x22, 0xa2, 0x79, 0x47, 0x60, 0x0a, 0x22, 0xe3, 0x67, 0x73, 0x40, 0xd2, 0xa8, + 0xc7, 0x68, 0xb1, 0x8e, 0x35, 0x1b, 0x79, 0x2f, 0x5a, 0x8d, 0x05, 0x4d, 0x67, 0xcb, 0x6a, 0xe2, + 0x05, 0xbc, 0xe3, 0xc5, 0xaa, 0x53, 0xd5, 0x6a, 0xbc, 0xd8, 0xf8, 0xcb, 0x79, 0x80, 0x18, 0x9b, + 0x7c, 0x99, 0xe7, 0xd1, 0xf8, 0x6a, 0xc7, 0x6e, 0xb8, 0x3b, 0xae, 0x1e, 0x58, 0x0e, 0x99, 0x7c, + 0x4b, 0x96, 0x98, 0x3a, 0x22, 0x79, 0x17, 0x26, 0x6a, 0x1b, 0x3a, 0xad, 0x92, 0x33, 0x20, 0x68, + 0x5b, 0x09, 0xf2, 0x24, 0x36, 0x9a, 0x56, 0xaa, 0xa3, 0xc1, 0x4d, 0x2b, 0xf9, 0x40, 0x88, 0x12, + 0xb6, 0xb1, 0xd4, 0x36, 0x84, 0x35, 0xaf, 0x53, 0x5d, 0x12, 0xbb, 0x14, 0xb6, 0x2e, 0x68, 0x5b, + 0x6d, 0x61, 0xe6, 0xcb, 0xf6, 0x09, 0x0d, 0x2f, 0xee, 0xc8, 0x81, 0x2e, 0xfe, 0x9b, 0x3f, 0x87, + 0x4a, 0xbc, 0xa6, 0x17, 0x52, 0xa1, 0xbb, 0x78, 0x6a, 0x6f, 0x31, 0xf1, 0xeb, 0xf4, 0x80, 0xe6, + 0x96, 0xa6, 0x7d, 0x9d, 0xb0, 0x8d, 0xb8, 0x11, 0x5f, 0x39, 0xf8, 0x3b, 0x75, 0x86, 0x35, 0xc5, + 0xdf, 0xce, 0xc1, 0xa9, 0x4c, 0x5a, 0x72, 0x15, 0x20, 0xd6, 0x10, 0x89, 0x5e, 0xc2, 0x1d, 0x33, + 0x0e, 0xbd, 0x60, 0x2a, 0x18, 0xe4, 0xeb, 0x49, 0xdd, 0xce, 0xf1, 0x07, 0xe1, 0xac, 0x0c, 0xad, + 0xa3, 0xeb, 0x76, 0x32, 0x34, 0x3a, 0xc6, 0xdf, 0x2d, 0xc0, 0xa4, 0x12, 0xd9, 0x81, 0xb7, 0xf5, + 0x18, 0x53, 0xd7, 0x7d, 0x18, 0x65, 0x5f, 0xe3, 0xd6, 0x85, 0x6f, 0x0c, 0xb7, 0xa4, 0x78, 0x39, + 0xe5, 0x58, 0x24, 0xb8, 0x5d, 0x55, 0x91, 0x79, 0xc0, 0x2b, 0xdc, 0x3a, 0x51, 0x73, 0x5e, 0x4f, + 0xfb, 0xc8, 0x68, 0xcc, 0x49, 0x00, 0x63, 0x4b, 0x87, 0x2d, 0xbb, 0x19, 0xd5, 0xc6, 0x2d, 0x2a, + 0x5e, 0xe9, 0x5a, 0x9b, 0x86, 0xcd, 0xab, 0x8b, 0x4d, 0xf0, 0x79, 0x59, 0x86, 0xf7, 0xa7, 0x46, + 0x35, 0xfb, 0x2e, 0x4c, 0xa6, 0x1a, 0x7d, 0xa2, 0xd8, 0x5b, 0x5b, 0x40, 0xd2, 0xed, 0xc8, 0xe0, + 0xf0, 0x8a, 0x1e, 0xd9, 0xed, 0x54, 0xf4, 0x78, 0x8a, 0x19, 0x78, 0xb9, 0x7d, 0xc6, 0xbc, 0x1a, + 0x99, 0xeb, 0xe7, 0xf2, 0xaa, 0x73, 0xd7, 0xd3, 0xbe, 0xea, 0xde, 0xd3, 0xee, 0xb6, 0xcf, 0x75, + 0x1b, 0xd3, 0xbe, 0x74, 0x08, 0xdf, 0x2f, 0xc0, 0x99, 0x2e, 0x94, 0xe4, 0x30, 0x39, 0x89, 0xb8, + 0x4e, 0xe1, 0x7a, 0xef, 0x0a, 0x9f, 0xc4, 0x54, 0x22, 0x5f, 0xe6, 0xee, 0xdd, 0x75, 0xcc, 0x1c, + 0x2b, 0x6e, 0xd3, 0x3c, 0xe9, 0x78, 0x04, 0x4d, 0xfa, 0x75, 0x73, 0x28, 0x79, 0x17, 0x06, 0xd0, + 0xb3, 0x2f, 0x11, 0x59, 0x8a, 0x61, 0x20, 0x5c, 0x09, 0xc3, 0xc5, 0x7e, 0x6a, 0x61, 0xb8, 0x18, + 0x80, 0x7c, 0x09, 0x0a, 0x95, 0xad, 0x9a, 0x18, 0x97, 0x71, 0x95, 0x7c, 0xab, 0x16, 0x47, 0xff, + 0xb6, 0xb5, 0x30, 0xdd, 0x8c, 0x82, 0x11, 0xde, 0x5e, 0xdc, 0x10, 0xa3, 0xa2, 0x12, 0xde, 0x5e, + 0xdc, 0x88, 0x09, 0x77, 0xeb, 0x5a, 0xa4, 0x8e, 0xdb, 0x8b, 0x1b, 0x9f, 0xdd, 0xb4, 0xff, 0x6b, + 0x79, 0xee, 0x93, 0xce, 0x3f, 0xec, 0x5d, 0x18, 0xd5, 0x22, 0x6f, 0xe6, 0x62, 0x79, 0x2c, 0x0a, + 0x70, 0x9a, 0x30, 0x41, 0xd1, 0x08, 0x64, 0x1c, 0x7d, 0xf6, 0x1b, 0x25, 0x5e, 0xd5, 0xd8, 0x23, + 0xe2, 0x80, 0x32, 0x71, 0x32, 0x8e, 0x7e, 0x44, 0x42, 0x6e, 0x40, 0x69, 0x93, 0xb6, 0xec, 0x56, + 0x18, 0xa9, 0x37, 0xd1, 0x8c, 0x34, 0x44, 0x98, 0x2e, 0x35, 0x44, 0x88, 0x68, 0xf2, 0xd8, 0xd9, + 0x0e, 0xea, 0xbe, 0x8b, 0xb1, 0x2b, 0xa2, 0xb3, 0x98, 0x9b, 0x3c, 0x2a, 0x25, 0x3a, 0x83, 0x04, + 0x91, 0xf1, 0x73, 0x39, 0x18, 0x12, 0x03, 0xc9, 0xf3, 0x9f, 0xec, 0xc6, 0x67, 0x89, 0xc8, 0x7f, + 0xb2, 0xeb, 0x26, 0xf3, 0x9f, 0xec, 0xf2, 0x00, 0x11, 0xc3, 0xc2, 0xbd, 0x32, 0x7a, 0xe8, 0xe3, + 0xe9, 0xb2, 0x39, 0x50, 0xaf, 0x36, 0x46, 0xed, 0xd7, 0x97, 0xc4, 0xf8, 0x9b, 0xa2, 0x65, 0xb7, + 0x17, 0x37, 0xc8, 0x3c, 0x94, 0x56, 0xbd, 0xba, 0xad, 0x9c, 0x73, 0xb8, 0xed, 0x34, 0x04, 0x4c, + 0xed, 0x20, 0x89, 0xc7, 0xda, 0xb7, 0xe1, 0x7b, 0xe2, 0x2e, 0xa3, 0xb4, 0xaf, 0xcd, 0x81, 0x89, + 0xf6, 0x45, 0xa8, 0x7d, 0xb7, 0x8f, 0x66, 0x6c, 0x12, 0x0f, 0x6e, 0x60, 0x80, 0xf1, 0x3b, 0xaa, + 0x8f, 0x8e, 0x28, 0x92, 0x3b, 0xc5, 0x6c, 0xb7, 0x9d, 0xe2, 0xc1, 0x0d, 0x33, 0x83, 0x0a, 0x5f, + 0xc9, 0x62, 0x70, 0x8d, 0xfa, 0x0f, 0x9f, 0xe2, 0x5d, 0x3a, 0xfb, 0x95, 0x2c, 0xf9, 0x79, 0x7d, + 0x6d, 0xd2, 0xff, 0x79, 0x1e, 0x4e, 0x67, 0x13, 0xaa, 0xdf, 0x92, 0xeb, 0xf1, 0x2d, 0x97, 0xa1, + 0xb4, 0xe2, 0x05, 0xa1, 0x62, 0x75, 0x86, 0xca, 0xfc, 0x3d, 0x01, 0x33, 0xa3, 0x52, 0x76, 0xe7, + 0x66, 0x7f, 0x47, 0xcb, 0x13, 0xf9, 0xa1, 0x27, 0x36, 0xbb, 0x73, 0xf3, 0x22, 0x72, 0x1b, 0x4a, + 0xa6, 0xf0, 0x11, 0x49, 0x74, 0x8d, 0x04, 0x47, 0xd2, 0x14, 0xf1, 0x05, 0x44, 0x0b, 0x80, 0x2a, + 0x60, 0xa4, 0x02, 0x43, 0x62, 0xf4, 0x13, 0x0f, 0xc1, 0x19, 0x53, 0x46, 0x8f, 0x49, 0x2c, 0xe9, + 0xd8, 0x8e, 0x82, 0x4f, 0x7a, 0xd5, 0x25, 0xe9, 0xee, 0x81, 0x3b, 0x0a, 0x7f, 0xf2, 0xd3, 0x0d, + 0xfc, 0x22, 0x44, 0xe3, 0xc7, 0xf2, 0x00, 0x52, 0x6b, 0xf3, 0xd4, 0xce, 0xb0, 0x2f, 0x69, 0x33, + 0x4c, 0xb1, 0x77, 0xe9, 0x3f, 0x5f, 0xdf, 0x3a, 0xda, 0x9d, 0xf4, 0x9f, 0xad, 0x6f, 0x0e, 0x06, + 0x36, 0x63, 0x85, 0x96, 0x70, 0x3e, 0x40, 0xe5, 0x32, 0x87, 0x1b, 0xdb, 0x30, 0x7d, 0x9b, 0x86, + 0xb1, 0x7a, 0x4b, 0x3e, 0x24, 0xf6, 0x66, 0xfb, 0x2a, 0x0c, 0x0b, 0xfc, 0x68, 0xff, 0xe2, 0xba, + 0x18, 0x11, 0xdc, 0x00, 0x75, 0x31, 0x12, 0x81, 0xed, 0x46, 0x4b, 0xb4, 0x41, 0x43, 0xfa, 0xd9, + 0x56, 0x53, 0x03, 0xc2, 0x3f, 0x05, 0xbf, 0xac, 0xbf, 0x1a, 0x8e, 0xed, 0x9f, 0x07, 0x70, 0x2a, + 0x6a, 0xfb, 0x93, 0xe4, 0x7b, 0x8d, 0x5d, 0x29, 0x45, 0x38, 0xdf, 0x98, 0x63, 0x0f, 0x4b, 0x92, + 0x47, 0x30, 0x2b, 0x09, 0xb6, 0xdc, 0xc8, 0x70, 0xaf, 0x2f, 0x5a, 0xf2, 0x16, 0x8c, 0x28, 0x34, + 0x22, 0x1c, 0x2d, 0x2a, 0x9d, 0x0f, 0xdc, 0x70, 0xcf, 0x0a, 0x38, 0x5c, 0x55, 0x3a, 0x2b, 0xe8, + 0xc6, 0x07, 0xf0, 0x6c, 0xe4, 0x20, 0x92, 0x51, 0x75, 0x82, 0x79, 0xee, 0x64, 0xcc, 0xd7, 0xe2, + 0xcf, 0xaa, 0xb6, 0x22, 0xa7, 0x4e, 0xc9, 0x9b, 0xa8, 0x9f, 0x25, 0x3e, 0xe6, 0x5c, 0xca, 0x4d, + 0x54, 0xf1, 0x06, 0x35, 0xde, 0x54, 0x1a, 0x9b, 0xc1, 0x50, 0x23, 0xce, 0x25, 0x89, 0x7f, 0x2c, + 0x0f, 0x13, 0xeb, 0xd5, 0xa5, 0xc5, 0xc8, 0x96, 0xe8, 0x73, 0x96, 0x4d, 0x50, 0xfb, 0xb6, 0xee, + 0xfb, 0x8d, 0x71, 0x1f, 0xa6, 0x12, 0xdd, 0x80, 0xa2, 0xc3, 0x3b, 0xdc, 0x83, 0x21, 0x02, 0x4b, + 0xb1, 0xe1, 0x74, 0x16, 0xfb, 0x07, 0x37, 0xcc, 0x04, 0xb6, 0xf1, 0x8f, 0x87, 0x13, 0x7c, 0xc5, + 0x16, 0xf6, 0x2a, 0x0c, 0x57, 0x83, 0xa0, 0x43, 0xfd, 0xfb, 0xe6, 0xaa, 0xaa, 0x2a, 0x70, 0x11, + 0x68, 0x75, 0xfc, 0x86, 0x19, 0x23, 0x90, 0x2b, 0x50, 0x12, 0x11, 0x5a, 0xe5, 0x9e, 0x80, 0x5a, + 0xdb, 0x28, 0xc0, 0xab, 0x19, 0x15, 0x93, 0xd7, 0x61, 0x94, 0xff, 0xcd, 0x67, 0x9b, 0xe8, 0x70, + 0x54, 0x0e, 0x0a, 0x74, 0x3e, 0x3b, 0x4d, 0x0d, 0x8d, 0xbc, 0x0c, 0x85, 0xca, 0xa2, 0x29, 0xd4, + 0x41, 0x42, 0x6e, 0xc4, 0x1c, 0xc1, 0x1d, 0xaa, 0x5f, 0x22, 0x16, 0x4d, 0x26, 0xfd, 0x49, 0x07, + 0x72, 0xa1, 0xc9, 0xe6, 0xa9, 0x8c, 0x05, 0x2c, 0x71, 0x98, 0x21, 0x8c, 0x5c, 0x83, 0xa1, 0x25, + 0x37, 0x68, 0x37, 0xec, 0x43, 0xa1, 0xc7, 0xe6, 0xa9, 0x72, 0x38, 0x48, 0xf3, 0x0b, 0xe7, 0x20, + 0x72, 0x45, 0xa6, 0x10, 0x29, 0xc5, 0x8e, 0x10, 0x5d, 0xf2, 0x84, 0xbc, 0x0a, 0x83, 0x22, 0x8e, + 0xe9, 0xb0, 0x12, 0xa1, 0x3c, 0x19, 0xbf, 0x54, 0xe0, 0xa4, 0x5d, 0x15, 0xe1, 0x49, 0xba, 0x2a, + 0x6e, 0xc3, 0x99, 0xdb, 0xa8, 0xbd, 0xd1, 0x23, 0x9e, 0xdc, 0x37, 0xab, 0x42, 0x1f, 0x8e, 0x8f, + 0x3a, 0x5c, 0xc1, 0x93, 0x0c, 0x9a, 0x62, 0x75, 0x7c, 0x35, 0xf3, 0x5b, 0x37, 0x46, 0xe4, 0x6b, + 0x30, 0x9d, 0x55, 0x24, 0xb4, 0xe6, 0x18, 0xdb, 0x23, 0xbb, 0x02, 0x35, 0xb6, 0x47, 0x16, 0x07, + 0xb2, 0x0a, 0x65, 0x0e, 0xaf, 0x38, 0x4d, 0xb7, 0xc5, 0x35, 0xff, 0x5c, 0xab, 0x8e, 0x9e, 0x09, + 0x82, 0xab, 0xcd, 0x0a, 0xf9, 0x0b, 0x80, 0xe6, 0xcb, 0x92, 0xa0, 0x24, 0x3f, 0x9d, 0x63, 0xb7, + 0x39, 0x1e, 0xf5, 0xf3, 0xbe, 0xb9, 0x1a, 0x88, 0xb8, 0x50, 0xa7, 0x63, 0x37, 0x95, 0x5a, 0xe8, + 0xbb, 0xad, 0x5d, 0xe1, 0xa7, 0xb2, 0x29, 0xfc, 0x54, 0xde, 0xfa, 0x44, 0x7e, 0x2a, 0x9c, 0x55, + 0xf0, 0xf8, 0x68, 0x6e, 0xd4, 0x17, 0x75, 0xe2, 0x2a, 0xd2, 0x5a, 0x80, 0x59, 0xcb, 0x1b, 0x0d, + 0xef, 0xe0, 0x7e, 0xeb, 0x21, 0xf5, 0xdd, 0x1d, 0x97, 0x3a, 0xfc, 0x23, 0x27, 0x70, 0x07, 0xe7, + 0x59, 0xcb, 0x31, 0x0f, 0x7f, 0x27, 0x42, 0x48, 0x7d, 0x68, 0x26, 0x07, 0x76, 0xf1, 0x94, 0xbe, + 0x10, 0xdc, 0xef, 0xb2, 0x1c, 0x5f, 0x3c, 0xa5, 0xe3, 0x84, 0x85, 0xd3, 0x48, 0x9d, 0x3c, 0x1a, + 0x09, 0xb9, 0x06, 0x83, 0xf7, 0xec, 0x47, 0x95, 0x5d, 0x2a, 0x52, 0x43, 0x8d, 0xc9, 0xed, 0x0f, + 0x81, 0x0b, 0xa5, 0xdf, 0xe7, 0xb6, 0xf6, 0xcf, 0x98, 0x02, 0x8d, 0xfc, 0x50, 0x0e, 0x4e, 0xf3, + 0x65, 0x2c, 0xbf, 0xb2, 0x46, 0xc3, 0x90, 0xf5, 0x83, 0x08, 0x10, 0x25, 0x13, 0x2b, 0xd4, 0x6a, + 0xeb, 0xd9, 0x78, 0x3c, 0xc7, 0xb6, 0xd8, 0x19, 0xa2, 0x8e, 0x0b, 0x44, 0xa9, 0x16, 0x05, 0x32, + 0x93, 0x5e, 0xd8, 0x91, 0x7f, 0x49, 0xb6, 0x9c, 0xbc, 0xa6, 0xba, 0x07, 0x16, 0x50, 0xce, 0x1d, + 0x6a, 0xda, 0x8f, 0x2c, 0x7b, 0x97, 0x6a, 0xaf, 0xd3, 0x42, 0xcf, 0xfc, 0xdd, 0x1c, 0x9c, 0xed, + 0xda, 0x38, 0x72, 0x13, 0xce, 0xc8, 0x74, 0xeb, 0x7b, 0x61, 0xd8, 0x0e, 0x2c, 0x79, 0x19, 0x10, + 0x0e, 0x85, 0xe6, 0x29, 0x51, 0xbc, 0xc2, 0x4a, 0xe5, 0xfd, 0x20, 0x20, 0xef, 0xc2, 0x39, 0xb7, + 0x15, 0xd0, 0x7a, 0xc7, 0xa7, 0x71, 0xbe, 0x76, 0xd7, 0xf1, 0x2d, 0xdf, 0x6e, 0xed, 0x4a, 0xef, + 0x48, 0xf3, 0xac, 0xc4, 0x91, 0x59, 0xdb, 0x5d, 0xc7, 0x37, 0x11, 0xc1, 0xf8, 0xa3, 0x61, 0x7e, + 0x2a, 0x56, 0x3a, 0xe1, 0x9e, 0x3c, 0x47, 0xe7, 0xb3, 0x7c, 0x6a, 0xb8, 0xb1, 0x9f, 0xe2, 0x53, + 0xa3, 0x7b, 0xd2, 0xc8, 0xe7, 0x8c, 0x7c, 0xe6, 0x73, 0xc6, 0xab, 0x30, 0xbc, 0xb8, 0x47, 0xeb, + 0xfb, 0x91, 0x5f, 0x43, 0x49, 0xe8, 0x8b, 0x19, 0x90, 0x87, 0x18, 0x8d, 0x11, 0xc8, 0x35, 0x00, + 0x74, 0xb2, 0xe3, 0x42, 0x96, 0x12, 0x26, 0x1c, 0x7d, 0xf2, 0x84, 0xfd, 0x84, 0x82, 0x82, 0xec, + 0x6b, 0xe6, 0x2d, 0xd5, 0xe0, 0x82, 0xb3, 0x0f, 0xfc, 0x1d, 0x81, 0x1e, 0x23, 0xb0, 0xcf, 0x53, + 0x96, 0x8a, 0xd8, 0xd8, 0xcb, 0xa9, 0xf5, 0xa4, 0x22, 0xa1, 0x2d, 0xa3, 0x34, 0xe2, 0xc6, 0x7d, + 0x7d, 0x54, 0xd8, 0x32, 0x46, 0x06, 0xdf, 0x66, 0x8c, 0x40, 0xbe, 0x04, 0x43, 0x8b, 0xd4, 0x0f, + 0x37, 0x37, 0x57, 0xd1, 0x26, 0x82, 0xc7, 0xd2, 0x2e, 0x61, 0xdc, 0xe3, 0x30, 0x6c, 0x7c, 0x7c, + 0x34, 0x37, 0x16, 0xba, 0x4d, 0x7a, 0x35, 0x9a, 0x22, 0x12, 0x9b, 0x2c, 0x40, 0x99, 0xbf, 0xf3, + 0xc6, 0xc2, 0x34, 0x6e, 0xf5, 0x25, 0x7e, 0xf0, 0x88, 0x47, 0xe1, 0x03, 0xba, 0x1d, 0x45, 0x7d, + 0x4e, 0xe1, 0x93, 0x65, 0x19, 0x2c, 0x5d, 0xfd, 0x48, 0x88, 0xb5, 0x3b, 0xc9, 0x25, 0xc0, 0xbe, + 0x35, 0x4d, 0x41, 0x2a, 0x30, 0xb6, 0xe8, 0x35, 0xdb, 0x76, 0xe8, 0x62, 0xe6, 0xa1, 0x43, 0xb1, + 0xab, 0xa3, 0x86, 0xaa, 0xae, 0x16, 0x68, 0x47, 0x84, 0x5a, 0x40, 0x6e, 0xc1, 0xb8, 0xe9, 0x75, + 0xd8, 0x20, 0xc9, 0x6b, 0x25, 0xdf, 0xb8, 0xd1, 0x72, 0xc1, 0x67, 0x25, 0xec, 0x9c, 0x11, 0x77, + 0x48, 0x2d, 0x66, 0x9d, 0x46, 0x45, 0xd6, 0x32, 0xf4, 0xfb, 0xea, 0x6e, 0xad, 0xc6, 0x7e, 0x4e, + 0x31, 0xcb, 0x78, 0x1a, 0xb8, 0x01, 0x23, 0xb5, 0xda, 0xfa, 0x26, 0x0d, 0xc2, 0x5b, 0x0d, 0xef, + 0x00, 0x37, 0xeb, 0x92, 0xc8, 0x89, 0x11, 0x78, 0x56, 0x48, 0x83, 0xd0, 0xda, 0x69, 0x78, 0x07, + 0xa6, 0x8a, 0x45, 0xbe, 0xc1, 0xfa, 0x43, 0x11, 0x6d, 0x44, 0x74, 0xbe, 0x5e, 0xd2, 0x17, 0x6e, + 0x89, 0xf1, 0x92, 0x61, 0x32, 0x98, 0xde, 0x59, 0x0a, 0x3a, 0x3a, 0xe9, 0xb0, 0x0b, 0x71, 0xc5, + 0x71, 0x7c, 0x1a, 0x04, 0x62, 0x57, 0xe5, 0x4e, 0x3a, 0x78, 0x7b, 0xb6, 0x79, 0x81, 0xe6, 0xa4, + 0xa3, 0x10, 0x90, 0xef, 0xe4, 0xe0, 0x94, 0x6a, 0xe7, 0x8f, 0x8b, 0x05, 0xad, 0x30, 0xf8, 0x1e, + 0xfb, 0xda, 0x55, 0x79, 0xaa, 0x5c, 0x55, 0xd0, 0xae, 0x3e, 0xbc, 0x7e, 0xb5, 0x12, 0xff, 0xac, + 0x49, 0x22, 0x11, 0xe0, 0x2a, 0x8b, 0x9f, 0x7a, 0x42, 0xd8, 0x19, 0xa4, 0x64, 0x91, 0x09, 0x1e, + 0x6c, 0x3e, 0xa1, 0x55, 0x4f, 0x75, 0x03, 0xb7, 0x68, 0xa1, 0x20, 0x14, 0xb3, 0x8f, 0xdb, 0xff, + 0xb8, 0x6d, 0x5d, 0xbe, 0x50, 0x68, 0x48, 0x15, 0x26, 0x38, 0x80, 0x6d, 0x09, 0x3c, 0x61, 0xc2, + 0x54, 0x1c, 0xb4, 0x59, 0xb0, 0xc1, 0xa7, 0x6b, 0x4c, 0x9a, 0xa0, 0x06, 0x93, 0x4b, 0xd0, 0xa1, + 0xe4, 0x5f, 0xab, 0xdc, 0x5b, 0x8d, 0xc5, 0xd7, 0xcf, 0x97, 0x9d, 0xbe, 0xf6, 0x6d, 0x3d, 0xec, + 0xf4, 0xef, 0x73, 0xcf, 0x45, 0xa5, 0x1b, 0xa4, 0xe4, 0xaf, 0x81, 0x93, 0x92, 0x7f, 0x82, 0xc6, + 0x4c, 0x60, 0x1b, 0x1f, 0x97, 0x12, 0x7c, 0x85, 0x6d, 0x9e, 0x01, 0x83, 0x5c, 0xb0, 0x57, 0xb3, + 0x6f, 0x73, 0xb1, 0xdf, 0x14, 0x25, 0xe4, 0x2c, 0x14, 0x6a, 0xb5, 0x75, 0xd1, 0xc9, 0x68, 0xa1, + 0x17, 0x04, 0x9e, 0xc9, 0x60, 0x6c, 0x84, 0xd0, 0xec, 0x4e, 0x89, 0xcb, 0xcb, 0x76, 0x50, 0x13, + 0xa1, 0xac, 0xbf, 0xa5, 0x98, 0x5d, 0x8c, 0xfb, 0x5b, 0x88, 0xd9, 0xb1, 0x70, 0xbd, 0x08, 0x33, + 0x95, 0x20, 0xa0, 0x3e, 0x9b, 0xa0, 0xc2, 0x9a, 0xcb, 0x17, 0xa2, 0xa0, 0x38, 0x28, 0xb0, 0x52, + 0xbb, 0x1e, 0x98, 0x5d, 0x11, 0xc9, 0x65, 0x28, 0x55, 0x3a, 0x8e, 0x4b, 0x5b, 0x75, 0x2d, 0xe8, + 0x8e, 0x2d, 0x60, 0x66, 0x54, 0x4a, 0xbe, 0x0a, 0xa7, 0x12, 0x81, 0xa7, 0x44, 0x0f, 0x0c, 0xc5, + 0xab, 0x59, 0x8a, 0xaa, 0xf1, 0x9b, 0x35, 0xef, 0x92, 0x6c, 0x4a, 0x52, 0x81, 0xf2, 0x32, 0xfa, + 0xa5, 0x2c, 0x51, 0xae, 0x3e, 0xf7, 0x7c, 0xee, 0x6b, 0xc3, 0x2f, 0x16, 0xdc, 0x67, 0xc5, 0x72, + 0xa2, 0x42, 0x33, 0x85, 0x4e, 0xee, 0xc2, 0x54, 0x12, 0xc6, 0xce, 0x04, 0x7e, 0x87, 0xc0, 0xc0, + 0x90, 0x29, 0x2e, 0x78, 0x2a, 0x64, 0x51, 0x91, 0x6d, 0x98, 0x8c, 0x6d, 0x36, 0xf4, 0x9b, 0x85, + 0x34, 0xec, 0x8c, 0xca, 0xe5, 0xed, 0xe2, 0x59, 0x31, 0x19, 0xa7, 0x62, 0xfb, 0x8f, 0xe8, 0x86, + 0x61, 0xa6, 0xd9, 0x11, 0x07, 0xc6, 0x6b, 0xee, 0x6e, 0xcb, 0x6d, 0xed, 0xde, 0xa5, 0x87, 0x1b, + 0xb6, 0xeb, 0x0b, 0x13, 0x3b, 0x69, 0x40, 0x5b, 0x09, 0x0e, 0x9b, 0x4d, 0x1a, 0xfa, 0x78, 0xda, + 0xb2, 0x72, 0x74, 0x13, 0x65, 0x12, 0xe3, 0x6c, 0xc0, 0xe9, 0xd0, 0x05, 0xab, 0x6d, 0xbb, 0xda, + 0xb1, 0xa2, 0xf3, 0xd4, 0x6e, 0x77, 0xa3, 0x7d, 0xde, 0xee, 0x1a, 0x30, 0xb9, 0xdc, 0xaa, 0xfb, + 0x87, 0xf8, 0x8a, 0x21, 0x1b, 0x37, 0x76, 0x4c, 0xe3, 0x5e, 0x10, 0x8d, 0x3b, 0x67, 0xcb, 0x19, + 0x96, 0xd5, 0xbc, 0x34, 0x63, 0x52, 0x83, 0x49, 0x94, 0xd8, 0xaa, 0x4b, 0x1b, 0xd5, 0x96, 0x1b, + 0xba, 0x98, 0x23, 0x9a, 0x1f, 0x57, 0x2f, 0x0a, 0x9e, 0xe7, 0xb9, 0x14, 0xef, 0x3a, 0x6d, 0xcb, + 0x95, 0x28, 0x2a, 0xd3, 0x14, 0x7d, 0x2f, 0x51, 0x7a, 0xe2, 0x9f, 0x8f, 0x28, 0x8d, 0x59, 0x94, + 0x12, 0xee, 0xd3, 0xe5, 0x78, 0x6f, 0x0f, 0xb0, 0x88, 0x1d, 0x11, 0x5e, 0x07, 0xc5, 0x13, 0x2d, + 0x8b, 0x92, 0x4e, 0x67, 0x7c, 0x67, 0x98, 0xef, 0xed, 0xaa, 0xfc, 0xda, 0xcd, 0x18, 0x2f, 0x21, + 0xd7, 0xe6, 0x4f, 0x22, 0xd7, 0x16, 0x8e, 0x97, 0x6b, 0x8b, 0xc7, 0xc9, 0xb5, 0x09, 0xc1, 0x73, + 0xe0, 0xc4, 0x82, 0xe7, 0xe0, 0x09, 0x04, 0xcf, 0xa1, 0x13, 0x09, 0x9e, 0x9a, 0x04, 0x5d, 0x3a, + 0x4e, 0x82, 0xfe, 0x97, 0x62, 0xea, 0xd3, 0x2a, 0xa6, 0x66, 0x89, 0x0a, 0x27, 0x12, 0x53, 0xbb, + 0x4b, 0x99, 0xe5, 0x7f, 0xd1, 0x52, 0xe6, 0xe4, 0x93, 0x91, 0x32, 0xc9, 0x27, 0x94, 0x32, 0xff, + 0x02, 0x94, 0x93, 0x07, 0xdf, 0xf1, 0xf1, 0xf6, 0x9e, 0x58, 0x6c, 0x28, 0x76, 0x2c, 0x27, 0x0f, + 0x1e, 0x76, 0x91, 0xde, 0xf0, 0xdd, 0x87, 0x76, 0x48, 0xef, 0x4a, 0xe3, 0x05, 0x11, 0x2b, 0x92, + 0x43, 0x71, 0xfb, 0x50, 0x50, 0x22, 0x99, 0x2b, 0x9f, 0x25, 0x73, 0x19, 0x3f, 0x9e, 0x87, 0x49, + 0x1e, 0xc7, 0xe5, 0xe9, 0xd7, 0xa1, 0xbf, 0xa3, 0x49, 0xd2, 0xd2, 0x54, 0x2e, 0xf1, 0x75, 0x3d, + 0xb4, 0xe8, 0x1f, 0xc2, 0xa9, 0x54, 0x57, 0xa0, 0x34, 0xbd, 0x24, 0x23, 0xe8, 0xa4, 0xe4, 0xe9, + 0x99, 0xec, 0x4a, 0x1e, 0xdc, 0x30, 0x53, 0x14, 0xc6, 0x3f, 0x2d, 0xa6, 0xf8, 0x0b, 0x7d, 0xba, + 0xaa, 0x21, 0xcf, 0x9d, 0x4c, 0x43, 0x9e, 0xef, 0x4f, 0x43, 0x9e, 0x38, 0xa6, 0x0a, 0xfd, 0x1c, + 0x53, 0x5f, 0x85, 0xb1, 0x4d, 0x6a, 0x37, 0x83, 0x4d, 0x4f, 0x04, 0x84, 0xe7, 0xa6, 0xb2, 0x32, + 0x40, 0x0e, 0x2b, 0x93, 0xc2, 0x60, 0x64, 0xf2, 0x13, 0x32, 0x02, 0xb6, 0xb5, 0xf2, 0x08, 0xf1, + 0xa6, 0xce, 0x41, 0x95, 0xf0, 0x07, 0x7a, 0x48, 0xf8, 0x35, 0x18, 0x15, 0x74, 0x71, 0x90, 0xc1, + 0x58, 0x14, 0x65, 0x45, 0x08, 0x97, 0xb5, 0x47, 0x29, 0xfb, 0xa2, 0xda, 0xb9, 0x14, 0xaa, 0x31, + 0x61, 0x5d, 0xb0, 0xdc, 0x72, 0xda, 0x9e, 0xdb, 0xc2, 0x2e, 0x18, 0x8a, 0xbb, 0x80, 0x0a, 0x30, + 0xef, 0x02, 0x05, 0x89, 0xbc, 0x05, 0xe3, 0x95, 0x8d, 0xaa, 0x4a, 0x56, 0x8a, 0x95, 0xf4, 0x76, + 0xdb, 0xb5, 0x34, 0xd2, 0x04, 0x6e, 0x2f, 0xa9, 0x6c, 0xf8, 0x9f, 0x8f, 0x54, 0x66, 0xfc, 0xc3, + 0x61, 0xb9, 0xbc, 0x3f, 0x5b, 0x65, 0xa0, 0xae, 0xde, 0x2b, 0x9c, 0x50, 0xbd, 0x57, 0x3c, 0x4e, + 0x38, 0xd1, 0x24, 0xa6, 0x81, 0x13, 0x48, 0x4c, 0x83, 0x9f, 0x5a, 0x55, 0x37, 0x74, 0x42, 0x19, + 0x28, 0xb1, 0xd2, 0x4a, 0xfd, 0xac, 0xb4, 0x4c, 0xb9, 0x69, 0xf8, 0xd3, 0xcb, 0x4d, 0x70, 0x62, + 0xb9, 0xa9, 0x16, 0xbb, 0x91, 0x8d, 0x1c, 0x6b, 0xcf, 0x7b, 0x5e, 0xdc, 0x57, 0x26, 0xb3, 0x43, + 0xf8, 0x44, 0x0e, 0x65, 0x9f, 0x2b, 0x61, 0xec, 0x9b, 0xd9, 0xc2, 0x58, 0xef, 0xd3, 0xe6, 0x5f, + 0x8a, 0x63, 0x4f, 0x44, 0x1c, 0xf3, 0x71, 0xc0, 0xb6, 0x6c, 0xbf, 0x85, 0x57, 0xce, 0x6b, 0x30, + 0x24, 0xa3, 0x62, 0xe5, 0x62, 0xed, 0x49, 0x3a, 0x1c, 0x96, 0xc4, 0x22, 0xf3, 0x50, 0x92, 0xc4, + 0x6a, 0x84, 0xef, 0x03, 0x01, 0xd3, 0x02, 0x0e, 0x09, 0x98, 0xf1, 0x77, 0x8a, 0x72, 0x53, 0x60, + 0xed, 0x10, 0xd9, 0xa0, 0x17, 0x94, 0x49, 0xa0, 0x08, 0x83, 0x89, 0x61, 0x4e, 0x58, 0xfa, 0xe9, + 0x24, 0x9f, 0x28, 0x4e, 0x59, 0x9c, 0x85, 0xaa, 0xd0, 0x47, 0x16, 0xaa, 0x37, 0xb4, 0x14, 0x4e, + 0xc5, 0x38, 0x67, 0x08, 0x5b, 0x28, 0xbd, 0x93, 0x37, 0xdd, 0x54, 0x73, 0x2d, 0x0d, 0xc4, 0x21, + 0x3b, 0x90, 0xb2, 0x47, 0x96, 0xa5, 0x48, 0xba, 0x1d, 0x3c, 0x49, 0x04, 0xc0, 0xa1, 0x7f, 0xa1, + 0x11, 0x00, 0x97, 0x01, 0x94, 0x0c, 0xbc, 0xfc, 0x71, 0xe7, 0x45, 0xd6, 0x4d, 0xc7, 0x67, 0xdf, + 0x55, 0x08, 0x8d, 0xdf, 0x23, 0x30, 0x59, 0xab, 0xad, 0x2f, 0xb9, 0xf6, 0x6e, 0xcb, 0x0b, 0x42, + 0xb7, 0x5e, 0x6d, 0xed, 0x78, 0x4c, 0xb4, 0x8b, 0x36, 0x18, 0x25, 0xd4, 0x5b, 0xbc, 0xb9, 0x44, + 0xc5, 0xec, 0xea, 0xb0, 0xec, 0xfb, 0x9e, 0xaf, 0x5e, 0x1d, 0x28, 0x03, 0x98, 0x1c, 0xce, 0xa4, + 0xa7, 0x5a, 0x87, 0xa7, 0x52, 0xe5, 0xef, 0x6d, 0x28, 0x3d, 0x05, 0x1c, 0x64, 0xca, 0x32, 0x42, + 0xd3, 0x13, 0x56, 0x48, 0xd3, 0x67, 0xb4, 0x38, 0x82, 0x71, 0x31, 0xdf, 0x3e, 0xc5, 0xf1, 0x86, + 0x4b, 0xb1, 0x8d, 0x70, 0xf5, 0x81, 0x3c, 0xb5, 0x06, 0x0e, 0xe1, 0x94, 0xe6, 0x02, 0xd5, 0xaf, + 0xe2, 0xf0, 0x65, 0x21, 0xad, 0x19, 0xe8, 0x3f, 0x9b, 0xa1, 0x3d, 0x54, 0x73, 0x1e, 0x64, 0xd6, + 0x40, 0x7e, 0x3c, 0x07, 0xe7, 0x33, 0x4b, 0xa2, 0xd5, 0x3d, 0xa2, 0xc5, 0x72, 0x54, 0x36, 0x0d, + 0x9e, 0xdd, 0xa1, 0x5b, 0xd5, 0x56, 0xc6, 0x56, 0xd0, 0xbb, 0x26, 0xf2, 0x1b, 0x39, 0x38, 0xa3, + 0x61, 0x44, 0xdb, 0x67, 0x10, 0xf9, 0xfa, 0x66, 0xce, 0xeb, 0x8f, 0x9e, 0xcc, 0xbc, 0xbe, 0xa8, + 0x7f, 0x4b, 0xbc, 0xbb, 0xab, 0xdf, 0xd0, 0xad, 0x85, 0xe4, 0x21, 0x4c, 0x62, 0x91, 0x54, 0x62, + 0xb2, 0x39, 0x2b, 0x74, 0x9f, 0xd3, 0x71, 0xb3, 0xb9, 0x5b, 0x1f, 0x66, 0xe8, 0x9b, 0xff, 0xfe, + 0xd1, 0xdc, 0x98, 0x86, 0x2e, 0xa3, 0x23, 0x5a, 0xb1, 0x26, 0xd4, 0x6d, 0xed, 0x78, 0xea, 0xd1, + 0x9b, 0xaa, 0x82, 0xfc, 0x47, 0x39, 0x98, 0x61, 0x50, 0xfe, 0x19, 0xb7, 0x7c, 0xaf, 0x19, 0x95, + 0x4b, 0x4b, 0x8b, 0x2e, 0xdd, 0xd6, 0x78, 0x32, 0xdd, 0xf6, 0x22, 0x36, 0x99, 0xef, 0x09, 0xd6, + 0x8e, 0xef, 0x35, 0xe3, 0xe6, 0x6b, 0x19, 0x66, 0xbb, 0x35, 0x92, 0xfc, 0x70, 0x0e, 0xce, 0x6a, + 0x9a, 0x17, 0x35, 0x86, 0xb4, 0x70, 0x9e, 0x9c, 0x8a, 0x9c, 0xa4, 0xe3, 0xa2, 0x85, 0xab, 0x62, + 0xfe, 0x5f, 0xc2, 0x16, 0xc4, 0xa7, 0x05, 0xb6, 0xc5, 0x6a, 0x72, 0x2c, 0xa5, 0x09, 0xdd, 0x6b, + 0x21, 0x2e, 0x4c, 0xe2, 0x1b, 0xa5, 0x66, 0x11, 0x34, 0xdd, 0xdd, 0x22, 0x28, 0xca, 0xa4, 0x84, + 0x01, 0x6a, 0xbb, 0x9b, 0x05, 0xa5, 0xb9, 0x92, 0xbf, 0x08, 0x67, 0x53, 0xc0, 0x68, 0xb5, 0x9d, + 0xea, 0xba, 0xda, 0x5e, 0x79, 0x7c, 0x34, 0xf7, 0x52, 0x56, 0x6d, 0x59, 0x2b, 0xad, 0x7b, 0x0d, + 0xc4, 0x06, 0x88, 0x0b, 0x45, 0xa2, 0xda, 0xec, 0x09, 0xfa, 0x8a, 0x98, 0x1f, 0x0a, 0x3e, 0xdb, + 0xcb, 0x95, 0x36, 0xa8, 0x47, 0x5e, 0x8c, 0x44, 0x28, 0x8c, 0x2a, 0xc1, 0x79, 0x0f, 0x31, 0x63, + 0x6d, 0xd7, 0x4a, 0xbe, 0x7f, 0x34, 0xa7, 0x61, 0x33, 0x11, 0x5b, 0x8d, 0xfa, 0xab, 0x8a, 0xd8, + 0x1a, 0x22, 0xf9, 0xb5, 0x1c, 0x4c, 0x33, 0x40, 0x3c, 0xa9, 0xc4, 0x47, 0xcd, 0xf4, 0x9a, 0xf5, + 0x7b, 0x4f, 0x66, 0xd6, 0x3f, 0x8f, 0x6d, 0x54, 0x67, 0x7d, 0xaa, 0x4b, 0x32, 0x1b, 0x87, 0xb3, + 0x5d, 0x7b, 0x0e, 0xd7, 0x66, 0xfb, 0xd9, 0x3e, 0x66, 0x3b, 0x1f, 0x80, 0xe3, 0x67, 0x7b, 0xd7, + 0x5a, 0xc8, 0x26, 0x8c, 0x0a, 0xe9, 0x9a, 0x77, 0xd8, 0x73, 0x5a, 0x60, 0x4f, 0xb5, 0x88, 0x5f, + 0x79, 0x44, 0xec, 0xe2, 0xd4, 0x17, 0x6a, 0x5c, 0x48, 0x0b, 0xa6, 0xf8, 0x6f, 0x5d, 0xd7, 0x31, + 0xd7, 0x55, 0xd7, 0x71, 0x59, 0x7c, 0xd1, 0x05, 0xc1, 0x3f, 0xa1, 0xf2, 0x50, 0x63, 0x2b, 0x64, + 0x30, 0x26, 0x6d, 0x20, 0x1a, 0x98, 0x2f, 0xda, 0x0b, 0xbd, 0x35, 0x1c, 0x2f, 0x89, 0x3a, 0xe7, + 0x92, 0x75, 0x26, 0x57, 0x6e, 0x06, 0x6f, 0x62, 0xc3, 0x84, 0x80, 0xb2, 0xbb, 0x34, 0xee, 0xf0, + 0xcf, 0x6b, 0xd1, 0x2d, 0x12, 0xa5, 0x5c, 0x30, 0x97, 0x35, 0x61, 0xf4, 0x91, 0xc4, 0x86, 0x9e, + 0xe4, 0x47, 0xd6, 0x61, 0xb2, 0xd2, 0x6e, 0x37, 0x5c, 0xea, 0xe0, 0x57, 0xf2, 0xa4, 0xa3, 0x46, + 0x9c, 0x68, 0xc2, 0xe6, 0x85, 0xe2, 0xb6, 0x90, 0xcc, 0x38, 0x9a, 0xa6, 0x35, 0xbe, 0x93, 0x4b, + 0x35, 0x9a, 0xbc, 0x0a, 0xc3, 0xf8, 0x43, 0x71, 0xb1, 0x46, 0x25, 0x00, 0x6f, 0x22, 0x2a, 0x23, + 0x62, 0x04, 0x26, 0x2c, 0xa9, 0x41, 0x93, 0x0a, 0x5c, 0x58, 0x12, 0x37, 0xd5, 0xf8, 0x6e, 0x3a, + 0x27, 0x2d, 0x35, 0x0b, 0xb1, 0xd0, 0x85, 0x96, 0x9a, 0xc2, 0x3e, 0xd3, 0xf8, 0xe1, 0xbc, 0x3e, + 0xed, 0xc8, 0x65, 0x45, 0x6e, 0x57, 0xc2, 0x36, 0x49, 0xb9, 0x5d, 0x91, 0xd6, 0xff, 0x76, 0x0e, + 0xa6, 0xd6, 0xfd, 0x5d, 0xbb, 0xe5, 0x7e, 0x9b, 0x87, 0x7f, 0xf4, 0x70, 0x5c, 0x7a, 0xe7, 0xec, + 0x79, 0x52, 0xb9, 0x47, 0x3c, 0xa5, 0x62, 0x36, 0x53, 0x70, 0xca, 0x98, 0x59, 0xed, 0x41, 0xdb, + 0x77, 0x6c, 0x98, 0x92, 0x02, 0x86, 0xa3, 0x73, 0xb8, 0xf1, 0x93, 0x79, 0x18, 0x51, 0x96, 0x00, + 0xf9, 0x22, 0x8c, 0xaa, 0x7c, 0x54, 0x05, 0x92, 0x5a, 0xad, 0xa9, 0x61, 0xa1, 0x06, 0x89, 0xda, + 0x4d, 0x4d, 0x83, 0xc4, 0x26, 0x3a, 0x42, 0x4f, 0x78, 0xb5, 0x79, 0x37, 0xe3, 0x6a, 0x73, 0xa2, + 0xec, 0xb4, 0x6f, 0xa5, 0x2f, 0x38, 0xfd, 0x27, 0x93, 0x35, 0x7e, 0x26, 0x07, 0xe5, 0xe4, 0x22, + 0xfd, 0x4c, 0x7a, 0xe5, 0x04, 0xaf, 0x05, 0x3f, 0x91, 0x8f, 0x22, 0x73, 0x4b, 0x8f, 0x9e, 0xa7, + 0xd5, 0x24, 0xe6, 0x6d, 0x4d, 0x91, 0xff, 0xac, 0x1e, 0x6a, 0x46, 0xf5, 0x85, 0xcd, 0x8e, 0x2f, + 0x55, 0xfc, 0xde, 0x2f, 0xce, 0x3d, 0x63, 0xbc, 0x0f, 0xd3, 0xc9, 0xee, 0x40, 0x65, 0x7e, 0x05, + 0x26, 0x74, 0x78, 0x32, 0xae, 0x7f, 0x92, 0xca, 0x4c, 0xe2, 0x1b, 0xbf, 0x9f, 0x4f, 0xf2, 0x16, + 0xe6, 0x31, 0x6c, 0xd3, 0x69, 0xd9, 0xdb, 0x8d, 0x28, 0xae, 0x37, 0xdf, 0x74, 0x38, 0xc8, 0x94, + 0x65, 0x27, 0x49, 0x74, 0x11, 0xf9, 0xa5, 0x14, 0xb2, 0xfd, 0x52, 0xc8, 0xcd, 0x84, 0x8d, 0x99, + 0x12, 0x44, 0xe1, 0x80, 0x6e, 0x5b, 0xb1, 0x9d, 0x59, 0xc2, 0xb4, 0x6c, 0x11, 0xa6, 0xb5, 0xf8, + 0x9e, 0x92, 0x7e, 0x20, 0xd6, 0xdd, 0x86, 0x58, 0xc0, 0x89, 0x33, 0x91, 0xc9, 0x0a, 0x0c, 0xb1, + 0x66, 0xde, 0xb3, 0xdb, 0x42, 0x47, 0x4f, 0x22, 0x2f, 0xb5, 0x46, 0x74, 0xe1, 0x53, 0x1c, 0xd5, + 0x1a, 0x94, 0x1d, 0xf9, 0x5a, 0x72, 0x67, 0x8e, 0x68, 0xfc, 0x69, 0x8e, 0xad, 0xff, 0xfa, 0xfe, + 0xe7, 0x2c, 0x5b, 0x06, 0xfb, 0xa4, 0x1e, 0xd6, 0x5b, 0x7f, 0x94, 0xe7, 0xa1, 0xd9, 0xc5, 0xf4, + 0x79, 0x03, 0x06, 0x37, 0x6d, 0x7f, 0x97, 0x86, 0x22, 0x68, 0xb9, 0xca, 0x85, 0x17, 0xc4, 0x21, + 0x1e, 0x42, 0xfc, 0x6d, 0x0a, 0x02, 0x55, 0x17, 0x96, 0xef, 0x4b, 0x17, 0xa6, 0x68, 0x7a, 0x0b, + 0x4f, 0x4c, 0xd3, 0xfb, 0x03, 0x51, 0x14, 0xf6, 0x4a, 0xd8, 0x47, 0xf8, 0xc8, 0x0b, 0xc9, 0x2c, + 0x06, 0xa9, 0x40, 0x9f, 0x31, 0x3b, 0x72, 0x53, 0xcd, 0x8b, 0xa0, 0xb8, 0x7a, 0x1c, 0x93, 0x01, + 0xc1, 0xf8, 0xa3, 0x02, 0xef, 0x63, 0xd1, 0x51, 0x97, 0x34, 0x37, 0x30, 0x5c, 0x27, 0x6c, 0xa3, + 0x57, 0x3d, 0x72, 0xd1, 0xb0, 0xe3, 0x12, 0x14, 0xd9, 0xdc, 0x14, 0xbd, 0x89, 0x78, 0x6c, 0xfe, + 0xaa, 0x78, 0xac, 0x9c, 0xad, 0x65, 0x3c, 0x93, 0xd4, 0x4c, 0x34, 0x78, 0x6c, 0xa9, 0x6b, 0x19, + 0x31, 0xc8, 0x65, 0x28, 0xae, 0x79, 0x8e, 0x0c, 0x53, 0x3a, 0x8d, 0xce, 0xc0, 0x9e, 0xa3, 0xb0, + 0x9c, 0xc9, 0x99, 0x88, 0xc1, 0xbe, 0x35, 0x0a, 0x6c, 0xae, 0x7e, 0x6b, 0x73, 0xc7, 0x16, 0xb1, + 0xb4, 0xd4, 0x6f, 0x8d, 0x63, 0xa0, 0x2f, 0xc3, 0xb8, 0x9e, 0x8b, 0x52, 0xd8, 0xb6, 0xa1, 0xc6, + 0x36, 0x91, 0xd2, 0x52, 0x55, 0xb4, 0xeb, 0x44, 0x64, 0x01, 0xc6, 0xb4, 0xf0, 0x68, 0xe2, 0xb1, + 0x0c, 0xd5, 0x9b, 0x7a, 0x70, 0x35, 0x55, 0xbd, 0xa9, 0x91, 0xb0, 0xf3, 0x5c, 0xb4, 0x5f, 0x79, + 0x32, 0x4b, 0xb5, 0x5d, 0xe0, 0x90, 0x1b, 0x50, 0xe2, 0x5e, 0xb7, 0xd5, 0x25, 0xf5, 0xe1, 0x23, + 0x40, 0x58, 0xc2, 0x6b, 0x5d, 0x22, 0x2a, 0x5e, 0x96, 0x5f, 0x80, 0xb2, 0xd8, 0x92, 0xe2, 0xac, + 0x8f, 0xe7, 0xa0, 0xb8, 0x58, 0x5d, 0x32, 0xd5, 0x6d, 0xa4, 0xee, 0x3a, 0xbe, 0x89, 0x50, 0x34, + 0xdd, 0x5f, 0xa3, 0xe1, 0x81, 0xe7, 0xef, 0x9b, 0x34, 0x08, 0x7d, 0x97, 0x27, 0x32, 0xc2, 0x85, + 0xf8, 0x45, 0xf2, 0x16, 0x0c, 0xa0, 0x91, 0x55, 0xe2, 0x64, 0x48, 0xd6, 0xb1, 0x30, 0x26, 0x26, + 0xf0, 0x00, 0x5a, 0x6c, 0x99, 0x9c, 0x88, 0xbc, 0x01, 0xc5, 0x25, 0xda, 0x3a, 0x4c, 0xa4, 0x72, + 0x49, 0x11, 0x47, 0x1b, 0x82, 0x43, 0x5b, 0x87, 0x26, 0x92, 0x18, 0x3f, 0x93, 0x87, 0x53, 0x19, + 0xcd, 0x7a, 0xf0, 0xc5, 0xa7, 0x74, 0x57, 0x5c, 0xd0, 0x76, 0x45, 0xf9, 0xde, 0xd9, 0xb5, 0xe3, + 0x33, 0x37, 0xc9, 0x9f, 0xcf, 0xc1, 0x19, 0x7d, 0x82, 0x0a, 0xab, 0xca, 0x07, 0x37, 0xc8, 0x9b, + 0x30, 0xb8, 0x42, 0x6d, 0x87, 0xca, 0x34, 0x0f, 0xa7, 0xa2, 0xf8, 0x38, 0xdc, 0xa5, 0x90, 0x17, + 0x72, 0xb6, 0xb1, 0x03, 0x0a, 0x87, 0x92, 0x25, 0xd1, 0x38, 0x2e, 0x8f, 0x1b, 0xd2, 0xbd, 0x37, + 0xab, 0xaa, 0x1e, 0x56, 0x03, 0xdf, 0xcf, 0xc1, 0xb3, 0x3d, 0x68, 0xd8, 0xc0, 0xb1, 0xa1, 0x57, + 0x07, 0x0e, 0x4f, 0x54, 0x84, 0x92, 0x77, 0x60, 0x62, 0x53, 0xc8, 0xf3, 0x72, 0x38, 0xf2, 0xf1, + 0x7a, 0x91, 0xa2, 0xbe, 0x25, 0xc7, 0x25, 0x89, 0xac, 0xf9, 0x9d, 0x17, 0x7a, 0xfa, 0x9d, 0xab, + 0x6e, 0xdc, 0xc5, 0x7e, 0xdd, 0xb8, 0xdf, 0x4f, 0x66, 0x70, 0x17, 0xd1, 0xf4, 0x62, 0x27, 0xf6, + 0x5c, 0x77, 0x27, 0xf6, 0x9e, 0x31, 0xbb, 0x8c, 0x9f, 0xcc, 0x41, 0x59, 0xe7, 0xfd, 0x69, 0xc7, + 0xf3, 0x6d, 0x6d, 0x3c, 0x9f, 0xcd, 0x1e, 0xcf, 0xee, 0x03, 0xf9, 0xbf, 0xe6, 0x92, 0x1f, 0xdb, + 0xd7, 0x08, 0x1a, 0x30, 0xb8, 0xe4, 0x35, 0x6d, 0xb7, 0xa5, 0x26, 0x11, 0x75, 0x10, 0x62, 0x8a, + 0x92, 0xfe, 0x7c, 0xfe, 0x2f, 0xc0, 0xc0, 0x9a, 0xd7, 0xaa, 0x2c, 0x09, 0xa3, 0x43, 0xe4, 0xd3, + 0xf2, 0x5a, 0x96, 0xed, 0x98, 0xbc, 0x80, 0xac, 0x02, 0xd4, 0xea, 0x3e, 0xa5, 0xad, 0x9a, 0xfb, + 0x6d, 0x9a, 0x90, 0x34, 0x58, 0x0f, 0x35, 0x3a, 0xb8, 0xb1, 0xe0, 0x1b, 0x4f, 0x80, 0x88, 0x56, + 0xe0, 0x7e, 0x5b, 0xdd, 0x6f, 0x15, 0x7a, 0x83, 0x02, 0xc4, 0x44, 0x98, 0x51, 0xcd, 0x75, 0x44, + 0x96, 0xdc, 0x31, 0x91, 0x51, 0x8d, 0x01, 0xb4, 0x8c, 0x6a, 0x0c, 0xc0, 0xb6, 0xf6, 0x15, 0xea, + 0xee, 0xee, 0x71, 0xeb, 0x93, 0x31, 0x3e, 0x55, 0xf7, 0x10, 0xa2, 0x6e, 0xed, 0x1c, 0xc7, 0xf8, + 0xf1, 0x01, 0x38, 0x6b, 0xd2, 0x5d, 0x97, 0x89, 0xc9, 0xf7, 0x03, 0xb7, 0xb5, 0xab, 0x79, 0x65, + 0x1b, 0x89, 0x89, 0x24, 0x02, 0x12, 0x33, 0x48, 0xd4, 0x31, 0x57, 0xa0, 0xc4, 0x4e, 0x45, 0x65, + 0x2e, 0xe1, 0x1b, 0x0a, 0xa6, 0x00, 0xe7, 0x93, 0x5c, 0x16, 0x93, 0x97, 0xc5, 0xa9, 0xad, 0x84, + 0x8c, 0x67, 0xa7, 0xf6, 0xc7, 0x47, 0x73, 0x50, 0x3b, 0x0c, 0x42, 0x8a, 0x37, 0x36, 0x71, 0x72, + 0x47, 0xa2, 0x75, 0xb1, 0x8b, 0x68, 0x7d, 0x0f, 0xa6, 0x2b, 0x0e, 0xdf, 0xac, 0xed, 0xc6, 0x86, + 0xef, 0xb6, 0xea, 0x6e, 0xdb, 0x6e, 0xc8, 0xeb, 0x22, 0xf6, 0xb2, 0x1d, 0x95, 0x5b, 0xed, 0x08, + 0xc1, 0xcc, 0x24, 0x63, 0x9f, 0xb1, 0xb4, 0x56, 0x43, 0xe7, 0x65, 0xf1, 0x3c, 0x86, 0x9f, 0xe1, + 0xb4, 0x02, 0xfc, 0x8a, 0xc0, 0x8c, 0x8a, 0x51, 0xa8, 0x47, 0x73, 0x86, 0xcd, 0xd5, 0x5a, 0xec, + 0x9d, 0xc4, 0x23, 0xda, 0x72, 0x93, 0x87, 0xb0, 0x11, 0xa0, 0xd9, 0x83, 0x86, 0x17, 0xd3, 0xd5, + 0x6a, 0x2b, 0x8c, 0xae, 0x94, 0xa2, 0x0b, 0x82, 0x3d, 0x95, 0x8e, 0xe3, 0x91, 0x6b, 0x6c, 0x2a, + 0x34, 0xbd, 0x90, 0xe2, 0x3c, 0x1f, 0x8e, 0xaf, 0x00, 0x3e, 0x42, 0xf9, 0x15, 0x40, 0x41, 0x21, + 0x6f, 0xc1, 0xd4, 0xf2, 0xe2, 0xbc, 0x54, 0x6a, 0x2e, 0x79, 0xf5, 0x0e, 0x3e, 0x50, 0x03, 0xd6, + 0x87, 0x63, 0x48, 0xeb, 0xf3, 0x6c, 0x72, 0x67, 0xa1, 0x91, 0x4b, 0x30, 0x54, 0x5d, 0xe2, 0x7d, + 0x3f, 0xa2, 0xa6, 0x6d, 0x10, 0x86, 0x1f, 0xb2, 0x90, 0xac, 0xc7, 0x32, 0xea, 0xe8, 0xb1, 0xc2, + 0xe4, 0xd9, 0xe3, 0xe5, 0x53, 0x91, 0xdd, 0x81, 0x67, 0x11, 0x5a, 0xf4, 0x1c, 0x1a, 0x3c, 0xb8, + 0xfe, 0x39, 0xcb, 0xee, 0xa0, 0x7c, 0x1b, 0xee, 0x5e, 0xd7, 0x33, 0xb7, 0xba, 0x7f, 0x1d, 0xb3, + 0x3b, 0xa4, 0x70, 0xc9, 0x97, 0x61, 0x00, 0x7f, 0x0a, 0xb9, 0x67, 0x2a, 0x83, 0x6d, 0x2c, 0xf3, + 0xd4, 0x79, 0x12, 0x60, 0x24, 0x20, 0x55, 0x18, 0x12, 0x22, 0xf7, 0x49, 0x62, 0x94, 0x0b, 0xd9, + 0x9d, 0x0f, 0x92, 0xa0, 0x37, 0x1c, 0x18, 0x55, 0x2b, 0x64, 0x93, 0x73, 0xc5, 0x0e, 0xf6, 0xa8, + 0xc3, 0x7e, 0x89, 0xf4, 0x22, 0x38, 0x39, 0xf7, 0x10, 0x6a, 0xb1, 0x76, 0x98, 0x0a, 0x0a, 0xdb, + 0x6d, 0xab, 0xc1, 0xfd, 0x40, 0x34, 0x45, 0x5c, 0xc2, 0x5d, 0x54, 0xe8, 0x38, 0xa6, 0x28, 0x32, + 0x7e, 0x00, 0xa6, 0xd7, 0x3a, 0x8d, 0x06, 0xbb, 0x90, 0xcb, 0xf0, 0xd3, 0xa1, 0x1d, 0x52, 0xb2, + 0x00, 0x03, 0x35, 0x25, 0xad, 0xe0, 0x54, 0x14, 0xdf, 0x3b, 0xc6, 0x41, 0x73, 0xb7, 0x1c, 0xfa, + 0x74, 0x27, 0x12, 0x0a, 0x72, 0x52, 0xe3, 0x77, 0xe3, 0x74, 0xd4, 0x9b, 0xbe, 0x5d, 0xdf, 0x8f, + 0x52, 0x4b, 0xf6, 0x9b, 0x59, 0xfb, 0x8e, 0x6c, 0x84, 0x7e, 0x94, 0x65, 0x35, 0xf8, 0xb8, 0xc6, + 0x90, 0xb7, 0x60, 0x44, 0x1c, 0x67, 0x4a, 0x24, 0x22, 0x0c, 0xf7, 0x20, 0x73, 0xdb, 0x27, 0xcc, + 0x0d, 0x54, 0x74, 0x3c, 0xa5, 0xf5, 0x4f, 0x79, 0x70, 0xfd, 0xb3, 0x38, 0xa5, 0xf5, 0x3a, 0x7a, + 0x4c, 0xdd, 0x7f, 0x30, 0x92, 0xec, 0x5b, 0x31, 0x77, 0x6f, 0xaa, 0xb1, 0x47, 0x72, 0xf1, 0x9d, + 0x29, 0x8e, 0x3d, 0xa2, 0xde, 0x99, 0x22, 0xd4, 0x68, 0x4c, 0xf2, 0xc7, 0x8c, 0xc9, 0x3b, 0x72, + 0x4c, 0x0a, 0xdd, 0x27, 0xc6, 0x54, 0x8f, 0x71, 0xa8, 0xc5, 0x2b, 0xa4, 0xd8, 0xd7, 0x85, 0xfb, + 0x19, 0x0c, 0xb2, 0xca, 0x49, 0x92, 0x1b, 0x9a, 0xe0, 0xa4, 0xde, 0xe2, 0x07, 0xfa, 0x67, 0x7a, + 0xcc, 0x2d, 0xfe, 0x2b, 0x30, 0x5a, 0x09, 0x43, 0xbb, 0xbe, 0x47, 0x9d, 0x25, 0xb6, 0x3d, 0x29, + 0x61, 0x12, 0x6c, 0x01, 0x57, 0x9f, 0x53, 0x54, 0x5c, 0x1e, 0xf6, 0xcb, 0x0e, 0x84, 0xe1, 0x5c, + 0x14, 0xf6, 0x8b, 0x41, 0xf4, 0xb0, 0x5f, 0x0c, 0x42, 0xae, 0xc1, 0x50, 0xb5, 0xf5, 0xd0, 0x65, + 0x7d, 0x52, 0x52, 0x12, 0xe8, 0x73, 0x90, 0xba, 0xb9, 0x0a, 0x2c, 0xf2, 0x86, 0x22, 0xee, 0x0e, + 0xc7, 0x57, 0x5b, 0xae, 0x0c, 0x89, 0x1c, 0xac, 0x55, 0x51, 0x36, 0x92, 0x7f, 0x6f, 0xc2, 0x90, + 0xd4, 0x71, 0x41, 0x7c, 0x9d, 0x15, 0x94, 0x69, 0x47, 0x4c, 0x89, 0x8c, 0xd9, 0x08, 0x95, 0x34, + 0x29, 0x23, 0x4a, 0x36, 0x42, 0x25, 0x4d, 0x8a, 0x96, 0x8d, 0x50, 0x49, 0x98, 0x12, 0xa9, 0x07, + 0x46, 0x8f, 0x55, 0x0f, 0x3c, 0x80, 0xd1, 0x0d, 0xdb, 0x0f, 0x5d, 0x26, 0x2e, 0xb4, 0xc2, 0x60, + 0x66, 0x4c, 0xd3, 0xa8, 0x29, 0x45, 0x0b, 0xcf, 0xc9, 0x04, 0x7a, 0x6d, 0x05, 0x5f, 0xcf, 0xf4, + 0x16, 0xc3, 0xb3, 0xcd, 0xe6, 0xc6, 0x3f, 0x8d, 0xd9, 0x1c, 0x76, 0x2a, 0x6a, 0x51, 0x26, 0xe2, + 0xbb, 0x3a, 0x8a, 0xb3, 0x09, 0x55, 0x4a, 0x84, 0x48, 0xbe, 0x0e, 0xa3, 0xec, 0x6f, 0xcc, 0x59, + 0xef, 0xd2, 0x60, 0xa6, 0x8c, 0x1f, 0xf7, 0x5c, 0xe6, 0xea, 0xe7, 0x89, 0xed, 0x6b, 0x34, 0xe4, + 0x0b, 0x18, 0x19, 0x27, 0xd5, 0xa3, 0x1a, 0x37, 0xf2, 0x2e, 0x8c, 0xb2, 0xd9, 0xb7, 0x6d, 0x07, + 0x5c, 0x4a, 0x9c, 0x8c, 0x0d, 0x1f, 0x1d, 0x01, 0x4f, 0x45, 0xde, 0x53, 0x09, 0xd8, 0x31, 0x5f, + 0x69, 0xf3, 0x0d, 0x92, 0x28, 0xb3, 0xbd, 0x9d, 0xda, 0x1c, 0x25, 0x1a, 0x79, 0x0f, 0x46, 0x2b, + 0xed, 0x76, 0xbc, 0xe3, 0x4c, 0x29, 0x2a, 0x92, 0x76, 0xdb, 0xca, 0xdc, 0x75, 0x34, 0x8a, 0xe4, + 0xc6, 0x3c, 0x7d, 0xa2, 0x8d, 0x99, 0xbc, 0x16, 0x09, 0xce, 0xa7, 0x62, 0x7d, 0x9f, 0xb8, 0x52, + 0x68, 0x52, 0x38, 0x97, 0xa1, 0x17, 0x61, 0x8c, 0x2b, 0xc0, 0xa4, 0x34, 0x73, 0x3a, 0xb5, 0x7a, + 0x32, 0x84, 0x1a, 0x9d, 0x86, 0x2c, 0xc3, 0x38, 0xf7, 0x39, 0x6b, 0x88, 0x90, 0x88, 0x33, 0x67, + 0xe2, 0xcc, 0xc8, 0xdc, 0x55, 0xad, 0x81, 0x91, 0xb2, 0x6d, 0x8d, 0x4b, 0x82, 0xc8, 0xf8, 0xe3, + 0x1c, 0x9c, 0xe9, 0x32, 0xe2, 0x51, 0xc0, 0xbc, 0x5c, 0xef, 0x80, 0x79, 0x6c, 0xe7, 0xd0, 0xef, + 0xcb, 0xf8, 0xfd, 0x42, 0xca, 0x52, 0xc7, 0x4b, 0xca, 0x5b, 0x1e, 0x10, 0x11, 0x5a, 0x5e, 0x54, + 0x7d, 0xc7, 0x43, 0xa5, 0x5d, 0x21, 0x7d, 0x08, 0x09, 0x3c, 0xde, 0xa8, 0x05, 0xe3, 0xf1, 0xd1, + 0xdc, 0x73, 0x22, 0x72, 0x7d, 0x34, 0xac, 0x1f, 0x79, 0xda, 0x0a, 0xce, 0x60, 0x6d, 0x1c, 0xe5, + 0x60, 0x44, 0x59, 0x87, 0xe4, 0x82, 0xe2, 0xc1, 0x56, 0xe6, 0xb9, 0x0f, 0x14, 0x0e, 0x79, 0x7e, + 0x12, 0xe1, 0xa2, 0xca, 0x1f, 0xaf, 0x9a, 0xbc, 0xc7, 0x44, 0x21, 0x25, 0xa8, 0x60, 0x53, 0xd3, + 0x23, 0x9a, 0x58, 0x8e, 0x79, 0x3f, 0xed, 0x20, 0xac, 0xd4, 0x43, 0xf7, 0x21, 0xed, 0xe3, 0xd0, + 0x89, 0xf3, 0x7e, 0xda, 0x41, 0x68, 0xd9, 0x48, 0x96, 0xca, 0xfb, 0x19, 0x31, 0x34, 0x7e, 0x24, + 0x07, 0x70, 0xbf, 0xba, 0x88, 0x51, 0x41, 0x3f, 0xad, 0x50, 0x90, 0x1d, 0x69, 0x4d, 0x72, 0xef, + 0x21, 0x0e, 0xfc, 0x37, 0x39, 0x18, 0xd7, 0xd1, 0xc8, 0x3b, 0x30, 0x51, 0xab, 0xfb, 0x5e, 0xa3, + 0xb1, 0x6d, 0xd7, 0xf7, 0x57, 0xdd, 0x16, 0xe5, 0x31, 0xae, 0x06, 0xf8, 0x59, 0x14, 0x44, 0x45, + 0x56, 0x83, 0x95, 0x99, 0x49, 0x64, 0xf2, 0xa3, 0x39, 0x18, 0xab, 0xed, 0x79, 0x07, 0x71, 0x3a, + 0x76, 0x3e, 0x20, 0x1f, 0xb2, 0xb5, 0x1d, 0xec, 0x79, 0x07, 0x56, 0x46, 0x4e, 0xf6, 0x8f, 0x8f, + 0xe6, 0xde, 0xee, 0xef, 0xc5, 0xb6, 0xee, 0xb5, 0x82, 0x90, 0x6d, 0xcc, 0x57, 0xb5, 0x4a, 0x4c, + 0xbd, 0x4e, 0xe3, 0xcf, 0x72, 0x30, 0x52, 0x65, 0x98, 0x8d, 0x06, 0xca, 0x5c, 0x9f, 0xa7, 0x2c, + 0x3c, 0xd1, 0x77, 0xf5, 0x18, 0xd8, 0xd7, 0x61, 0x22, 0x81, 0x46, 0x0c, 0x18, 0xac, 0xa1, 0xd7, + 0xb2, 0xaa, 0x2b, 0xe0, 0x7e, 0xcc, 0xa6, 0x28, 0x31, 0x96, 0x15, 0xb2, 0x07, 0xd7, 0xf1, 0xc1, + 0x6f, 0x1e, 0xc0, 0x95, 0x20, 0x79, 0xb3, 0x21, 0xc9, 0x96, 0x3c, 0xb8, 0x6e, 0x2a, 0x58, 0xc6, + 0x1a, 0x0c, 0xd6, 0x3c, 0x3f, 0x5c, 0x38, 0xe4, 0x97, 0x89, 0x25, 0x1a, 0xd4, 0xd5, 0x17, 0x3d, + 0x17, 0xb5, 0xe8, 0x75, 0x53, 0x14, 0x91, 0x39, 0x18, 0xb8, 0xe5, 0xd2, 0x86, 0xa3, 0x9a, 0x6e, + 0xee, 0x30, 0x80, 0xc9, 0xe1, 0xec, 0xc2, 0x75, 0x3a, 0x0e, 0x9e, 0x1d, 0xdb, 0x88, 0x7e, 0xda, + 0x75, 0xb3, 0xa8, 0xf5, 0xef, 0xf3, 0x7a, 0x92, 0x5b, 0xad, 0xa6, 0x1e, 0x5d, 0xfd, 0xef, 0xe5, + 0x60, 0xb6, 0x3b, 0x89, 0x6a, 0x76, 0x9a, 0xeb, 0x61, 0x76, 0xfa, 0x62, 0xf2, 0x05, 0x0a, 0xd1, + 0xc4, 0x0b, 0x54, 0xfc, 0xee, 0xb4, 0x84, 0x56, 0xbf, 0xf5, 0x28, 0x07, 0xf9, 0x85, 0x1e, 0x6d, + 0x46, 0x44, 0x3e, 0xcc, 0x21, 0xd2, 0x98, 0x82, 0xd6, 0xf8, 0xcd, 0x22, 0x9c, 0xed, 0x4a, 0x41, + 0x56, 0x94, 0x38, 0xfc, 0xe3, 0x51, 0x04, 0xf0, 0xae, 0xf8, 0x57, 0xf1, 0x5f, 0x34, 0xec, 0x4a, + 0xfa, 0xb5, 0xac, 0x47, 0xf1, 0xd7, 0xf3, 0xc8, 0xeb, 0x95, 0x63, 0x79, 0x71, 0x74, 0x64, 0x06, + 0xe9, 0x50, 0xec, 0xe8, 0x01, 0x45, 0x43, 0xdb, 0x6d, 0x04, 0xea, 0xb2, 0x73, 0x38, 0xc8, 0x94, + 0x65, 0xb1, 0x2d, 0x70, 0x31, 0xdb, 0x16, 0xd8, 0xf8, 0x7f, 0x72, 0x30, 0x1c, 0x35, 0x9b, 0xcc, + 0xc2, 0xe9, 0x4d, 0xb3, 0xb2, 0xb8, 0x6c, 0x6d, 0xbe, 0xbf, 0xb1, 0x6c, 0xdd, 0x5f, 0xab, 0x6d, + 0x2c, 0x2f, 0x56, 0x6f, 0x55, 0x97, 0x97, 0xca, 0xcf, 0x90, 0x49, 0x18, 0xbb, 0xbf, 0x76, 0x77, + 0x6d, 0x7d, 0x6b, 0xcd, 0x5a, 0x36, 0xcd, 0x75, 0xb3, 0x9c, 0x23, 0x63, 0x30, 0x6c, 0x2e, 0x54, + 0x16, 0xad, 0xb5, 0xf5, 0xa5, 0xe5, 0x72, 0x9e, 0x94, 0x61, 0x74, 0x71, 0x7d, 0x6d, 0x6d, 0x79, + 0x71, 0xb3, 0xfa, 0xa0, 0xba, 0xf9, 0x7e, 0xb9, 0x40, 0x08, 0x8c, 0x23, 0xc2, 0x86, 0x59, 0x5d, + 0x5b, 0xac, 0x6e, 0x54, 0x56, 0xcb, 0x45, 0x06, 0x63, 0xf8, 0x0a, 0x6c, 0x20, 0x62, 0x74, 0xf7, + 0xfe, 0xc2, 0x72, 0x79, 0x90, 0xa1, 0xb0, 0xbf, 0x14, 0x94, 0x21, 0x56, 0x3d, 0xa2, 0x2c, 0x55, + 0x36, 0x2b, 0x0b, 0x95, 0xda, 0x72, 0xb9, 0x44, 0xce, 0xc0, 0x94, 0x06, 0xb2, 0x56, 0xd7, 0x6f, + 0x57, 0xd7, 0xca, 0xc3, 0x64, 0x1a, 0xca, 0x11, 0x6c, 0x69, 0xc1, 0xba, 0x5f, 0x5b, 0x36, 0xcb, + 0x90, 0x84, 0xae, 0x55, 0xee, 0x2d, 0x97, 0x47, 0x8c, 0xb7, 0xb9, 0xc7, 0x11, 0xef, 0x6a, 0x72, + 0x1a, 0x48, 0x6d, 0xb3, 0xb2, 0x79, 0xbf, 0x96, 0xf8, 0xf8, 0x11, 0x18, 0xaa, 0xdd, 0x5f, 0x5c, + 0x5c, 0xae, 0xd5, 0xca, 0x39, 0x02, 0x30, 0x78, 0xab, 0x52, 0x5d, 0x5d, 0x5e, 0x2a, 0xe7, 0x8d, + 0x9f, 0xce, 0xc1, 0xa4, 0x94, 0x00, 0xe5, 0x73, 0xc2, 0xa7, 0x5c, 0x8b, 0xef, 0x68, 0x17, 0x5b, + 0xe9, 0x10, 0x92, 0xa8, 0xa4, 0xc7, 0x32, 0xf4, 0xe1, 0x54, 0x26, 0x32, 0x79, 0x1f, 0xca, 0xb2, + 0x01, 0xf7, 0xec, 0xb0, 0xbe, 0x17, 0x6f, 0x63, 0xcf, 0x25, 0x2a, 0x49, 0xa0, 0x71, 0x05, 0x63, + 0x9c, 0xe6, 0x2f, 0xc5, 0xc6, 0xf8, 0x5e, 0x0e, 0xce, 0x74, 0x21, 0x26, 0x8b, 0x30, 0x18, 0x85, + 0x25, 0xef, 0x61, 0xb0, 0x34, 0xfd, 0xfd, 0xa3, 0x39, 0x81, 0x88, 0xd9, 0xce, 0xf0, 0x2f, 0x73, + 0x30, 0x8a, 0x33, 0x8e, 0xc1, 0xbe, 0x79, 0x9f, 0x9c, 0x4d, 0x74, 0xa7, 0xa8, 0xa9, 0xb2, 0x55, + 0x5b, 0x18, 0x11, 0x1d, 0x52, 0xb0, 0x0f, 0x02, 0x8c, 0xf6, 0x6d, 0x7c, 0x37, 0xc7, 0x24, 0xb6, + 0x24, 0x22, 0x13, 0x64, 0x2b, 0x41, 0xd0, 0x69, 0x52, 0xd3, 0x6b, 0xd0, 0x8a, 0xb9, 0x26, 0xce, + 0x02, 0x14, 0x41, 0x6d, 0x2c, 0xc0, 0xbb, 0x82, 0x65, 0xfb, 0x2d, 0xed, 0x71, 0x52, 0xa5, 0x21, + 0x6f, 0x00, 0x44, 0x59, 0xe7, 0x65, 0xd0, 0x00, 0x1e, 0x34, 0x43, 0x40, 0x75, 0x21, 0x5a, 0x41, + 0x36, 0xfe, 0x4a, 0x0e, 0x46, 0xc5, 0x4d, 0xa8, 0xd2, 0xa0, 0x7e, 0xf8, 0xe9, 0xe6, 0xcc, 0x1b, + 0xda, 0x9c, 0x89, 0xec, 0xf3, 0x15, 0xfe, 0xac, 0x38, 0x73, 0xba, 0xfc, 0x67, 0x39, 0x28, 0x27, + 0x11, 0xc9, 0x3b, 0x50, 0xaa, 0xd1, 0x87, 0xd4, 0x77, 0xc3, 0x43, 0xb1, 0xfb, 0xc9, 0x04, 0x2e, + 0x1c, 0x47, 0x94, 0x71, 0x85, 0x6b, 0x20, 0x7e, 0x99, 0x11, 0x4d, 0xbf, 0x9b, 0xb8, 0xa2, 0xcb, + 0x28, 0x3c, 0x29, 0x5d, 0x86, 0xf1, 0x3f, 0xe6, 0xe1, 0xcc, 0x6d, 0x1a, 0xaa, 0xdf, 0x14, 0xbd, + 0x26, 0x7f, 0xa1, 0xbf, 0xef, 0x52, 0xbe, 0x64, 0x06, 0x86, 0xb0, 0x48, 0x8e, 0xaf, 0x29, 0x7f, + 0x92, 0x85, 0x68, 0x5e, 0x17, 0xb4, 0x0c, 0x11, 0x5d, 0xea, 0xbe, 0xaa, 0xc4, 0x8c, 0x8f, 0xa6, + 0xf5, 0x25, 0x18, 0xc7, 0xa0, 0xa8, 0x1d, 0xb6, 0x1c, 0xa8, 0x23, 0x74, 0x3a, 0x25, 0x33, 0x01, + 0x25, 0x2f, 0x43, 0x99, 0x41, 0x2a, 0xf5, 0xfd, 0x96, 0x77, 0xd0, 0xa0, 0xce, 0x2e, 0xe5, 0x69, + 0xc2, 0x4b, 0x66, 0x0a, 0x2e, 0x79, 0xde, 0x6f, 0xf1, 0xfb, 0x18, 0x75, 0x50, 0xf1, 0x22, 0x78, + 0xc6, 0xd0, 0xd9, 0x37, 0x60, 0xe4, 0x13, 0xe6, 0x7f, 0x30, 0xfe, 0x87, 0x1c, 0x4c, 0xe3, 0xc7, + 0x29, 0x15, 0xa3, 0x46, 0xfe, 0x0b, 0x71, 0x6f, 0x29, 0x21, 0xd1, 0x6d, 0x06, 0xd2, 0x97, 0x42, + 0xd4, 0x8b, 0xb1, 0xa2, 0x27, 0xdf, 0x87, 0xa2, 0xa7, 0x76, 0x92, 0xac, 0xa2, 0x7d, 0xea, 0xa9, + 0x78, 0x2e, 0xf8, 0x78, 0xc8, 0x8d, 0x1f, 0xcd, 0xc3, 0x90, 0x49, 0x31, 0xdd, 0x22, 0xb9, 0x04, + 0x43, 0x6b, 0x5e, 0x48, 0x83, 0x7b, 0x5a, 0x6e, 0xcd, 0x16, 0x03, 0x59, 0x4d, 0xc7, 0x94, 0x85, + 0x6c, 0xc2, 0x6f, 0xf8, 0x9e, 0xd3, 0xa9, 0x87, 0xea, 0x84, 0x6f, 0x73, 0x90, 0x29, 0xcb, 0xc8, + 0xab, 0x30, 0x2c, 0x38, 0x47, 0x6f, 0x78, 0x68, 0x7b, 0xea, 0xd3, 0x28, 0x5d, 0x67, 0x8c, 0x80, + 0x82, 0x2a, 0x97, 0x1a, 0x8a, 0x8a, 0xa0, 0x9a, 0x12, 0x04, 0xa4, 0xfc, 0x3d, 0xd0, 0x43, 0xfe, + 0xfe, 0x02, 0x0c, 0x56, 0x82, 0x80, 0x86, 0xd2, 0x09, 0x7a, 0x34, 0x8a, 0x48, 0x13, 0xd0, 0x90, + 0x33, 0xb6, 0xb1, 0xdc, 0x14, 0x78, 0xc6, 0x9f, 0xe6, 0x61, 0x00, 0xff, 0xc4, 0x77, 0x4b, 0xbf, + 0xbe, 0xa7, 0xbd, 0x5b, 0xfa, 0xf5, 0x3d, 0x13, 0xa1, 0xe4, 0x3a, 0xaa, 0x1f, 0x64, 0xf4, 0x7e, + 0xf1, 0xf5, 0xa8, 0x57, 0x77, 0x62, 0xb0, 0xa9, 0xe2, 0x44, 0x0f, 0xba, 0x85, 0xcc, 0xd0, 0x07, + 0xa7, 0x21, 0xbf, 0x5e, 0x13, 0x5f, 0x8c, 0x21, 0x5a, 0xbc, 0xc0, 0xcc, 0xaf, 0xd7, 0xb0, 0x37, + 0x56, 0x2a, 0xf3, 0xaf, 0xdf, 0x54, 0xd3, 0xc0, 0x06, 0x7b, 0xf6, 0xfc, 0xeb, 0x37, 0x4d, 0x51, + 0xc2, 0xfa, 0x17, 0xdb, 0x8c, 0x0f, 0x9b, 0xdc, 0x69, 0x17, 0xfb, 0x17, 0xbf, 0x0d, 0x1f, 0x31, + 0xcd, 0x18, 0x81, 0xcc, 0xc3, 0x88, 0x70, 0x15, 0x47, 0x7c, 0xc5, 0x95, 0x5b, 0xb8, 0x92, 0x73, + 0x0a, 0x15, 0x89, 0x3f, 0x71, 0x89, 0x01, 0x92, 0x39, 0xc6, 0xc4, 0x13, 0x97, 0x1c, 0xc2, 0xc0, + 0x54, 0x50, 0x62, 0x9f, 0xe3, 0xd8, 0x19, 0x57, 0xf5, 0x39, 0xc6, 0x20, 0xb7, 0x11, 0x82, 0xf1, + 0xcb, 0x79, 0x28, 0x6d, 0x34, 0x3a, 0xbb, 0x6e, 0xeb, 0xc1, 0x75, 0x42, 0x00, 0xef, 0x66, 0x32, + 0x0a, 0x32, 0xfb, 0x9b, 0x9c, 0x85, 0x92, 0xbc, 0x8e, 0xc9, 0x0d, 0x29, 0x10, 0x57, 0xb1, 0x19, + 0x90, 0xe3, 0x2e, 0x72, 0xc6, 0xcb, 0x9f, 0xe4, 0x3a, 0x44, 0x97, 0xaa, 0x6e, 0xb7, 0xaf, 0x22, + 0x5b, 0x2c, 0x66, 0x84, 0x46, 0x5e, 0x03, 0x3c, 0x24, 0xc4, 0x8d, 0x40, 0x6a, 0xa9, 0x79, 0xd3, + 0x84, 0xf0, 0xc1, 0x49, 0x10, 0x8d, 0xdc, 0x00, 0x31, 0x31, 0x45, 0x66, 0xca, 0x53, 0x3a, 0x01, + 0xcf, 0x0e, 0x24, 0x49, 0x04, 0x2a, 0x79, 0x0b, 0x46, 0xe2, 0x9c, 0xf0, 0x71, 0xc2, 0x49, 0x95, + 0x72, 0x31, 0x2e, 0x7f, 0x70, 0xdd, 0x54, 0xd1, 0x8d, 0xff, 0x64, 0x10, 0x46, 0xd5, 0xf6, 0x10, + 0x13, 0xa6, 0x82, 0x06, 0xbb, 0x90, 0x0b, 0xdb, 0xa2, 0x36, 0x16, 0x8a, 0xe3, 0xf4, 0x82, 0xde, + 0x20, 0x86, 0xc7, 0x0d, 0x8d, 0xa4, 0x8f, 0xfb, 0xca, 0x33, 0xe6, 0x64, 0x10, 0x83, 0x39, 0x1e, + 0xa9, 0x40, 0xc9, 0x6b, 0x07, 0xbb, 0xb4, 0xe5, 0xca, 0x47, 0x94, 0x8b, 0x1a, 0xa3, 0x75, 0x51, + 0x98, 0xe2, 0x15, 0x91, 0x91, 0xd7, 0x61, 0xd0, 0x6b, 0xd3, 0x96, 0xed, 0x8a, 0x33, 0xee, 0xd9, + 0x04, 0x03, 0xda, 0xaa, 0x54, 0x15, 0x42, 0x81, 0x4c, 0xae, 0x41, 0xd1, 0xdb, 0x8f, 0xc6, 0xeb, + 0xac, 0x4e, 0xb4, 0x1f, 0xda, 0x0a, 0x09, 0x22, 0x32, 0x82, 0x8f, 0xec, 0xe6, 0x8e, 0x18, 0x31, + 0x9d, 0xe0, 0x8e, 0xdd, 0xdc, 0x51, 0x09, 0x18, 0x22, 0x79, 0x17, 0xa0, 0x6d, 0xef, 0x52, 0xdf, + 0x72, 0x3a, 0xe1, 0xa1, 0x18, 0xb7, 0xe7, 0x34, 0xb2, 0x0d, 0x56, 0xbc, 0xd4, 0x09, 0x0f, 0x15, + 0xda, 0xe1, 0xb6, 0x04, 0x92, 0x0a, 0x40, 0xd3, 0x0e, 0x43, 0xea, 0x37, 0x3d, 0x61, 0xdc, 0x35, + 0x12, 0x25, 0x74, 0xe4, 0x0c, 0xee, 0x45, 0xc5, 0x0a, 0x07, 0x85, 0x08, 0x1b, 0xed, 0xfa, 0xb6, + 0xc8, 0x0f, 0x9a, 0x68, 0xb4, 0xeb, 0x6b, 0x5f, 0xc9, 0x10, 0xc9, 0x97, 0x61, 0xc8, 0x71, 0x83, + 0xba, 0xe7, 0x3b, 0x22, 0xf8, 0xc1, 0x39, 0x8d, 0x66, 0x89, 0x97, 0x29, 0x64, 0x12, 0x9d, 0xb5, + 0x56, 0xc4, 0x57, 0x5b, 0xf3, 0x0e, 0x50, 0x77, 0x9f, 0x6c, 0x6d, 0x2d, 0x2a, 0x56, 0x5b, 0x1b, + 0x13, 0xb1, 0xa1, 0xdc, 0x75, 0xc3, 0x86, 0xbd, 0x2d, 0xde, 0x91, 0xf5, 0xa1, 0xbc, 0x8d, 0x45, + 0xea, 0x50, 0x72, 0x64, 0xf2, 0x06, 0x94, 0x68, 0x2b, 0xf4, 0x6d, 0xcb, 0x75, 0x84, 0x53, 0x9c, + 0xde, 0x68, 0x76, 0x00, 0xdb, 0xd5, 0x25, 0xb5, 0xd1, 0x88, 0x5f, 0x75, 0x58, 0xff, 0x04, 0x75, + 0xb7, 0x29, 0x7c, 0xd9, 0xf4, 0xfe, 0xa9, 0x2d, 0x56, 0xef, 0xa9, 0xfd, 0xc3, 0x10, 0xc9, 0x73, + 0x00, 0xbb, 0xb4, 0x45, 0xb9, 0x63, 0x29, 0x7f, 0x65, 0x30, 0x15, 0xc8, 0x57, 0x8a, 0xff, 0xf3, + 0x2f, 0xce, 0xe5, 0x16, 0x00, 0x4a, 0x32, 0xfa, 0x83, 0xb1, 0x0a, 0x67, 0xbb, 0x2e, 0x0a, 0x72, + 0x05, 0xca, 0x3b, 0xb6, 0xd0, 0x73, 0xd5, 0xf7, 0xec, 0x56, 0x8b, 0x36, 0xc4, 0x76, 0x34, 0x21, + 0xe1, 0x8b, 0x1c, 0xcc, 0x39, 0x1b, 0xef, 0xc2, 0x74, 0x56, 0x6f, 0x90, 0xe7, 0x61, 0x54, 0x0d, + 0x74, 0x21, 0x98, 0x8c, 0xd8, 0x6d, 0x57, 0x86, 0xba, 0x10, 0x0c, 0x7e, 0x23, 0x07, 0xe7, 0x7a, + 0xad, 0x2d, 0x32, 0x0b, 0xa5, 0xb6, 0xef, 0x7a, 0x28, 0xc3, 0xf1, 0x1d, 0x30, 0xfa, 0x4d, 0xce, + 0x03, 0x70, 0x61, 0x23, 0xb4, 0x77, 0x85, 0xb1, 0xbb, 0x39, 0x8c, 0x90, 0x4d, 0x7b, 0x37, 0x20, + 0xaf, 0xc0, 0xa4, 0x43, 0x77, 0xec, 0x4e, 0x23, 0xb4, 0x82, 0xfa, 0x1e, 0x75, 0xd0, 0xbf, 0x04, + 0x8d, 0x98, 0xcc, 0xb2, 0x28, 0xa8, 0x49, 0x78, 0xaa, 0xc5, 0x03, 0x5d, 0x5a, 0x7c, 0xa7, 0x58, + 0xca, 0x95, 0xf3, 0x26, 0xda, 0xf2, 0x18, 0x3f, 0x94, 0x87, 0x99, 0x6e, 0x93, 0x89, 0xbc, 0x9d, + 0xd5, 0x07, 0x5c, 0x55, 0xaf, 0xc2, 0x55, 0x55, 0xbd, 0x52, 0x1b, 0x99, 0x87, 0xc8, 0x3b, 0xe4, + 0x38, 0x4f, 0x6f, 0x09, 0x63, 0x34, 0x6d, 0x3b, 0x08, 0x0e, 0xd8, 0x7a, 0x29, 0x28, 0x81, 0xec, + 0x04, 0x4c, 0xa5, 0x91, 0x30, 0xf2, 0x25, 0x80, 0x7a, 0xc3, 0x0b, 0x28, 0xbe, 0x88, 0x8b, 0x83, + 0x98, 0x9b, 0xc8, 0x46, 0x50, 0xf5, 0x09, 0x14, 0xa1, 0x8b, 0x9e, 0x43, 0xc5, 0x00, 0xda, 0x70, + 0xa6, 0xcb, 0xee, 0xc1, 0x86, 0x27, 0x4e, 0x9c, 0x29, 0xc3, 0xf0, 0x77, 0xa2, 0xf4, 0x99, 0xc9, + 0x1e, 0xcf, 0x77, 0x9b, 0x23, 0x87, 0x40, 0xd2, 0x5b, 0x04, 0xe3, 0x2e, 0x0c, 0x3d, 0x3b, 0x7e, + 0xc4, 0x9d, 0x43, 0xee, 0xfb, 0x0d, 0x32, 0x07, 0x23, 0x32, 0xcd, 0x0e, 0x13, 0x74, 0x39, 0x73, + 0x10, 0xa0, 0xbb, 0x14, 0x27, 0x0f, 0xc6, 0x5b, 0x44, 0x1f, 0x20, 0x71, 0x84, 0x0e, 0x23, 0x64, + 0xf3, 0xb0, 0x2d, 0xbf, 0xee, 0x9c, 0x9c, 0xdf, 0xfa, 0xc6, 0x2d, 0x4a, 0x7f, 0x36, 0x27, 0x87, + 0x3f, 0xbd, 0xf3, 0x1d, 0xd7, 0x3e, 0x02, 0xe8, 0xb1, 0x21, 0x1a, 0x86, 0x7f, 0xb3, 0x23, 0x5d, + 0xae, 0x3a, 0x71, 0xa4, 0x8b, 0x9f, 0xe4, 0x12, 0x4c, 0xf8, 0xdc, 0xa6, 0x2f, 0xf4, 0x44, 0x7f, + 0xe2, 0x48, 0x99, 0x63, 0x1c, 0xbc, 0xe9, 0x61, 0x9f, 0x8a, 0x76, 0xdd, 0x89, 0x3a, 0x4c, 0x39, + 0x08, 0xc8, 0x55, 0x18, 0x66, 0x07, 0x01, 0xc6, 0x91, 0x48, 0x98, 0x8a, 0x23, 0x1e, 0x1e, 0xab, + 0x66, 0xe9, 0x23, 0xf1, 0xb7, 0xe0, 0xf5, 0x0f, 0x73, 0x92, 0x99, 0x7a, 0x0c, 0x91, 0x33, 0x30, + 0xe4, 0xf9, 0xbb, 0xca, 0xa7, 0x0d, 0x7a, 0xfe, 0x2e, 0xfb, 0xae, 0xcb, 0x50, 0xe6, 0x9e, 0x0b, + 0xdc, 0x25, 0x3c, 0x38, 0x6c, 0xf1, 0x7b, 0x6a, 0xc9, 0x1c, 0xe7, 0x70, 0xcc, 0x25, 0x7a, 0xd8, + 0xaa, 0x33, 0xcc, 0x20, 0xf0, 0x2c, 0x35, 0x78, 0x8c, 0xf8, 0xec, 0xf1, 0x20, 0xf0, 0xe2, 0x28, + 0x32, 0x0e, 0x59, 0x80, 0x31, 0xc6, 0x27, 0x0a, 0x61, 0x23, 0x4e, 0xc9, 0xf3, 0xe9, 0x53, 0xf2, + 0xb0, 0x55, 0x97, 0x4d, 0x34, 0x47, 0x03, 0xe5, 0x97, 0xf8, 0x9a, 0x9f, 0xcb, 0xc3, 0xe9, 0x6c, + 0x74, 0x1c, 0x2f, 0x56, 0x09, 0x3a, 0xf0, 0x70, 0x9d, 0xa5, 0x39, 0xcc, 0x20, 0x3c, 0x46, 0x41, + 0x56, 0x6b, 0xf3, 0x99, 0xad, 0x7d, 0x19, 0x26, 0x91, 0x91, 0x90, 0x4b, 0x1a, 0x6e, 0x10, 0x0a, + 0xd7, 0x7b, 0x73, 0x82, 0x15, 0xf0, 0x0d, 0x6e, 0x95, 0x81, 0xc9, 0x8b, 0x30, 0x2e, 0xb7, 0x28, + 0xef, 0xa0, 0xc5, 0x2a, 0xe6, 0xfb, 0xd3, 0x98, 0x80, 0xae, 0x23, 0x90, 0x9c, 0x82, 0x41, 0xbb, + 0xdd, 0x66, 0x55, 0xf2, 0x6d, 0x69, 0xc0, 0x6e, 0xb7, 0xab, 0x0e, 0xb9, 0x08, 0x63, 0xe8, 0xae, + 0x64, 0xed, 0xa0, 0xa1, 0x88, 0x30, 0x10, 0x33, 0x47, 0x11, 0xc8, 0x8d, 0x47, 0x02, 0xb6, 0x10, + 0x18, 0xad, 0x44, 0x19, 0x42, 0x14, 0xb0, 0xdb, 0x12, 0x41, 0xf4, 0xcc, 0x97, 0x61, 0x42, 0x9c, + 0xa6, 0x62, 0x87, 0x47, 0x4a, 0x31, 0xff, 0x98, 0x98, 0x2b, 0xc2, 0x8f, 0x83, 0x00, 0x55, 0x1d, + 0x49, 0xf9, 0x07, 0x39, 0x38, 0x95, 0x79, 0x1c, 0x93, 0x6f, 0x02, 0xf7, 0xde, 0x08, 0x3d, 0xcb, + 0xa7, 0x75, 0xb7, 0xed, 0xa2, 0x7f, 0x3b, 0x57, 0x42, 0xcd, 0xf7, 0x3a, 0xc8, 0xd1, 0x13, 0x64, + 0xd3, 0x33, 0x23, 0x22, 0x7e, 0x8f, 0x2e, 0xfb, 0x09, 0xf0, 0xec, 0x07, 0x70, 0x2a, 0x13, 0x35, + 0xe3, 0x7e, 0xfb, 0xaa, 0x9e, 0xa6, 0x4d, 0xbe, 0x2a, 0x24, 0x3e, 0x5a, 0xb9, 0xf7, 0x8a, 0xcf, + 0xfb, 0xad, 0xe8, 0xf3, 0x12, 0x07, 0x37, 0x59, 0x4e, 0x4e, 0xcb, 0x2c, 0xd9, 0x53, 0x12, 0x75, + 0x9d, 0x99, 0xe4, 0x03, 0x38, 0x25, 0xa6, 0xca, 0xae, 0x6f, 0xb7, 0xf7, 0x62, 0x76, 0xbc, 0xa1, + 0x2f, 0x65, 0xb1, 0xe3, 0x73, 0xe8, 0x36, 0xc3, 0x8f, 0xb8, 0x4e, 0xd9, 0x69, 0xa0, 0xf8, 0x06, + 0x5f, 0x1e, 0xfa, 0x19, 0xad, 0xc9, 0x98, 0x83, 0xb9, 0xac, 0x39, 0xd8, 0xf7, 0x02, 0x10, 0x75, + 0xfe, 0x70, 0x0e, 0x2e, 0x1c, 0xd7, 0x66, 0xb2, 0x05, 0xa7, 0xf1, 0xdd, 0x3b, 0xf0, 0xa2, 0xcf, + 0xb6, 0xea, 0x76, 0x7d, 0x8f, 0x8a, 0x59, 0x62, 0x64, 0x7e, 0x7c, 0xbb, 0x5d, 0xab, 0xad, 0x2b, + 0xdf, 0xdd, 0x6e, 0xd7, 0x02, 0x4f, 0xfe, 0x5e, 0x64, 0xe4, 0xa2, 0x0d, 0x0e, 0x3c, 0xdb, 0x83, + 0x52, 0x59, 0x56, 0x39, 0x75, 0x59, 0x5d, 0x86, 0xf2, 0x0e, 0x75, 0x98, 0x08, 0x45, 0x1d, 0x6c, + 0xda, 0xc3, 0x79, 0x9e, 0xeb, 0xd0, 0x1c, 0x8f, 0xe0, 0xb5, 0xc0, 0x7b, 0x30, 0x2f, 0x6a, 0x69, + 0xca, 0x1d, 0x52, 0x15, 0xd1, 0xc8, 0x55, 0x98, 0x4a, 0xf8, 0xea, 0xc7, 0xce, 0x9f, 0xe6, 0x24, + 0x2b, 0xd2, 0x23, 0xbb, 0x3c, 0x0f, 0xa3, 0x72, 0x18, 0xfc, 0xc8, 0x85, 0xc4, 0x1c, 0x11, 0x30, + 0x36, 0xcb, 0x45, 0x75, 0x7f, 0x27, 0x2f, 0x45, 0xa6, 0x05, 0xcf, 0x0b, 0x83, 0xd0, 0xb7, 0xdb, + 0xda, 0xbd, 0x89, 0x34, 0xe1, 0xac, 0x67, 0x77, 0xc2, 0xbd, 0x79, 0x8b, 0xfd, 0xeb, 0xf9, 0xd2, + 0x9f, 0xb3, 0x2e, 0x2d, 0xe1, 0x46, 0xe6, 0xaf, 0xe9, 0x5b, 0x67, 0x85, 0x61, 0x57, 0x54, 0x64, + 0x76, 0xc2, 0x2b, 0x5c, 0x57, 0x9e, 0x31, 0xcf, 0x70, 0x9e, 0x29, 0x2c, 0xb2, 0x02, 0xa3, 0xdb, + 0xd4, 0xf6, 0xa9, 0x6f, 0xc5, 0x49, 0xd5, 0x93, 0x17, 0xa7, 0x05, 0x44, 0x40, 0xfb, 0x4c, 0x9d, + 0xeb, 0xc8, 0x76, 0x5c, 0x42, 0xde, 0x81, 0x61, 0xd7, 0x11, 0xa1, 0xe8, 0xc4, 0xf5, 0x49, 0x17, + 0xd9, 0xab, 0x0e, 0x8f, 0x4c, 0x17, 0xf3, 0x60, 0x77, 0x2f, 0x57, 0x40, 0x17, 0xc6, 0xb4, 0x1b, + 0xa6, 0xb1, 0x20, 0x4f, 0xe7, 0x34, 0x59, 0x2a, 0x25, 0xfc, 0x69, 0x18, 0x0c, 0x94, 0xd8, 0x78, + 0xa6, 0xf8, 0x65, 0xfc, 0x05, 0xb8, 0xdc, 0x6f, 0x1f, 0x91, 0xd7, 0x80, 0x74, 0xe9, 0xf0, 0x61, + 0x73, 0xd2, 0x4e, 0xf5, 0xdb, 0xf3, 0xa0, 0x06, 0xf7, 0x72, 0xe5, 0x80, 0x4b, 0xd8, 0x7d, 0xdf, + 0x35, 0xfe, 0x8b, 0x3c, 0x8c, 0xeb, 0x77, 0x6a, 0xf2, 0x0a, 0x14, 0x23, 0xb6, 0xe3, 0x91, 0xee, + 0x57, 0x45, 0x62, 0xcc, 0x4d, 0x44, 0x62, 0x07, 0x04, 0xbe, 0xff, 0x58, 0x4d, 0x55, 0x3d, 0x6b, + 0x8e, 0x22, 0x50, 0xaa, 0x65, 0xef, 0x00, 0x4f, 0xad, 0x8b, 0x7b, 0x59, 0xd8, 0x5f, 0x22, 0xf9, + 0x12, 0xbb, 0xd9, 0xa3, 0x5e, 0x6d, 0x94, 0xd1, 0xb2, 0xfd, 0x04, 0x73, 0xc7, 0xc7, 0x57, 0xa6, + 0x62, 0xf7, 0x2b, 0x93, 0xf8, 0x94, 0x2e, 0x57, 0xa6, 0x81, 0x1e, 0x57, 0xa6, 0x98, 0x32, 0xba, + 0x32, 0xbd, 0x20, 0x5a, 0xef, 0xdb, 0x07, 0x16, 0x7e, 0x16, 0x37, 0x3c, 0xe3, 0xed, 0x32, 0xed, + 0x03, 0x7c, 0xf8, 0x5a, 0x18, 0x06, 0xf9, 0x5a, 0x66, 0xfc, 0xf5, 0x5c, 0xe2, 0xce, 0x22, 0x7b, + 0xf6, 0x45, 0x18, 0x77, 0x9b, 0x4c, 0x98, 0xa2, 0x8e, 0x22, 0x04, 0x8c, 0x99, 0x63, 0x12, 0xca, + 0x05, 0x81, 0x97, 0x60, 0x22, 0x42, 0xe3, 0xce, 0xc2, 0xdc, 0xa0, 0xdd, 0x8c, 0xa8, 0x85, 0xb3, + 0xf0, 0x2b, 0x30, 0x19, 0x21, 0x0a, 0xb9, 0x93, 0xcb, 0x01, 0x63, 0x66, 0x59, 0x16, 0x88, 0x9c, + 0x8f, 0x81, 0xb1, 0x9b, 0x3c, 0x64, 0x3e, 0xa3, 0x56, 0x19, 0xff, 0x24, 0x0f, 0x53, 0x19, 0xca, + 0x16, 0xf2, 0x01, 0x4c, 0xc9, 0x4d, 0x83, 0x1f, 0x46, 0x7c, 0x31, 0xf3, 0xed, 0xe2, 0x4a, 0xd6, + 0x76, 0x81, 0x68, 0x19, 0x4b, 0x7a, 0x52, 0x6c, 0x14, 0x71, 0xf9, 0x9f, 0x9f, 0x2d, 0x82, 0xbc, + 0x0f, 0xa7, 0x45, 0xaa, 0x66, 0x65, 0xa7, 0xb0, 0x7c, 0xba, 0x23, 0x26, 0xec, 0xf3, 0xa9, 0x05, + 0xe5, 0xd6, 0x95, 0xe6, 0x98, 0x74, 0x67, 0xe5, 0x19, 0x73, 0x3a, 0xc8, 0x80, 0x27, 0x77, 0x9f, + 0x7f, 0x37, 0x07, 0xc6, 0xf1, 0xfd, 0x85, 0xb7, 0xa0, 0x64, 0x87, 0xb3, 0x5b, 0x90, 0xd2, 0x7b, + 0x17, 0x61, 0xcc, 0xa7, 0x3b, 0x3e, 0x0d, 0xf6, 0x94, 0xee, 0x1b, 0x36, 0x47, 0x05, 0x50, 0x76, + 0x8c, 0x0c, 0x53, 0x70, 0xa2, 0xe5, 0x2b, 0x89, 0x8c, 0x5b, 0xd1, 0xa1, 0x92, 0x39, 0x0e, 0x64, + 0x1a, 0x06, 0xd4, 0x06, 0xf2, 0x1f, 0x77, 0x8a, 0xa5, 0x7c, 0xb9, 0x60, 0x8a, 0x60, 0x0a, 0x3b, + 0x6e, 0x83, 0x1a, 0xbf, 0x9e, 0x83, 0xd9, 0xee, 0x9d, 0x47, 0x3e, 0x50, 0x9e, 0x07, 0x0b, 0x3c, + 0x2c, 0xdd, 0x31, 0xfd, 0xad, 0xbe, 0xa4, 0x08, 0xff, 0xfe, 0x64, 0x96, 0x62, 0xc1, 0xf2, 0xd3, + 0xbc, 0x71, 0xbc, 0x21, 0xb5, 0x8b, 0x4c, 0x2e, 0x7f, 0x70, 0x9d, 0x5c, 0x81, 0x21, 0xae, 0x50, + 0x94, 0x0d, 0x9d, 0xd0, 0x1a, 0xfa, 0xe0, 0xba, 0x29, 0xcb, 0x8d, 0xef, 0xe5, 0x22, 0x95, 0x4a, + 0xb2, 0xf9, 0x0f, 0xae, 0x93, 0x2f, 0xf5, 0xf7, 0xd0, 0x57, 0x92, 0x0f, 0x7d, 0xd1, 0x23, 0xdf, + 0x97, 0xb5, 0x47, 0xbe, 0x17, 0x7a, 0xf7, 0x93, 0xb8, 0xbc, 0x25, 0xf3, 0x48, 0xfe, 0xb3, 0x1c, + 0x9c, 0xef, 0x49, 0x41, 0xce, 0x41, 0xa9, 0xb2, 0x51, 0xdd, 0x8c, 0x47, 0x96, 0xad, 0x16, 0x09, + 0x21, 0xb7, 0x61, 0x78, 0xc1, 0x0e, 0xdc, 0x3a, 0x9b, 0xc0, 0x99, 0xe2, 0x68, 0x8a, 0x6d, 0x84, + 0xbe, 0xf2, 0x8c, 0x19, 0xd3, 0x12, 0x0b, 0x26, 0x71, 0x15, 0xa4, 0xf2, 0xb4, 0x25, 0x45, 0x91, + 0x14, 0xc3, 0x14, 0x19, 0xdb, 0x61, 0x52, 0xc0, 0xe4, 0xe2, 0x7b, 0x28, 0x65, 0xcf, 0xee, 0x0d, + 0x3c, 0x41, 0x48, 0x8e, 0xcb, 0x50, 0xda, 0x90, 0x6a, 0x15, 0x25, 0x4d, 0xab, 0x54, 0xa1, 0x98, + 0x51, 0xa9, 0xf1, 0xd7, 0x72, 0x52, 0x5e, 0x38, 0xfe, 0x43, 0x94, 0x00, 0xbe, 0x4e, 0xef, 0x00, + 0xbe, 0xce, 0x27, 0x0c, 0xe0, 0x6b, 0xfc, 0xb2, 0x08, 0x98, 0x55, 0x75, 0x36, 0x12, 0x39, 0x25, + 0x3e, 0xad, 0xd9, 0xc2, 0xb2, 0x36, 0x3b, 0x2f, 0x2a, 0x41, 0xc5, 0xd3, 0x75, 0x75, 0xb7, 0x5e, + 0x50, 0xa6, 0xea, 0x3f, 0xc9, 0xc3, 0xb9, 0x5e, 0xe4, 0x99, 0xe9, 0x2f, 0x72, 0x27, 0x4b, 0x7f, + 0x71, 0x05, 0x4a, 0x1c, 0xa6, 0xe7, 0x14, 0x14, 0xa4, 0xac, 0xc3, 0x65, 0x31, 0xb9, 0x08, 0x83, + 0x95, 0xc5, 0x5a, 0x1c, 0xf5, 0x18, 0xdf, 0xd9, 0xec, 0x7a, 0x80, 0x2f, 0x38, 0xa2, 0x88, 0x7c, + 0x23, 0x1d, 0xe8, 0x5b, 0x84, 0x3b, 0x7e, 0x56, 0xe9, 0x90, 0x54, 0x2c, 0x3b, 0x6c, 0x6f, 0x1c, + 0x7b, 0x4d, 0x84, 0x33, 0x32, 0xd3, 0x41, 0xc3, 0x0d, 0x18, 0xdc, 0xf0, 0x69, 0x40, 0x43, 0xf5, + 0x0d, 0xac, 0x8d, 0x10, 0x53, 0x94, 0x88, 0x17, 0x2a, 0xfb, 0x90, 0x7b, 0x19, 0x0c, 0xaa, 0x4e, + 0x58, 0xf8, 0xa4, 0xc5, 0xc0, 0xa6, 0x82, 0x62, 0x7c, 0x27, 0x07, 0xd3, 0x59, 0xcd, 0x22, 0xe7, + 0xa0, 0xd8, 0xca, 0x0c, 0x51, 0xde, 0xe2, 0xb6, 0xce, 0x23, 0x98, 0xcf, 0x6d, 0xc7, 0xf3, 0x9b, + 0x76, 0xa8, 0x3e, 0xfc, 0x29, 0x60, 0x13, 0xd8, 0x8f, 0x5b, 0xf8, 0x37, 0x99, 0x93, 0x9b, 0x6d, + 0x21, 0x15, 0xd4, 0x1c, 0xff, 0x33, 0x2a, 0x00, 0x55, 0x67, 0x63, 0xbd, 0xcd, 0x43, 0xa3, 0xdd, + 0x80, 0x22, 0x6b, 0x56, 0x62, 0x32, 0xb2, 0xe9, 0x50, 0xb9, 0xb7, 0x2a, 0x90, 0x78, 0xab, 0xd8, + 0xdd, 0xc9, 0x44, 0x64, 0x63, 0x0b, 0xc6, 0x75, 0x0c, 0xb2, 0xac, 0x07, 0xd3, 0x88, 0x53, 0xcd, + 0x2f, 0x78, 0x1e, 0x37, 0x3e, 0x59, 0x38, 0xfb, 0xfd, 0xa3, 0x39, 0x60, 0x3f, 0x39, 0x4d, 0x56, + 0xb0, 0x0d, 0xe3, 0xa7, 0xf2, 0x30, 0x1d, 0x1b, 0xb1, 0xcb, 0x25, 0xf1, 0xd4, 0x5a, 0x54, 0x56, + 0x34, 0x8b, 0xbf, 0xb9, 0x54, 0x36, 0x67, 0xf9, 0x81, 0x3d, 0x0c, 0x8d, 0x6e, 0xc3, 0x4c, 0x37, + 0x7c, 0xf2, 0x4a, 0x2a, 0xdf, 0xaa, 0x70, 0xb6, 0x8c, 0x12, 0xb3, 0x2a, 0xe9, 0x57, 0xff, 0x51, + 0x0e, 0x66, 0x85, 0xc9, 0xc4, 0x3d, 0xdb, 0x6d, 0x61, 0x8e, 0xf9, 0x3a, 0x7d, 0x32, 0x16, 0xc1, + 0xb7, 0xb5, 0x6d, 0xe9, 0x45, 0xdd, 0x32, 0x26, 0x55, 0x5b, 0xf7, 0xaf, 0x25, 0x57, 0xd0, 0xad, + 0xb6, 0xce, 0x27, 0x6f, 0x91, 0x7b, 0x60, 0xb4, 0x18, 0x40, 0xf5, 0xc0, 0x40, 0x0c, 0xe3, 0x2f, + 0xc1, 0x73, 0xbd, 0x2b, 0x20, 0x1f, 0xc2, 0x18, 0x86, 0xa2, 0xbd, 0xdf, 0xde, 0xf5, 0x6d, 0x87, + 0x4a, 0x45, 0x91, 0x7c, 0xdf, 0x51, 0xcb, 0xb8, 0x2b, 0xb1, 0xf0, 0x08, 0xd8, 0xc5, 0x20, 0xb7, + 0x82, 0x48, 0xb3, 0x4b, 0x52, 0xb9, 0x19, 0x3f, 0x94, 0x03, 0x92, 0xe6, 0x41, 0x6e, 0xc2, 0xe8, + 0xfd, 0xcd, 0xc5, 0x5a, 0x68, 0xfb, 0xe1, 0x8a, 0xd7, 0xf1, 0x85, 0x8b, 0x2e, 0x37, 0x10, 0x0f, + 0xeb, 0x6c, 0x67, 0xf0, 0x43, 0x6b, 0xcf, 0xeb, 0xf8, 0xa6, 0x86, 0x87, 0xf1, 0x6e, 0x29, 0xdd, + 0x77, 0xec, 0x43, 0x3d, 0xde, 0xad, 0x80, 0x69, 0xf1, 0x6e, 0x05, 0xcc, 0xf8, 0x5b, 0x39, 0x78, + 0x56, 0xbe, 0xa5, 0x38, 0x19, 0x6d, 0x59, 0x44, 0x37, 0x28, 0x5f, 0x86, 0x28, 0xe9, 0x25, 0x9b, + 0x4e, 0x4a, 0x4f, 0x41, 0x6c, 0x20, 0x0a, 0xa9, 0x9c, 0x96, 0xbc, 0x07, 0xc5, 0x5a, 0xe8, 0xb5, + 0xfb, 0x70, 0x15, 0x2c, 0x47, 0x23, 0x1a, 0x7a, 0x6d, 0x64, 0x81, 0x94, 0x06, 0x85, 0x69, 0xb5, + 0x71, 0xb2, 0xc5, 0xe4, 0x1e, 0x0c, 0x09, 0x1f, 0xee, 0x84, 0xde, 0xa9, 0xc7, 0x37, 0x2d, 0x4c, + 0x48, 0x7f, 0x44, 0x11, 0x22, 0xc3, 0x94, 0x3c, 0x8c, 0x9f, 0xcc, 0xc1, 0x08, 0x13, 0x1e, 0xf0, + 0xca, 0xf5, 0x69, 0xa7, 0xb4, 0x2e, 0x07, 0x4a, 0xb5, 0x65, 0xc4, 0xbe, 0xaf, 0xc3, 0xf5, 0x75, + 0x98, 0x48, 0x10, 0x10, 0x03, 0x3d, 0x51, 0x1a, 0x6e, 0xdd, 0xe6, 0xe1, 0x33, 0xb9, 0xce, 0x4f, + 0x83, 0x19, 0xff, 0x4a, 0x0e, 0xa6, 0xd7, 0xf7, 0x43, 0xbb, 0x8a, 0x57, 0x48, 0xb3, 0xd3, 0x90, + 0xeb, 0x9d, 0x09, 0x44, 0xf2, 0x51, 0x8e, 0x5b, 0xc9, 0x73, 0x81, 0x48, 0xc0, 0xcc, 0xa8, 0x94, + 0xac, 0x40, 0x49, 0x9c, 0x2f, 0x81, 0x88, 0x6c, 0x21, 0xdf, 0x9c, 0x75, 0xc6, 0x02, 0x89, 0x7d, + 0x09, 0x6e, 0x61, 0x82, 0xc6, 0x8c, 0xa8, 0x8d, 0x3f, 0xcd, 0xc1, 0x99, 0x2e, 0x34, 0xe4, 0x6d, + 0x18, 0x40, 0x63, 0x3f, 0x31, 0x7a, 0xe7, 0xba, 0x54, 0x11, 0xd6, 0xf7, 0x1e, 0x5c, 0xe7, 0x07, + 0x51, 0x93, 0xfd, 0x30, 0x39, 0x15, 0xf9, 0x00, 0x86, 0x2b, 0x8e, 0x23, 0xee, 0x25, 0x79, 0xed, + 0x5e, 0xd2, 0xa5, 0xc6, 0xab, 0x11, 0x3e, 0xbf, 0x97, 0x70, 0xb3, 0x13, 0xc7, 0xb1, 0x84, 0x21, + 0x63, 0xcc, 0x6f, 0xf6, 0x2d, 0x18, 0xd7, 0x91, 0x4f, 0x74, 0x2f, 0xf9, 0x5e, 0x0e, 0xca, 0x7a, + 0x1b, 0x3e, 0x1b, 0x4f, 0xca, 0xac, 0x61, 0x3e, 0x66, 0x52, 0xfd, 0x4c, 0x1e, 0x4e, 0x65, 0xf6, + 0x30, 0x79, 0x0d, 0x06, 0x2b, 0xed, 0x76, 0x75, 0x49, 0xcc, 0x2a, 0x21, 0xf0, 0xa0, 0xa6, 0x55, + 0xbb, 0xb6, 0x71, 0x24, 0x72, 0x03, 0x4a, 0x38, 0x33, 0x19, 0x41, 0x3e, 0x8e, 0x31, 0xc1, 0x9f, + 0x36, 0x12, 0x31, 0x26, 0x24, 0x22, 0xb9, 0x05, 0xe3, 0xc2, 0xa9, 0xca, 0xa4, 0xbb, 0xf4, 0x51, + 0x14, 0xec, 0x0c, 0xe3, 0xb1, 0x49, 0x17, 0x2c, 0xcb, 0xe7, 0x65, 0xaa, 0x5b, 0x91, 0x4e, 0x85, + 0xf9, 0x7f, 0x19, 0x4f, 0x95, 0x13, 0x0f, 0x74, 0xc1, 0xf3, 0xff, 0x62, 0x23, 0xba, 0xf0, 0x4a, + 0x51, 0x46, 0xc3, 0x55, 0x09, 0x02, 0x77, 0xb7, 0xd5, 0xa4, 0xad, 0xf0, 0xb3, 0x1b, 0xae, 0xb8, + 0x8e, 0xbe, 0x86, 0xeb, 0xbb, 0x45, 0xbe, 0x98, 0x93, 0x64, 0xc7, 0xa4, 0xb8, 0x5f, 0x82, 0x21, + 0xee, 0xce, 0x25, 0x57, 0xc6, 0xf9, 0xcc, 0x26, 0x70, 0x9c, 0x07, 0xd7, 0xb9, 0xf8, 0xc2, 0xad, + 0x0e, 0x03, 0xf3, 0xff, 0xa3, 0xee, 0x7a, 0x7e, 0x1b, 0x37, 0xae, 0xbf, 0x49, 0xc9, 0x5e, 0xfb, + 0xc9, 0x3f, 0xe8, 0xc9, 0xc6, 0xab, 0xaf, 0x77, 0xd7, 0xc9, 0x57, 0x4d, 0x37, 0x8d, 0xd2, 0xfc, + 0x6e, 0x9a, 0x6c, 0x8a, 0x34, 0xa5, 0x25, 0xca, 0x62, 0x2c, 0x91, 0x0c, 0x49, 0xd9, 0xd9, 0x34, + 0x2d, 0xa1, 0xd8, 0x5c, 0xaf, 0x5a, 0x2d, 0xa5, 0xe8, 0x47, 0xb6, 0x9b, 0x5b, 0x2f, 0xb9, 0x14, + 0x01, 0x8a, 0x5c, 0x5b, 0xa0, 0x28, 0x90, 0xff, 0xa2, 0xff, 0x40, 0x80, 0xa0, 0x40, 0x0e, 0xbd, + 0x15, 0x08, 0xda, 0x00, 0xbd, 0xf4, 0xde, 0x4b, 0x4e, 0xc5, 0xbc, 0x99, 0x21, 0x87, 0xa4, 0xa4, + 0xd8, 0x9b, 0x45, 0x8b, 0xde, 0xc4, 0x37, 0x6f, 0x46, 0xf3, 0xf3, 0xcd, 0xbc, 0x99, 0xf7, 0x3e, + 0x4f, 0x64, 0x25, 0x47, 0x50, 0xaa, 0xf5, 0xc3, 0x6e, 0x34, 0x1d, 0xfa, 0xe7, 0xbb, 0x60, 0x2c, + 0xf3, 0xb6, 0xac, 0x9f, 0xb0, 0x6c, 0x78, 0x31, 0x89, 0x92, 0x5c, 0x2e, 0x88, 0xf8, 0xb1, 0x21, + 0x52, 0x11, 0xef, 0x43, 0x9f, 0x5f, 0xd0, 0x3f, 0x59, 0x22, 0xe6, 0x4b, 0x5b, 0xd9, 0x71, 0x4b, + 0xa5, 0x00, 0x36, 0x5b, 0xdd, 0xf1, 0xc4, 0x1f, 0x75, 0xa3, 0x31, 0x22, 0x32, 0x9c, 0xc3, 0x4d, + 0x56, 0x44, 0xb6, 0xdb, 0xc2, 0xdb, 0xc8, 0x49, 0x9c, 0x15, 0xeb, 0x9c, 0x29, 0x8e, 0x9e, 0x97, + 0x1a, 0xbd, 0xa8, 0xdb, 0xef, 0x7d, 0x28, 0xec, 0x35, 0xd9, 0x79, 0xe9, 0xb6, 0x20, 0xba, 0x49, + 0x7a, 0xe5, 0xdd, 0xdc, 0xb8, 0xb1, 0x5a, 0x96, 0xe0, 0x12, 0x37, 0xd1, 0x67, 0x26, 0xeb, 0x8e, + 0x61, 0xd5, 0x4d, 0xeb, 0x40, 0x53, 0xc8, 0x26, 0x80, 0xe3, 0xda, 0x35, 0xc3, 0xf3, 0xe8, 0xb7, + 0x4a, 0xbf, 0xb9, 0x3d, 0x7b, 0xa3, 0xd3, 0xd2, 0x0a, 0x92, 0x49, 0x7b, 0xb1, 0xf2, 0xb9, 0x02, + 0x3b, 0xb3, 0x87, 0x92, 0xf8, 0x80, 0x4e, 0x0d, 0xfc, 0xaa, 0xf9, 0x87, 0x0b, 0xc7, 0x7d, 0x26, + 0x39, 0xeb, 0x1c, 0x31, 0x61, 0x46, 0xf7, 0xaa, 0x78, 0x39, 0x4a, 0x62, 0xb2, 0xf5, 0x4e, 0x2b, + 0x35, 0x28, 0xcf, 0x2b, 0x23, 0xdd, 0xd4, 0x2d, 0x28, 0xe9, 0x8e, 0xd3, 0x32, 0x6b, 0xba, 0x6f, + 0xda, 0x96, 0xa6, 0x90, 0x35, 0x58, 0x3e, 0x70, 0xed, 0x8e, 0xa3, 0xa9, 0x95, 0x4f, 0x14, 0xd8, + 0x30, 0xa3, 0x49, 0x78, 0xc6, 0xec, 0x5f, 0xbe, 0xed, 0xe2, 0x7b, 0x2d, 0xb5, 0xf8, 0xca, 0xb1, + 0xfb, 0x4f, 0xfc, 0x07, 0xe7, 0x5a, 0x79, 0x7f, 0x51, 0x60, 0x3b, 0x97, 0x87, 0x78, 0x70, 0x49, + 0x3f, 0xf6, 0x6c, 0xb3, 0x5e, 0xe3, 0x35, 0x13, 0xa7, 0x72, 0x4e, 0xcd, 0xff, 0x0b, 0xb3, 0xae, + 0xbd, 0x37, 0x0e, 0x06, 0xbd, 0x53, 0x29, 0x12, 0x44, 0x73, 0xc9, 0x15, 0x25, 0xe1, 0x4e, 0xf6, + 0xe1, 0x74, 0x14, 0x62, 0xb1, 0x6a, 0xea, 0x46, 0x33, 0xa6, 0xe7, 0x0b, 0x66, 0xc1, 0xef, 0x69, + 0x7a, 0xbe, 0xe8, 0xa4, 0xbc, 0xfd, 0x0d, 0x28, 0x71, 0xad, 0x05, 0x15, 0x82, 0x8f, 0x15, 0x28, + 0xcf, 0xab, 0x2b, 0x55, 0x84, 0xd2, 0xa6, 0xf6, 0x3b, 0x31, 0x96, 0x5f, 0xda, 0xc6, 0x5e, 0xb0, + 0x91, 0x37, 0xa0, 0xc4, 0x02, 0x5d, 0x7a, 0x2f, 0x75, 0x5c, 0x93, 0x4f, 0x90, 0xeb, 0xff, 0xfc, + 0xf2, 0xb1, 0x2b, 0x2c, 0x2c, 0x66, 0x30, 0x7e, 0x29, 0x1d, 0x2d, 0xbe, 0xac, 0xb8, 0x72, 0x8e, + 0xca, 0x47, 0x0a, 0xec, 0xce, 0x6f, 0x24, 0xdd, 0x65, 0x7c, 0x7a, 0x36, 0x4f, 0xac, 0x95, 0x71, + 0x97, 0xc1, 0xf3, 0x7a, 0xc6, 0x5c, 0x39, 0x66, 0xa4, 0x99, 0xe2, 0x18, 0x4b, 0x6a, 0x2e, 0xb4, + 0x4a, 0x3a, 0x93, 0x60, 0xac, 0xfc, 0x4e, 0x85, 0x1d, 0x3a, 0x81, 0xfa, 0xe1, 0x78, 0xac, 0x4f, + 0x27, 0x77, 0xc2, 0x68, 0xc2, 0x8f, 0x54, 0xe4, 0x15, 0x58, 0xb9, 0x73, 0xb1, 0xdb, 0x40, 0xc6, + 0x4e, 0x08, 0xa0, 0x50, 0x16, 0xe6, 0x22, 0xf4, 0x37, 0xb9, 0x0e, 0x52, 0x28, 0x1b, 0x94, 0xa9, + 0xeb, 0xee, 0xda, 0x30, 0x0e, 0x68, 0xf3, 0x2a, 0x2c, 0xa3, 0xf6, 0xcf, 0x45, 0xa3, 0x38, 0xd2, + 0xce, 0xae, 0x19, 0xde, 0x0d, 0xb8, 0x2c, 0x03, 0x79, 0x0e, 0x20, 0xc1, 0x8c, 0xe3, 0xb2, 0x4f, + 0xa8, 0xd1, 0x31, 0x6c, 0x9c, 0xbb, 0x76, 0xf7, 0x76, 0x97, 0x03, 0xb1, 0x55, 0x61, 0x5b, 0x74, + 0xc9, 0x50, 0x78, 0xc5, 0xf3, 0x77, 0x98, 0x2d, 0x96, 0x60, 0x0e, 0xb9, 0x67, 0x7c, 0xe5, 0x1f, + 0x2a, 0xac, 0x1d, 0xd3, 0x83, 0x02, 0xaa, 0xbf, 0x8b, 0xd5, 0xe9, 0x17, 0xa1, 0xd4, 0x1a, 0x74, + 0xf9, 0xdd, 0xfd, 0x98, 0x03, 0x73, 0xa0, 0xc9, 0x6e, 0x7f, 0xd0, 0x15, 0xcf, 0x00, 0x63, 0x57, + 0x66, 0xfa, 0x06, 0x73, 0xe3, 0x37, 0x61, 0x85, 0xd9, 0x3d, 0xf0, 0x8b, 0x1a, 0x71, 0x54, 0x8c, + 0x6b, 0xf4, 0x2c, 0x4b, 0x96, 0xae, 0x9b, 0x99, 0xe5, 0x84, 0x7c, 0x6e, 0xe1, 0xb8, 0x1c, 0x92, + 0xb2, 0xbf, 0x7c, 0x3e, 0x65, 0x5f, 0xf2, 0x3f, 0x5e, 0x39, 0x8f, 0xff, 0xf1, 0xee, 0x4d, 0x28, + 0x49, 0xf5, 0xb9, 0xd0, 0xc9, 0xf1, 0xd7, 0x2a, 0x6c, 0x60, 0xab, 0xe2, 0xa7, 0xa4, 0xff, 0xcd, + 0xab, 0x8b, 0xd7, 0x52, 0x57, 0x17, 0x65, 0x79, 0xbc, 0x58, 0xcb, 0x16, 0xdc, 0x59, 0xbc, 0x09, + 0xdb, 0x39, 0x46, 0xf2, 0x32, 0x2c, 0xd3, 0xea, 0x0b, 0x55, 0x4f, 0xcb, 0xce, 0x80, 0x04, 0xab, + 0x86, 0x36, 0x7c, 0xec, 0x32, 0xee, 0xca, 0xbf, 0x14, 0x58, 0xe7, 0x20, 0x82, 0xd1, 0xed, 0xc1, + 0x37, 0x76, 0xe7, 0x8d, 0x6c, 0x77, 0x32, 0xe7, 0x19, 0xde, 0x9d, 0xff, 0xe9, 0x4e, 0xbc, 0x99, + 0xea, 0xc4, 0x2b, 0xb1, 0xe7, 0xba, 0x68, 0xce, 0x82, 0x3e, 0xfc, 0x13, 0x62, 0xb9, 0xa4, 0x19, + 0xc9, 0xcf, 0x61, 0xcd, 0x0a, 0xef, 0xa5, 0x34, 0xa6, 0x1b, 0x73, 0x0a, 0x7d, 0x36, 0x66, 0x64, + 0x6b, 0x0a, 0x37, 0x9b, 0x28, 0xbc, 0x17, 0xe4, 0x9e, 0x71, 0x92, 0x22, 0xa9, 0xd2, 0x94, 0xce, + 0x76, 0x91, 0xa9, 0xcf, 0x4d, 0x34, 0xd1, 0x1f, 0xec, 0x8f, 0x45, 0x80, 0xc4, 0xba, 0x8d, 0x2e, + 0xc0, 0x30, 0x05, 0xb5, 0xcb, 0xef, 0x8e, 0x91, 0x24, 0xcf, 0x71, 0x4e, 0x22, 0x37, 0xf8, 0xa5, + 0xa8, 0x3a, 0x1f, 0x59, 0x00, 0xaf, 0x47, 0x6b, 0xdc, 0x7a, 0xec, 0x34, 0xec, 0x77, 0x99, 0x2c, + 0x2e, 0xec, 0x3f, 0x81, 0x40, 0x32, 0x31, 0x75, 0x4e, 0x34, 0x18, 0xb4, 0x31, 0xab, 0x53, 0x86, + 0x9c, 0xc5, 0x68, 0xf1, 0xc1, 0x2d, 0x46, 0x97, 0x1f, 0xc0, 0x62, 0x74, 0xe5, 0x9c, 0x16, 0xa3, + 0x0e, 0xac, 0xf5, 0xa2, 0x0f, 0xc2, 0x68, 0x32, 0x18, 0xdd, 0x47, 0x7b, 0xb2, 0xe4, 0x2a, 0x8b, + 0x76, 0xb5, 0x29, 0xd2, 0xd8, 0x78, 0xe3, 0x86, 0x19, 0xf3, 0xcb, 0xc3, 0x1d, 0x13, 0xc9, 0x0f, + 0x20, 0x79, 0xf5, 0xe0, 0xc8, 0x9f, 0xf3, 0xf7, 0xd9, 0x13, 0xf1, 0x28, 0xf2, 0x13, 0x48, 0x3f, + 0x7e, 0x70, 0x7f, 0x0b, 0x16, 0xb9, 0x4c, 0x4e, 0x90, 0xc1, 0x34, 0x4e, 0xa4, 0xf7, 0x11, 0x6e, + 0x50, 0xf3, 0xb5, 0x0a, 0x24, 0x5f, 0x71, 0xf2, 0x1a, 0x94, 0x98, 0xe8, 0x0f, 0x46, 0xe3, 0xf7, + 0xb9, 0x99, 0x23, 0xf3, 0xf7, 0x93, 0xc8, 0xb2, 0xbf, 0x1f, 0x23, 0xbb, 0xe3, 0xf7, 0xfb, 0xe4, + 0x67, 0xf0, 0x08, 0x0e, 0xfc, 0x30, 0x1c, 0xf5, 0x06, 0xa7, 0x01, 0x22, 0xae, 0x74, 0xfb, 0x1c, + 0x53, 0xfe, 0x19, 0x0c, 0x7e, 0x92, 0x4f, 0x9e, 0x33, 0x41, 0xd0, 0x9a, 0xd0, 0x41, 0x4e, 0x87, + 0x31, 0x12, 0x1f, 0x34, 0x39, 0xff, 0xed, 0x69, 0xbf, 0xcf, 0xe7, 0x5c, 0x15, 0x43, 0x5f, 0x67, + 0xd2, 0xe6, 0x14, 0xbc, 0x99, 0x14, 0xdc, 0x98, 0xf6, 0xfb, 0xe4, 0x15, 0x80, 0x41, 0x14, 0xdc, + 0xed, 0x8d, 0xc7, 0xec, 0x21, 0x23, 0xb6, 0x04, 0x4e, 0xa8, 0xf2, 0xf0, 0x0d, 0xa2, 0x36, 0x23, + 0xd2, 0xe1, 0x1b, 0x76, 0xcf, 0x42, 0xf4, 0x9f, 0xc1, 0x99, 0xb7, 0xcc, 0x51, 0x22, 0x05, 0x31, + 0x3d, 0x8d, 0xce, 0x42, 0xaf, 0xf7, 0xa1, 0xb0, 0x66, 0x7a, 0x07, 0xb6, 0xb9, 0x21, 0xca, 0x71, + 0x6f, 0x72, 0x87, 0x9f, 0xbb, 0xbf, 0xcd, 0xa1, 0x5d, 0x3a, 0x78, 0xff, 0xb5, 0x08, 0xa0, 0x1f, + 0x7b, 0xc2, 0x35, 0xf5, 0x29, 0x58, 0xa6, 0xda, 0x84, 0xb8, 0x95, 0xc0, 0x3b, 0x5d, 0x2c, 0x57, + 0xbe, 0xd3, 0x45, 0x0e, 0x2a, 0x27, 0xdc, 0xf0, 0x0c, 0x2f, 0xc6, 0xd4, 0xe4, 0x0a, 0x63, 0xc4, + 0x48, 0xa9, 0xd3, 0x2b, 0x23, 0x91, 0x16, 0x40, 0xe2, 0x2c, 0xca, 0xf5, 0xdb, 0xed, 0xc4, 0xeb, + 0x8a, 0x27, 0x70, 0xf8, 0xbf, 0xc4, 0xe1, 0x54, 0x9e, 0x3e, 0x09, 0x1b, 0x39, 0x84, 0xa2, 0xdf, + 0x8d, 0xed, 0x5c, 0xe7, 0xb8, 0xd0, 0x3e, 0xce, 0x31, 0xff, 0x13, 0x37, 0xda, 0xcd, 0x49, 0x37, + 0x15, 0x1a, 0x05, 0x0b, 0x21, 0x06, 0xac, 0xf0, 0x78, 0x4e, 0x73, 0xf0, 0x14, 0x78, 0x38, 0x27, + 0x8e, 0xa2, 0x84, 0x44, 0xf9, 0xb4, 0xc3, 0x23, 0x37, 0xbd, 0x08, 0x05, 0xcf, 0x6b, 0x73, 0xc7, + 0x91, 0x8d, 0x44, 0x57, 0xf1, 0xbc, 0xb6, 0x08, 0x7f, 0x77, 0x57, 0xca, 0x46, 0x99, 0xc9, 0x8f, + 0xa0, 0x24, 0x1d, 0xc4, 0xb9, 0xcb, 0x15, 0xf6, 0x41, 0x2f, 0x21, 0xcb, 0xe2, 0x4c, 0xe2, 0x26, + 0x2d, 0xd0, 0x0e, 0xa7, 0xef, 0x85, 0xfa, 0x70, 0x88, 0x36, 0x9a, 0x1f, 0x84, 0x23, 0x06, 0x4d, + 0xb8, 0x9a, 0x00, 0x10, 0x05, 0xdd, 0xe1, 0x30, 0x38, 0x15, 0xa9, 0xf2, 0xcd, 0x4c, 0x36, 0x27, + 0x71, 0x60, 0xdb, 0x0b, 0x27, 0xd3, 0x21, 0x33, 0xc3, 0x68, 0x0c, 0x46, 0x54, 0x35, 0x61, 0x02, + 0x03, 0xb1, 0x5a, 0xc6, 0x34, 0x51, 0xd8, 0xbe, 0xdc, 0x1e, 0x8c, 0x32, 0x6a, 0x4a, 0x3e, 0x73, + 0x25, 0x94, 0x87, 0x9c, 0xee, 0xf7, 0x69, 0x85, 0x07, 0xf7, 0x7b, 0xa1, 0xf0, 0x24, 0x6a, 0xce, + 0x73, 0x33, 0x9c, 0x88, 0xf1, 0x19, 0x4d, 0x72, 0x22, 0x4e, 0xb9, 0x0e, 0x7f, 0x5a, 0x94, 0xc0, + 0x29, 0xf8, 0x58, 0xbc, 0x0e, 0xf0, 0xe6, 0xa0, 0x17, 0xb5, 0xc3, 0xc9, 0x9d, 0xc1, 0xa9, 0xe4, + 0xcb, 0x5c, 0xfa, 0xc5, 0xa0, 0x17, 0x05, 0x77, 0x91, 0xfc, 0xf5, 0x97, 0x8f, 0x49, 0x4c, 0xae, + 0xf4, 0x9b, 0x7c, 0x1f, 0xd6, 0xe8, 0x97, 0x9f, 0x18, 0x93, 0xb0, 0x0b, 0x4c, 0xcc, 0xcd, 0xc3, + 0x68, 0xc6, 0x0c, 0xe4, 0x26, 0xe2, 0x87, 0xf6, 0x86, 0x13, 0xe9, 0x58, 0x2d, 0xc0, 0x42, 0x7b, + 0xc3, 0x49, 0x16, 0x6f, 0x48, 0x62, 0x26, 0xcd, 0xb8, 0xea, 0x02, 0x81, 0x96, 0xc3, 0x94, 0xe2, + 0x2d, 0x1d, 0x9f, 0x6b, 0x81, 0x00, 0x3a, 0x91, 0x63, 0x85, 0x64, 0xb2, 0x61, 0x25, 0xbc, 0x66, + 0x9d, 0x3d, 0xab, 0xf0, 0xdd, 0x8d, 0x55, 0x62, 0x7c, 0xe7, 0x34, 0x38, 0x41, 0x72, 0xaa, 0x12, + 0x31, 0x33, 0xd9, 0x87, 0x2d, 0xe6, 0x71, 0x17, 0x23, 0xd9, 0xf3, 0x9d, 0x0e, 0x65, 0x5b, 0x02, + 0x75, 0x2f, 0xff, 0x7d, 0x26, 0x03, 0x69, 0xc0, 0x32, 0xaa, 0x96, 0xdc, 0xed, 0xe9, 0xaa, 0xac, + 0x53, 0x67, 0xd7, 0x11, 0xca, 0x15, 0xd4, 0xa6, 0x65, 0xb9, 0x82, 0xac, 0xe4, 0x6d, 0x00, 0x23, + 0x1a, 0x0d, 0xfa, 0x7d, 0x84, 0xe2, 0x59, 0x45, 0xc5, 0xec, 0x7a, 0x7a, 0x3d, 0x62, 0x29, 0x09, + 0x13, 0xf7, 0x30, 0xc7, 0xef, 0x20, 0x03, 0xd8, 0x23, 0x95, 0x55, 0x31, 0x61, 0x85, 0x2d, 0x46, + 0x84, 0xb5, 0xe2, 0x98, 0x99, 0x12, 0x28, 0x12, 0x83, 0xb5, 0xe2, 0xf4, 0x3c, 0xac, 0x95, 0x94, + 0xa1, 0x72, 0x08, 0x97, 0x67, 0x35, 0x2c, 0xa5, 0x0c, 0x2b, 0xe7, 0x55, 0x86, 0xff, 0x50, 0x80, + 0x75, 0x2c, 0x4d, 0x48, 0x61, 0x1d, 0x36, 0xbc, 0xe9, 0x7b, 0xb1, 0x7b, 0xa8, 0x90, 0xc6, 0x58, + 0xbf, 0xb1, 0x9c, 0x20, 0x3f, 0x78, 0xa5, 0x72, 0x10, 0x03, 0x36, 0xc5, 0x4e, 0x70, 0x20, 0x6c, + 0xdd, 0x62, 0x44, 0x29, 0x01, 0x5c, 0x90, 0x8f, 0xe4, 0x91, 0xc9, 0x94, 0xec, 0x07, 0x85, 0x8b, + 0xec, 0x07, 0xc5, 0x73, 0xed, 0x07, 0x3f, 0x85, 0x75, 0xf1, 0x6f, 0x28, 0xc9, 0x97, 0xbf, 0x9d, + 0x24, 0x4f, 0x15, 0x46, 0x5a, 0xb1, 0x44, 0x5f, 0x59, 0x28, 0xd1, 0xf1, 0x15, 0x51, 0xac, 0xb2, + 0x5c, 0x70, 0x3e, 0x5e, 0x06, 0x42, 0xdd, 0x1f, 0xd4, 0x9c, 0x07, 0xd8, 0x25, 0x5f, 0x86, 0xb5, + 0xd6, 0x40, 0x3c, 0x20, 0x49, 0x37, 0xf7, 0x7d, 0x41, 0x94, 0x8f, 0x0b, 0x31, 0x67, 0xbc, 0xbb, + 0x15, 0x1e, 0xc6, 0xee, 0x76, 0x13, 0x80, 0x1b, 0x51, 0x26, 0x10, 0xd5, 0xb8, 0x64, 0x84, 0xf7, + 0x4f, 0xfa, 0x01, 0x41, 0x62, 0xa6, 0xd2, 0x89, 0x9b, 0x9a, 0xe8, 0x27, 0x27, 0x83, 0x69, 0x34, + 0x49, 0xc5, 0x74, 0xe1, 0x8e, 0x80, 0x74, 0x4b, 0xc0, 0x34, 0x59, 0x3c, 0x64, 0xb2, 0x3d, 0xdc, + 0x01, 0x21, 0x6f, 0xc5, 0x36, 0x72, 0x0b, 0x43, 0x5c, 0x56, 0x72, 0x3d, 0x34, 0xd7, 0x32, 0xae, + 0xf2, 0xb9, 0x22, 0xc3, 0xf9, 0x3d, 0xc0, 0x50, 0xbf, 0x0a, 0x10, 0xbf, 0xe0, 0x8b, 0xb1, 0x66, + 0x9a, 0x5c, 0x4c, 0x95, 0x7b, 0x39, 0xe1, 0x95, 0x5a, 0x53, 0x78, 0x58, 0xad, 0xf1, 0xa1, 0x64, + 0xff, 0x72, 0xd2, 0x4d, 0x4c, 0x3e, 0xc0, 0x8b, 0x4f, 0xb2, 0x28, 0x99, 0x44, 0x28, 0xce, 0xe4, + 0x1c, 0x3c, 0x37, 0x14, 0x67, 0x9c, 0xb1, 0xf2, 0x16, 0x6c, 0xc9, 0x2e, 0x0a, 0xf7, 0xa3, 0x13, + 0xf2, 0x63, 0x86, 0x43, 0xa2, 0xa4, 0x74, 0x1c, 0x89, 0x89, 0x4a, 0xdc, 0xfb, 0xd1, 0x09, 0x3b, + 0xff, 0x74, 0xef, 0xc9, 0x75, 0x45, 0xed, 0xf3, 0x0b, 0x05, 0x48, 0x9e, 0x5d, 0x96, 0x26, 0xca, + 0x7f, 0xe1, 0x74, 0x99, 0x39, 0x95, 0x15, 0x2f, 0x72, 0x2a, 0xab, 0xfe, 0x56, 0x81, 0x2d, 0x53, + 0x6f, 0x73, 0xec, 0x3d, 0xf6, 0x12, 0xf1, 0xff, 0x70, 0xdd, 0xd4, 0xdb, 0x81, 0x63, 0xb7, 0xcc, + 0xda, 0xad, 0x60, 0x26, 0xa4, 0xce, 0x75, 0xf8, 0xbf, 0x3c, 0x4b, 0xf2, 0x62, 0x71, 0x0d, 0xca, + 0xf9, 0x64, 0x01, 0xbb, 0x33, 0x3b, 0xb3, 0x40, 0xe8, 0x29, 0x54, 0xdf, 0x80, 0x2d, 0x81, 0x46, + 0xe3, 0xb7, 0x3c, 0x04, 0xb1, 0xdb, 0x82, 0xd2, 0x91, 0xe1, 0x9a, 0x8d, 0x5b, 0x41, 0xa3, 0xd3, + 0x6a, 0x69, 0x4b, 0x64, 0x03, 0xd6, 0x38, 0xa1, 0xa6, 0x6b, 0x0a, 0x59, 0x87, 0x55, 0xd3, 0xf2, + 0x8c, 0x5a, 0xc7, 0x35, 0x34, 0xb5, 0xfa, 0x06, 0x6c, 0x3a, 0xa3, 0xde, 0x07, 0xdd, 0x49, 0x78, + 0x18, 0xde, 0xc7, 0x07, 0x87, 0x4b, 0x50, 0x70, 0xf5, 0x63, 0x6d, 0x89, 0x00, 0xac, 0x38, 0x87, + 0x35, 0xef, 0x85, 0x17, 0x34, 0x85, 0x94, 0xe0, 0xd2, 0x41, 0xcd, 0x09, 0x0e, 0xdb, 0x9e, 0xa6, + 0xd2, 0x0f, 0xfd, 0xd8, 0xc3, 0x8f, 0x42, 0xf5, 0x79, 0xd8, 0xc6, 0xb3, 0x42, 0xab, 0x37, 0x9e, + 0x84, 0x51, 0x38, 0xc2, 0x3a, 0xac, 0xc3, 0xaa, 0x17, 0xd2, 0x45, 0x3e, 0x09, 0x59, 0x05, 0xda, + 0xd3, 0xfe, 0xa4, 0x37, 0xec, 0x87, 0xbf, 0xd2, 0x94, 0xea, 0x4d, 0xd8, 0x72, 0x07, 0xd3, 0x49, + 0x2f, 0x3a, 0xf3, 0x26, 0x94, 0xe3, 0xec, 0x3e, 0x79, 0x14, 0xb6, 0x3b, 0x96, 0xde, 0xde, 0x37, + 0x0f, 0x3a, 0x76, 0xc7, 0x0b, 0xda, 0xba, 0x5f, 0x6b, 0xb2, 0xe7, 0x8e, 0xb6, 0xed, 0xf9, 0x81, + 0x6b, 0xd4, 0x0c, 0xcb, 0xd7, 0x94, 0xea, 0x6f, 0x14, 0xd8, 0xec, 0x8c, 0xb9, 0x89, 0x6e, 0x07, + 0x4d, 0xf8, 0x1f, 0x87, 0x6b, 0x1d, 0xcf, 0x70, 0x03, 0xdf, 0x3e, 0x34, 0xac, 0xa0, 0xe3, 0xe9, + 0x07, 0x59, 0x3c, 0xa7, 0xc7, 0xe0, 0xaa, 0xc4, 0xe1, 0x1a, 0x35, 0xfb, 0xc8, 0x70, 0x03, 0x47, + 0xf7, 0xbc, 0x63, 0xdb, 0xad, 0x6b, 0x0a, 0xd9, 0x85, 0x9d, 0x19, 0x0c, 0xed, 0x86, 0xae, 0xa9, + 0xb9, 0x34, 0xcb, 0x38, 0xd6, 0x5b, 0xc1, 0xbe, 0xed, 0x6b, 0x85, 0x6a, 0x9b, 0x6e, 0x74, 0x08, + 0x79, 0xc2, 0x00, 0x6b, 0x57, 0xa1, 0x68, 0xd9, 0x96, 0x91, 0x7d, 0x92, 0x5a, 0x87, 0x55, 0xdd, + 0x71, 0x5c, 0xfb, 0x08, 0x07, 0x14, 0x60, 0xa5, 0x6e, 0x58, 0xb4, 0x66, 0x05, 0x9a, 0xe2, 0xb8, + 0x76, 0xdb, 0xf6, 0x8d, 0xba, 0x56, 0xac, 0xba, 0x62, 0xc1, 0x88, 0x42, 0x4f, 0x06, 0xec, 0xfd, + 0xa7, 0x6e, 0x34, 0xf4, 0x4e, 0xcb, 0xe7, 0x1d, 0x72, 0x2b, 0x70, 0x8d, 0xb7, 0x3a, 0x86, 0xe7, + 0x7b, 0x9a, 0x42, 0x34, 0x58, 0xb7, 0x0c, 0xa3, 0xee, 0x05, 0xae, 0x71, 0x64, 0x1a, 0xc7, 0x9a, + 0x4a, 0xcb, 0x64, 0xbf, 0xe9, 0x3f, 0x54, 0x3f, 0x55, 0x80, 0x30, 0xb8, 0x18, 0x01, 0x2c, 0x8a, + 0xe3, 0xb3, 0x07, 0xbb, 0x4d, 0xda, 0xb1, 0xd8, 0xb4, 0xb6, 0x5d, 0xcf, 0x76, 0xd9, 0x0e, 0x90, + 0x4c, 0xba, 0xdd, 0x68, 0x68, 0x0a, 0xb9, 0x0a, 0x8f, 0x64, 0xe8, 0x75, 0xd7, 0x76, 0x34, 0x75, + 0x57, 0x5d, 0x55, 0xc8, 0x95, 0x5c, 0xe2, 0xa1, 0x61, 0x38, 0x5a, 0x81, 0x0e, 0x51, 0x26, 0x41, + 0x4c, 0x40, 0x96, 0xbd, 0x58, 0xfd, 0x48, 0x81, 0x1d, 0x56, 0x4d, 0x31, 0x9b, 0xe3, 0xaa, 0x5e, + 0x83, 0x32, 0x47, 0xb6, 0x9a, 0x55, 0xd1, 0xcb, 0xa0, 0xa5, 0x52, 0x59, 0x35, 0x1f, 0x85, 0xed, + 0x14, 0x15, 0xeb, 0xa1, 0xd2, 0xb5, 0x9a, 0x22, 0xef, 0x1b, 0x9e, 0x1f, 0x18, 0x8d, 0x86, 0xed, + 0xfa, 0xac, 0x22, 0x85, 0x6a, 0x05, 0xb6, 0x6b, 0xe1, 0x68, 0x42, 0x75, 0x90, 0x68, 0xdc, 0x1b, + 0x44, 0x58, 0x85, 0x0d, 0x58, 0x33, 0xde, 0xf6, 0x0d, 0xcb, 0x33, 0x6d, 0x4b, 0x5b, 0xaa, 0x5e, + 0xcb, 0xf0, 0x88, 0x55, 0xe3, 0x79, 0x4d, 0x6d, 0xa9, 0xda, 0x85, 0x0d, 0x61, 0x12, 0xcb, 0x66, + 0xc5, 0x1e, 0xec, 0x8a, 0xb9, 0x86, 0xeb, 0x37, 0xdb, 0x84, 0x32, 0x5c, 0xce, 0xa7, 0x1b, 0xbe, + 0xa6, 0xd0, 0x51, 0xc8, 0xa4, 0x50, 0xba, 0x5a, 0xfd, 0xbd, 0x02, 0x65, 0x1e, 0x4d, 0x8b, 0xbf, + 0x47, 0x30, 0x30, 0x4d, 0x04, 0xa6, 0xa9, 0xc2, 0x0d, 0xdf, 0xed, 0x78, 0xbe, 0x51, 0x0f, 0xea, + 0xc6, 0x91, 0x59, 0x33, 0x70, 0xba, 0x98, 0xae, 0xd1, 0x36, 0x2c, 0x3f, 0xf3, 0xd7, 0x4f, 0xc3, + 0x93, 0x0b, 0x78, 0x2d, 0xdb, 0x17, 0xdf, 0x74, 0x95, 0x3c, 0x09, 0xdf, 0x59, 0xc0, 0x1c, 0x33, + 0xaa, 0xd5, 0x77, 0x61, 0x3d, 0x05, 0x10, 0x7e, 0x05, 0x1e, 0x91, 0xbf, 0x9d, 0x30, 0x3a, 0xed, + 0x45, 0x67, 0xda, 0x52, 0x36, 0xc1, 0x9d, 0x46, 0x11, 0x4d, 0xc0, 0x05, 0x29, 0x27, 0xf8, 0xe1, + 0xe8, 0x6e, 0x2f, 0xea, 0x4e, 0xc2, 0x53, 0x4d, 0xad, 0x3e, 0x0b, 0x1b, 0x29, 0x04, 0x23, 0xda, + 0xf3, 0x2d, 0x9b, 0xcb, 0xab, 0xb6, 0x51, 0x37, 0x3b, 0x6d, 0x6d, 0x99, 0x2e, 0xc5, 0xa6, 0x79, + 0xd0, 0xd4, 0xa0, 0xfa, 0x89, 0x42, 0x4f, 0xcc, 0xd8, 0x3f, 0xed, 0x86, 0x2e, 0xc6, 0x8a, 0xce, + 0x13, 0x06, 0x76, 0x66, 0x78, 0x1e, 0x7b, 0x4a, 0xbd, 0x06, 0x65, 0xfe, 0x11, 0xe8, 0x56, 0x3d, + 0x68, 0xea, 0x6e, 0xfd, 0x58, 0x77, 0xe9, 0xe4, 0xb9, 0xa5, 0xa9, 0xb8, 0x22, 0x24, 0x4a, 0xe0, + 0xdb, 0x9d, 0x5a, 0x53, 0x2b, 0xd0, 0x09, 0x98, 0xa2, 0x3b, 0xa6, 0xa5, 0x15, 0x71, 0x7d, 0xe5, + 0xb8, 0xb1, 0x58, 0x9a, 0xbe, 0x5c, 0xed, 0x81, 0x96, 0x75, 0x5b, 0xca, 0xbd, 0x69, 0xbb, 0x1d, + 0xcb, 0x62, 0x02, 0x64, 0x0b, 0x4a, 0xb6, 0xdf, 0x34, 0x5c, 0x0e, 0x47, 0x87, 0xf8, 0x73, 0x1d, + 0x4b, 0xef, 0xf8, 0x4d, 0xdb, 0x35, 0xdf, 0x41, 0x49, 0x52, 0x86, 0xcb, 0x5e, 0x4b, 0xaf, 0x1d, + 0xe2, 0xa0, 0x99, 0x56, 0x50, 0x6b, 0xea, 0x96, 0x65, 0xb4, 0x34, 0xa8, 0xfe, 0x59, 0x81, 0xab, + 0x0b, 0xde, 0xbd, 0xc8, 0x33, 0xf0, 0x54, 0xd3, 0xd0, 0xeb, 0x2d, 0xc3, 0xf3, 0x02, 0x5a, 0xa4, + 0x61, 0xf9, 0xfc, 0x79, 0x79, 0xe6, 0x6c, 0x7d, 0x0a, 0xbe, 0xbb, 0x98, 0x3d, 0x91, 0x7b, 0xdf, + 0x83, 0x27, 0x16, 0xb3, 0x72, 0x39, 0xa8, 0xd2, 0x39, 0xbb, 0x98, 0x33, 0x96, 0x9f, 0x85, 0xea, + 0xc7, 0x0a, 0xec, 0xcc, 0x56, 0x17, 0x69, 0xdd, 0x4c, 0xcb, 0xf3, 0xf5, 0x56, 0x2b, 0x70, 0x74, + 0x57, 0x6f, 0x07, 0x86, 0xe5, 0xda, 0xad, 0xd6, 0x2c, 0xb9, 0xf1, 0x04, 0x3c, 0x3e, 0x9f, 0xd5, + 0xab, 0xb9, 0xa6, 0x43, 0x17, 0x60, 0x05, 0xf6, 0xe6, 0x73, 0x19, 0x66, 0xcd, 0xd0, 0xd4, 0xfd, + 0xd7, 0x3f, 0xfb, 0xfb, 0xde, 0xd2, 0x67, 0x5f, 0xed, 0x29, 0x5f, 0x7c, 0xb5, 0xa7, 0xfc, 0xed, + 0xab, 0x3d, 0xe5, 0x9d, 0xa7, 0x2f, 0x10, 0x88, 0xf2, 0xbd, 0x15, 0xb4, 0xa7, 0x78, 0xe9, 0xdf, + 0x01, 0x00, 0x00, 0xff, 0xff, 0x7b, 0xb0, 0xf8, 0xd2, 0x3d, 0x86, 0x01, 0x00, } func (this *PluginSpecV1) Equal(that interface{}) bool { @@ -35116,6 +35120,15 @@ func (m *SSOClientRedirectSettings) MarshalToSizedBuffer(dAtA []byte) (int, erro i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.InsecureAllowedCidrRanges) > 0 { + for iNdEx := len(m.InsecureAllowedCidrRanges) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.InsecureAllowedCidrRanges[iNdEx]) + copy(dAtA[i:], m.InsecureAllowedCidrRanges[iNdEx]) + i = encodeVarintTypes(dAtA, i, uint64(len(m.InsecureAllowedCidrRanges[iNdEx]))) + i-- + dAtA[i] = 0x12 + } + } if len(m.AllowedHttpsHostnames) > 0 { for iNdEx := len(m.AllowedHttpsHostnames) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.AllowedHttpsHostnames[iNdEx]) @@ -50051,6 +50064,12 @@ func (m *SSOClientRedirectSettings) Size() (n int) { n += 1 + l + sovTypes(uint64(l)) } } + if len(m.InsecureAllowedCidrRanges) > 0 { + for _, s := range m.InsecureAllowedCidrRanges { + l = len(s) + n += 1 + l + sovTypes(uint64(l)) + } + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -93310,6 +93329,38 @@ func (m *SSOClientRedirectSettings) Unmarshal(dAtA []byte) error { } m.AllowedHttpsHostnames = append(m.AllowedHttpsHostnames, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field InsecureAllowedCidrRanges", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.InsecureAllowedCidrRanges = append(m.InsecureAllowedCidrRanges, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) diff --git a/docs/pages/access-controls/sso.mdx b/docs/pages/access-controls/sso.mdx index 1eb2efea3546e..1c3a89ac235c1 100644 --- a/docs/pages/access-controls/sso.mdx +++ b/docs/pages/access-controls/sso.mdx @@ -197,6 +197,35 @@ authentication succeeds, Teleport will retrieve SSH and X.509 certificates and store them in the `~/.tsh/keys/` directory. The tool will also will add SSH cert to an SSH agent if there's one running. +### Changing Callback Address + +The callback address can be changed if calling back to a remote machine +instead of the local machine is required: + +```code +# --bind-addr sets the host and port tsh will listen on, and --callback changes +# what link is displayed to the user +$ tsh login --proxy=proxy.example.com --auth=github --bind-addr=localhost:1234 --callback https://remote.machine:1234 +``` + +For this to work the hostname or CIDR of the remote machine that will be used for +the callback will need to be allowed via`spec.client_redirect_settings`: + +```code +spec: + client_redirect_settings: + # a list of hostnames allowed for HTTPS client redirect URLs + # can be a regex pattern + allowed_https_hostnames: + - remote.machine + - '*.app.github.dev' + - '^\d+-[a-zA-Z0-9]+\.foo.internal$' + # a list of CIDRs allowed for HTTP or HTTPS client redirect URLs + insecure_allowed_cidr_ranges: + - '192.168.1.0/24' + - '2001:db8::/96' +``` + ## Configuring SSO Teleport works with SSO providers by relying on the concept of an diff --git a/docs/pages/reference/cli/tsh.mdx b/docs/pages/reference/cli/tsh.mdx index 7cab1a0c50870..1c8c2c3076ea9 100644 --- a/docs/pages/reference/cli/tsh.mdx +++ b/docs/pages/reference/cli/tsh.mdx @@ -316,6 +316,7 @@ $ tsh login [] [] | Name | Default Value(s) | Allowed Value(s) | Description | | - | - | - | - | | `--bind-addr` | none | host:port | Address in the form of host:port to bind to for login command webhook | +| `--callback` | none | host:port | Override the base URL (host:port) of the link shown when opening a browser for cluster logins. Must be used with --bind-addr. | `-o, --out` | none | filepath | Identity output filepath | | `--format` | `file` | `file`, `openssh` or `kubernetes` | Identity format: file, openssh (for OpenSSH compatibility) or kubernetes (for kubeconfig) | | `--browser` | none | `none` | Set to 'none' to suppress opening system default browser for `tsh login` commands | diff --git a/docs/pages/reference/terraform-provider/data-sources/github_connector.mdx b/docs/pages/reference/terraform-provider/data-sources/github_connector.mdx index faf4d97151e53..3a38d3bd7f01b 100644 --- a/docs/pages/reference/terraform-provider/data-sources/github_connector.mdx +++ b/docs/pages/reference/terraform-provider/data-sources/github_connector.mdx @@ -45,6 +45,7 @@ Optional: Optional: - `allowed_https_hostnames` (List of String) a list of hostnames allowed for https client redirect URLs +- `insecure_allowed_cidr_ranges` (List of String) a list of CIDRs allowed for HTTP or HTTPS client redirect URLs ### Nested Schema for `spec.teams_to_logins` diff --git a/docs/pages/reference/terraform-provider/data-sources/oidc_connector.mdx b/docs/pages/reference/terraform-provider/data-sources/oidc_connector.mdx index 57b7098854dec..81a214a6b4c6c 100644 --- a/docs/pages/reference/terraform-provider/data-sources/oidc_connector.mdx +++ b/docs/pages/reference/terraform-provider/data-sources/oidc_connector.mdx @@ -59,6 +59,7 @@ Optional: Optional: - `allowed_https_hostnames` (List of String) a list of hostnames allowed for https client redirect URLs +- `insecure_allowed_cidr_ranges` (List of String) a list of CIDRs allowed for HTTP or HTTPS client redirect URLs diff --git a/docs/pages/reference/terraform-provider/data-sources/saml_connector.mdx b/docs/pages/reference/terraform-provider/data-sources/saml_connector.mdx index bcf70b19659a3..937a064e99baf 100644 --- a/docs/pages/reference/terraform-provider/data-sources/saml_connector.mdx +++ b/docs/pages/reference/terraform-provider/data-sources/saml_connector.mdx @@ -69,6 +69,7 @@ Optional: Optional: - `allowed_https_hostnames` (List of String) a list of hostnames allowed for https client redirect URLs +- `insecure_allowed_cidr_ranges` (List of String) a list of CIDRs allowed for HTTP or HTTPS client redirect URLs ### Nested Schema for `spec.signing_key_pair` diff --git a/docs/pages/reference/terraform-provider/resources/github_connector.mdx b/docs/pages/reference/terraform-provider/resources/github_connector.mdx index 6b532e77edb2c..6db1290d5850b 100644 --- a/docs/pages/reference/terraform-provider/resources/github_connector.mdx +++ b/docs/pages/reference/terraform-provider/resources/github_connector.mdx @@ -76,6 +76,7 @@ Optional: Optional: - `allowed_https_hostnames` (List of String) a list of hostnames allowed for https client redirect URLs +- `insecure_allowed_cidr_ranges` (List of String) a list of CIDRs allowed for HTTP or HTTPS client redirect URLs ### Nested Schema for `spec.teams_to_logins` diff --git a/docs/pages/reference/terraform-provider/resources/oidc_connector.mdx b/docs/pages/reference/terraform-provider/resources/oidc_connector.mdx index 463818acf2fcc..0fe2cf61d32b1 100644 --- a/docs/pages/reference/terraform-provider/resources/oidc_connector.mdx +++ b/docs/pages/reference/terraform-provider/resources/oidc_connector.mdx @@ -89,6 +89,7 @@ Optional: Optional: - `allowed_https_hostnames` (List of String) a list of hostnames allowed for https client redirect URLs +- `insecure_allowed_cidr_ranges` (List of String) a list of CIDRs allowed for HTTP or HTTPS client redirect URLs diff --git a/docs/pages/reference/terraform-provider/resources/saml_connector.mdx b/docs/pages/reference/terraform-provider/resources/saml_connector.mdx index 35a33e15e4244..5c7dd6474ad9e 100644 --- a/docs/pages/reference/terraform-provider/resources/saml_connector.mdx +++ b/docs/pages/reference/terraform-provider/resources/saml_connector.mdx @@ -115,6 +115,7 @@ Optional: Optional: - `allowed_https_hostnames` (List of String) a list of hostnames allowed for https client redirect URLs +- `insecure_allowed_cidr_ranges` (List of String) a list of CIDRs allowed for HTTP or HTTPS client redirect URLs ### Nested Schema for `spec.signing_key_pair` diff --git a/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_githubconnectors.yaml b/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_githubconnectors.yaml index 78f55c60cda1f..a92d5dbf5eff8 100644 --- a/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_githubconnectors.yaml +++ b/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_githubconnectors.yaml @@ -55,6 +55,13 @@ spec: type: string nullable: true type: array + insecure_allowed_cidr_ranges: + description: a list of CIDRs allowed for HTTP or HTTPS client + redirect URLs + items: + type: string + nullable: true + type: array type: object client_secret: description: ClientSecret is the Github OAuth app client secret. diff --git a/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_oidcconnectors.yaml b/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_oidcconnectors.yaml index aa3486d5ae3e4..b801cf6db84f4 100644 --- a/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_oidcconnectors.yaml +++ b/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_oidcconnectors.yaml @@ -80,6 +80,13 @@ spec: type: string nullable: true type: array + insecure_allowed_cidr_ranges: + description: a list of CIDRs allowed for HTTP or HTTPS client + redirect URLs + items: + type: string + nullable: true + type: array type: object client_secret: description: ClientSecret is used to authenticate the client. diff --git a/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_samlconnectors.yaml b/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_samlconnectors.yaml index 4ffda895f0cd0..a4437220e61cb 100644 --- a/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_samlconnectors.yaml +++ b/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_samlconnectors.yaml @@ -95,6 +95,13 @@ spec: type: string nullable: true type: array + insecure_allowed_cidr_ranges: + description: a list of CIDRs allowed for HTTP or HTTPS client + redirect URLs + items: + type: string + nullable: true + type: array type: object display: description: Display controls how this connector is displayed. diff --git a/examples/resources/adfs-connector.yaml b/examples/resources/adfs-connector.yaml index 98efa8e19d1a8..2fe06392411cd 100644 --- a/examples/resources/adfs-connector.yaml +++ b/examples/resources/adfs-connector.yaml @@ -62,3 +62,15 @@ spec: - name: "http://schemas.xmlsoap.org/claims/Group" value: "Users" roles: ["access"] + + client_redirect_settings: + # a list of hostnames allowed for HTTPS client redirect URLs + # can be a regex pattern + allowed_https_hostnames: + - remote.machine + - '*.app.github.dev' + - '^\d+-[a-zA-Z0-9]+\.foo.internal$' + # a list of CIDRs allowed for HTTP or HTTPS client redirect URLs + insecure_allowed_cidr_ranges: + - '192.168.1.0/24' + - '2001:db8::/96' diff --git a/examples/resources/github.yaml b/examples/resources/github.yaml index 38fa67072a2d1..7cc0d197dc443 100644 --- a/examples/resources/github.yaml +++ b/examples/resources/github.yaml @@ -20,3 +20,14 @@ spec: - editor organization: team: + client_redirect_settings: + # a list of hostnames allowed for HTTPS client redirect URLs + # can be a regex pattern + allowed_https_hostnames: + - remote.machine + - '*.app.github.dev' + - '^\d+-[a-zA-Z0-9]+\.foo.internal$' + # a list of CIDRs allowed for HTTP or HTTPS client redirect URLs + insecure_allowed_cidr_ranges: + - '192.168.1.0/24' + - '2001:db8::/96' diff --git a/examples/resources/gworkspace-connector-inline.yaml b/examples/resources/gworkspace-connector-inline.yaml index f1ea91b7d2ea2..d69997c40b5ce 100644 --- a/examples/resources/gworkspace-connector-inline.yaml +++ b/examples/resources/gworkspace-connector-inline.yaml @@ -33,4 +33,15 @@ spec: scope: - openid - email + client_redirect_settings: + # a list of hostnames allowed for HTTPS client redirect URLs + # can be a regex pattern + allowed_https_hostnames: + - remote.machine + - '*.app.github.dev' + - '^\d+-[a-zA-Z0-9]+\.foo.internal$' + # a list of CIDRs allowed for HTTP or HTTPS client redirect URLs + insecure_allowed_cidr_ranges: + - '192.168.1.0/24' + - '2001:db8::/96' version: v3 diff --git a/examples/resources/gworkspace-connector.yaml b/examples/resources/gworkspace-connector.yaml index 5e31b8b6b5148..5b1d0bc83575a 100644 --- a/examples/resources/gworkspace-connector.yaml +++ b/examples/resources/gworkspace-connector.yaml @@ -21,4 +21,15 @@ spec: scope: - openid - email + client_redirect_settings: + # a list of hostnames allowed for HTTPS client redirect URLs + # can be a regex pattern + allowed_https_hostnames: + - remote.machine + - '*.app.github.dev' + - '^\d+-[a-zA-Z0-9]+\.foo.internal$' + # a list of CIDRs allowed for HTTP or HTTPS client redirect URLs + insecure_allowed_cidr_ranges: + - '192.168.1.0/24' + - '2001:db8::/96' version: v3 diff --git a/examples/resources/oidc-connector.yaml b/examples/resources/oidc-connector.yaml index 33dfb5e28d8f2..5cb0ca0658fc1 100644 --- a/examples/resources/oidc-connector.yaml +++ b/examples/resources/oidc-connector.yaml @@ -16,4 +16,15 @@ spec: issuer_url: https://idp.example.com/ redirect_url: https://mytenant.teleport.sh:443/v1/webapi/oidc/callback max_age: 24h + client_redirect_settings: + # a list of hostnames allowed for HTTPS client redirect URLs + # can be a regex pattern + allowed_https_hostnames: + - remote.machine + - '*.app.github.dev' + - '^\d+-[a-zA-Z0-9]+\.foo.internal$' + # a list of CIDRs allowed for HTTP or HTTPS client redirect URLs + insecure_allowed_cidr_ranges: + - '192.168.1.0/24' + - '2001:db8::/96' version: v3 diff --git a/examples/resources/onelogin-connector.yaml b/examples/resources/onelogin-connector.yaml index cb88657208eaa..3e6e37aa76101 100644 --- a/examples/resources/onelogin-connector.yaml +++ b/examples/resources/onelogin-connector.yaml @@ -23,4 +23,15 @@ spec: issuer: "" service_provider_issuer: https://teleport.example.com:443/v1/webapi/saml/acs/onelogin sso: "" + client_redirect_settings: + # a list of hostnames allowed for HTTPS client redirect URLs + # can be a regex pattern + allowed_https_hostnames: + - remote.machine + - '*.app.github.dev' + - '^\d+-[a-zA-Z0-9]+\.foo.internal$' + # a list of CIDRs allowed for HTTP or HTTPS client redirect URLs + insecure_allowed_cidr_ranges: + - '192.168.1.0/24' + - '2001:db8::/96' version: v2 \ No newline at end of file diff --git a/examples/resources/saml-connector.yaml b/examples/resources/saml-connector.yaml index 43e94f227004a..d439adbfcda49 100644 --- a/examples/resources/saml-connector.yaml +++ b/examples/resources/saml-connector.yaml @@ -31,4 +31,15 @@ spec: # Optional SAML Single Logout endpoint. If set, logging out of Teleport # will also log the user out of the SAML provider session. single_logout_url: https://example.okta.com/app/your-app-id/slo/saml + client_redirect_settings: + # a list of hostnames allowed for HTTPS client redirect URLs + # can be a regex pattern + allowed_https_hostnames: + - remote.machine + - '*.app.github.dev' + - '^\d+-[a-zA-Z0-9]+\.foo.internal$' + # a list of CIDRs allowed for HTTP or HTTPS client redirect URLs + insecure_allowed_cidr_ranges: + - '192.168.1.0/24' + - '2001:db8::/96' \ No newline at end of file diff --git a/integrations/operator/config/crd/bases/resources.teleport.dev_githubconnectors.yaml b/integrations/operator/config/crd/bases/resources.teleport.dev_githubconnectors.yaml index 78f55c60cda1f..a92d5dbf5eff8 100644 --- a/integrations/operator/config/crd/bases/resources.teleport.dev_githubconnectors.yaml +++ b/integrations/operator/config/crd/bases/resources.teleport.dev_githubconnectors.yaml @@ -55,6 +55,13 @@ spec: type: string nullable: true type: array + insecure_allowed_cidr_ranges: + description: a list of CIDRs allowed for HTTP or HTTPS client + redirect URLs + items: + type: string + nullable: true + type: array type: object client_secret: description: ClientSecret is the Github OAuth app client secret. diff --git a/integrations/operator/config/crd/bases/resources.teleport.dev_oidcconnectors.yaml b/integrations/operator/config/crd/bases/resources.teleport.dev_oidcconnectors.yaml index aa3486d5ae3e4..b801cf6db84f4 100644 --- a/integrations/operator/config/crd/bases/resources.teleport.dev_oidcconnectors.yaml +++ b/integrations/operator/config/crd/bases/resources.teleport.dev_oidcconnectors.yaml @@ -80,6 +80,13 @@ spec: type: string nullable: true type: array + insecure_allowed_cidr_ranges: + description: a list of CIDRs allowed for HTTP or HTTPS client + redirect URLs + items: + type: string + nullable: true + type: array type: object client_secret: description: ClientSecret is used to authenticate the client. diff --git a/integrations/operator/config/crd/bases/resources.teleport.dev_samlconnectors.yaml b/integrations/operator/config/crd/bases/resources.teleport.dev_samlconnectors.yaml index 4ffda895f0cd0..a4437220e61cb 100644 --- a/integrations/operator/config/crd/bases/resources.teleport.dev_samlconnectors.yaml +++ b/integrations/operator/config/crd/bases/resources.teleport.dev_samlconnectors.yaml @@ -95,6 +95,13 @@ spec: type: string nullable: true type: array + insecure_allowed_cidr_ranges: + description: a list of CIDRs allowed for HTTP or HTTPS client + redirect URLs + items: + type: string + nullable: true + type: array type: object display: description: Display controls how this connector is displayed. diff --git a/integrations/terraform/tfschema/types_terraform.go b/integrations/terraform/tfschema/types_terraform.go index ffa073542eb50..8778b4c65099b 100644 --- a/integrations/terraform/tfschema/types_terraform.go +++ b/integrations/terraform/tfschema/types_terraform.go @@ -2683,11 +2683,18 @@ func GenSchemaOIDCConnectorV3(ctx context.Context) (github_com_hashicorp_terrafo Type: github_com_hashicorp_terraform_plugin_framework_types.StringType, }, "client_redirect_settings": { - Attributes: github_com_hashicorp_terraform_plugin_framework_tfsdk.SingleNestedAttributes(map[string]github_com_hashicorp_terraform_plugin_framework_tfsdk.Attribute{"allowed_https_hostnames": { - Description: "a list of hostnames allowed for https client redirect URLs", - Optional: true, - Type: github_com_hashicorp_terraform_plugin_framework_types.ListType{ElemType: github_com_hashicorp_terraform_plugin_framework_types.StringType}, - }}), + Attributes: github_com_hashicorp_terraform_plugin_framework_tfsdk.SingleNestedAttributes(map[string]github_com_hashicorp_terraform_plugin_framework_tfsdk.Attribute{ + "allowed_https_hostnames": { + Description: "a list of hostnames allowed for https client redirect URLs", + Optional: true, + Type: github_com_hashicorp_terraform_plugin_framework_types.ListType{ElemType: github_com_hashicorp_terraform_plugin_framework_types.StringType}, + }, + "insecure_allowed_cidr_ranges": { + Description: "a list of CIDRs allowed for HTTP or HTTPS client redirect URLs", + Optional: true, + Type: github_com_hashicorp_terraform_plugin_framework_types.ListType{ElemType: github_com_hashicorp_terraform_plugin_framework_types.StringType}, + }, + }), Description: "ClientRedirectSettings defines which client redirect URLs are allowed for non-browser SSO logins other than the standard localhost ones.", Optional: true, }, @@ -2892,11 +2899,18 @@ func GenSchemaSAMLConnectorV2(ctx context.Context) (github_com_hashicorp_terrafo Type: github_com_hashicorp_terraform_plugin_framework_types.StringType, }, "client_redirect_settings": { - Attributes: github_com_hashicorp_terraform_plugin_framework_tfsdk.SingleNestedAttributes(map[string]github_com_hashicorp_terraform_plugin_framework_tfsdk.Attribute{"allowed_https_hostnames": { - Description: "a list of hostnames allowed for https client redirect URLs", - Optional: true, - Type: github_com_hashicorp_terraform_plugin_framework_types.ListType{ElemType: github_com_hashicorp_terraform_plugin_framework_types.StringType}, - }}), + Attributes: github_com_hashicorp_terraform_plugin_framework_tfsdk.SingleNestedAttributes(map[string]github_com_hashicorp_terraform_plugin_framework_tfsdk.Attribute{ + "allowed_https_hostnames": { + Description: "a list of hostnames allowed for https client redirect URLs", + Optional: true, + Type: github_com_hashicorp_terraform_plugin_framework_types.ListType{ElemType: github_com_hashicorp_terraform_plugin_framework_types.StringType}, + }, + "insecure_allowed_cidr_ranges": { + Description: "a list of CIDRs allowed for HTTP or HTTPS client redirect URLs", + Optional: true, + Type: github_com_hashicorp_terraform_plugin_framework_types.ListType{ElemType: github_com_hashicorp_terraform_plugin_framework_types.StringType}, + }, + }), Description: "ClientRedirectSettings defines which client redirect URLs are allowed for non-browser SSO logins other than the standard localhost ones.", Optional: true, }, @@ -3059,11 +3073,18 @@ func GenSchemaGithubConnectorV3(ctx context.Context) (github_com_hashicorp_terra Type: github_com_hashicorp_terraform_plugin_framework_types.StringType, }, "client_redirect_settings": { - Attributes: github_com_hashicorp_terraform_plugin_framework_tfsdk.SingleNestedAttributes(map[string]github_com_hashicorp_terraform_plugin_framework_tfsdk.Attribute{"allowed_https_hostnames": { - Description: "a list of hostnames allowed for https client redirect URLs", - Optional: true, - Type: github_com_hashicorp_terraform_plugin_framework_types.ListType{ElemType: github_com_hashicorp_terraform_plugin_framework_types.StringType}, - }}), + Attributes: github_com_hashicorp_terraform_plugin_framework_tfsdk.SingleNestedAttributes(map[string]github_com_hashicorp_terraform_plugin_framework_tfsdk.Attribute{ + "allowed_https_hostnames": { + Description: "a list of hostnames allowed for https client redirect URLs", + Optional: true, + Type: github_com_hashicorp_terraform_plugin_framework_types.ListType{ElemType: github_com_hashicorp_terraform_plugin_framework_types.StringType}, + }, + "insecure_allowed_cidr_ranges": { + Description: "a list of CIDRs allowed for HTTP or HTTPS client redirect URLs", + Optional: true, + Type: github_com_hashicorp_terraform_plugin_framework_types.ListType{ElemType: github_com_hashicorp_terraform_plugin_framework_types.StringType}, + }, + }), Description: "ClientRedirectSettings defines which client redirect URLs are allowed for non-browser SSO logins other than the standard localhost ones.", Optional: true, }, @@ -27925,6 +27946,33 @@ func CopyOIDCConnectorV3FromTerraform(_ context.Context, tf github_com_hashicorp } } } + { + a, ok := tf.Attrs["insecure_allowed_cidr_ranges"] + if !ok { + diags.Append(attrReadMissingDiag{"OIDCConnectorV3.Spec.ClientRedirectSettings.insecure_allowed_cidr_ranges"}) + } else { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.List) + if !ok { + diags.Append(attrReadConversionFailureDiag{"OIDCConnectorV3.Spec.ClientRedirectSettings.insecure_allowed_cidr_ranges", "github.com/hashicorp/terraform-plugin-framework/types.List"}) + } else { + obj.InsecureAllowedCidrRanges = make([]string, len(v.Elems)) + if !v.Null && !v.Unknown { + for k, a := range v.Elems { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + diags.Append(attrReadConversionFailureDiag{"OIDCConnectorV3.Spec.ClientRedirectSettings.insecure_allowed_cidr_ranges", "github_com_hashicorp_terraform_plugin_framework_types.String"}) + } else { + var t string + if !v.Null && !v.Unknown { + t = string(v.Value) + } + obj.InsecureAllowedCidrRanges[k] = t + } + } + } + } + } + } } } } @@ -28813,6 +28861,59 @@ func CopyOIDCConnectorV3ToTerraform(ctx context.Context, obj *github_com_gravita } } } + { + a, ok := tf.AttrTypes["insecure_allowed_cidr_ranges"] + if !ok { + diags.Append(attrWriteMissingDiag{"OIDCConnectorV3.Spec.ClientRedirectSettings.insecure_allowed_cidr_ranges"}) + } else { + o, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.ListType) + if !ok { + diags.Append(attrWriteConversionFailureDiag{"OIDCConnectorV3.Spec.ClientRedirectSettings.insecure_allowed_cidr_ranges", "github.com/hashicorp/terraform-plugin-framework/types.ListType"}) + } else { + c, ok := tf.Attrs["insecure_allowed_cidr_ranges"].(github_com_hashicorp_terraform_plugin_framework_types.List) + if !ok { + c = github_com_hashicorp_terraform_plugin_framework_types.List{ + + ElemType: o.ElemType, + Elems: make([]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(obj.InsecureAllowedCidrRanges)), + Null: true, + } + } else { + if c.Elems == nil { + c.Elems = make([]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(obj.InsecureAllowedCidrRanges)) + } + } + if obj.InsecureAllowedCidrRanges != nil { + t := o.ElemType + if len(obj.InsecureAllowedCidrRanges) != len(c.Elems) { + c.Elems = make([]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(obj.InsecureAllowedCidrRanges)) + } + for k, a := range obj.InsecureAllowedCidrRanges { + v, ok := tf.Attrs["insecure_allowed_cidr_ranges"].(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + i, err := t.ValueFromTerraform(ctx, github_com_hashicorp_terraform_plugin_go_tftypes.NewValue(t.TerraformType(ctx), nil)) + if err != nil { + diags.Append(attrWriteGeneralError{"OIDCConnectorV3.Spec.ClientRedirectSettings.insecure_allowed_cidr_ranges", err}) + } + v, ok = i.(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + diags.Append(attrWriteConversionFailureDiag{"OIDCConnectorV3.Spec.ClientRedirectSettings.insecure_allowed_cidr_ranges", "github.com/hashicorp/terraform-plugin-framework/types.String"}) + } + v.Null = string(a) == "" + } + v.Value = string(a) + v.Unknown = false + c.Elems[k] = v + } + if len(obj.InsecureAllowedCidrRanges) > 0 { + c.Null = false + } + } + c.Unknown = false + tf.Attrs["insecure_allowed_cidr_ranges"] = c + } + } + } } v.Unknown = false tf.Attrs["client_redirect_settings"] = v @@ -29446,6 +29547,33 @@ func CopySAMLConnectorV2FromTerraform(_ context.Context, tf github_com_hashicorp } } } + { + a, ok := tf.Attrs["insecure_allowed_cidr_ranges"] + if !ok { + diags.Append(attrReadMissingDiag{"SAMLConnectorV2.Spec.ClientRedirectSettings.insecure_allowed_cidr_ranges"}) + } else { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.List) + if !ok { + diags.Append(attrReadConversionFailureDiag{"SAMLConnectorV2.Spec.ClientRedirectSettings.insecure_allowed_cidr_ranges", "github.com/hashicorp/terraform-plugin-framework/types.List"}) + } else { + obj.InsecureAllowedCidrRanges = make([]string, len(v.Elems)) + if !v.Null && !v.Unknown { + for k, a := range v.Elems { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + diags.Append(attrReadConversionFailureDiag{"SAMLConnectorV2.Spec.ClientRedirectSettings.insecure_allowed_cidr_ranges", "github_com_hashicorp_terraform_plugin_framework_types.String"}) + } else { + var t string + if !v.Null && !v.Unknown { + t = string(v.Value) + } + obj.InsecureAllowedCidrRanges[k] = t + } + } + } + } + } + } } } } @@ -30393,6 +30521,59 @@ func CopySAMLConnectorV2ToTerraform(ctx context.Context, obj *github_com_gravita } } } + { + a, ok := tf.AttrTypes["insecure_allowed_cidr_ranges"] + if !ok { + diags.Append(attrWriteMissingDiag{"SAMLConnectorV2.Spec.ClientRedirectSettings.insecure_allowed_cidr_ranges"}) + } else { + o, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.ListType) + if !ok { + diags.Append(attrWriteConversionFailureDiag{"SAMLConnectorV2.Spec.ClientRedirectSettings.insecure_allowed_cidr_ranges", "github.com/hashicorp/terraform-plugin-framework/types.ListType"}) + } else { + c, ok := tf.Attrs["insecure_allowed_cidr_ranges"].(github_com_hashicorp_terraform_plugin_framework_types.List) + if !ok { + c = github_com_hashicorp_terraform_plugin_framework_types.List{ + + ElemType: o.ElemType, + Elems: make([]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(obj.InsecureAllowedCidrRanges)), + Null: true, + } + } else { + if c.Elems == nil { + c.Elems = make([]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(obj.InsecureAllowedCidrRanges)) + } + } + if obj.InsecureAllowedCidrRanges != nil { + t := o.ElemType + if len(obj.InsecureAllowedCidrRanges) != len(c.Elems) { + c.Elems = make([]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(obj.InsecureAllowedCidrRanges)) + } + for k, a := range obj.InsecureAllowedCidrRanges { + v, ok := tf.Attrs["insecure_allowed_cidr_ranges"].(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + i, err := t.ValueFromTerraform(ctx, github_com_hashicorp_terraform_plugin_go_tftypes.NewValue(t.TerraformType(ctx), nil)) + if err != nil { + diags.Append(attrWriteGeneralError{"SAMLConnectorV2.Spec.ClientRedirectSettings.insecure_allowed_cidr_ranges", err}) + } + v, ok = i.(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + diags.Append(attrWriteConversionFailureDiag{"SAMLConnectorV2.Spec.ClientRedirectSettings.insecure_allowed_cidr_ranges", "github.com/hashicorp/terraform-plugin-framework/types.String"}) + } + v.Null = string(a) == "" + } + v.Value = string(a) + v.Unknown = false + c.Elems[k] = v + } + if len(obj.InsecureAllowedCidrRanges) > 0 { + c.Null = false + } + } + c.Unknown = false + tf.Attrs["insecure_allowed_cidr_ranges"] = c + } + } + } } v.Unknown = false tf.Attrs["client_redirect_settings"] = v @@ -31002,6 +31183,33 @@ func CopyGithubConnectorV3FromTerraform(_ context.Context, tf github_com_hashico } } } + { + a, ok := tf.Attrs["insecure_allowed_cidr_ranges"] + if !ok { + diags.Append(attrReadMissingDiag{"GithubConnectorV3.Spec.ClientRedirectSettings.insecure_allowed_cidr_ranges"}) + } else { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.List) + if !ok { + diags.Append(attrReadConversionFailureDiag{"GithubConnectorV3.Spec.ClientRedirectSettings.insecure_allowed_cidr_ranges", "github.com/hashicorp/terraform-plugin-framework/types.List"}) + } else { + obj.InsecureAllowedCidrRanges = make([]string, len(v.Elems)) + if !v.Null && !v.Unknown { + for k, a := range v.Elems { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + diags.Append(attrReadConversionFailureDiag{"GithubConnectorV3.Spec.ClientRedirectSettings.insecure_allowed_cidr_ranges", "github_com_hashicorp_terraform_plugin_framework_types.String"}) + } else { + var t string + if !v.Null && !v.Unknown { + t = string(v.Value) + } + obj.InsecureAllowedCidrRanges[k] = t + } + } + } + } + } + } } } } @@ -31929,6 +32137,59 @@ func CopyGithubConnectorV3ToTerraform(ctx context.Context, obj *github_com_gravi } } } + { + a, ok := tf.AttrTypes["insecure_allowed_cidr_ranges"] + if !ok { + diags.Append(attrWriteMissingDiag{"GithubConnectorV3.Spec.ClientRedirectSettings.insecure_allowed_cidr_ranges"}) + } else { + o, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.ListType) + if !ok { + diags.Append(attrWriteConversionFailureDiag{"GithubConnectorV3.Spec.ClientRedirectSettings.insecure_allowed_cidr_ranges", "github.com/hashicorp/terraform-plugin-framework/types.ListType"}) + } else { + c, ok := tf.Attrs["insecure_allowed_cidr_ranges"].(github_com_hashicorp_terraform_plugin_framework_types.List) + if !ok { + c = github_com_hashicorp_terraform_plugin_framework_types.List{ + + ElemType: o.ElemType, + Elems: make([]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(obj.InsecureAllowedCidrRanges)), + Null: true, + } + } else { + if c.Elems == nil { + c.Elems = make([]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(obj.InsecureAllowedCidrRanges)) + } + } + if obj.InsecureAllowedCidrRanges != nil { + t := o.ElemType + if len(obj.InsecureAllowedCidrRanges) != len(c.Elems) { + c.Elems = make([]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(obj.InsecureAllowedCidrRanges)) + } + for k, a := range obj.InsecureAllowedCidrRanges { + v, ok := tf.Attrs["insecure_allowed_cidr_ranges"].(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + i, err := t.ValueFromTerraform(ctx, github_com_hashicorp_terraform_plugin_go_tftypes.NewValue(t.TerraformType(ctx), nil)) + if err != nil { + diags.Append(attrWriteGeneralError{"GithubConnectorV3.Spec.ClientRedirectSettings.insecure_allowed_cidr_ranges", err}) + } + v, ok = i.(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + diags.Append(attrWriteConversionFailureDiag{"GithubConnectorV3.Spec.ClientRedirectSettings.insecure_allowed_cidr_ranges", "github.com/hashicorp/terraform-plugin-framework/types.String"}) + } + v.Null = string(a) == "" + } + v.Value = string(a) + v.Unknown = false + c.Elems[k] = v + } + if len(obj.InsecureAllowedCidrRanges) > 0 { + c.Null = false + } + } + c.Unknown = false + tf.Attrs["insecure_allowed_cidr_ranges"] = c + } + } + } } v.Unknown = false tf.Attrs["client_redirect_settings"] = v diff --git a/lib/auth/github.go b/lib/auth/github.go index ea1fdf0c13013..dc679f234615c 100644 --- a/lib/auth/github.go +++ b/lib/auth/github.go @@ -24,8 +24,11 @@ import ( "errors" "fmt" "io" + "log/slog" "net/http" + "net/netip" "net/url" + "slices" "strings" "time" @@ -909,6 +912,8 @@ func (a *Server) createGithubUser(ctx context.Context, p *CreateUserParams, dryR return user, nil } +const unknownRedirectHostnameErrMsg = "unknown custom client redirect URL hostname" + // ValidateClientRedirect checks a desktop client redirect URL for SSO logins // against some (potentially nil) settings from an auth connector; in the // current implementation, that means either "http" schema with a hostname of @@ -916,7 +921,10 @@ func (a *Server) createGithubUser(ctx context.Context, p *CreateUserParams, dryR // or "https" schema with a hostname that matches one in the https_hostname // list, a path of "/callback" and either an empty port or explicitly 443. The // settings are ignored and only localhost URLs are allowed if we're using an -// ephemeral connector (in the SSO testing flow). +// ephemeral connector (in the SSO testing flow). If the insecure_allowed_cidr_ranges +// list is non-empty URLs in both the "http" and "https" schema are allowed +// if the hostname is an IP address that is contained in a specified CIDR +// range on any port. func ValidateClientRedirect(clientRedirect string, ssoTestFlow bool, settings *types.SSOClientRedirectSettings) error { if clientRedirect == "" { // empty redirects are non-functional and harmless, so we allow them as @@ -946,45 +954,61 @@ func ValidateClientRedirect(clientRedirect string, ssoTestFlow bool, settings *t } // we checked everything but u.Scheme and u.Host now - - switch u.Scheme { - default: + if u.Scheme != "http" && u.Scheme != "https" { return trace.BadParameter("invalid scheme in client redirect URL") + } - case "http": - switch u.Hostname() { - default: - return trace.BadParameter("invalid hostname in client redirect URL") - case "localhost", "127.0.0.1", "::1": - return nil - } + // allow HTTP redirects to local addresses + allowedHTTPLocalAddrs := []string{"localhost", "127.0.0.1", "::1"} + if u.Scheme == "http" && slices.Contains(allowedHTTPLocalAddrs, u.Hostname()) { + return nil + } + + if ssoTestFlow { + return trace.AccessDenied("custom client redirect URLs are not allowed in SSO test") + } + + if settings == nil { + return trace.AccessDenied(unknownRedirectHostnameErrMsg) + } + + // allow HTTP or HTTPS redirects from IPs in specified CIDR ranges + hostIP, err := netip.ParseAddr(u.Hostname()) + if err == nil { + hostIP = hostIP.Unmap() - case "https": - if ssoTestFlow { - return trace.AccessDenied("custom client redirect URLs are not allowed in SSO test") + for _, cidrStr := range settings.InsecureAllowedCidrRanges { + cidr, err := netip.ParsePrefix(cidrStr) + if err != nil { + slog.WarnContext(context.Background(), "error parsing OIDC connector CIDR prefix", "cidr", cidrStr, "err", err) + continue + } + if cidr.Contains(hostIP) { + return nil + } } + } + if u.Scheme == "https" { switch u.Port() { default: return trace.BadParameter("invalid port in client redirect URL") case "", "443": } - var allowedHostnames []string - if settings != nil { - allowedHostnames = settings.AllowedHttpsHostnames - } - - ok, err := utils.SliceMatchesRegex(u.Hostname(), allowedHostnames) - if err != nil { - return trace.Wrap(err, "matching custom client redirect URL hostname") - } - if !ok { - return trace.AccessDenied("unknown custom client redirect URL hostname") + for _, expression := range settings.AllowedHttpsHostnames { + ok, err := utils.MatchString(u.Hostname(), expression) + if err != nil { + slog.WarnContext(context.Background(), "error compiling OIDC connector allowed HTTPS hostname regex", "regex", expression, "err", err) + continue + } + if ok { + return nil + } } - - return nil } + + return trace.AccessDenied(unknownRedirectHostnameErrMsg) } // populateGithubClaims builds a GithubClaims using queried diff --git a/lib/auth/github_test.go b/lib/auth/github_test.go index c06d771d76f37..26e059c18d2d9 100644 --- a/lib/auth/github_test.go +++ b/lib/auth/github_test.go @@ -643,6 +643,9 @@ func TestValidateClientRedirect(t *testing.T) { "https://127.0.0.1:12345/callback", "https://localhost:12345/callback", "https://localhost/callback", + "ftp://localhost/callback", + "ftp://127.0.0.1/callback", + "ftp://[::1]/callback", } { const ssoTestFlowFalse = false var defaultSettings *types.SSOClientRedirectSettings @@ -699,6 +702,60 @@ func TestValidateClientRedirect(t *testing.T) { } }) + t.Run("InsecureAllowedCidrRanges", func(t *testing.T) { + for _, goodURL := range []string{ + "http://192.168.0.27/callback", + "https://192.168.0.27/callback", + "http://192.168.0.27:1337/callback", + "https://192.168.0.27:1337/callback", + "http://[2001:db8::aaaa:bbbb]/callback", + "https://[2001:db8::aaaa:bbbb]/callback", + "http://[2001:db8::aaaa:bbbb]:1337/callback", + "https://[2001:db8::aaaa:bbbb]:1337/callback", + "http://[2001:db8::1]/callback", + "https://[2001:db8::1]/callback", + "http://[2001:db8::1]:1337/callback", + "https://[2001:db8::1]:1337/callback", + } { + const ssoTestFlowFalse = false + settings := &types.SSOClientRedirectSettings{ + InsecureAllowedCidrRanges: []string{ + "192.168.0.0/24", + "2001:db8::/96", + }, + } + require.NoError(t, ValidateClientRedirect(goodURL+"?secret_key=", ssoTestFlowFalse, settings)) + } + + for _, badURL := range []string{ + "http://192.168.1.1/callback", + "https://192.168.1.1/callback", + "http://192.168.1.1:80/callback", + "https://192.168.1.1:443/callback", + "http://[2001:db8::1:aaaa:bbbb]/callback", + "https://[2001:db8::1:aaaa:bbbb]/callback", + "http://[2001:db8::1:aaaa:bbbb]:80/callback", + "https://[2001:db8::1:aaaa:bbbb]:443/callback", + "http://[2001:db9::]/callback", + "https://[2001:db9::]/callback", + "http://not.an.ip/callback", + "https://not.an.ip/callback", + "http://192.168.0.27/nocallback", + "https://192.168.0.27/nocallback", + "http://[2001:db8::1]/notacallback", + "https://[2001:db8::1]/notacallback", + } { + const ssoTestFlowFalse = false + settings := &types.SSOClientRedirectSettings{ + InsecureAllowedCidrRanges: []string{ + "192.168.0.0/24", + "2001:db8::/96", + }, + } + require.Error(t, ValidateClientRedirect(badURL+"?secret_key=", ssoTestFlowFalse, settings)) + } + }) + t.Run("SSOTestFlow", func(t *testing.T) { for _, goodURL := range []string{ "http://127.0.0.1:12345/callback", diff --git a/lib/client/redirect.go b/lib/client/redirect.go index 04d1ce6b1b94f..1e88f4b1cde6e 100644 --- a/lib/client/redirect.go +++ b/lib/client/redirect.go @@ -135,7 +135,12 @@ func NewRedirector(ctx context.Context, login SSHLoginSSO, config *RedirectorCon if err != nil { return nil, trace.Wrap(err) } - callbackURL.Scheme = "https" + // Default to HTTPS if no scheme is specified. + // This will allow users to specify an insecure HTTP URL but + // the backend will verify if the callback URL is allowed. + if callbackURL.Scheme == "" { + callbackURL.Scheme = "https" + } callbackAddr = callbackURL.String() } diff --git a/lib/services/local/users.go b/lib/services/local/users.go index 8bf7a74b62b68..505e1abdb2034 100644 --- a/lib/services/local/users.go +++ b/lib/services/local/users.go @@ -1246,6 +1246,9 @@ func (s *IdentityService) GetMFADevices(ctx context.Context, user string, withSe // UpsertOIDCConnector upserts OIDC Connector func (s *IdentityService) UpsertOIDCConnector(ctx context.Context, connector types.OIDCConnector) (types.OIDCConnector, error) { + if err := connector.Validate(); err != nil { + return nil, trace.Wrap(err) + } rev := connector.GetRevision() value, err := services.MarshalOIDCConnector(connector) if err != nil { @@ -1267,6 +1270,9 @@ func (s *IdentityService) UpsertOIDCConnector(ctx context.Context, connector typ // CreateOIDCConnector creates a new OIDC connector. func (s *IdentityService) CreateOIDCConnector(ctx context.Context, connector types.OIDCConnector) (types.OIDCConnector, error) { + if err := connector.Validate(); err != nil { + return nil, trace.Wrap(err) + } value, err := services.MarshalOIDCConnector(connector) if err != nil { return nil, trace.Wrap(err) @@ -1286,6 +1292,9 @@ func (s *IdentityService) CreateOIDCConnector(ctx context.Context, connector typ // UpdateOIDCConnector updates an existing OIDC connector. func (s *IdentityService) UpdateOIDCConnector(ctx context.Context, connector types.OIDCConnector) (types.OIDCConnector, error) { + if err := connector.Validate(); err != nil { + return nil, trace.Wrap(err) + } value, err := services.MarshalOIDCConnector(connector) if err != nil { return nil, trace.Wrap(err) From 81aa12afe7ba1d428f1ffb2e2a3cc69ac3ca4dbc Mon Sep 17 00:00:00 2001 From: Zac Bergquist Date: Tue, 30 Jul 2024 20:04:44 -0600 Subject: [PATCH 023/139] Fix code with old Apache 2 license (#44842) Teleport OSS is licensed under AGPLv3 as of Teleport 15. See https://goteleport.com/blog/teleport-oss-switches-to-agpl-v3/ --- lib/auth/kubewaitingcontainer/service.go | 22 +++++++------ lib/auth/kubewaitingcontainer/service_test.go | 22 +++++++------ .../notifications/notificationsv1/service.go | 22 +++++++------ .../databaseobject/databaseobject_test.go | 22 +++++++------ .../common/databaseobjectimportrule/create.go | 22 +++++++------ .../databaseobjectimportrule/create_test.go | 22 +++++++------ lib/srv/db/postgres/schema.go | 22 +++++++------ lib/srv/desktop/rdp/rdpclient/src/client.rs | 22 +++++++------ .../rdp/rdpclient/src/client/global.rs | 22 +++++++------ .../rdp/rdpclient/src/rdpdr/filesystem.rs | 22 +++++++------ .../desktop/rdp/rdpclient/src/rdpdr/tdp.rs | 22 +++++++------ lib/srv/desktop/rdp/rdpclient/src/ssl.rs | 32 +++++++++---------- lib/srv/discovery/config_test.go | 30 ++++++++--------- .../apiserver/handler/time_converter.go | 30 ++++++++--------- .../apiserver/handler/time_converter_test.go | 30 ++++++++--------- lib/teleterm/daemon/mfaprompt.go | 22 +++++++------ lib/utils/diagnostics/latency/monitor.go | 22 +++++++------ lib/utils/diagnostics/latency/monitor_test.go | 22 +++++++------ tool/tsh/common/play.go | 30 ++++++++--------- .../AssumeStartTime/AssumeStartTime.story.tsx | 22 +++++++------ .../RequestCheckout/AdditionalOptions.tsx | 22 +++++++------ .../NewRequest/RequestCheckout/utils.ts | 22 +++++++------ .../components/AccessRequests/Shared/utils.ts | 22 +++++++------ .../LatencyDiagnostic.test.tsx | 22 +++++++------ .../LatencyDiagnostic/LatencyDiagnostic.tsx | 28 ++++++++-------- .../components/LatencyDiagnostic/index.ts | 28 ++++++++-------- .../shared/utils/advancedSearchLabelQuery.ts | 22 +++++++------ .../LabelsInput/LabelsInput.story.tsx | 22 +++++++------ .../src/services/discovery/discovery.ts | 22 +++++++------ .../teleport/src/services/discovery/index.ts | 22 +++++++------ .../teleport/src/services/discovery/types.ts | 22 +++++++------ 31 files changed, 393 insertions(+), 343 deletions(-) diff --git a/lib/auth/kubewaitingcontainer/service.go b/lib/auth/kubewaitingcontainer/service.go index a40229b9b5dcb..579ccccd00dde 100644 --- a/lib/auth/kubewaitingcontainer/service.go +++ b/lib/auth/kubewaitingcontainer/service.go @@ -1,16 +1,18 @@ -// Copyright 2024 Gravitational, Inc. +// Teleport +// Copyright (C) 2024 Gravitational, Inc. // -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // -// http://www.apache.org/licenses/LICENSE-2.0 +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. // -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . package kubewaitingcontainer diff --git a/lib/auth/kubewaitingcontainer/service_test.go b/lib/auth/kubewaitingcontainer/service_test.go index 1477afb5dfa9f..958ea577c0cb2 100644 --- a/lib/auth/kubewaitingcontainer/service_test.go +++ b/lib/auth/kubewaitingcontainer/service_test.go @@ -1,16 +1,18 @@ -// Copyright 2024 Gravitational, Inc. +// Teleport +// Copyright (C) 2024 Gravitational, Inc. // -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // -// http://www.apache.org/licenses/LICENSE-2.0 +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. // -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . package kubewaitingcontainer diff --git a/lib/auth/notifications/notificationsv1/service.go b/lib/auth/notifications/notificationsv1/service.go index b6b16b39be896..d62976f59d145 100644 --- a/lib/auth/notifications/notificationsv1/service.go +++ b/lib/auth/notifications/notificationsv1/service.go @@ -1,16 +1,18 @@ -// Copyright 2024 Gravitational, Inc. +// Teleport +// Copyright (C) 2024 Gravitational, Inc. // -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // -// http://www.apache.org/licenses/LICENSE-2.0 +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. // -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . package notifications diff --git a/lib/srv/db/common/databaseobject/databaseobject_test.go b/lib/srv/db/common/databaseobject/databaseobject_test.go index 60c250f630461..a622de56b991e 100644 --- a/lib/srv/db/common/databaseobject/databaseobject_test.go +++ b/lib/srv/db/common/databaseobject/databaseobject_test.go @@ -1,16 +1,18 @@ -// Copyright 2024 Gravitational, Inc. +// Teleport +// Copyright (C) 2024 Gravitational, Inc. // -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // -// http://www.apache.org/licenses/LICENSE-2.0 +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. // -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . package databaseobject diff --git a/lib/srv/db/common/databaseobjectimportrule/create.go b/lib/srv/db/common/databaseobjectimportrule/create.go index 5dfb56595c671..5f2bff26fe545 100644 --- a/lib/srv/db/common/databaseobjectimportrule/create.go +++ b/lib/srv/db/common/databaseobjectimportrule/create.go @@ -1,16 +1,18 @@ -// Copyright 2024 Gravitational, Inc. +// Teleport +// Copyright (C) 2024 Gravitational, Inc. // -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // -// http://www.apache.org/licenses/LICENSE-2.0 +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. // -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . package databaseobjectimportrule diff --git a/lib/srv/db/common/databaseobjectimportrule/create_test.go b/lib/srv/db/common/databaseobjectimportrule/create_test.go index 8253fbb7a0c4c..e3bb591eb011d 100644 --- a/lib/srv/db/common/databaseobjectimportrule/create_test.go +++ b/lib/srv/db/common/databaseobjectimportrule/create_test.go @@ -1,16 +1,18 @@ -// Copyright 2024 Gravitational, Inc. +// Teleport +// Copyright (C) 2024 Gravitational, Inc. // -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // -// http://www.apache.org/licenses/LICENSE-2.0 +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. // -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . package databaseobjectimportrule diff --git a/lib/srv/db/postgres/schema.go b/lib/srv/db/postgres/schema.go index 4712d764f923a..00ba7fd23292e 100644 --- a/lib/srv/db/postgres/schema.go +++ b/lib/srv/db/postgres/schema.go @@ -1,16 +1,18 @@ -// Copyright 2023 Gravitational, Inc +// Teleport +// Copyright (C) 2024 Gravitational, Inc. // -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // -// http://www.apache.org/licenses/LICENSE-2.0 +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. // -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . package postgres diff --git a/lib/srv/desktop/rdp/rdpclient/src/client.rs b/lib/srv/desktop/rdp/rdpclient/src/client.rs index d2b62a3978bb3..70dce95aa1e88 100644 --- a/lib/srv/desktop/rdp/rdpclient/src/client.rs +++ b/lib/srv/desktop/rdp/rdpclient/src/client.rs @@ -1,16 +1,18 @@ -// Copyright 2023 Gravitational, Inc +// Teleport +// Copyright (C) 2024 Gravitational, Inc. // -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // -// http://www.apache.org/licenses/LICENSE-2.0 +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. // -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . pub mod global; diff --git a/lib/srv/desktop/rdp/rdpclient/src/client/global.rs b/lib/srv/desktop/rdp/rdpclient/src/client/global.rs index 380e53e5c1767..c1ed2ba291fa6 100644 --- a/lib/srv/desktop/rdp/rdpclient/src/client/global.rs +++ b/lib/srv/desktop/rdp/rdpclient/src/client/global.rs @@ -1,16 +1,18 @@ -// Copyright 2023 Gravitational, Inc +// Teleport +// Copyright (C) 2024 Gravitational, Inc. // -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // -// http://www.apache.org/licenses/LICENSE-2.0 +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. // -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . //! This module contains static structures which are used in common by all //! desktop sessions on a given windows_desktop_service. diff --git a/lib/srv/desktop/rdp/rdpclient/src/rdpdr/filesystem.rs b/lib/srv/desktop/rdp/rdpclient/src/rdpdr/filesystem.rs index 5a1bc3e09b393..5210a704252e3 100644 --- a/lib/srv/desktop/rdp/rdpclient/src/rdpdr/filesystem.rs +++ b/lib/srv/desktop/rdp/rdpclient/src/rdpdr/filesystem.rs @@ -1,16 +1,18 @@ -// Copyright 2023 Gravitational, Inc +// Teleport +// Copyright (C) 2024 Gravitational, Inc. // -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // -// http://www.apache.org/licenses/LICENSE-2.0 +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. // -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . use super::{ path::UnixPath, diff --git a/lib/srv/desktop/rdp/rdpclient/src/rdpdr/tdp.rs b/lib/srv/desktop/rdp/rdpclient/src/rdpdr/tdp.rs index e146dbe2fcb0e..4cc1f32dec8f3 100644 --- a/lib/srv/desktop/rdp/rdpclient/src/rdpdr/tdp.rs +++ b/lib/srv/desktop/rdp/rdpclient/src/rdpdr/tdp.rs @@ -1,16 +1,18 @@ -// Copyright 2023 Gravitational, Inc +// Teleport +// Copyright (C) 2024 Gravitational, Inc. // -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // -// http://www.apache.org/licenses/LICENSE-2.0 +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. // -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . use super::{filesystem::FileCacheObject, path::UnixPath}; use crate::{ diff --git a/lib/srv/desktop/rdp/rdpclient/src/ssl.rs b/lib/srv/desktop/rdp/rdpclient/src/ssl.rs index 55fd39c6fabe8..76db641a525f5 100644 --- a/lib/srv/desktop/rdp/rdpclient/src/ssl.rs +++ b/lib/srv/desktop/rdp/rdpclient/src/ssl.rs @@ -1,20 +1,18 @@ -/* - * - * Copyright 2021 Gravitational, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * / - */ +// Teleport +// Copyright (C) 2024 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . use crate::client::{ClientError, ClientResult}; #[cfg(feature = "fips")] diff --git a/lib/srv/discovery/config_test.go b/lib/srv/discovery/config_test.go index 2801e8c1f1736..9e96d5f087c4f 100644 --- a/lib/srv/discovery/config_test.go +++ b/lib/srv/discovery/config_test.go @@ -1,18 +1,18 @@ -/* -Copyright 2024 Gravitational, Inc. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ +// Teleport +// Copyright (C) 2024 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . package discovery diff --git a/lib/teleterm/apiserver/handler/time_converter.go b/lib/teleterm/apiserver/handler/time_converter.go index 550c0ebf037e1..6bf0cd60ed16f 100644 --- a/lib/teleterm/apiserver/handler/time_converter.go +++ b/lib/teleterm/apiserver/handler/time_converter.go @@ -1,18 +1,18 @@ -/** - * Copyright 2024 Gravitational, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +// Teleport +// Copyright (C) 2024 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . package handler diff --git a/lib/teleterm/apiserver/handler/time_converter_test.go b/lib/teleterm/apiserver/handler/time_converter_test.go index 1e6215b7f8beb..f0eee31041d42 100644 --- a/lib/teleterm/apiserver/handler/time_converter_test.go +++ b/lib/teleterm/apiserver/handler/time_converter_test.go @@ -1,18 +1,18 @@ -/** - * Copyright 2024 Gravitational, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +// Teleport +// Copyright (C) 2024 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . package handler diff --git a/lib/teleterm/daemon/mfaprompt.go b/lib/teleterm/daemon/mfaprompt.go index 5a797c21f39e1..82404ea5d5010 100644 --- a/lib/teleterm/daemon/mfaprompt.go +++ b/lib/teleterm/daemon/mfaprompt.go @@ -1,16 +1,18 @@ -// Copyright 2023 Gravitational, Inc +// Teleport +// Copyright (C) 2024 Gravitational, Inc. // -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // -// http://www.apache.org/licenses/LICENSE-2.0 +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. // -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . package daemon diff --git a/lib/utils/diagnostics/latency/monitor.go b/lib/utils/diagnostics/latency/monitor.go index f5a5fa8ca01d4..392607e3dfbfd 100644 --- a/lib/utils/diagnostics/latency/monitor.go +++ b/lib/utils/diagnostics/latency/monitor.go @@ -1,16 +1,18 @@ -// Copyright 2023 Gravitational, Inc +// Teleport +// Copyright (C) 2024 Gravitational, Inc. // -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // -// http://www.apache.org/licenses/LICENSE-2.0 +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. // -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . package latency diff --git a/lib/utils/diagnostics/latency/monitor_test.go b/lib/utils/diagnostics/latency/monitor_test.go index a14c29998d2dd..85089d4e21313 100644 --- a/lib/utils/diagnostics/latency/monitor_test.go +++ b/lib/utils/diagnostics/latency/monitor_test.go @@ -1,16 +1,18 @@ -// Copyright 2023 Gravitational, Inc +// Teleport +// Copyright (C) 2024 Gravitational, Inc. // -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // -// http://www.apache.org/licenses/LICENSE-2.0 +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. // -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . package latency diff --git a/tool/tsh/common/play.go b/tool/tsh/common/play.go index 0c78b17fd412f..67614b161bb07 100644 --- a/tool/tsh/common/play.go +++ b/tool/tsh/common/play.go @@ -1,18 +1,18 @@ -/* -Copyright 2016-2023 Gravitational, Inc. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ +// Teleport +// Copyright (C) 2024 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . package common diff --git a/web/packages/shared/components/AccessRequests/AssumeStartTime/AssumeStartTime.story.tsx b/web/packages/shared/components/AccessRequests/AssumeStartTime/AssumeStartTime.story.tsx index 5c217cc9cb7f8..473e297cbae70 100644 --- a/web/packages/shared/components/AccessRequests/AssumeStartTime/AssumeStartTime.story.tsx +++ b/web/packages/shared/components/AccessRequests/AssumeStartTime/AssumeStartTime.story.tsx @@ -1,17 +1,19 @@ /** - * Copyright 2023 Gravitational, Inc. + * Teleport + * Copyright (C) 2024 Gravitational, Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ import React, { useState } from 'react'; diff --git a/web/packages/shared/components/AccessRequests/NewRequest/RequestCheckout/AdditionalOptions.tsx b/web/packages/shared/components/AccessRequests/NewRequest/RequestCheckout/AdditionalOptions.tsx index de9cde3487d6a..7d97bc9084136 100644 --- a/web/packages/shared/components/AccessRequests/NewRequest/RequestCheckout/AdditionalOptions.tsx +++ b/web/packages/shared/components/AccessRequests/NewRequest/RequestCheckout/AdditionalOptions.tsx @@ -1,17 +1,19 @@ /** - * Copyright 2024 Gravitational, Inc. + * Teleport + * Copyright (C) 2024 Gravitational, Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ import React, { useState } from 'react'; diff --git a/web/packages/shared/components/AccessRequests/NewRequest/RequestCheckout/utils.ts b/web/packages/shared/components/AccessRequests/NewRequest/RequestCheckout/utils.ts index 6fda2a2aee9b0..9fe62cdcabd70 100644 --- a/web/packages/shared/components/AccessRequests/NewRequest/RequestCheckout/utils.ts +++ b/web/packages/shared/components/AccessRequests/NewRequest/RequestCheckout/utils.ts @@ -1,17 +1,19 @@ /** - * Copyright 2024 Gravitational, Inc. + * Teleport + * Copyright (C) 2024 Gravitational, Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ import { addHours, addDays, isAfter } from 'date-fns'; diff --git a/web/packages/shared/components/AccessRequests/Shared/utils.ts b/web/packages/shared/components/AccessRequests/Shared/utils.ts index 8fe3dd818d6be..99536746726b3 100644 --- a/web/packages/shared/components/AccessRequests/Shared/utils.ts +++ b/web/packages/shared/components/AccessRequests/Shared/utils.ts @@ -1,17 +1,19 @@ /** - * Copyright 2024 Gravitational, Inc. + * Teleport + * Copyright (C) 2024 Gravitational, Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ import { formatDuration, intervalToDuration } from 'date-fns'; diff --git a/web/packages/shared/components/LatencyDiagnostic/LatencyDiagnostic.test.tsx b/web/packages/shared/components/LatencyDiagnostic/LatencyDiagnostic.test.tsx index 0029c15af8314..426e45c61650d 100644 --- a/web/packages/shared/components/LatencyDiagnostic/LatencyDiagnostic.test.tsx +++ b/web/packages/shared/components/LatencyDiagnostic/LatencyDiagnostic.test.tsx @@ -1,17 +1,19 @@ /** - * Copyright 2023 Gravitational, Inc + * Teleport + * Copyright (C) 2024 Gravitational, Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ import { diff --git a/web/packages/shared/components/LatencyDiagnostic/LatencyDiagnostic.tsx b/web/packages/shared/components/LatencyDiagnostic/LatencyDiagnostic.tsx index 6b76c9236d2dc..cd30ba6d90f75 100644 --- a/web/packages/shared/components/LatencyDiagnostic/LatencyDiagnostic.tsx +++ b/web/packages/shared/components/LatencyDiagnostic/LatencyDiagnostic.tsx @@ -1,17 +1,19 @@ /** - Copyright 2023 Gravitational, Inc. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ import styled from 'styled-components'; diff --git a/web/packages/shared/components/LatencyDiagnostic/index.ts b/web/packages/shared/components/LatencyDiagnostic/index.ts index 36b33f959b217..518ca5ac530f6 100644 --- a/web/packages/shared/components/LatencyDiagnostic/index.ts +++ b/web/packages/shared/components/LatencyDiagnostic/index.ts @@ -1,17 +1,19 @@ /** - Copyright 2023 Gravitational, Inc. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ export * from './LatencyDiagnostic'; diff --git a/web/packages/shared/utils/advancedSearchLabelQuery.ts b/web/packages/shared/utils/advancedSearchLabelQuery.ts index 94bba698183da..12e7ef643c82b 100644 --- a/web/packages/shared/utils/advancedSearchLabelQuery.ts +++ b/web/packages/shared/utils/advancedSearchLabelQuery.ts @@ -1,17 +1,19 @@ /** - * Copyright 2023 Gravitational, Inc + * Teleport + * Copyright (C) 2024 Gravitational, Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ export function makeAdvancedSearchQueryForLabel( diff --git a/web/packages/teleport/src/components/LabelsInput/LabelsInput.story.tsx b/web/packages/teleport/src/components/LabelsInput/LabelsInput.story.tsx index f90c7797165fe..c0e5f0af893f7 100644 --- a/web/packages/teleport/src/components/LabelsInput/LabelsInput.story.tsx +++ b/web/packages/teleport/src/components/LabelsInput/LabelsInput.story.tsx @@ -1,17 +1,19 @@ /** - * Copyright 2024 Gravitational, Inc. + * Teleport + * Copyright (C) 2024 Gravitational, Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ import React, { useState } from 'react'; diff --git a/web/packages/teleport/src/services/discovery/discovery.ts b/web/packages/teleport/src/services/discovery/discovery.ts index 38a497080dde6..bef90e31971c3 100644 --- a/web/packages/teleport/src/services/discovery/discovery.ts +++ b/web/packages/teleport/src/services/discovery/discovery.ts @@ -1,17 +1,19 @@ /** - * Copyright 2023 Gravitational, Inc. + * Teleport + * Copyright (C) 2024 Gravitational, Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ import api from 'teleport/services/api'; diff --git a/web/packages/teleport/src/services/discovery/index.ts b/web/packages/teleport/src/services/discovery/index.ts index 948b825b4d062..67db3acf751bb 100644 --- a/web/packages/teleport/src/services/discovery/index.ts +++ b/web/packages/teleport/src/services/discovery/index.ts @@ -1,17 +1,19 @@ /** - * Copyright 2023 Gravitational, Inc. + * Teleport + * Copyright (C) 2024 Gravitational, Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ export * from './discovery'; diff --git a/web/packages/teleport/src/services/discovery/types.ts b/web/packages/teleport/src/services/discovery/types.ts index 70a82daf03a7e..de90d04c2cd39 100644 --- a/web/packages/teleport/src/services/discovery/types.ts +++ b/web/packages/teleport/src/services/discovery/types.ts @@ -1,17 +1,19 @@ /** - * Copyright 2023 Gravitational, Inc. + * Teleport + * Copyright (C) 2024 Gravitational, Inc. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ import { Regions } from '../integrations'; From b29f53c7bc68fc45722de1566dcb0c7ebcb94db2 Mon Sep 17 00:00:00 2001 From: Roman Tkachenko Date: Wed, 31 Jul 2024 02:52:31 -0700 Subject: [PATCH 024/139] [v16] Auto Discover Server must not overwrite manual changes (#44848) * Auto Discover Server must not overwrite manual changes This PR changes the flow so that only discover managed installations might have their teleport.yaml configuration replaced. * Update lib/srv/server/installer/autodiscover.go Co-authored-by: Ryan Clark * Update lib/srv/server/installer/autodiscover.go Co-authored-by: Roman Tkachenko * Update lib/srv/server/installer/autodiscover.go --------- Co-authored-by: Marco Dinis Co-authored-by: Ryan Clark Co-authored-by: Gavin Frazar --- lib/srv/server/installer/autodiscover.go | 32 ++++ lib/srv/server/installer/autodiscover_test.go | 156 +++++++++++++++++- 2 files changed, 187 insertions(+), 1 deletion(-) diff --git a/lib/srv/server/installer/autodiscover.go b/lib/srv/server/installer/autodiscover.go index 287677b3aa68b..a9b8901127972 100644 --- a/lib/srv/server/installer/autodiscover.go +++ b/lib/srv/server/installer/autodiscover.go @@ -52,6 +52,13 @@ import ( "github.com/gravitational/teleport/lib/utils/packagemanager" ) +const ( + discoverNotice = "" + + "Teleport Discover has successfully configured /etc/teleport.yaml for this server to join the cluster.\n" + + "Discover might replace the configuration if the server fails to join the cluster.\n" + + "Please remove this file if you are managing this instance using another tool or doing so manually.\n" +) + // AutoDiscoverNodeInstallerConfig installs and configures a Teleport Server into the current system. type AutoDiscoverNodeInstallerConfig struct { Logger *slog.Logger @@ -312,6 +319,7 @@ func (ani *AutoDiscoverNodeInstaller) configureTeleportNode(ctx context.Context, _ = os.Remove(teleportYamlConfigurationPathNew) }() + discoverNoticeFile := teleportYamlConfigurationPath + ".discover" // Check if file already exists and has the same content that we are about to write if _, err := os.Stat(teleportYamlConfigurationPath); err == nil { hashExistingFile, err := checksum(teleportYamlConfigurationPath) @@ -325,14 +333,38 @@ func (ani *AutoDiscoverNodeInstaller) configureTeleportNode(ctx context.Context, } if hashExistingFile == hashNewFile { + if err := os.WriteFile(discoverNoticeFile, []byte(discoverNotice), 0o644); err != nil { + return trace.Wrap(err) + } + return trace.AlreadyExists("teleport.yaml is up to date") } + + // If a previous /etc/teleport.yaml configuration file exists and is different from the target one, it might be because one of the following reasons: + // - discover installation params (eg token name) were changed + // - `$ teleport node configure` command produces a different output + // - teleport was manually installed / configured + // + // For the first two scenarios, it's fine, and even desired in most cases, to restart teleport with the new configuration. + // + // However, for the last scenario (teleport was manually installed), this flow must not replace the currently running teleport service configuration. + // To prevent this, this flow checks for the existence of the discover notice file, and only allows replacement if it does exist. + if _, err := os.Stat(discoverNoticeFile); err != nil { + ani.Logger.InfoContext(ctx, "Refusing to replace the existing teleport configuration. For the script to replace the existing configuration remove the Teleport configuration.", + "teleport_configuration", teleportYamlConfigurationPath, + "discover_notice_file", discoverNoticeFile) + return trace.BadParameter("missing discover notice file") + } } if err := os.Rename(teleportYamlConfigurationPathNew, teleportYamlConfigurationPath); err != nil { return trace.Wrap(err) } + if err := os.WriteFile(discoverNoticeFile, []byte(discoverNotice), 0o644); err != nil { + return trace.Wrap(err) + } + return nil } diff --git a/lib/srv/server/installer/autodiscover_test.go b/lib/srv/server/installer/autodiscover_test.go index 5d36a036e1db6..0d02cb918f2cf 100644 --- a/lib/srv/server/installer/autodiscover_test.go +++ b/lib/srv/server/installer/autodiscover_test.go @@ -201,6 +201,8 @@ func TestAutoDiscoverNode(t *testing.T) { for binName, mockBin := range mockBins { require.True(t, mockBin.Check(t), "mismatch between expected invocations and actual calls for %q", binName) } + require.FileExists(t, testTempDir+"/etc/teleport.yaml") + require.FileExists(t, testTempDir+"/etc/teleport.yaml.discover") }) } } @@ -277,6 +279,8 @@ func TestAutoDiscoverNode(t *testing.T) { for binName, mockBin := range mockBins { require.True(t, mockBin.Check(t), "mismatch between expected invocations and actual calls for %q", binName) } + require.FileExists(t, testTempDir+"/etc/teleport.yaml") + require.FileExists(t, testTempDir+"/etc/teleport.yaml.discover") }) t.Run("fails when imds server is not available", func(t *testing.T) { @@ -314,9 +318,11 @@ func TestAutoDiscoverNode(t *testing.T) { for binName, mockBin := range mockBins { require.True(t, mockBin.Check(t), "mismatch between expected invocations and actual calls for %q", binName) } + require.NoFileExists(t, testTempDir+"/etc/teleport.yaml") + require.NoFileExists(t, testTempDir+"/etc/teleport.yaml.discover") }) - t.Run("reconfigures and restarts if target teleport.yaml is different", func(t *testing.T) { + t.Run("reconfigures and restarts if target teleport.yaml is different and discover file exists", func(t *testing.T) { distroConfig := wellKnownOS["ubuntu"]["24.04"] testTempDir := t.TempDir() @@ -345,6 +351,8 @@ func TestAutoDiscoverNode(t *testing.T) { // create an existing teleport.yaml configuration file require.NoError(t, os.WriteFile(testTempDir+"/etc/teleport.yaml", []byte("has wrong config"), 0o644)) + // create a teleport.yaml.discover to indicate that this host is controlled by the discover flow + require.NoError(t, os.WriteFile(testTempDir+"/etc/teleport.yaml.discover", []byte(""), 0o644)) // package manager is not called in this scenario because teleport binary already exists in the system require.FileExists(t, mockBins["teleport"].Path) @@ -374,11 +382,72 @@ func TestAutoDiscoverNode(t *testing.T) { require.NoFileExists(t, testTempDir+"/etc/teleport.yaml.new") require.FileExists(t, testTempDir+"/etc/teleport.yaml") + require.FileExists(t, testTempDir+"/etc/teleport.yaml.discover") bs, err := os.ReadFile(testTempDir + "/etc/teleport.yaml") require.NoError(t, err) require.Equal(t, "teleport.yaml configuration bytes", string(bs)) }) + t.Run("does not reconfigure if teleport.yaml exists but discover file does not exists", func(t *testing.T) { + distroConfig := wellKnownOS["ubuntu"]["24.04"] + + testTempDir := t.TempDir() + + setupDirsForTest(t, testTempDir, distroConfig) + + installerConfig := &AutoDiscoverNodeInstallerConfig{ + RepositoryChannel: "stable/rolling", + AutoUpgrades: false, + ProxyPublicAddr: "proxy.example.com", + TeleportPackage: "teleport", + TokenName: "my-token", + AzureClientID: "azure-client-id", + + fsRootPrefix: testTempDir, + imdsProviders: mockIMDSProviders, + binariesLocation: binariesLocation, + aptPublicKeyEndpoint: mockRepoKeys.URL, + } + + teleportInstaller, err := NewAutoDiscoverNodeInstaller(installerConfig) + require.NoError(t, err) + + // package manager is not called in this scenario because teleport binary already exists in the system + require.FileExists(t, mockBins["teleport"].Path) + + // create an existing teleport.yaml configuration file + require.NoError(t, os.WriteFile(testTempDir+"/etc/teleport.yaml", []byte("has wrong config"), 0o644)) + + // package manager is not called in this scenario because teleport binary already exists in the system + require.FileExists(t, mockBins["teleport"].Path) + + mockBins["teleport"].Expect("node", + "configure", + "--output=file://"+testTempDir+"/etc/teleport.yaml.new", + "--proxy=proxy.example.com", + "--join-method=azure", + "--token=my-token", + "--labels=teleport.internal/region=eastus,teleport.internal/resource-group=TestGroup,teleport.internal/subscription-id=5187AF11-3581-4AB6-A654-59405CD40C44,teleport.internal/vm-id=ED7DAC09-6E73-447F-BD18-AF4D1196C1E4", + "--azure-client-id=azure-client-id", + ).AndCallFunc(func(c *bintest.Call) { + // create a teleport.yaml configuration file + require.NoError(t, os.WriteFile(testTempDir+"/etc/teleport.yaml.new", []byte("teleport.yaml configuration bytes"), 0o644)) + c.Exit(0) + }) + + require.ErrorContains(t, teleportInstaller.Install(ctx), "missing discover notice file") + + for binName, mockBin := range mockBins { + require.True(t, mockBin.Check(t), "mismatch between expected invocations and actual calls for %q", binName) + } + + require.NoFileExists(t, testTempDir+"/etc/teleport.yaml.new") + require.FileExists(t, testTempDir+"/etc/teleport.yaml") + bs, err := os.ReadFile(testTempDir + "/etc/teleport.yaml") + require.NoError(t, err) + require.Equal(t, "has wrong config", string(bs)) + }) + t.Run("does nothing if teleport is already installed and target teleport.yaml configuration already exists", func(t *testing.T) { distroName := "ubuntu" distroVersion := "24.04" @@ -440,6 +509,91 @@ func TestAutoDiscoverNode(t *testing.T) { require.NoError(t, err) require.Equal(t, "teleport.yaml configuration bytes", string(bs)) }) + + t.Run("does nothing if target teleport.yaml configuration exists but was manually created/edited", func(t *testing.T) { + distroName := "ubuntu" + distroVersion := "24.04" + distroConfig := wellKnownOS[distroName][distroVersion] + + testTempDir := t.TempDir() + + setupDirsForTest(t, testTempDir, distroConfig) + + installerConfig := &AutoDiscoverNodeInstallerConfig{ + RepositoryChannel: "stable/rolling", + AutoUpgrades: false, + ProxyPublicAddr: "proxy.example.com", + TeleportPackage: "teleport", + TokenName: "my-token", + AzureClientID: "azure-client-id", + + fsRootPrefix: testTempDir, + imdsProviders: mockIMDSProviders, + binariesLocation: binariesLocation, + aptPublicKeyEndpoint: mockRepoKeys.URL, + } + + teleportInstaller, err := NewAutoDiscoverNodeInstaller(installerConfig) + require.NoError(t, err) + + // package manager is not called in this scenario because teleport binary already exists in the system + require.FileExists(t, mockBins["teleport"].Path) + + // create an existing teleport.yaml configuration file + require.NoError(t, os.WriteFile(testTempDir+"/etc/teleport.yaml", []byte("teleport.yaml bytes"), 0o644)) + + // package manager is not called in this scenario because teleport binary already exists in the system + require.FileExists(t, mockBins["teleport"].Path) + + mockBins["teleport"].Expect("node", + "configure", + "--output=file://"+testTempDir+"/etc/teleport.yaml.new", + "--proxy=proxy.example.com", + "--join-method=azure", + "--token=my-token", + "--labels=teleport.internal/region=eastus,teleport.internal/resource-group=TestGroup,teleport.internal/subscription-id=5187AF11-3581-4AB6-A654-59405CD40C44,teleport.internal/vm-id=ED7DAC09-6E73-447F-BD18-AF4D1196C1E4", + "--azure-client-id=azure-client-id", + ).AndCallFunc(func(c *bintest.Call) { + // create a teleport.yaml configuration file + require.NoError(t, os.WriteFile(testTempDir+"/etc/teleport.yaml.new", []byte("teleport.yaml configuration bytes"), 0o644)) + c.Exit(0) + }) + + require.ErrorContains(t, teleportInstaller.Install(ctx), "missing discover notice file") + + for binName, mockBin := range mockBins { + require.True(t, mockBin.Check(t), "mismatch between expected invocations and actual calls for %q", binName) + } + + t.Run("even if it runs multiple times", func(t *testing.T) { + + // create an existing teleport.yaml configuration file + require.NoError(t, os.WriteFile(testTempDir+"/etc/teleport.yaml", []byte("manual configuration already exists"), 0o644)) + + // package manager is not called in this scenario because teleport binary already exists in the system + require.FileExists(t, mockBins["teleport"].Path) + + mockBins["teleport"].Expect("node", + "configure", + "--output=file://"+testTempDir+"/etc/teleport.yaml.new", + "--proxy=proxy.example.com", + "--join-method=azure", + "--token=my-token", + "--labels=teleport.internal/region=eastus,teleport.internal/resource-group=TestGroup,teleport.internal/subscription-id=5187AF11-3581-4AB6-A654-59405CD40C44,teleport.internal/vm-id=ED7DAC09-6E73-447F-BD18-AF4D1196C1E4", + "--azure-client-id=azure-client-id", + ).AndCallFunc(func(c *bintest.Call) { + // create a teleport.yaml configuration file + require.NoError(t, os.WriteFile(testTempDir+"/etc/teleport.yaml.new", []byte("teleport.yaml configuration bytes"), 0o644)) + c.Exit(0) + }) + + require.ErrorContains(t, teleportInstaller.Install(ctx), "missing discover notice file") + + for binName, mockBin := range mockBins { + require.True(t, mockBin.Check(t), "mismatch between expected invocations and actual calls for %q", binName) + } + }) + }) } // wellKnownOS lists the officially supported repositories for Linux Distros From 38ed5f24411a25be9c35f18e655557fb5fbea993 Mon Sep 17 00:00:00 2001 From: Steven Martin Date: Wed, 31 Jul 2024 06:39:01 -0400 Subject: [PATCH 025/139] [v16] update plugin command descriptions (#44830) * update plugin command descriptions * verbiage update for logging plugin clean up Co-authored-by: Zac Bergquist --------- Co-authored-by: Steven Martin Co-authored-by: Zac Bergquist --- tool/tctl/common/plugin/okta.go | 2 +- tool/tctl/common/plugin/plugins_command.go | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tool/tctl/common/plugin/okta.go b/tool/tctl/common/plugin/okta.go index 75c5bcb2e7c7c..e63ee8a512610 100644 --- a/tool/tctl/common/plugin/okta.go +++ b/tool/tctl/common/plugin/okta.go @@ -34,7 +34,7 @@ import ( ) func (p *PluginsCommand) initInstallOkta(parent *kingpin.CmdClause) { - p.install.okta.cmd = parent.Command("okta", "Install an okta integration") + p.install.okta.cmd = parent.Command("okta", "Install an Okta integration.") p.install.okta.cmd. Flag("name", "Name of the plugin resource to create"). Default("okta"). diff --git a/tool/tctl/common/plugin/plugins_command.go b/tool/tctl/common/plugin/plugins_command.go index 56bebe1a655f9..ba6c92f7ae5a9 100644 --- a/tool/tctl/common/plugin/plugins_command.go +++ b/tool/tctl/common/plugin/plugins_command.go @@ -86,7 +86,7 @@ func (p *PluginsCommand) Initialize(app *kingpin.Application, config *servicecfg pluginsCommand := app.Command("plugins", "Manage Teleport plugins.").Hidden() p.cleanupCmd = pluginsCommand.Command("cleanup", "Cleans up the given plugin type.") - p.cleanupCmd.Arg("type", "The type of plugin to cleanup. Only supports okta at present.").Required().EnumVar(&p.pluginType, string(types.PluginTypeOkta)) + p.cleanupCmd.Arg("type", "The type of plugin to clean up. Only supports Okta at present.").Required().EnumVar(&p.pluginType, string(types.PluginTypeOkta)) p.cleanupCmd.Flag("dry-run", "Dry run the cleanup command. Dry run defaults to on.").Default("true").BoolVar(&p.dryRun) p.initInstall(pluginsCommand, config) @@ -101,7 +101,7 @@ func (p *PluginsCommand) initInstall(parent *kingpin.CmdClause, config *servicec } func (p *PluginsCommand) initInstallSCIM(parent *kingpin.CmdClause) { - p.install.scim.cmd = p.install.cmd.Command("scim", "Install a new SCIM integration") + p.install.scim.cmd = p.install.cmd.Command("scim", "Install a new SCIM integration.") p.install.scim.cmd. Flag("name", "The name of the SCIM plugin resource to create"). Default("scim"). @@ -130,7 +130,7 @@ func (p *PluginsCommand) initInstallSCIM(parent *kingpin.CmdClause) { } func (p *PluginsCommand) initDelete(parent *kingpin.CmdClause) { - p.delete.cmd = parent.Command("delete", "Remove a plugin instance") + p.delete.cmd = parent.Command("delete", "Remove a plugin instance.") p.delete.cmd. Arg("name", "The name of the SCIM plugin resource to delete"). StringVar(&p.delete.name) From d0858d18d2cd8300b85c52892eac1e92671a396d Mon Sep 17 00:00:00 2001 From: Zac Bergquist Date: Wed, 31 Jul 2024 07:42:00 -0600 Subject: [PATCH 026/139] Remove some dead Rust code (#44852) --- lib/srv/desktop/rdp/rdpclient/src/client/global.rs | 4 ++-- lib/srv/desktop/rdp/rdpclient/src/lib.rs | 13 ------------- 2 files changed, 2 insertions(+), 15 deletions(-) diff --git a/lib/srv/desktop/rdp/rdpclient/src/client/global.rs b/lib/srv/desktop/rdp/rdpclient/src/client/global.rs index c1ed2ba291fa6..65051237d7670 100644 --- a/lib/srv/desktop/rdp/rdpclient/src/client/global.rs +++ b/lib/srv/desktop/rdp/rdpclient/src/client/global.rs @@ -29,8 +29,8 @@ //! managed by Go). //! //! In practice this primarily means ensuring that any such global, static -//! structures that might be accessed directly by a call from go are [`Send`] -//! + [`Sync`] and thus are only mutated when locked. See [`assert_send_sync`] +//! structures that might be accessed directly by a call from go are `Send + Sync` +//! and thus are only mutated when locked. See `assert_send_sync` //! below for an example of how this is enforced. use super::ClientHandle; diff --git a/lib/srv/desktop/rdp/rdpclient/src/lib.rs b/lib/srv/desktop/rdp/rdpclient/src/lib.rs index 845e3355813e4..08f79ee9f13ad 100644 --- a/lib/srv/desktop/rdp/rdpclient/src/lib.rs +++ b/lib/srv/desktop/rdp/rdpclient/src/lib.rs @@ -486,19 +486,6 @@ pub enum CGODisconnectCode { DisconnectCodeServer = 2, } -#[repr(C)] -pub struct CGOReadRdpOutputReturns { - user_message: *const c_char, - disconnect_code: CGODisconnectCode, - err_code: CGOErrCode, -} - -#[repr(C)] -pub struct CGOClientOrError { - client: u64, - err: CGOErrCode, -} - /// CGOMousePointerEvent is a CGO-compatible version of PointerEvent that we pass back to Go. /// PointerEvent is a mouse move or click update from the user. #[repr(C)] From 8dd9836b59afe7525afdd2e3022388e95803fc40 Mon Sep 17 00:00:00 2001 From: Zac Bergquist Date: Wed, 31 Jul 2024 08:02:00 -0600 Subject: [PATCH 027/139] docs: add instructions for uninstalling the Windows auth package (#44781) --- .../enroll-resources/desktop-access/getting-started.mdx | 4 ++++ docs/pages/includes/uninstall-windows-auth.mdx | 8 ++++++++ docs/pages/management/admin/uninstall-teleport.mdx | 3 ++- 3 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 docs/pages/includes/uninstall-windows-auth.mdx diff --git a/docs/pages/enroll-resources/desktop-access/getting-started.mdx b/docs/pages/enroll-resources/desktop-access/getting-started.mdx index 9aeee4468fdbf..040bb796e51f9 100644 --- a/docs/pages/enroll-resources/desktop-access/getting-started.mdx +++ b/docs/pages/enroll-resources/desktop-access/getting-started.mdx @@ -285,6 +285,10 @@ Windows login to use for the connection. To view the recording, select **Management** in the Teleport Web UI, then click **Session Recordings** in the Activity section. +## Uninstall + +(!docs/pages/includes/uninstall-windows-auth.mdx!) + ## Next steps For more general information about how to create, assign, and update roles, see [Access Controls diff --git a/docs/pages/includes/uninstall-windows-auth.mdx b/docs/pages/includes/uninstall-windows-auth.mdx new file mode 100644 index 0000000000000..76e1ed1d8cf2e --- /dev/null +++ b/docs/pages/includes/uninstall-windows-auth.mdx @@ -0,0 +1,8 @@ +If you are using Teleport's Windows auth package to provide passwordless logins for local users, +you can remove it by running the setup program from an administrative command prompt: + +``` +> teleport-windows-auth-setup.exe uninstall +``` + +A reboot is necessary after the uninstall completes in order to fully remove the package. diff --git a/docs/pages/management/admin/uninstall-teleport.mdx b/docs/pages/management/admin/uninstall-teleport.mdx index 52531ec9ff59c..30dc2a7ebd304 100644 --- a/docs/pages/management/admin/uninstall-teleport.mdx +++ b/docs/pages/management/admin/uninstall-teleport.mdx @@ -152,7 +152,6 @@ Follow the instructions for your Linux distribution: - ### macOS @@ -187,6 +186,8 @@ Follow the instructions for your Linux distribution: ``` (!docs/pages/includes/uninstall-teleport-connect-windows.mdx!) +(!docs/pages/includes/uninstall-windows-auth.mdx!) + ## Step 3/3. Remove Teleport data and configuration files From a3a81178253d48e5ac9a4031a4d8c9cfb10cc44e Mon Sep 17 00:00:00 2001 From: Steven Martin Date: Wed, 31 Jul 2024 10:51:40 -0400 Subject: [PATCH 028/139] [v16] docs: fix Okta integration link (#44865) * docs: fix Okta integration link * docs: verbiage update for okta integration Co-authored-by: Zac Bergquist --------- Co-authored-by: Zac Bergquist --- .../access-controls/teleport-policy/policy-integrations.mdx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/pages/access-controls/teleport-policy/policy-integrations.mdx b/docs/pages/access-controls/teleport-policy/policy-integrations.mdx index b8ff579c55cae..007f2d1a02fda 100644 --- a/docs/pages/access-controls/teleport-policy/policy-integrations.mdx +++ b/docs/pages/access-controls/teleport-policy/policy-integrations.mdx @@ -67,7 +67,8 @@ spec: The preset `editor` role has the required permissions by default. -Teleport can also import and grant access to resources from an Okta organizations, such as user profiles, groups and applications. You can view connection data in Access Graph. Follow the steps here to add an (../../enroll-resources/application-access/okta/hosted-guide.mdx) in your cluster. +Teleport can also import and grant access to resources from Okta organizations, such as user profiles, groups and applications. You can view connection data in Access Graph. Follow the steps here to add an [Okta +integration](../../enroll-resources/application-access/okta/hosted-guide.mdx) in your cluster. ## Next steps - Explore [connections and resource paths](./policy-connections.mdx) with Teleport Policy. From 7d8ab70d1cfbcb669ef6ead894ee5ef3b3cdd69b Mon Sep 17 00:00:00 2001 From: Sakshyam Shah Date: Wed, 31 Jul 2024 11:15:35 -0400 Subject: [PATCH 029/139] [v16] refactor: export getContentSecurityPolicyString (#44816) * refactor: export getContentSecurityPolicyString * export CSPMap type --- lib/httplib/httpheaders.go | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/lib/httplib/httpheaders.go b/lib/httplib/httpheaders.go index b5f6ff9cae464..2c1d500980c3c 100644 --- a/lib/httplib/httpheaders.go +++ b/lib/httplib/httpheaders.go @@ -62,9 +62,10 @@ func newCSPCache() *cspCache { } } -type cspMap map[string][]string +// CSPMap holds a map of Content Security Policy. +type CSPMap map[string][]string -var defaultContentSecurityPolicy = cspMap{ +var defaultContentSecurityPolicy = CSPMap{ "default-src": {"'self'"}, "script-src": {"'self'"}, // specify CSP directives not covered by `default-src` @@ -77,24 +78,24 @@ var defaultContentSecurityPolicy = cspMap{ "style-src": {"'self'", "'unsafe-inline'"}, } -var defaultFontSrc = cspMap{"font-src": {"'self'", "data:"}} -var defaultConnectSrc = cspMap{"connect-src": {"'self'", "wss:"}} +var defaultFontSrc = CSPMap{"font-src": {"'self'", "data:"}} +var defaultConnectSrc = CSPMap{"connect-src": {"'self'", "wss:"}} -var stripeSecurityPolicy = cspMap{ +var stripeSecurityPolicy = CSPMap{ // auto-pay plans in Cloud use stripe.com to manage billing information "script-src": {"https://js.stripe.com"}, "frame-src": {"https://js.stripe.com"}, } -var wasmSecurityPolicy = cspMap{ +var wasmSecurityPolicy = CSPMap{ "script-src": {"'self'", "'wasm-unsafe-eval'"}, } // combineCSPMaps combines multiple CSP maps into a single map. -// When multiple of the input cspMaps have the same key, their +// When multiple of the input CSPMap have the same key, their // respective lists are concatenated. -func combineCSPMaps(cspMaps ...cspMap) cspMap { - combinedMap := make(cspMap) +func combineCSPMaps(cspMaps ...CSPMap) CSPMap { + combinedMap := make(CSPMap) for _, cspMap := range cspMaps { for key, value := range cspMap { @@ -106,11 +107,11 @@ func combineCSPMaps(cspMaps ...cspMap) cspMap { return combinedMap } -// getContentSecurityPolicyString combines multiple CSP maps into a single +// GetContentSecurityPolicyString combines multiple CSP maps into a single // CSP string, alphabetically sorted by the directive key. // When multiple of the input cspMaps have the same key, their // respective lists are concatenated. -func getContentSecurityPolicyString(cspMaps ...cspMap) string { +func GetContentSecurityPolicyString(cspMaps ...CSPMap) string { combined := combineCSPMaps(cspMaps...) keys := make([]string, 0, len(combined)) @@ -175,8 +176,8 @@ func SetDefaultSecurityHeaders(h http.Header) { h.Set("Strict-Transport-Security", "max-age=31536000; includeSubDomains") } -func getIndexContentSecurityPolicy(withStripe, withWasm bool) cspMap { - cspMaps := []cspMap{defaultContentSecurityPolicy, defaultFontSrc, defaultConnectSrc} +func getIndexContentSecurityPolicy(withStripe, withWasm bool) CSPMap { + cspMaps := []CSPMap{defaultContentSecurityPolicy, defaultFontSrc, defaultConnectSrc} if withStripe { cspMaps = append(cspMaps, stripeSecurityPolicy) @@ -209,7 +210,7 @@ func getIndexContentSecurityPolicyString(cfg proto.Features, urlPath string) str // Nothing found in cache, calculate regex and result withWasm := desktopSessionRe.MatchString(urlPath) || recordingRe.MatchString(urlPath) - cspString := getContentSecurityPolicyString( + cspString := GetContentSecurityPolicyString( getIndexContentSecurityPolicy(withStripe, withWasm), ) // Add result to cache @@ -231,9 +232,9 @@ func getRedirectPageContentSecurityPolicyString(scriptSrc string) string { return cspString } - cspString := getContentSecurityPolicyString( + cspString := GetContentSecurityPolicyString( defaultContentSecurityPolicy, - cspMap{ + CSPMap{ "script-src": {"'" + scriptSrc + "'"}, }, ) From 806b00ed7a87ecb77183c1b2400f69f5617be615 Mon Sep 17 00:00:00 2001 From: Roman Tkachenko Date: Wed, 31 Jul 2024 09:51:17 -0700 Subject: [PATCH 030/139] Release 16.1.1 (#44881) --- CHANGELOG.md | 43 ++++++++++++ Makefile | 2 +- api/version.go | 2 +- .../macos/tsh/tsh.app/Contents/Info.plist | 4 +- .../macos/tshdev/tsh.app/Contents/Info.plist | 4 +- docs/cspell.json | 7 +- examples/chart/access/discord/Chart.yaml | 2 +- .../__snapshot__/configmap_test.yaml.snap | 4 +- .../__snapshot__/deployment_test.yaml.snap | 8 +-- examples/chart/access/email/Chart.yaml | 2 +- .../__snapshot__/configmap_test.yaml.snap | 24 +++---- .../__snapshot__/deployment_test.yaml.snap | 58 ++++++++-------- examples/chart/access/jira/Chart.yaml | 2 +- .../__snapshot__/configmap_test.yaml.snap | 4 +- .../__snapshot__/deployment_test.yaml.snap | 8 +-- examples/chart/access/mattermost/Chart.yaml | 2 +- .../__snapshot__/configmap_test.yaml.snap | 4 +- .../__snapshot__/deployment_test.yaml.snap | 28 ++++---- examples/chart/access/msteams/Chart.yaml | 2 +- .../__snapshot__/configmap_test.yaml.snap | 4 +- .../__snapshot__/deployment_test.yaml.snap | 8 +-- examples/chart/access/pagerduty/Chart.yaml | 2 +- .../__snapshot__/configmap_test.yaml.snap | 4 +- .../__snapshot__/deployment_test.yaml.snap | 8 +-- examples/chart/access/slack/Chart.yaml | 2 +- .../__snapshot__/configmap_test.yaml.snap | 4 +- .../__snapshot__/deployment_test.yaml.snap | 8 +-- examples/chart/event-handler/Chart.yaml | 2 +- .../__snapshot__/configmap_test.yaml.snap | 4 +- .../__snapshot__/deployment_test.yaml.snap | 6 +- examples/chart/teleport-cluster/Chart.yaml | 2 +- .../charts/teleport-operator/Chart.yaml | 2 +- .../auth_clusterrole_test.yaml.snap | 4 +- .../__snapshot__/auth_config_test.yaml.snap | 4 +- .../auth_deployment_test.yaml.snap | 8 +-- .../__snapshot__/proxy_config_test.yaml.snap | 4 +- .../proxy_deployment_test.yaml.snap | 36 +++++----- examples/chart/teleport-kube-agent/Chart.yaml | 2 +- .../__snapshot__/deployment_test.yaml.snap | 60 ++++++++--------- .../tests/__snapshot__/job_test.yaml.snap | 8 +-- .../__snapshot__/statefulset_test.yaml.snap | 66 +++++++++---------- .../updater_deployment_test.yaml.snap | 4 +- 42 files changed, 254 insertions(+), 208 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 44907c3e89ff1..21e392418c643 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,48 @@ # Changelog +## 16.1.1 (07/31/24) + +* Added option to allow client redirects from IPs in specified CIDR ranges in SSO client logins. [#44846](https://github.com/gravitational/teleport/pull/44846) +* Machine ID can now be configured to use Kubernetes Secret destinations from the command line using the `kubernetes-secret` schema. [#44801](https://github.com/gravitational/teleport/pull/44801) +* Prevent discovery service from overwriting Teleport dynamic resources that have the same name as discovered resources. [#44785](https://github.com/gravitational/teleport/pull/44785) +* Reduced the probability that the event-handler deadlocks when encountering errors processing session recordings. [#44771](https://github.com/gravitational/teleport/pull/44771) +* Improved event-handler diagnostics by providing a way to capture profiles dynamically via `SIGUSR1`. [#44758](https://github.com/gravitational/teleport/pull/44758) +* Teleport Connect now uses ConPTY for better terminal resizing and accurate color rendering on Windows, with an option to disable it in the app config. [#44742](https://github.com/gravitational/teleport/pull/44742) +* Fixed event-handler Helm charts using the wrong command when starting the event-handler container. [#44697](https://github.com/gravitational/teleport/pull/44697) +* Improved stability of very large Teleport clusters during temporary backend disruption/degradation. [#44694](https://github.com/gravitational/teleport/pull/44694) +* Resolved compatibility issue with Paramiko and Machine ID's SSH multiplexer SSH agent. [#44673](https://github.com/gravitational/teleport/pull/44673) +* Teleport no longer creates invalid SAML Connectors when calling `tctl get saml/ | tctl create -f` without the `--with-secrets` flag. [#44666](https://github.com/gravitational/teleport/pull/44666) +* Fixed a fatal error in `tbot` when unable to lookup the user from a given UID in containerized environments for checking ACL configuration. [#44645](https://github.com/gravitational/teleport/pull/44645) +* Fixed Application Access regression where an HTTP header wasn't set in forwarded requests. [#44628](https://github.com/gravitational/teleport/pull/44628) +* Added Server auto-discovery support for Rocky and AlmaLinux distros. [#44612](https://github.com/gravitational/teleport/pull/44612) +* Use the registered port of the target host when `tsh puttyconfig` is invoked without `--port`. [#44572](https://github.com/gravitational/teleport/pull/44572) +* Added more icons for guessing application icon by name or by label `teleport.icon` in the web UI. [#44566](https://github.com/gravitational/teleport/pull/44566) +* Remove deprecated S3 bucket option when creating or editing AWS OIDC integration in the web UI. [#44485](https://github.com/gravitational/teleport/pull/44485) +* Fixed terminal sessions with a database CLI client in Teleport Connect hanging indefinitely if the client cannot be found. [#44465](https://github.com/gravitational/teleport/pull/44465) +* Added `application-tunnel` service to Machine ID for establishing a long-lived tunnel to a HTTP or TCP application for Machine to Machine access. [#44443](https://github.com/gravitational/teleport/pull/44443) +* Fixed a regression that caused Teleport Connect to fail to start on Intel Macs. [#44435](https://github.com/gravitational/teleport/pull/44435) +* Improved auto-discovery resiliency by recreating Teleport configuration when the node fails to join the cluster. [#44432](https://github.com/gravitational/teleport/pull/44432) +* Fixed a low-probability panic in audit event upload logic. [#44425](https://github.com/gravitational/teleport/pull/44425) +* Fixed Teleport Connect binaries not being signed correctly. [#44419](https://github.com/gravitational/teleport/pull/44419) +* Prevented DoSing the cluster during a mass failed join event by agents. [#44414](https://github.com/gravitational/teleport/pull/44414) +* The availability filter is now a toggle to show (or hide) requestable resources. [#44413](https://github.com/gravitational/teleport/pull/44413) +* Moved PostgreSQL auto provisioning users procedures to `pg_temp` schema. [#44409](https://github.com/gravitational/teleport/pull/44409) +* Added audit events for AWS and Azure integration resource actions. [#44403](https://github.com/gravitational/teleport/pull/44403) +* Fixed automatic updates with previous versions of the `teleport.yaml` config. [#44379](https://github.com/gravitational/teleport/pull/44379) +* Added support for Rocky and AlmaLinux when enrolling a new server from the UI. [#44332](https://github.com/gravitational/teleport/pull/44332) +* Fixed PostgreSQL session playback not rendering queries line breaks correctly. [#44315](https://github.com/gravitational/teleport/pull/44315) +* Fixed Teleport access plugin tarballs containing a `build` directory, which was accidentally added upon v16.0.0 release. [#44300](https://github.com/gravitational/teleport/pull/44300) +* Prevented an infinite loop in DynamoDB event querying by advancing the cursor to the next day when the limit is reached at the end of a day with an empty iterator. This ensures the cursor does not reset to the beginning of the day. [#44275](https://github.com/gravitational/teleport/pull/44275) +* The clipboard sharing tooltip for desktop sessions now indicates why clipboard sharing is disabled. [#44237](https://github.com/gravitational/teleport/pull/44237) +* Prevented redirects to arbitrary URLs when launching an app. [#44188](https://github.com/gravitational/teleport/pull/44188) +* Added a `--skip-idle-time` flag to `tsh play`. [#44013](https://github.com/gravitational/teleport/pull/44013) +* Added audit events for discovery config actions. [#43793](https://github.com/gravitational/teleport/pull/43793) +* Enabled Access Monitoring Rules routing with Mattermost plugin. [#43601](https://github.com/gravitational/teleport/pull/43601) +* SAML application can now be deleted from the Web UI. [#4778](https://github.com/gravitational/teleport.e/pull/4778) +* Fixed an Access List permission bug where an access list owner, who is also a member, was not able to add/remove access list member. [#4744](https://github.com/gravitational/teleport.e/pull/4744) +* Fixed a bug in Web UI where clicking SAML GCP Workforce Identity Federation discover tile would throw an error, preventing from using the guided enrollment feature. [#4720](https://github.com/gravitational/teleport.e/pull/4720) +* Fixed an issue with incorrect yum/zypper updater packages being installed. [#4684](https://github.com/gravitational/teleport.e/pull/4684) + ## 16.1.0 (07/15/24) ### New logo diff --git a/Makefile b/Makefile index 273e2738649cd..79d7ab7f399a9 100644 --- a/Makefile +++ b/Makefile @@ -11,7 +11,7 @@ # Stable releases: "1.0.0" # Pre-releases: "1.0.0-alpha.1", "1.0.0-beta.2", "1.0.0-rc.3" # Master/dev branch: "1.0.0-dev" -VERSION=16.1.0 +VERSION=16.1.1 DOCKER_IMAGE ?= teleport diff --git a/api/version.go b/api/version.go index dbdfbfb47adb7..cce1000fe32e5 100644 --- a/api/version.go +++ b/api/version.go @@ -3,6 +3,6 @@ package api import "github.com/coreos/go-semver/semver" -const Version = "16.1.0" +const Version = "16.1.1" var SemVersion = semver.New(Version) diff --git a/build.assets/macos/tsh/tsh.app/Contents/Info.plist b/build.assets/macos/tsh/tsh.app/Contents/Info.plist index 2b7afbd72fde2..2099b7d5b4dd0 100644 --- a/build.assets/macos/tsh/tsh.app/Contents/Info.plist +++ b/build.assets/macos/tsh/tsh.app/Contents/Info.plist @@ -19,13 +19,13 @@ CFBundlePackageType APPL CFBundleShortVersionString - 16.1.0 + 16.1.1 CFBundleSupportedPlatforms MacOSX CFBundleVersion - 16.1.0 + 16.1.1 DTCompiler com.apple.compilers.llvm.clang.1_0 DTPlatformBuild diff --git a/build.assets/macos/tshdev/tsh.app/Contents/Info.plist b/build.assets/macos/tshdev/tsh.app/Contents/Info.plist index 9959b89a2abe1..395d865a43253 100644 --- a/build.assets/macos/tshdev/tsh.app/Contents/Info.plist +++ b/build.assets/macos/tshdev/tsh.app/Contents/Info.plist @@ -17,13 +17,13 @@ CFBundlePackageType APPL CFBundleShortVersionString - 16.1.0 + 16.1.1 CFBundleSupportedPlatforms MacOSX CFBundleVersion - 16.1.0 + 16.1.1 DTCompiler com.apple.compilers.llvm.clang.1_0 DTPlatformBuild diff --git a/docs/cspell.json b/docs/cspell.json index ce8e71e5ad1d3..9d5fb1b66b94c 100644 --- a/docs/cspell.json +++ b/docs/cspell.json @@ -192,6 +192,7 @@ "SECURITYADMIN", "SIEM", "SIGINT", + "SIGUSR", "SLAVEOF", "SLES", "SLOWLOG", @@ -985,5 +986,7 @@ "flagWords": [ "hte" ], - "ignorePaths": ["**/reference/terraform-provider/**"] -} + "ignorePaths": [ + "**/reference/terraform-provider/**" + ] +} \ No newline at end of file diff --git a/examples/chart/access/discord/Chart.yaml b/examples/chart/access/discord/Chart.yaml index 11e09eacf7d07..05058430436c6 100644 --- a/examples/chart/access/discord/Chart.yaml +++ b/examples/chart/access/discord/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "16.1.0" +.version: &version "16.1.1" apiVersion: v2 name: teleport-plugin-discord diff --git a/examples/chart/access/discord/tests/__snapshot__/configmap_test.yaml.snap b/examples/chart/access/discord/tests/__snapshot__/configmap_test.yaml.snap index 13d96442bc257..6c8f40beb0f86 100644 --- a/examples/chart/access/discord/tests/__snapshot__/configmap_test.yaml.snap +++ b/examples/chart/access/discord/tests/__snapshot__/configmap_test.yaml.snap @@ -24,6 +24,6 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-discord - app.kubernetes.io/version: 16.1.0 - helm.sh/chart: teleport-plugin-discord-16.1.0 + app.kubernetes.io/version: 16.1.1 + helm.sh/chart: teleport-plugin-discord-16.1.1 name: RELEASE-NAME-teleport-plugin-discord diff --git a/examples/chart/access/discord/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/access/discord/tests/__snapshot__/deployment_test.yaml.snap index ca874d0ff6d62..6acb03d47c1ee 100644 --- a/examples/chart/access/discord/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/access/discord/tests/__snapshot__/deployment_test.yaml.snap @@ -7,8 +7,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-discord - app.kubernetes.io/version: 16.1.0 - helm.sh/chart: teleport-plugin-discord-16.1.0 + app.kubernetes.io/version: 16.1.1 + helm.sh/chart: teleport-plugin-discord-16.1.1 name: RELEASE-NAME-teleport-plugin-discord spec: replicas: 1 @@ -22,8 +22,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-discord - app.kubernetes.io/version: 16.1.0 - helm.sh/chart: teleport-plugin-discord-16.1.0 + app.kubernetes.io/version: 16.1.1 + helm.sh/chart: teleport-plugin-discord-16.1.1 spec: containers: - command: diff --git a/examples/chart/access/email/Chart.yaml b/examples/chart/access/email/Chart.yaml index a009c6b61dd1f..44f5e8ed15e72 100644 --- a/examples/chart/access/email/Chart.yaml +++ b/examples/chart/access/email/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "16.1.0" +.version: &version "16.1.1" apiVersion: v2 name: teleport-plugin-email diff --git a/examples/chart/access/email/tests/__snapshot__/configmap_test.yaml.snap b/examples/chart/access/email/tests/__snapshot__/configmap_test.yaml.snap index 88cf268fcb68d..2255d5ab19371 100644 --- a/examples/chart/access/email/tests/__snapshot__/configmap_test.yaml.snap +++ b/examples/chart/access/email/tests/__snapshot__/configmap_test.yaml.snap @@ -26,8 +26,8 @@ should match the snapshot (mailgun on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.0 - helm.sh/chart: teleport-plugin-email-16.1.0 + app.kubernetes.io/version: 16.1.1 + helm.sh/chart: teleport-plugin-email-16.1.1 name: RELEASE-NAME-teleport-plugin-email should match the snapshot (smtp on): 1: | @@ -59,8 +59,8 @@ should match the snapshot (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.0 - helm.sh/chart: teleport-plugin-email-16.1.0 + app.kubernetes.io/version: 16.1.1 + helm.sh/chart: teleport-plugin-email-16.1.1 name: RELEASE-NAME-teleport-plugin-email should match the snapshot (smtp on, no starttls): 1: | @@ -92,8 +92,8 @@ should match the snapshot (smtp on, no starttls): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.0 - helm.sh/chart: teleport-plugin-email-16.1.0 + app.kubernetes.io/version: 16.1.1 + helm.sh/chart: teleport-plugin-email-16.1.1 name: RELEASE-NAME-teleport-plugin-email should match the snapshot (smtp on, password file): 1: | @@ -125,8 +125,8 @@ should match the snapshot (smtp on, password file): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.0 - helm.sh/chart: teleport-plugin-email-16.1.0 + app.kubernetes.io/version: 16.1.1 + helm.sh/chart: teleport-plugin-email-16.1.1 name: RELEASE-NAME-teleport-plugin-email should match the snapshot (smtp on, roleToRecipients set): 1: | @@ -161,8 +161,8 @@ should match the snapshot (smtp on, roleToRecipients set): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.0 - helm.sh/chart: teleport-plugin-email-16.1.0 + app.kubernetes.io/version: 16.1.1 + helm.sh/chart: teleport-plugin-email-16.1.1 name: RELEASE-NAME-teleport-plugin-email should match the snapshot (smtp on, starttls disabled): 1: | @@ -194,6 +194,6 @@ should match the snapshot (smtp on, starttls disabled): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.0 - helm.sh/chart: teleport-plugin-email-16.1.0 + app.kubernetes.io/version: 16.1.1 + helm.sh/chart: teleport-plugin-email-16.1.1 name: RELEASE-NAME-teleport-plugin-email diff --git a/examples/chart/access/email/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/access/email/tests/__snapshot__/deployment_test.yaml.snap index 2b3c50e16a486..456bdc296fb77 100644 --- a/examples/chart/access/email/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/access/email/tests/__snapshot__/deployment_test.yaml.snap @@ -7,8 +7,8 @@ should be possible to override volume name (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.0 - helm.sh/chart: teleport-plugin-email-16.1.0 + app.kubernetes.io/version: 16.1.1 + helm.sh/chart: teleport-plugin-email-16.1.1 name: RELEASE-NAME-teleport-plugin-email spec: replicas: 1 @@ -22,8 +22,8 @@ should be possible to override volume name (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.0 - helm.sh/chart: teleport-plugin-email-16.1.0 + app.kubernetes.io/version: 16.1.1 + helm.sh/chart: teleport-plugin-email-16.1.1 spec: containers: - command: @@ -34,7 +34,7 @@ should be possible to override volume name (smtp on): env: - name: TELEPORT_PLUGIN_FAIL_FAST value: "true" - image: public.ecr.aws/gravitational/teleport-plugin-email:16.1.0 + image: public.ecr.aws/gravitational/teleport-plugin-email:16.1.1 imagePullPolicy: IfNotPresent name: teleport-plugin-email ports: @@ -75,8 +75,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.0 - helm.sh/chart: teleport-plugin-email-16.1.0 + app.kubernetes.io/version: 16.1.1 + helm.sh/chart: teleport-plugin-email-16.1.1 name: RELEASE-NAME-teleport-plugin-email spec: replicas: 1 @@ -90,8 +90,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.0 - helm.sh/chart: teleport-plugin-email-16.1.0 + app.kubernetes.io/version: 16.1.1 + helm.sh/chart: teleport-plugin-email-16.1.1 spec: containers: - command: @@ -136,8 +136,8 @@ should match the snapshot (mailgun on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.0 - helm.sh/chart: teleport-plugin-email-16.1.0 + app.kubernetes.io/version: 16.1.1 + helm.sh/chart: teleport-plugin-email-16.1.1 name: RELEASE-NAME-teleport-plugin-email spec: replicas: 1 @@ -151,8 +151,8 @@ should match the snapshot (mailgun on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.0 - helm.sh/chart: teleport-plugin-email-16.1.0 + app.kubernetes.io/version: 16.1.1 + helm.sh/chart: teleport-plugin-email-16.1.1 spec: containers: - command: @@ -163,7 +163,7 @@ should match the snapshot (mailgun on): env: - name: TELEPORT_PLUGIN_FAIL_FAST value: "true" - image: public.ecr.aws/gravitational/teleport-plugin-email:16.1.0 + image: public.ecr.aws/gravitational/teleport-plugin-email:16.1.1 imagePullPolicy: IfNotPresent name: teleport-plugin-email ports: @@ -204,8 +204,8 @@ should match the snapshot (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.0 - helm.sh/chart: teleport-plugin-email-16.1.0 + app.kubernetes.io/version: 16.1.1 + helm.sh/chart: teleport-plugin-email-16.1.1 name: RELEASE-NAME-teleport-plugin-email spec: replicas: 1 @@ -219,8 +219,8 @@ should match the snapshot (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.0 - helm.sh/chart: teleport-plugin-email-16.1.0 + app.kubernetes.io/version: 16.1.1 + helm.sh/chart: teleport-plugin-email-16.1.1 spec: containers: - command: @@ -231,7 +231,7 @@ should match the snapshot (smtp on): env: - name: TELEPORT_PLUGIN_FAIL_FAST value: "true" - image: public.ecr.aws/gravitational/teleport-plugin-email:16.1.0 + image: public.ecr.aws/gravitational/teleport-plugin-email:16.1.1 imagePullPolicy: IfNotPresent name: teleport-plugin-email ports: @@ -272,8 +272,8 @@ should mount external secret (mailgun on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.0 - helm.sh/chart: teleport-plugin-email-16.1.0 + app.kubernetes.io/version: 16.1.1 + helm.sh/chart: teleport-plugin-email-16.1.1 name: RELEASE-NAME-teleport-plugin-email spec: replicas: 1 @@ -287,8 +287,8 @@ should mount external secret (mailgun on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.0 - helm.sh/chart: teleport-plugin-email-16.1.0 + app.kubernetes.io/version: 16.1.1 + helm.sh/chart: teleport-plugin-email-16.1.1 spec: containers: - command: @@ -299,7 +299,7 @@ should mount external secret (mailgun on): env: - name: TELEPORT_PLUGIN_FAIL_FAST value: "true" - image: public.ecr.aws/gravitational/teleport-plugin-email:16.1.0 + image: public.ecr.aws/gravitational/teleport-plugin-email:16.1.1 imagePullPolicy: IfNotPresent name: teleport-plugin-email ports: @@ -340,8 +340,8 @@ should mount external secret (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.0 - helm.sh/chart: teleport-plugin-email-16.1.0 + app.kubernetes.io/version: 16.1.1 + helm.sh/chart: teleport-plugin-email-16.1.1 name: RELEASE-NAME-teleport-plugin-email spec: replicas: 1 @@ -355,8 +355,8 @@ should mount external secret (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.0 - helm.sh/chart: teleport-plugin-email-16.1.0 + app.kubernetes.io/version: 16.1.1 + helm.sh/chart: teleport-plugin-email-16.1.1 spec: containers: - command: @@ -367,7 +367,7 @@ should mount external secret (smtp on): env: - name: TELEPORT_PLUGIN_FAIL_FAST value: "true" - image: public.ecr.aws/gravitational/teleport-plugin-email:16.1.0 + image: public.ecr.aws/gravitational/teleport-plugin-email:16.1.1 imagePullPolicy: IfNotPresent name: teleport-plugin-email ports: diff --git a/examples/chart/access/jira/Chart.yaml b/examples/chart/access/jira/Chart.yaml index f5c67a6790b40..1debcdc55f5d1 100644 --- a/examples/chart/access/jira/Chart.yaml +++ b/examples/chart/access/jira/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "16.1.0" +.version: &version "16.1.1" apiVersion: v2 name: teleport-plugin-jira diff --git a/examples/chart/access/jira/tests/__snapshot__/configmap_test.yaml.snap b/examples/chart/access/jira/tests/__snapshot__/configmap_test.yaml.snap index 3cbb8dacc4895..0c4d0d8281932 100644 --- a/examples/chart/access/jira/tests/__snapshot__/configmap_test.yaml.snap +++ b/examples/chart/access/jira/tests/__snapshot__/configmap_test.yaml.snap @@ -32,6 +32,6 @@ should match the snapshot (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-jira - app.kubernetes.io/version: 16.1.0 - helm.sh/chart: teleport-plugin-jira-16.1.0 + app.kubernetes.io/version: 16.1.1 + helm.sh/chart: teleport-plugin-jira-16.1.1 name: RELEASE-NAME-teleport-plugin-jira diff --git a/examples/chart/access/jira/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/access/jira/tests/__snapshot__/deployment_test.yaml.snap index 1bad9867adfeb..146d6625ad9e6 100644 --- a/examples/chart/access/jira/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/access/jira/tests/__snapshot__/deployment_test.yaml.snap @@ -7,8 +7,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-jira - app.kubernetes.io/version: 16.1.0 - helm.sh/chart: teleport-plugin-jira-16.1.0 + app.kubernetes.io/version: 16.1.1 + helm.sh/chart: teleport-plugin-jira-16.1.1 name: RELEASE-NAME-teleport-plugin-jira spec: replicas: 1 @@ -22,8 +22,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-jira - app.kubernetes.io/version: 16.1.0 - helm.sh/chart: teleport-plugin-jira-16.1.0 + app.kubernetes.io/version: 16.1.1 + helm.sh/chart: teleport-plugin-jira-16.1.1 spec: containers: - command: diff --git a/examples/chart/access/mattermost/Chart.yaml b/examples/chart/access/mattermost/Chart.yaml index 85666fc718dd0..34b55eba6d19d 100644 --- a/examples/chart/access/mattermost/Chart.yaml +++ b/examples/chart/access/mattermost/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "16.1.0" +.version: &version "16.1.1" apiVersion: v2 name: teleport-plugin-mattermost diff --git a/examples/chart/access/mattermost/tests/__snapshot__/configmap_test.yaml.snap b/examples/chart/access/mattermost/tests/__snapshot__/configmap_test.yaml.snap index a6129ff1d0066..4d578a3c23118 100644 --- a/examples/chart/access/mattermost/tests/__snapshot__/configmap_test.yaml.snap +++ b/examples/chart/access/mattermost/tests/__snapshot__/configmap_test.yaml.snap @@ -22,6 +22,6 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-mattermost - app.kubernetes.io/version: 16.1.0 - helm.sh/chart: teleport-plugin-mattermost-16.1.0 + app.kubernetes.io/version: 16.1.1 + helm.sh/chart: teleport-plugin-mattermost-16.1.1 name: RELEASE-NAME-teleport-plugin-mattermost diff --git a/examples/chart/access/mattermost/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/access/mattermost/tests/__snapshot__/deployment_test.yaml.snap index bd30ce31912de..afae0446f7406 100644 --- a/examples/chart/access/mattermost/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/access/mattermost/tests/__snapshot__/deployment_test.yaml.snap @@ -7,8 +7,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-mattermost - app.kubernetes.io/version: 16.1.0 - helm.sh/chart: teleport-plugin-mattermost-16.1.0 + app.kubernetes.io/version: 16.1.1 + helm.sh/chart: teleport-plugin-mattermost-16.1.1 name: RELEASE-NAME-teleport-plugin-mattermost spec: replicas: 1 @@ -22,8 +22,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-mattermost - app.kubernetes.io/version: 16.1.0 - helm.sh/chart: teleport-plugin-mattermost-16.1.0 + app.kubernetes.io/version: 16.1.1 + helm.sh/chart: teleport-plugin-mattermost-16.1.1 spec: containers: - command: @@ -75,8 +75,8 @@ should mount external secret: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-mattermost - app.kubernetes.io/version: 16.1.0 - helm.sh/chart: teleport-plugin-mattermost-16.1.0 + app.kubernetes.io/version: 16.1.1 + helm.sh/chart: teleport-plugin-mattermost-16.1.1 name: RELEASE-NAME-teleport-plugin-mattermost spec: replicas: 1 @@ -90,8 +90,8 @@ should mount external secret: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-mattermost - app.kubernetes.io/version: 16.1.0 - helm.sh/chart: teleport-plugin-mattermost-16.1.0 + app.kubernetes.io/version: 16.1.1 + helm.sh/chart: teleport-plugin-mattermost-16.1.1 spec: containers: - command: @@ -102,7 +102,7 @@ should mount external secret: env: - name: TELEPORT_PLUGIN_FAIL_FAST value: "true" - image: public.ecr.aws/gravitational/teleport-plugin-mattermost:16.1.0 + image: public.ecr.aws/gravitational/teleport-plugin-mattermost:16.1.1 imagePullPolicy: IfNotPresent name: teleport-plugin-mattermost ports: @@ -143,8 +143,8 @@ should override volume name: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-mattermost - app.kubernetes.io/version: 16.1.0 - helm.sh/chart: teleport-plugin-mattermost-16.1.0 + app.kubernetes.io/version: 16.1.1 + helm.sh/chart: teleport-plugin-mattermost-16.1.1 name: RELEASE-NAME-teleport-plugin-mattermost spec: replicas: 1 @@ -158,8 +158,8 @@ should override volume name: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-mattermost - app.kubernetes.io/version: 16.1.0 - helm.sh/chart: teleport-plugin-mattermost-16.1.0 + app.kubernetes.io/version: 16.1.1 + helm.sh/chart: teleport-plugin-mattermost-16.1.1 spec: containers: - command: @@ -170,7 +170,7 @@ should override volume name: env: - name: TELEPORT_PLUGIN_FAIL_FAST value: "true" - image: public.ecr.aws/gravitational/teleport-plugin-mattermost:16.1.0 + image: public.ecr.aws/gravitational/teleport-plugin-mattermost:16.1.1 imagePullPolicy: IfNotPresent name: teleport-plugin-mattermost ports: diff --git a/examples/chart/access/msteams/Chart.yaml b/examples/chart/access/msteams/Chart.yaml index f84fe2255f9a5..dea0aa109fef8 100644 --- a/examples/chart/access/msteams/Chart.yaml +++ b/examples/chart/access/msteams/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "16.1.0" +.version: &version "16.1.1" apiVersion: v2 name: teleport-plugin-msteams diff --git a/examples/chart/access/msteams/tests/__snapshot__/configmap_test.yaml.snap b/examples/chart/access/msteams/tests/__snapshot__/configmap_test.yaml.snap index 6c0d07ffd0c11..9b05ed49ff2be 100644 --- a/examples/chart/access/msteams/tests/__snapshot__/configmap_test.yaml.snap +++ b/examples/chart/access/msteams/tests/__snapshot__/configmap_test.yaml.snap @@ -29,6 +29,6 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-msteams - app.kubernetes.io/version: 16.1.0 - helm.sh/chart: teleport-plugin-msteams-16.1.0 + app.kubernetes.io/version: 16.1.1 + helm.sh/chart: teleport-plugin-msteams-16.1.1 name: RELEASE-NAME-teleport-plugin-msteams diff --git a/examples/chart/access/msteams/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/access/msteams/tests/__snapshot__/deployment_test.yaml.snap index 009c0ecd8c26c..0a6fde99b7e5c 100644 --- a/examples/chart/access/msteams/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/access/msteams/tests/__snapshot__/deployment_test.yaml.snap @@ -7,8 +7,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-msteams - app.kubernetes.io/version: 16.1.0 - helm.sh/chart: teleport-plugin-msteams-16.1.0 + app.kubernetes.io/version: 16.1.1 + helm.sh/chart: teleport-plugin-msteams-16.1.1 name: RELEASE-NAME-teleport-plugin-msteams spec: replicas: 1 @@ -22,8 +22,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-msteams - app.kubernetes.io/version: 16.1.0 - helm.sh/chart: teleport-plugin-msteams-16.1.0 + app.kubernetes.io/version: 16.1.1 + helm.sh/chart: teleport-plugin-msteams-16.1.1 spec: containers: - command: diff --git a/examples/chart/access/pagerduty/Chart.yaml b/examples/chart/access/pagerduty/Chart.yaml index c0a19d8217e1d..43d7af164a115 100644 --- a/examples/chart/access/pagerduty/Chart.yaml +++ b/examples/chart/access/pagerduty/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "16.1.0" +.version: &version "16.1.1" apiVersion: v2 name: teleport-plugin-pagerduty diff --git a/examples/chart/access/pagerduty/tests/__snapshot__/configmap_test.yaml.snap b/examples/chart/access/pagerduty/tests/__snapshot__/configmap_test.yaml.snap index 085936482996b..adeb1e63ba49e 100644 --- a/examples/chart/access/pagerduty/tests/__snapshot__/configmap_test.yaml.snap +++ b/examples/chart/access/pagerduty/tests/__snapshot__/configmap_test.yaml.snap @@ -21,6 +21,6 @@ should match the snapshot (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-pagerduty - app.kubernetes.io/version: 16.1.0 - helm.sh/chart: teleport-plugin-pagerduty-16.1.0 + app.kubernetes.io/version: 16.1.1 + helm.sh/chart: teleport-plugin-pagerduty-16.1.1 name: RELEASE-NAME-teleport-plugin-pagerduty diff --git a/examples/chart/access/pagerduty/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/access/pagerduty/tests/__snapshot__/deployment_test.yaml.snap index 18853163538fd..ee30ab1d3aa17 100644 --- a/examples/chart/access/pagerduty/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/access/pagerduty/tests/__snapshot__/deployment_test.yaml.snap @@ -7,8 +7,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-pagerduty - app.kubernetes.io/version: 16.1.0 - helm.sh/chart: teleport-plugin-pagerduty-16.1.0 + app.kubernetes.io/version: 16.1.1 + helm.sh/chart: teleport-plugin-pagerduty-16.1.1 name: RELEASE-NAME-teleport-plugin-pagerduty spec: replicas: 1 @@ -22,8 +22,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-pagerduty - app.kubernetes.io/version: 16.1.0 - helm.sh/chart: teleport-plugin-pagerduty-16.1.0 + app.kubernetes.io/version: 16.1.1 + helm.sh/chart: teleport-plugin-pagerduty-16.1.1 spec: containers: - command: diff --git a/examples/chart/access/slack/Chart.yaml b/examples/chart/access/slack/Chart.yaml index f118992f2bc49..3d9eb9aef6bc7 100644 --- a/examples/chart/access/slack/Chart.yaml +++ b/examples/chart/access/slack/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "16.1.0" +.version: &version "16.1.1" apiVersion: v2 name: teleport-plugin-slack diff --git a/examples/chart/access/slack/tests/__snapshot__/configmap_test.yaml.snap b/examples/chart/access/slack/tests/__snapshot__/configmap_test.yaml.snap index 923f889917bfa..626684bbf13a5 100644 --- a/examples/chart/access/slack/tests/__snapshot__/configmap_test.yaml.snap +++ b/examples/chart/access/slack/tests/__snapshot__/configmap_test.yaml.snap @@ -24,6 +24,6 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-slack - app.kubernetes.io/version: 16.1.0 - helm.sh/chart: teleport-plugin-slack-16.1.0 + app.kubernetes.io/version: 16.1.1 + helm.sh/chart: teleport-plugin-slack-16.1.1 name: RELEASE-NAME-teleport-plugin-slack diff --git a/examples/chart/access/slack/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/access/slack/tests/__snapshot__/deployment_test.yaml.snap index cd78c254df165..ba613731e18c8 100644 --- a/examples/chart/access/slack/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/access/slack/tests/__snapshot__/deployment_test.yaml.snap @@ -7,8 +7,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-slack - app.kubernetes.io/version: 16.1.0 - helm.sh/chart: teleport-plugin-slack-16.1.0 + app.kubernetes.io/version: 16.1.1 + helm.sh/chart: teleport-plugin-slack-16.1.1 name: RELEASE-NAME-teleport-plugin-slack spec: replicas: 1 @@ -22,8 +22,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-slack - app.kubernetes.io/version: 16.1.0 - helm.sh/chart: teleport-plugin-slack-16.1.0 + app.kubernetes.io/version: 16.1.1 + helm.sh/chart: teleport-plugin-slack-16.1.1 spec: containers: - command: diff --git a/examples/chart/event-handler/Chart.yaml b/examples/chart/event-handler/Chart.yaml index fe0ac320dda9c..3f9dd0767b998 100644 --- a/examples/chart/event-handler/Chart.yaml +++ b/examples/chart/event-handler/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "16.1.0" +.version: &version "16.1.1" apiVersion: v2 name: teleport-plugin-event-handler diff --git a/examples/chart/event-handler/tests/__snapshot__/configmap_test.yaml.snap b/examples/chart/event-handler/tests/__snapshot__/configmap_test.yaml.snap index eda11a25e447e..5b7b6eb33784d 100644 --- a/examples/chart/event-handler/tests/__snapshot__/configmap_test.yaml.snap +++ b/examples/chart/event-handler/tests/__snapshot__/configmap_test.yaml.snap @@ -26,6 +26,6 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-event-handler - app.kubernetes.io/version: 16.1.0 - helm.sh/chart: teleport-plugin-event-handler-16.1.0 + app.kubernetes.io/version: 16.1.1 + helm.sh/chart: teleport-plugin-event-handler-16.1.1 name: RELEASE-NAME-teleport-plugin-event-handler diff --git a/examples/chart/event-handler/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/event-handler/tests/__snapshot__/deployment_test.yaml.snap index 8568abd94ab63..98f354d559861 100644 --- a/examples/chart/event-handler/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/event-handler/tests/__snapshot__/deployment_test.yaml.snap @@ -7,8 +7,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-event-handler - app.kubernetes.io/version: 16.1.0 - helm.sh/chart: teleport-plugin-event-handler-16.1.0 + app.kubernetes.io/version: 16.1.1 + helm.sh/chart: teleport-plugin-event-handler-16.1.1 name: RELEASE-NAME-teleport-plugin-event-handler spec: replicas: 1 @@ -82,7 +82,7 @@ should mount tls.existingCASecretName and set environment when set in values: value: "true" - name: SSL_CERT_FILE value: /etc/teleport-tls-ca/ca.pem - image: public.ecr.aws/gravitational/teleport-plugin-event-handler:16.1.0 + image: public.ecr.aws/gravitational/teleport-plugin-event-handler:16.1.1 imagePullPolicy: IfNotPresent name: teleport-plugin-event-handler ports: diff --git a/examples/chart/teleport-cluster/Chart.yaml b/examples/chart/teleport-cluster/Chart.yaml index d136d72ff0895..f7419298b64f0 100644 --- a/examples/chart/teleport-cluster/Chart.yaml +++ b/examples/chart/teleport-cluster/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "16.1.0" +.version: &version "16.1.1" name: teleport-cluster apiVersion: v2 diff --git a/examples/chart/teleport-cluster/charts/teleport-operator/Chart.yaml b/examples/chart/teleport-cluster/charts/teleport-operator/Chart.yaml index ce72967aafdb9..25ca728938e5d 100644 --- a/examples/chart/teleport-cluster/charts/teleport-operator/Chart.yaml +++ b/examples/chart/teleport-cluster/charts/teleport-operator/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "16.1.0" +.version: &version "16.1.1" name: teleport-operator apiVersion: v2 diff --git a/examples/chart/teleport-cluster/tests/__snapshot__/auth_clusterrole_test.yaml.snap b/examples/chart/teleport-cluster/tests/__snapshot__/auth_clusterrole_test.yaml.snap index a40d4d0a3f347..fc18c16193d5d 100644 --- a/examples/chart/teleport-cluster/tests/__snapshot__/auth_clusterrole_test.yaml.snap +++ b/examples/chart/teleport-cluster/tests/__snapshot__/auth_clusterrole_test.yaml.snap @@ -8,8 +8,8 @@ adds operator permissions to ClusterRole: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-cluster - app.kubernetes.io/version: 16.1.0 - helm.sh/chart: teleport-cluster-16.1.0 + app.kubernetes.io/version: 16.1.1 + helm.sh/chart: teleport-cluster-16.1.1 teleport.dev/majorVersion: "16" name: RELEASE-NAME rules: diff --git a/examples/chart/teleport-cluster/tests/__snapshot__/auth_config_test.yaml.snap b/examples/chart/teleport-cluster/tests/__snapshot__/auth_config_test.yaml.snap index 76815f52b5ab5..b7f90528160db 100644 --- a/examples/chart/teleport-cluster/tests/__snapshot__/auth_config_test.yaml.snap +++ b/examples/chart/teleport-cluster/tests/__snapshot__/auth_config_test.yaml.snap @@ -1848,8 +1848,8 @@ sets clusterDomain on Configmap: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-cluster - app.kubernetes.io/version: 16.1.0 - helm.sh/chart: teleport-cluster-16.1.0 + app.kubernetes.io/version: 16.1.1 + helm.sh/chart: teleport-cluster-16.1.1 teleport.dev/majorVersion: "16" name: RELEASE-NAME-auth namespace: NAMESPACE diff --git a/examples/chart/teleport-cluster/tests/__snapshot__/auth_deployment_test.yaml.snap b/examples/chart/teleport-cluster/tests/__snapshot__/auth_deployment_test.yaml.snap index 8038f289b5373..c8f992f00efc2 100644 --- a/examples/chart/teleport-cluster/tests/__snapshot__/auth_deployment_test.yaml.snap +++ b/examples/chart/teleport-cluster/tests/__snapshot__/auth_deployment_test.yaml.snap @@ -8,7 +8,7 @@ - args: - --diag-addr=0.0.0.0:3000 - --apply-on-startup=/etc/teleport/apply-on-startup.yaml - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -141,7 +141,7 @@ should set nodeSelector when set in values: - args: - --diag-addr=0.0.0.0:3000 - --apply-on-startup=/etc/teleport/apply-on-startup.yaml - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -238,7 +238,7 @@ should set resources when set in values: - args: - --diag-addr=0.0.0.0:3000 - --apply-on-startup=/etc/teleport/apply-on-startup.yaml - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -324,7 +324,7 @@ should set securityContext when set in values: - args: - --diag-addr=0.0.0.0:3000 - --apply-on-startup=/etc/teleport/apply-on-startup.yaml - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent lifecycle: preStop: diff --git a/examples/chart/teleport-cluster/tests/__snapshot__/proxy_config_test.yaml.snap b/examples/chart/teleport-cluster/tests/__snapshot__/proxy_config_test.yaml.snap index 921bb26bbf0df..88e8e05388267 100644 --- a/examples/chart/teleport-cluster/tests/__snapshot__/proxy_config_test.yaml.snap +++ b/examples/chart/teleport-cluster/tests/__snapshot__/proxy_config_test.yaml.snap @@ -567,8 +567,8 @@ sets clusterDomain on Configmap: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-cluster - app.kubernetes.io/version: 16.1.0 - helm.sh/chart: teleport-cluster-16.1.0 + app.kubernetes.io/version: 16.1.1 + helm.sh/chart: teleport-cluster-16.1.1 teleport.dev/majorVersion: "16" name: RELEASE-NAME-proxy namespace: NAMESPACE diff --git a/examples/chart/teleport-cluster/tests/__snapshot__/proxy_deployment_test.yaml.snap b/examples/chart/teleport-cluster/tests/__snapshot__/proxy_deployment_test.yaml.snap index ae75e82108945..14a2c8810b43f 100644 --- a/examples/chart/teleport-cluster/tests/__snapshot__/proxy_deployment_test.yaml.snap +++ b/examples/chart/teleport-cluster/tests/__snapshot__/proxy_deployment_test.yaml.snap @@ -11,8 +11,8 @@ sets clusterDomain on Deployment Pods: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-cluster - app.kubernetes.io/version: 16.1.0 - helm.sh/chart: teleport-cluster-16.1.0 + app.kubernetes.io/version: 16.1.1 + helm.sh/chart: teleport-cluster-16.1.1 teleport.dev/majorVersion: "16" name: RELEASE-NAME-proxy namespace: NAMESPACE @@ -26,7 +26,7 @@ sets clusterDomain on Deployment Pods: template: metadata: annotations: - checksum/config: 77797663ab04d615b921cf993092cf34694ce91db18e0e88196049e73b051d5e + checksum/config: 0fec9cfed507aff767a06b7d89d9dad9b3b1f85d0f23ce0e9e7abb84c1cd4f09 kubernetes.io/pod: test-annotation kubernetes.io/pod-different: 4 labels: @@ -34,8 +34,8 @@ sets clusterDomain on Deployment Pods: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-cluster - app.kubernetes.io/version: 16.1.0 - helm.sh/chart: teleport-cluster-16.1.0 + app.kubernetes.io/version: 16.1.1 + helm.sh/chart: teleport-cluster-16.1.1 teleport.dev/majorVersion: "16" spec: affinity: @@ -44,7 +44,7 @@ sets clusterDomain on Deployment Pods: containers: - args: - --diag-addr=0.0.0.0:3000 - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -105,7 +105,7 @@ sets clusterDomain on Deployment Pods: - wait - no-resolve - RELEASE-NAME-auth-v15.NAMESPACE.svc.test.com - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 name: wait-auth-update serviceAccountName: RELEASE-NAME-proxy terminationGracePeriodSeconds: 60 @@ -137,7 +137,7 @@ should provision initContainer correctly when set in values: - wait - no-resolve - RELEASE-NAME-auth-v15.NAMESPACE.svc.cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 name: wait-auth-update resources: limits: @@ -201,7 +201,7 @@ should set nodeSelector when set in values: containers: - args: - --diag-addr=0.0.0.0:3000 - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -262,7 +262,7 @@ should set nodeSelector when set in values: - wait - no-resolve - RELEASE-NAME-auth-v15.NAMESPACE.svc.cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 name: wait-auth-update nodeSelector: environment: security @@ -313,7 +313,7 @@ should set resources for wait-auth-update initContainer when set in values: containers: - args: - --diag-addr=0.0.0.0:3000 - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -381,7 +381,7 @@ should set resources for wait-auth-update initContainer when set in values: - wait - no-resolve - RELEASE-NAME-auth-v15.NAMESPACE.svc.cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 name: wait-auth-update resources: limits: @@ -421,7 +421,7 @@ should set resources when set in values: containers: - args: - --diag-addr=0.0.0.0:3000 - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -489,7 +489,7 @@ should set resources when set in values: - wait - no-resolve - RELEASE-NAME-auth-v15.NAMESPACE.svc.cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 name: wait-auth-update resources: limits: @@ -529,7 +529,7 @@ should set securityContext for initContainers when set in values: containers: - args: - --diag-addr=0.0.0.0:3000 - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -597,7 +597,7 @@ should set securityContext for initContainers when set in values: - wait - no-resolve - RELEASE-NAME-auth-v15.NAMESPACE.svc.cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 name: wait-auth-update securityContext: allowPrivilegeEscalation: false @@ -637,7 +637,7 @@ should set securityContext when set in values: containers: - args: - --diag-addr=0.0.0.0:3000 - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -705,7 +705,7 @@ should set securityContext when set in values: - wait - no-resolve - RELEASE-NAME-auth-v15.NAMESPACE.svc.cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 name: wait-auth-update securityContext: allowPrivilegeEscalation: false diff --git a/examples/chart/teleport-kube-agent/Chart.yaml b/examples/chart/teleport-kube-agent/Chart.yaml index fdb785214d7f9..ec2c593ec97a4 100644 --- a/examples/chart/teleport-kube-agent/Chart.yaml +++ b/examples/chart/teleport-kube-agent/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "16.1.0" +.version: &version "16.1.1" name: teleport-kube-agent apiVersion: v2 diff --git a/examples/chart/teleport-kube-agent/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/teleport-kube-agent/tests/__snapshot__/deployment_test.yaml.snap index e23333cb6ac15..e0657f4222605 100644 --- a/examples/chart/teleport-kube-agent/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/teleport-kube-agent/tests/__snapshot__/deployment_test.yaml.snap @@ -32,7 +32,7 @@ sets Deployment annotations when specified if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -109,7 +109,7 @@ sets Deployment labels when specified if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -173,7 +173,7 @@ sets Pod annotations when specified if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -237,7 +237,7 @@ sets Pod labels when specified if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -322,7 +322,7 @@ should add emptyDir for data when existingDataVolume is not set if action is Upg value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -387,7 +387,7 @@ should add insecureSkipProxyTLSVerify to args when set in values if action is Up value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -451,7 +451,7 @@ should correctly configure existingDataVolume when set if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -513,7 +513,7 @@ should expose diag port if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -589,7 +589,7 @@ should have multiple replicas when replicaCount is set (using .replicaCount, dep value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -665,7 +665,7 @@ should have multiple replicas when replicaCount is set (using highAvailability.r value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -729,7 +729,7 @@ should have one replica when replicaCount is not set if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -793,7 +793,7 @@ should mount extraVolumes and extraVolumeMounts if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -862,7 +862,7 @@ should mount jamfCredentialsSecret if it already exists and when role is jamf an value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -932,7 +932,7 @@ should mount jamfCredentialsSecret.name when role is jamf and action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1004,7 +1004,7 @@ should mount tls.existingCASecretName and set environment when set in values if value: cluster.local - name: SSL_CERT_FILE value: /etc/teleport-tls-ca/ca.pem - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1078,7 +1078,7 @@ should mount tls.existingCASecretName and set extra environment when set in valu value: http://username:password@my.proxy.host:3128 - name: SSL_CERT_FILE value: /etc/teleport-tls-ca/ca.pem - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1148,7 +1148,7 @@ should provision initContainer correctly when set in values if action is Upgrade value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1270,7 +1270,7 @@ should set affinity when set in values if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1334,7 +1334,7 @@ should set default serviceAccountName when not set in values if action is Upgrad value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1411,7 +1411,7 @@ should set environment when extraEnv set in values if action is Upgrade: value: cluster.local - name: HTTPS_PROXY value: http://username:password@my.proxy.host:3128 - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1539,7 +1539,7 @@ should set imagePullPolicy when set in values if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: Always livenessProbe: failureThreshold: 6 @@ -1603,7 +1603,7 @@ should set nodeSelector if set in values if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1669,7 +1669,7 @@ should set not set priorityClassName when not set in values if action is Upgrade value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1745,7 +1745,7 @@ should set preferred affinity when more than one replica is used if action is Up value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1809,7 +1809,7 @@ should set priorityClassName when set in values if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1874,7 +1874,7 @@ should set probeTimeoutSeconds when set in values if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1948,7 +1948,7 @@ should set required affinity when highAvailability.requireAntiAffinity is set if value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2012,7 +2012,7 @@ should set resources when set in values if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2083,7 +2083,7 @@ should set serviceAccountName when set in values if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2147,7 +2147,7 @@ should set tolerations when set in values if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 diff --git a/examples/chart/teleport-kube-agent/tests/__snapshot__/job_test.yaml.snap b/examples/chart/teleport-kube-agent/tests/__snapshot__/job_test.yaml.snap index 82105dc401c82..eca9f070bba23 100644 --- a/examples/chart/teleport-kube-agent/tests/__snapshot__/job_test.yaml.snap +++ b/examples/chart/teleport-kube-agent/tests/__snapshot__/job_test.yaml.snap @@ -25,7 +25,7 @@ should create ServiceAccount for post-delete hook by default: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent name: post-delete-job securityContext: @@ -106,7 +106,7 @@ should not create ServiceAccount for post-delete hook if serviceAccount.create i fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent name: post-delete-job securityContext: @@ -136,7 +136,7 @@ should not create ServiceAccount, Role or RoleBinding for post-delete hook if se fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent name: post-delete-job securityContext: @@ -166,7 +166,7 @@ should set nodeSelector in post-delete hook: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent name: post-delete-job securityContext: diff --git a/examples/chart/teleport-kube-agent/tests/__snapshot__/statefulset_test.yaml.snap b/examples/chart/teleport-kube-agent/tests/__snapshot__/statefulset_test.yaml.snap index e668ef11fc4bd..07870c7aab89d 100644 --- a/examples/chart/teleport-kube-agent/tests/__snapshot__/statefulset_test.yaml.snap +++ b/examples/chart/teleport-kube-agent/tests/__snapshot__/statefulset_test.yaml.snap @@ -16,7 +16,7 @@ sets Pod annotations when specified: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -86,7 +86,7 @@ sets Pod labels when specified: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -180,7 +180,7 @@ sets StatefulSet labels when specified: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -282,7 +282,7 @@ should add insecureSkipProxyTLSVerify to args when set in values: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -352,7 +352,7 @@ should add volumeClaimTemplate for data volume when using StatefulSet and action fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -442,7 +442,7 @@ should add volumeClaimTemplate for data volume when using StatefulSet and is Fre fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -522,7 +522,7 @@ should add volumeMount for data volume when using StatefulSet: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -592,7 +592,7 @@ should expose diag port: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -662,7 +662,7 @@ should generate Statefulset when storage is disabled and mode is a Upgrade: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -746,7 +746,7 @@ should have multiple replicas when replicaCount is set (using .replicaCount, dep fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -828,7 +828,7 @@ should have multiple replicas when replicaCount is set (using highAvailability.r fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -898,7 +898,7 @@ should have one replica when replicaCount is not set: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -968,7 +968,7 @@ should install Statefulset when storage is disabled and mode is a Fresh Install: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1040,7 +1040,7 @@ should mount extraVolumes and extraVolumeMounts: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1115,7 +1115,7 @@ should mount jamfCredentialsSecret if it already exists and when role is jamf: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1193,7 +1193,7 @@ should mount jamfCredentialsSecret.name when role is jamf: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1273,7 +1273,7 @@ should mount tls.existingCASecretName and set environment when set in values: value: RELEASE-NAME - name: SSL_CERT_FILE value: /etc/teleport-tls-ca/ca.pem - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1355,7 +1355,7 @@ should mount tls.existingCASecretName and set extra environment when set in valu value: /etc/teleport-tls-ca/ca.pem - name: HTTPS_PROXY value: http://username:password@my.proxy.host:3128 - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1433,7 +1433,7 @@ should not add emptyDir for data when using StatefulSet: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1503,7 +1503,7 @@ should provision initContainer correctly when set in values: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1631,7 +1631,7 @@ should set affinity when set in values: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1701,7 +1701,7 @@ should set default serviceAccountName when not set in values: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1784,7 +1784,7 @@ should set environment when extraEnv set in values: value: RELEASE-NAME - name: HTTPS_PROXY value: http://username:password@my.proxy.host:3128 - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1924,7 +1924,7 @@ should set imagePullPolicy when set in values: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: Always livenessProbe: failureThreshold: 6 @@ -1994,7 +1994,7 @@ should set nodeSelector if set in values: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2078,7 +2078,7 @@ should set preferred affinity when more than one replica is used: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2148,7 +2148,7 @@ should set probeTimeoutSeconds when set in values: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2228,7 +2228,7 @@ should set required affinity when highAvailability.requireAntiAffinity is set: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2298,7 +2298,7 @@ should set resources when set in values: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2375,7 +2375,7 @@ should set serviceAccountName when set in values: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2445,7 +2445,7 @@ should set storage.requests when set in values and action is an Upgrade: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2515,7 +2515,7 @@ should set storage.storageClassName when set in values and action is an Upgrade: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2585,7 +2585,7 @@ should set tolerations when set in values: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.0 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 diff --git a/examples/chart/teleport-kube-agent/tests/__snapshot__/updater_deployment_test.yaml.snap b/examples/chart/teleport-kube-agent/tests/__snapshot__/updater_deployment_test.yaml.snap index 326ca9952cced..b7b90b241bc87 100644 --- a/examples/chart/teleport-kube-agent/tests/__snapshot__/updater_deployment_test.yaml.snap +++ b/examples/chart/teleport-kube-agent/tests/__snapshot__/updater_deployment_test.yaml.snap @@ -27,7 +27,7 @@ sets the affinity: - --base-image=public.ecr.aws/gravitational/teleport-distroless - --version-server=https://my-custom-version-server/v1 - --version-channel=custom/preview - image: public.ecr.aws/gravitational/teleport-kube-agent-updater:16.1.0 + image: public.ecr.aws/gravitational/teleport-kube-agent-updater:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -73,7 +73,7 @@ sets the tolerations: - --base-image=public.ecr.aws/gravitational/teleport-distroless - --version-server=https://my-custom-version-server/v1 - --version-channel=custom/preview - image: public.ecr.aws/gravitational/teleport-kube-agent-updater:16.1.0 + image: public.ecr.aws/gravitational/teleport-kube-agent-updater:16.1.1 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 From c197ddbc54ab9990c9644c78426f42215b78b8ff Mon Sep 17 00:00:00 2001 From: Noah Stride Date: Thu, 1 Aug 2024 09:45:42 +0100 Subject: [PATCH 031/139] Workload Identity: Kubernetes Workload Attestation (#44209) (#44883) * Start hacking on resolving pod/container id from pid * Add godoc comments * Tidy attestation into well defined types * Use gopsutil to determine gid/uid on unix systems * Start threading through config * Update tests * Start working TLS support into kubelet api client * Thread through configuration to yaml * Support loading the CA * Start testing with real cluster/bug fixes * Simplify by removing container lookup * Add new attestation rules/tests for new attestation rules * Add test that leverages example mountfiles * Start handling kubelet client auth more elegantly * Add handling of custom CA values * Tie together configuration validation * Update YAML tests * Go mod/sum * Ensure we use the Effective UID/GID rather than "Real" UID/GID in Unix attestation * Add testdata from GCP * Add test of Kubernetes attestation with mock kubelet API * Add test for UnixAttestor * Update YAML goldenfile * Appease liinter * Remove change to session.go * Add timeout to Kubelet client * Import `time` * Go mod tidy * Go mod tidy * Remove TODO about renaming * Rename attestor -> attestors * Add stubs on windows * Add missing license header --- go.mod | 10 +- go.sum | 21 ++ .../config/service_spiffe_workload_api.go | 34 +- .../service_spiffe_workload_api_test.go | 19 ++ .../TestBotConfig_YAML/standard_config.golden | 5 + .../full.golden | 14 + .../minimal.golden | 3 + lib/tbot/service_spiffe_workload_api.go | 165 ++++++--- lib/tbot/service_spiffe_workload_api_test.go | 228 +++++++++++-- lib/tbot/spiffe/workloadattest/attest.go | 107 ++++++ lib/tbot/spiffe/workloadattest/kubernetes.go | 135 ++++++++ .../spiffe/workloadattest/kubernetes_unix.go | 316 ++++++++++++++++++ .../workloadattest/kubernetes_unix_test.go | 178 ++++++++++ .../workloadattest/kubernetes_windows.go | 41 +++ .../mountfile/k8s-real-docker-desktop | 22 ++ .../k8s-real-gcp-v1.29.5-gke.1091002 | 24 ++ .../k8s-real-k3s-ubuntu-v1.28.6+k3s2 | 27 ++ .../testdata/mountfile/k8s-real-orbstack | 24 ++ lib/tbot/spiffe/workloadattest/unix.go | 122 +++++++ lib/tbot/spiffe/workloadattest/unix_test.go | 46 +++ 20 files changed, 1477 insertions(+), 64 deletions(-) create mode 100644 lib/tbot/spiffe/workloadattest/attest.go create mode 100644 lib/tbot/spiffe/workloadattest/kubernetes.go create mode 100644 lib/tbot/spiffe/workloadattest/kubernetes_unix.go create mode 100644 lib/tbot/spiffe/workloadattest/kubernetes_unix_test.go create mode 100644 lib/tbot/spiffe/workloadattest/kubernetes_windows.go create mode 100644 lib/tbot/spiffe/workloadattest/testdata/mountfile/k8s-real-docker-desktop create mode 100644 lib/tbot/spiffe/workloadattest/testdata/mountfile/k8s-real-gcp-v1.29.5-gke.1091002 create mode 100644 lib/tbot/spiffe/workloadattest/testdata/mountfile/k8s-real-k3s-ubuntu-v1.28.6+k3s2 create mode 100644 lib/tbot/spiffe/workloadattest/testdata/mountfile/k8s-real-orbstack create mode 100644 lib/tbot/spiffe/workloadattest/unix.go create mode 100644 lib/tbot/spiffe/workloadattest/unix_test.go diff --git a/go.mod b/go.mod index e865a43bdeae8..6f440c82ea5f5 100644 --- a/go.mod +++ b/go.mod @@ -164,6 +164,7 @@ require ( github.com/schollz/progressbar/v3 v3.14.2 github.com/scim2/filter-parser/v2 v2.2.0 github.com/segmentio/parquet-go v0.0.0-20230712180008-5d42db8f0d47 + github.com/shirou/gopsutil/v4 v4.24.6 github.com/sigstore/cosign/v2 v2.2.4 github.com/sigstore/sigstore v1.8.3 github.com/sijms/go-ora/v2 v2.8.10 @@ -330,6 +331,7 @@ require ( github.com/go-jose/go-jose/v4 v4.0.1 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-logr/zapr v1.3.0 // indirect + github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-openapi/analysis v0.23.0 // indirect github.com/go-openapi/errors v0.22.0 // indirect github.com/go-openapi/jsonpointer v0.21.0 // indirect @@ -408,6 +410,7 @@ require ( github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de // indirect github.com/lithammer/dedent v1.1.0 // indirect github.com/lucasb-eyer/go-colorful v1.2.0 // indirect + github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattermost/xml-roundtrip-validator v0.1.0 // indirect @@ -452,6 +455,7 @@ require ( github.com/pkg/errors v0.9.1 // indirect github.com/pkg/xattr v0.4.9 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect github.com/pquerna/cachecontrol v0.1.0 // indirect github.com/prometheus/procfs v0.13.0 // indirect github.com/rivo/uniseg v0.4.7 // indirect @@ -469,6 +473,7 @@ require ( github.com/segmentio/encoding v0.4.0 // indirect github.com/shabbyrobe/gocovmerge v0.0.0-20230507112040-c3350d9342df // indirect github.com/shibumi/go-pathspec v1.3.0 // indirect + github.com/shoenig/go-m1cpu v0.1.6 // indirect github.com/shopspring/decimal v1.4.0 // indirect github.com/siddontang/go v0.0.0-20180604090527-bdc77568d726 // indirect github.com/siddontang/go-log v0.0.0-20180807004314-8d05993dda07 // indirect @@ -485,6 +490,8 @@ require ( github.com/thales-e-security/pool v0.0.2 // indirect github.com/theupdateframework/go-tuf v0.7.0 // indirect github.com/titanous/rocacheck v0.0.0-20171023193734-afe73141d399 // indirect + github.com/tklauser/go-sysconf v0.3.12 // indirect + github.com/tklauser/numcpus v0.6.1 // indirect github.com/transparency-dev/merkle v0.0.2 // indirect github.com/vbatts/tar-split v0.11.5 // indirect github.com/weppos/publicsuffix-go v0.30.1-0.20230620154423-38c92ad2d5c6 // indirect @@ -499,6 +506,7 @@ require ( github.com/xlab/treeprint v1.2.0 // indirect github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect github.com/yuin/gopher-lua v1.1.1 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect github.com/zeebo/errs v1.3.0 // indirect github.com/zeebo/xxh3 v1.0.2 // indirect github.com/zmap/zcrypto v0.0.0-20230310154051-c8b263fd8300 // indirect @@ -522,7 +530,7 @@ require ( k8s.io/component-helpers v0.29.3 // indirect k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect k8s.io/metrics v0.29.3 // indirect - k8s.io/utils v0.0.0-20240102154912-e7106e64919e // indirect + k8s.io/utils v0.0.0-20240102154912-e7106e64919e mvdan.cc/sh/v3 v3.7.0 // indirect oras.land/oras-go v1.2.5 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect diff --git a/go.sum b/go.sum index 4aeb6f8d9c316..9318192807824 100644 --- a/go.sum +++ b/go.sum @@ -1242,6 +1242,8 @@ github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= +github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-openapi/analysis v0.23.0 h1:aGday7OWupfMs+LbmLZG4k0MYXIANxcuBTYUC03zFCU= github.com/go-openapi/analysis v0.23.0/go.mod h1:9mz9ZWaSlV8TvjQHLl2mUW2PbZtemkE8yA5v22ohupo= github.com/go-openapi/errors v0.22.0 h1:c4xY/OLxUBSTiepAg3j/MHuAv5mJhnf53LLMWFB+u/w= @@ -1797,6 +1799,8 @@ github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffkt github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= github.com/lyft/protoc-gen-star/v2 v2.0.1/go.mod h1:RcCdONR2ScXaYnQC5tUzxzlpA3WVYF7/opLeUgcQs/o= @@ -2029,6 +2033,8 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/poy/onpar v1.1.2 h1:QaNrNiZx0+Nar5dLgTVp5mXkyoVFIbepjyEoGSnhbAY= github.com/poy/onpar v1.1.2/go.mod h1:6X8FLNoxyr9kkmnlqpK6LSoiOtrO6MICtWwEuWkLjzg= github.com/pquerna/cachecontrol v0.1.0 h1:yJMy84ti9h/+OEWa752kBTKv4XC30OtVVHYv/8cTqKc= @@ -2131,6 +2137,12 @@ github.com/shabbyrobe/gocovmerge v0.0.0-20230507112040-c3350d9342df h1:S77Pf5fIG github.com/shabbyrobe/gocovmerge v0.0.0-20230507112040-c3350d9342df/go.mod h1:dcuzJZ83w/SqN9k4eQqwKYMgmKWzg/KzJAURBhRL1tc= github.com/shibumi/go-pathspec v1.3.0 h1:QUyMZhFo0Md5B8zV8x2tesohbb5kfbpTi9rBnKh5dkI= github.com/shibumi/go-pathspec v1.3.0/go.mod h1:Xutfslp817l2I1cZvgcfeMQJG5QnU2lh5tVaaMCl3jE= +github.com/shirou/gopsutil/v4 v4.24.6 h1:9qqCSYF2pgOU+t+NgJtp7Co5+5mHF/HyKBUckySQL64= +github.com/shirou/gopsutil/v4 v4.24.6/go.mod h1:aoebb2vxetJ/yIDZISmduFvVNPHqXQ9SEJwRXxkf0RA= +github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= +github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= +github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= +github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k= @@ -2227,6 +2239,10 @@ github.com/titanous/rocacheck v0.0.0-20171023193734-afe73141d399 h1:e/5i7d4oYZ+C github.com/titanous/rocacheck v0.0.0-20171023193734-afe73141d399/go.mod h1:LdwHTNJT99C5fTAzDz0ud328OgXz+gierycbcIx2fRs= github.com/tjfoc/gmsm v1.4.1 h1:aMe1GlZb+0bLjn+cKTPEvvn9oUEBlJitaZiiBwsbgho= github.com/tjfoc/gmsm v1.4.1/go.mod h1:j4INPkHWMrhJb38G+J6W4Tw0AbuN8Thu3PbdVYhVcTE= +github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/transparency-dev/merkle v0.0.2 h1:Q9nBoQcZcgPamMkGn7ghV8XiTZ/kRxn1yCG81+twTK4= github.com/transparency-dev/merkle v0.0.2/go.mod h1:pqSy+OXefQ1EDUVmAJ8MUhHB9TXGuzVAT58PqBoHz1A= @@ -2277,6 +2293,8 @@ github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1 github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yuin/gopher-lua v1.1.1 h1:kYKnWBjvbNP4XLT3+bPEwAXJx262OhaHDWDVOPjL46M= github.com/yuin/gopher-lua v1.1.1/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43 h1:+lm10QQTNSBd8DVTNGHx7o/IKu9HYDvLMffDhbyLccI= github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50 h1:hlE8//ciYMztlGpl/VA+Zm1AcTPHYkHJPbHqE6WJUXE= @@ -2618,6 +2636,7 @@ golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2647,6 +2666,7 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201126233918-771906719818/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2704,6 +2724,7 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= diff --git a/lib/tbot/config/service_spiffe_workload_api.go b/lib/tbot/config/service_spiffe_workload_api.go index 59c2db2cbb315..5c034653b740b 100644 --- a/lib/tbot/config/service_spiffe_workload_api.go +++ b/lib/tbot/config/service_spiffe_workload_api.go @@ -23,6 +23,8 @@ import ( "github.com/gravitational/trace" "gopkg.in/yaml.v3" + + "github.com/gravitational/teleport/lib/tbot/spiffe/workloadattest" ) const SPIFFEWorkloadAPIServiceType = "spiffe-workload-api" @@ -58,6 +60,27 @@ type SVIDRequestRuleUnix struct { GID *int `yaml:"gid,omitempty"` } +// SVIDRequestRuleKubernetes is a workload attestation ruleset for workloads +// that connect via Unix domain sockets and are running in a Kubernetes pod. +// +// Requires the "kubernetes" attestor to be enabled. +// +// Fields should be a subset of workloadattest.KubernetesAttestation. +type SVIDRequestRuleKubernetes struct { + // Namespace is the Kubernetes namespace that a workload must be running in + // to be issued this SVID. + // If unspecified, the namespace is not checked. + Namespace string `yaml:"namespace,omitempty"` + // ServiceAccount is the Kubernetes service account that a workload must be + // running as to be issued this SVID. + // If unspecified, the service account is not checked. + ServiceAccount string `yaml:"service_account,omitempty"` + // PodName is the Kubernetes pod name that a workload must be running in to + // be issued this SVID. + // If unspecified, the pod name is not checked. + PodName string `yaml:"pod_name,omitempty"` +} + // SVIDRequestRule is an individual workload attestation rule. All values // specified within the rule must be satisfied for the rule itself to pass. type SVIDRequestRule struct { @@ -65,6 +88,10 @@ type SVIDRequestRule struct { // Unix domain sockets. If any value here is set, the rule will not pass // unless the workload is connecting via a Unix domain socket. Unix SVIDRequestRuleUnix `yaml:"unix"` + // Kubernetes is the workload attestation ruleset for workloads that connect + // via the Unix domain socket and are running in a Kubernetes pod. + // The "kubernetes" attestor must be enabled or these rules will fail. + Kubernetes SVIDRequestRuleKubernetes `yaml:"kubernetes"` } func (o SVIDRequestRule) LogValue() slog.Value { @@ -92,6 +119,8 @@ type SPIFFEWorkloadAPIService struct { // SVIDs is the list of SVIDs that the SPIFFE Workload API server should // provide. SVIDs []SVIDRequestWithRules `yaml:"svids"` + // Attestors is the configuration for the workload attestation process. + Attestors workloadattest.Config `yaml:"attestors"` } func (s *SPIFFEWorkloadAPIService) Type() string { @@ -121,8 +150,11 @@ func (s *SPIFFEWorkloadAPIService) CheckAndSetDefaults() error { } for i, svid := range s.SVIDs { if err := svid.CheckAndSetDefaults(); err != nil { - return trace.Wrap(err, "validiting svid[%d]", i) + return trace.Wrap(err, "validating svid[%d]", i) } } + if err := s.Attestors.CheckAndSetDefaults(); err != nil { + return trace.Wrap(err, "validating attestor") + } return nil } diff --git a/lib/tbot/config/service_spiffe_workload_api_test.go b/lib/tbot/config/service_spiffe_workload_api_test.go index 1e4334730490c..795cf38b00896 100644 --- a/lib/tbot/config/service_spiffe_workload_api_test.go +++ b/lib/tbot/config/service_spiffe_workload_api_test.go @@ -20,6 +20,8 @@ package config import ( "testing" + + "github.com/gravitational/teleport/lib/tbot/spiffe/workloadattest" ) func ptr[T any](v T) *T { @@ -34,6 +36,18 @@ func TestSPIFFEWorkloadAPIService_YAML(t *testing.T) { name: "full", in: SPIFFEWorkloadAPIService{ Listen: "unix:///var/run/spiffe.sock", + Attestors: workloadattest.Config{ + Kubernetes: workloadattest.KubernetesAttestorConfig{ + Enabled: true, + Kubelet: workloadattest.KubeletClientConfig{ + SecurePort: 12345, + TokenPath: "/path/to/token", + CAPath: "/path/to/ca.pem", + SkipVerify: true, + Anonymous: true, + }, + }, + }, SVIDs: []SVIDRequestWithRules{ { SVIDRequest: SVIDRequest{ @@ -56,6 +70,11 @@ func TestSPIFFEWorkloadAPIService_YAML(t *testing.T) { Unix: SVIDRequestRuleUnix{ PID: ptr(100), }, + Kubernetes: SVIDRequestRuleKubernetes{ + Namespace: "my-namespace", + PodName: "my-pod", + ServiceAccount: "service-account", + }, }, }, }, diff --git a/lib/tbot/config/testdata/TestBotConfig_YAML/standard_config.golden b/lib/tbot/config/testdata/TestBotConfig_YAML/standard_config.golden index 31eacda54d8c0..53a59aceacc8e 100644 --- a/lib/tbot/config/testdata/TestBotConfig_YAML/standard_config.golden +++ b/lib/tbot/config/testdata/TestBotConfig_YAML/standard_config.golden @@ -35,8 +35,13 @@ services: pid: 100 uid: 1000 gid: 1234 + kubernetes: {} - unix: pid: 100 + kubernetes: {} + attestors: + kubernetes: + enabled: false - type: example message: llama - type: ssh-multiplexer diff --git a/lib/tbot/config/testdata/TestSPIFFEWorkloadAPIService_YAML/full.golden b/lib/tbot/config/testdata/TestSPIFFEWorkloadAPIService_YAML/full.golden index 53fc172b4dc4b..4a7c696e887bf 100644 --- a/lib/tbot/config/testdata/TestSPIFFEWorkloadAPIService_YAML/full.golden +++ b/lib/tbot/config/testdata/TestSPIFFEWorkloadAPIService_YAML/full.golden @@ -14,5 +14,19 @@ svids: pid: 100 uid: 1000 gid: 1234 + kubernetes: {} - unix: pid: 100 + kubernetes: + namespace: my-namespace + service_account: service-account + pod_name: my-pod +attestors: + kubernetes: + enabled: true + kubelet: + secure_port: 12345 + token_path: /path/to/token + ca_path: /path/to/ca.pem + skip_verify: true + anonymous: true diff --git a/lib/tbot/config/testdata/TestSPIFFEWorkloadAPIService_YAML/minimal.golden b/lib/tbot/config/testdata/TestSPIFFEWorkloadAPIService_YAML/minimal.golden index 1cef5bf13e1e0..326b4dfab8a67 100644 --- a/lib/tbot/config/testdata/TestSPIFFEWorkloadAPIService_YAML/minimal.golden +++ b/lib/tbot/config/testdata/TestSPIFFEWorkloadAPIService_YAML/minimal.golden @@ -2,3 +2,6 @@ type: spiffe-workload-api listen: unix:///var/run/spiffe.sock svids: - path: /foo +attestors: + kubernetes: + enabled: false diff --git a/lib/tbot/service_spiffe_workload_api.go b/lib/tbot/service_spiffe_workload_api.go index 680c9fa56f5ec..b04fac4d3f9e5 100644 --- a/lib/tbot/service_spiffe_workload_api.go +++ b/lib/tbot/service_spiffe_workload_api.go @@ -54,6 +54,7 @@ import ( "github.com/gravitational/teleport/lib/reversetunnelclient" "github.com/gravitational/teleport/lib/services" "github.com/gravitational/teleport/lib/tbot/config" + "github.com/gravitational/teleport/lib/tbot/spiffe/workloadattest" "github.com/gravitational/teleport/lib/uds" ) @@ -87,6 +88,8 @@ type SPIFFEWorkloadAPIService struct { trustDomain string + attestor *workloadattest.Attestor + // trustBundle is protected by trustBundleMu. Use setTrustBundle and // getTrustBundle to access it. trustBundle []byte @@ -170,6 +173,11 @@ func (s *SPIFFEWorkloadAPIService) setup(ctx context.Context) (err error) { } s.trustDomain = authPing.ClusterName + s.attestor, err = workloadattest.NewAttestor(s.log, s.cfg.Attestors) + if err != nil { + return trace.Wrap(err, "setting up workload attestation") + } + return nil } @@ -419,11 +427,16 @@ func (s *SPIFFEWorkloadAPIService) fetchX509SVIDs( // filterSVIDRequests filters the SVID requests based on the workload // attestation. +// +// TODO(noah): In a future PR, we need to totally refactor this to a more +// flexible rules engine otherwise this is going to get absurdly large as +// we add more types. Ideally, something that would be compatible with a +// predicate language would be great. func filterSVIDRequests( ctx context.Context, log *slog.Logger, svidRequests []config.SVIDRequestWithRules, - udsCreds *uds.Creds, + att workloadattest.Attestation, ) []config.SVIDRequest { var filtered []config.SVIDRequest for _, req := range svidRequests { @@ -442,33 +455,91 @@ func filterSVIDRequests( match := false for _, rule := range req.Rules { log := log.With("rule", rule) - log.DebugContext( - ctx, - "Evaluating rule against workload attestation", - ) - if rule.Unix.UID != nil && (udsCreds == nil || *rule.Unix.UID != udsCreds.UID) { + logMismatch := func(field string, want any, got any) { log.DebugContext( ctx, "Rule did not match workload attestation", - "field", "unix.uid", + "field", field, + "want", want, + "got", got, ) - continue } - if rule.Unix.PID != nil && (udsCreds == nil || *rule.Unix.PID != udsCreds.PID) { + logNotAttested := func(requiredAttestor string) { log.DebugContext( ctx, - "Rule did not match workload attestation", - "field", "unix.pid", + "Workload did not complete attestation required for this rule", + "required_attestor", requiredAttestor, ) - continue } - if rule.Unix.GID != nil && (udsCreds == nil || *rule.Unix.GID != udsCreds.GID) { - log.DebugContext( - ctx, - "Rule did not match workload attestation", - "field", "unix.gid", - ) - continue + log.DebugContext( + ctx, + "Evaluating rule against workload attestation", + ) + if rule.Unix.UID != nil { + if !att.Unix.Attested { + logNotAttested("unix") + continue + } + if *rule.Unix.UID != att.Unix.UID { + logMismatch("unix.uid", *rule.Unix.UID, att.Unix.UID) + continue + } + // Rule field matched! + } + if rule.Unix.PID != nil { + if !att.Unix.Attested { + logNotAttested("unix") + continue + } + if *rule.Unix.PID != att.Unix.PID { + logMismatch("unix.pid", *rule.Unix.PID, att.Unix.PID) + continue + } + // Rule field matched! + } + if rule.Unix.GID != nil { + if !att.Unix.Attested { + logNotAttested("unix") + continue + } + if *rule.Unix.GID != att.Unix.GID { + logMismatch("unix.gid", *rule.Unix.GID, att.Unix.GID) + continue + } + // Rule field matched! + } + if rule.Kubernetes.Namespace != "" { + if !att.Kubernetes.Attested { + logNotAttested("kubernetes") + continue + } + if rule.Kubernetes.Namespace != att.Kubernetes.Namespace { + logMismatch("kubernetes.namespace", rule.Kubernetes.Namespace, att.Kubernetes.Namespace) + continue + } + // Rule field matched! + } + if rule.Kubernetes.PodName != "" { + if !att.Kubernetes.Attested { + logNotAttested("kubernetes") + continue + } + if rule.Kubernetes.PodName != att.Kubernetes.PodName { + logMismatch("kubernetes.pod_name", rule.Kubernetes.PodName, att.Kubernetes.PodName) + continue + } + // Rule field matched! + } + if rule.Kubernetes.ServiceAccount != "" { + if !att.Kubernetes.Attested { + logNotAttested("kubernetes") + continue + } + if rule.Kubernetes.ServiceAccount != att.Kubernetes.ServiceAccount { + logMismatch("kubernetes.service_account", rule.Kubernetes.ServiceAccount, att.Kubernetes.ServiceAccount) + continue + } + // Rule field matched! } log.DebugContext( @@ -489,49 +560,59 @@ func filterSVIDRequests( return filtered } -// FetchX509SVID generates and returns the X.509 SVIDs available to a workload. -// It is a streaming RPC, and sends renewed SVIDs to the client before they -// expire. -// Implements the SPIFFE Workload API FetchX509SVID method. -func (s *SPIFFEWorkloadAPIService) FetchX509SVID( - _ *workloadpb.X509SVIDRequest, - srv workloadpb.SpiffeWorkloadAPI_FetchX509SVIDServer, -) error { - renewCh, unsubscribe := s.trustBundleBroadcast.subscribe() - defer unsubscribe() - ctx := srv.Context() +func (s *SPIFFEWorkloadAPIService) authenticateClient(ctx context.Context) (*slog.Logger, workloadattest.Attestation, error) { + // The zero value of the attestation is equivalent to no attestation. + var att workloadattest.Attestation p, ok := peer.FromContext(ctx) if !ok { - return trace.BadParameter("peer not found in context") + return nil, att, trace.BadParameter("peer not found in context") } log := s.log authInfo, ok := p.AuthInfo.(uds.AuthInfo) + if ok && authInfo.Creds != nil { + var err error + att, err = s.attestor.Attest(ctx, authInfo.Creds.PID) + if err != nil { + return nil, att, trace.Wrap(err, "performing workload attestation") + } log = log.With( - slog.Group("workload", - slog.Group("unix", - "pid", authInfo.Creds.PID, - "uid", authInfo.Creds.UID, - "gid", authInfo.Creds.GID, - ), - ), + "workload", slog.LogValuer(att), ) } if p.Addr.String() != "" { log = log.With( - slog.Group("workload", - slog.String("addr", p.Addr.String()), - ), + slog.String("remote_addr", p.Addr.String()), ) } + return log, att, nil +} + +// FetchX509SVID generates and returns the X.509 SVIDs available to a workload. +// It is a streaming RPC, and sends renewed SVIDs to the client before they +// expire. +// Implements the SPIFFE Workload API FetchX509SVID method. +func (s *SPIFFEWorkloadAPIService) FetchX509SVID( + _ *workloadpb.X509SVIDRequest, + srv workloadpb.SpiffeWorkloadAPI_FetchX509SVIDServer, +) error { + renewCh, unsubscribe := s.trustBundleBroadcast.subscribe() + defer unsubscribe() + ctx := srv.Context() + + log, creds, err := s.authenticateClient(ctx) + if err != nil { + return trace.Wrap(err) + } + log.InfoContext(ctx, "FetchX509SVID stream opened by workload") defer log.InfoContext(ctx, "FetchX509SVID stream has closed") // Before we issue the SVIDs to the workload, we need to complete workload // attestation and determine which SVIDs to issue. - svidReqs := filterSVIDRequests(ctx, log, s.cfg.SVIDs, authInfo.Creds) + svidReqs := filterSVIDRequests(ctx, log, s.cfg.SVIDs, creds) // The SPIFFE Workload API (5.2.1): // diff --git a/lib/tbot/service_spiffe_workload_api_test.go b/lib/tbot/service_spiffe_workload_api_test.go index 1638a836f6e41..3a331a1a1f06d 100644 --- a/lib/tbot/service_spiffe_workload_api_test.go +++ b/lib/tbot/service_spiffe_workload_api_test.go @@ -26,7 +26,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/gravitational/teleport/lib/tbot/config" - "github.com/gravitational/teleport/lib/uds" + "github.com/gravitational/teleport/lib/tbot/spiffe/workloadattest" "github.com/gravitational/teleport/lib/utils" ) @@ -35,17 +35,18 @@ func ptr[T any](v T) *T { } func TestSPIFFEWorkloadAPIService_filterSVIDRequests(t *testing.T) { + // This test is more for overall behavior. Use the _field test for + // each individual field. ctx := context.Background() log := utils.NewSlogLoggerForTests() tests := []struct { name string - uds *uds.Creds + att workloadattest.Attestation in []config.SVIDRequestWithRules want []config.SVIDRequest }{ { name: "no rules", - uds: nil, in: []config.SVIDRequestWithRules{ { SVIDRequest: config.SVIDRequest{ @@ -68,11 +69,14 @@ func TestSPIFFEWorkloadAPIService_filterSVIDRequests(t *testing.T) { }, }, { - name: "no rules with uds", - uds: &uds.Creds{ - UID: 1000, - GID: 1001, - PID: 1002, + name: "no rules with attestation", + att: workloadattest.Attestation{ + Unix: workloadattest.UnixAttestation{ + Attested: true, + UID: 1000, + GID: 1001, + PID: 1002, + }, }, in: []config.SVIDRequestWithRules{ { @@ -96,11 +100,43 @@ func TestSPIFFEWorkloadAPIService_filterSVIDRequests(t *testing.T) { }, }, { - name: "no matching rules with uds", - uds: &uds.Creds{ - UID: 1000, - GID: 1001, - PID: 1002, + name: "no rules with attestation", + att: workloadattest.Attestation{ + Unix: workloadattest.UnixAttestation{ + // We don't expect that workloadattest will ever return + // Attested: false and include UID/PID/GID but we want to + // ensure we handle this by failing regardless. + Attested: false, + UID: 1000, + GID: 1001, + PID: 1002, + }, + }, + in: []config.SVIDRequestWithRules{ + { + SVIDRequest: config.SVIDRequest{ + Path: "/foo", + }, + Rules: []config.SVIDRequestRule{ + { + Unix: config.SVIDRequestRuleUnix{ + UID: ptr(1000), + }, + }, + }, + }, + }, + want: nil, + }, + { + name: "no matching rules with attestation", + att: workloadattest.Attestation{ + Unix: workloadattest.UnixAttestation{ + Attested: true, + UID: 1000, + GID: 1001, + PID: 1002, + }, }, in: []config.SVIDRequestWithRules{ { @@ -137,8 +173,7 @@ func TestSPIFFEWorkloadAPIService_filterSVIDRequests(t *testing.T) { want: nil, }, { - name: "no matching rules without uds", - uds: nil, + name: "no matching rules without attestation", in: []config.SVIDRequestWithRules{ { SVIDRequest: config.SVIDRequest{ @@ -174,10 +209,13 @@ func TestSPIFFEWorkloadAPIService_filterSVIDRequests(t *testing.T) { }, { name: "some matching rules with uds", - uds: &uds.Creds{ - UID: 1000, - GID: 1001, - PID: 1002, + att: workloadattest.Attestation{ + Unix: workloadattest.UnixAttestation{ + Attested: true, + UID: 1000, + GID: 1001, + PID: 1002, + }, }, in: []config.SVIDRequestWithRules{ { @@ -230,8 +268,158 @@ func TestSPIFFEWorkloadAPIService_filterSVIDRequests(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - got := filterSVIDRequests(ctx, log, tt.in, tt.uds) + got := filterSVIDRequests(ctx, log, tt.in, tt.att) assert.Empty(t, gocmp.Diff(tt.want, got)) }) } } + +func TestSPIFFEWorkloadAPIService_filterSVIDRequests_field(t *testing.T) { + ctx := context.Background() + log := utils.NewSlogLoggerForTests() + tests := []struct { + field string + matching workloadattest.Attestation + nonMatching workloadattest.Attestation + rule config.SVIDRequestRule + }{ + { + field: "unix.pid", + rule: config.SVIDRequestRule{ + Unix: config.SVIDRequestRuleUnix{ + PID: ptr(1000), + }, + }, + matching: workloadattest.Attestation{ + Unix: workloadattest.UnixAttestation{ + Attested: true, + PID: 1000, + }, + }, + nonMatching: workloadattest.Attestation{ + Unix: workloadattest.UnixAttestation{ + Attested: true, + PID: 200, + }, + }, + }, + { + field: "unix.uid", + rule: config.SVIDRequestRule{ + Unix: config.SVIDRequestRuleUnix{ + UID: ptr(1000), + }, + }, + matching: workloadattest.Attestation{ + Unix: workloadattest.UnixAttestation{ + Attested: true, + UID: 1000, + }, + }, + nonMatching: workloadattest.Attestation{ + Unix: workloadattest.UnixAttestation{ + Attested: true, + UID: 200, + }, + }, + }, + { + field: "unix.gid", + rule: config.SVIDRequestRule{ + Unix: config.SVIDRequestRuleUnix{ + GID: ptr(1000), + }, + }, + matching: workloadattest.Attestation{ + Unix: workloadattest.UnixAttestation{ + Attested: true, + GID: 1000, + }, + }, + nonMatching: workloadattest.Attestation{ + Unix: workloadattest.UnixAttestation{ + Attested: true, + GID: 200, + }, + }, + }, + { + field: "unix.namespace", + rule: config.SVIDRequestRule{ + Kubernetes: config.SVIDRequestRuleKubernetes{ + Namespace: "foo", + }, + }, + matching: workloadattest.Attestation{ + Kubernetes: workloadattest.KubernetesAttestation{ + Attested: true, + Namespace: "foo", + }, + }, + nonMatching: workloadattest.Attestation{ + Kubernetes: workloadattest.KubernetesAttestation{ + Attested: true, + Namespace: "bar", + }, + }, + }, + { + field: "kubernetes.service_account", + rule: config.SVIDRequestRule{ + Kubernetes: config.SVIDRequestRuleKubernetes{ + ServiceAccount: "foo", + }, + }, + matching: workloadattest.Attestation{ + Kubernetes: workloadattest.KubernetesAttestation{ + Attested: true, + ServiceAccount: "foo", + }, + }, + nonMatching: workloadattest.Attestation{ + Kubernetes: workloadattest.KubernetesAttestation{ + Attested: true, + ServiceAccount: "bar", + }, + }, + }, + { + field: "kubernetes.pod_name", + rule: config.SVIDRequestRule{ + Kubernetes: config.SVIDRequestRuleKubernetes{ + PodName: "foo", + }, + }, + matching: workloadattest.Attestation{ + Kubernetes: workloadattest.KubernetesAttestation{ + Attested: true, + PodName: "foo", + }, + }, + nonMatching: workloadattest.Attestation{ + Kubernetes: workloadattest.KubernetesAttestation{ + Attested: true, + PodName: "bar", + }, + }, + }, + } + for _, tt := range tests { + t.Run(tt.field, func(t *testing.T) { + rules := []config.SVIDRequestWithRules{ + { + SVIDRequest: config.SVIDRequest{ + Path: "/foo", + }, + Rules: []config.SVIDRequestRule{tt.rule}, + }, + } + t.Run("matching", func(t *testing.T) { + assert.Len(t, filterSVIDRequests(ctx, log, rules, tt.matching), 1) + }) + t.Run("non-matching", func(t *testing.T) { + assert.Empty(t, filterSVIDRequests(ctx, log, rules, tt.nonMatching)) + }) + }) + } +} diff --git a/lib/tbot/spiffe/workloadattest/attest.go b/lib/tbot/spiffe/workloadattest/attest.go new file mode 100644 index 0000000000000..cd3d87cf65dc1 --- /dev/null +++ b/lib/tbot/spiffe/workloadattest/attest.go @@ -0,0 +1,107 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package workloadattest + +import ( + "context" + "log/slog" + + "github.com/gravitational/trace" +) + +// Attestation holds the results of the attestation process carried out on a +// PID by the attestor. +type Attestation struct { + Unix UnixAttestation + Kubernetes KubernetesAttestation +} + +// LogValue implements slog.LogValue to provide a nicely formatted set of +// log keys for a given attestation. +func (a Attestation) LogValue() slog.Value { + return slog.GroupValue( + slog.Attr{ + Key: "unix", + Value: a.Unix.LogValue(), + }, + slog.Attr{ + Key: "kubernetes", + Value: a.Kubernetes.LogValue(), + }, + ) +} + +type attestor[T any] interface { + Attest(ctx context.Context, pid int) (T, error) +} + +// Attestor runs the workload attestation process on a given PID to determine +// key information about the process. +type Attestor struct { + log *slog.Logger + kubernetes attestor[KubernetesAttestation] + unix attestor[UnixAttestation] +} + +// Config is the configuration for Attestor +type Config struct { + Kubernetes KubernetesAttestorConfig `yaml:"kubernetes"` +} + +func (c *Config) CheckAndSetDefaults() error { + return trace.Wrap(c.Kubernetes.CheckAndSetDefaults(), "validating kubernetes") +} + +// NewAttestor returns an Attestor from the given config. +func NewAttestor(log *slog.Logger, cfg Config) (*Attestor, error) { + att := &Attestor{ + log: log, + unix: NewUnixAttestor(), + } + if cfg.Kubernetes.Enabled { + att.kubernetes = NewKubernetesAttestor(cfg.Kubernetes, log) + } + return att, nil +} + +func (a *Attestor) Attest(ctx context.Context, pid int) (Attestation, error) { + a.log.DebugContext(ctx, "Starting workload attestation", "pid", pid) + defer a.log.DebugContext(ctx, "Finished workload attestation complete", "pid", pid) + + att := Attestation{} + var err error + + // We always perform the unix attestation first + att.Unix, err = a.unix.Attest(ctx, pid) + if err != nil { + return att, err + } + + // Then we can perform the optionally configured attestations + // For these, failure is soft. If it fails, we log, but still return the + // successfully attested data. + if a.kubernetes != nil { + att.Kubernetes, err = a.kubernetes.Attest(ctx, pid) + if err != nil { + a.log.WarnContext(ctx, "Failed to perform Kubernetes workload attestation", "error", err) + } + } + + return att, nil +} diff --git a/lib/tbot/spiffe/workloadattest/kubernetes.go b/lib/tbot/spiffe/workloadattest/kubernetes.go new file mode 100644 index 0000000000000..afadbab5c45e4 --- /dev/null +++ b/lib/tbot/spiffe/workloadattest/kubernetes.go @@ -0,0 +1,135 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package workloadattest + +import ( + "log/slog" + + "github.com/gravitational/trace" +) + +// KubernetesAttestation holds the Kubernetes pod information retrieved from +// the workload attestation process. +type KubernetesAttestation struct { + // Attested is true if the PID was successfully attested to a Kubernetes + // pod. This indicates the validity of the rest of the fields. + Attested bool + // Namespace is the namespace of the pod. + Namespace string + // ServiceAccount is the service account of the pod. + ServiceAccount string + // PodName is the name of the pod. + PodName string + // PodUID is the UID of the pod. + PodUID string + // Labels is a map of labels on the pod. + Labels map[string]string +} + +// LogValue implements slog.LogValue to provide a nicely formatted set of +// log keys for a given attestation. +func (a KubernetesAttestation) LogValue() slog.Value { + values := []slog.Attr{ + slog.Bool("attested", a.Attested), + } + if a.Attested { + labels := []slog.Attr{} + for k, v := range a.Labels { + labels = append(labels, slog.String(k, v)) + } + values = append(values, + slog.String("namespace", a.Namespace), + slog.String("service_account", a.ServiceAccount), + slog.String("pod_name", a.PodName), + slog.String("pod_uid", a.PodUID), + slog.Attr{ + Key: "labels", + Value: slog.GroupValue(labels...), + }, + ) + } + return slog.GroupValue(values...) +} + +// KubernetesAttestorConfig holds the configuration for the KubernetesAttestor. +type KubernetesAttestorConfig struct { + // Enabled is true if the KubernetesAttestor is enabled. If false, + // Kubernetes attestation will not be attempted. + Enabled bool `yaml:"enabled"` + Kubelet KubeletClientConfig `yaml:"kubelet,omitempty"` +} + +func (c *KubernetesAttestorConfig) CheckAndSetDefaults() error { + if !c.Enabled { + return nil + } + return trace.Wrap(c.Kubelet.CheckAndSetDefaults(), "validating kubelet") +} + +const ( + // nodeNameEnv is used to inject the current nodes name via the downward API. + // This provides a hostname for the kubelet client to use. + nodeNameEnv = "TELEPORT_NODE_NAME" + defaultServiceAccountTokenPath = "/var/run/secrets/kubernetes.io/serviceaccount/token" + defaultCAPath = "/var/run/secrets/kubernetes.io/serviceaccount/ca.crt" + defaultSecurePort = 10250 +) + +// KubeletClientConfig holds the configuration for the Kubelet client +// used to query the Kubelet API for workload attestation. +type KubeletClientConfig struct { + // ReadOnlyPort is the port on which the Kubelet API is exposed for + // read-only operations. This is mutually exclusive with SecurePort. + // This is primarily left for legacy support - since Kubernetes 1.16, the + // read-only port is disabled by default. + ReadOnlyPort int `yaml:"read_only_port,omitempty"` + // SecurePort specifies the secure port on which the Kubelet API is exposed. + // If unspecified, this defaults to `10250`. This is mutually exclusive + // with ReadOnlyPort. + SecurePort int `yaml:"secure_port,omitempty"` + + // TokenPath is the path to the token file used to authenticate with the + // Kubelet API when using the secure port. + // Defaults to `/var/run/secrets/kubernetes.io/serviceaccount/token`. + TokenPath string `yaml:"token_path,omitempty"` + // CAPath is the path to the CA file used to verify the certificate + // presented by Kubelet when using the secure port. + // Defaults to `/var/run/secrets/kubernetes.io/serviceaccount/ca.crt`. + CAPath string `yaml:"ca_path,omitempty"` + // SkipVerify is used to skip verification of the Kubelet's certificate when + // using the secure port. If set, CAPath will be ignored. + // + // This is useful in scenarios where Kubelet has not been configured with a + // valid certificate signed by the cluster CA. This is more common than + // you'd think. + SkipVerify bool `yaml:"skip_verify,omitempty"` + // Anonymous is used to indicate that no authentication should be used + // when connecting to the secure Kubelet API. If set, TokenPath will be + // ignored. + Anonymous bool `yaml:"anonymous,omitempty"` +} + +// CheckAndSetDefaults checks the KubeletClientConfig for any invalid values +// and sets defaults where necessary. +func (c KubeletClientConfig) CheckAndSetDefaults() error { + if c.ReadOnlyPort != 0 && c.SecurePort != 0 { + return trace.BadParameter("readOnlyPort and securePort are mutually exclusive") + } + return nil +} diff --git a/lib/tbot/spiffe/workloadattest/kubernetes_unix.go b/lib/tbot/spiffe/workloadattest/kubernetes_unix.go new file mode 100644 index 0000000000000..567b33d337d00 --- /dev/null +++ b/lib/tbot/spiffe/workloadattest/kubernetes_unix.go @@ -0,0 +1,316 @@ +//go:build unix + +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package workloadattest + +import ( + "cmp" + "context" + "crypto/tls" + "crypto/x509" + "encoding/json" + "fmt" + "log/slog" + "net" + "net/http" + "net/url" + "os" + "path" + "regexp" + "strconv" + "strings" + "time" + + "github.com/gravitational/trace" + v1 "k8s.io/api/core/v1" + "k8s.io/utils/mount" +) + +// KubernetesAttestor attests a workload to a Kubernetes pod. +// +// It requires: +// +// - `hostPID: true` so we can view the /proc of other pods. +// - `TELEPORT_MY_NODE_NAME` to be set to the node name of the current node. +// - A service account that allows it to query the Kubelet API. +// +// It roughly takes the following steps: +// 1. From the PID, determine the container ID and pod ID from the +// /proc//mountinfo file. +// 2. Makes a request to the Kubelet API to list all pods on the node. +// 3. Find the pod and container with the matching ID. +// 4. Convert the pod information to a KubernetesAttestation. +type KubernetesAttestor struct { + kubeletClient *kubeletClient + log *slog.Logger + // rootPath specifies the location of `/`. This allows overriding for tests. + rootPath string +} + +// NewKubernetesAttestor creates a new KubernetesAttestor. +func NewKubernetesAttestor(cfg KubernetesAttestorConfig, log *slog.Logger) *KubernetesAttestor { + kubeletClient := newKubeletClient(cfg.Kubelet) + return &KubernetesAttestor{ + kubeletClient: kubeletClient, + log: log, + } +} + +// Attest resolves the Kubernetes pod information from the +// PID of the workload. +func (a *KubernetesAttestor) Attest(ctx context.Context, pid int) (KubernetesAttestation, error) { + a.log.DebugContext(ctx, "Starting Kubernetes workload attestation", "pid", pid) + + podID, containerID, err := a.getContainerAndPodID(pid) + if err != nil { + return KubernetesAttestation{}, trace.Wrap(err, "determining pod and container ID") + } + a.log.DebugContext(ctx, "Found pod and container ID", "pod_id", podID, "container_id", containerID) + + pod, err := a.getPodForID(ctx, podID) + if err != nil { + return KubernetesAttestation{}, trace.Wrap(err, "finding pod by ID") + } + a.log.DebugContext(ctx, "Found pod", "pod_name", pod.Name) + + att := KubernetesAttestation{ + Attested: true, + Namespace: pod.Namespace, + ServiceAccount: pod.Spec.ServiceAccountName, + PodName: pod.Name, + PodUID: string(pod.UID), + Labels: pod.Labels, + } + a.log.DebugContext(ctx, "Finished Kubernetes workload attestation", "attestation", att) + return att, nil +} + +// getContainerAndPodID retrieves the container ID and pod ID for the provided +// PID. +func (a *KubernetesAttestor) getContainerAndPodID(pid int) (podID string, containerID string, err error) { + info, err := mount.ParseMountInfo( + path.Join(a.rootPath, "/proc", strconv.Itoa(pid), "mountinfo"), + ) + if err != nil { + return "", "", trace.Wrap( + err, "parsing mountinfo", + ) + } + + // Find the cgroup or cgroupv2 mount + // For cgroup v2, we expect a single mount. But for cgroup v1, there will + // be one mount per subsystem, but regardless, they will all contain the + // same container ID/pod ID. + var cgroupMount mount.MountInfo + for _, m := range info { + if m.FsType == "cgroup" || m.FsType == "cgroup2" { + cgroupMount = m + break + } + } + + podID, containerID, err = mountpointSourceToContainerAndPodID( + cgroupMount.Root, + ) + if err != nil { + return "", "", trace.Wrap( + err, "parsing cgroup mount (root: %q)", cgroupMount.Root, + ) + } + return podID, containerID, nil +} + +var ( + // A container ID is usually a 64 character hex string, so this regex just + // selects for that. + containerIDRegex = regexp.MustCompile(`(?P[[:xdigit:]]{64})`) + // A pod ID is usually a UUID prefaced with "pod". + // There are two main cgroup drivers: + // - systemd , the dashes are replaced with underscores + // - cgroupfs, the dashes are kept. + podIDRegex = regexp.MustCompile(`pod(?P[[:xdigit:]]{8}[_-][[:xdigit:]]{4}[_-][[:xdigit:]]{4}[_-][[:xdigit:]]{4}[_-][[:xdigit:]]{12})`) +) + +// mountpointSourceToContainerAndPodID takes the source of the cgroup mountpoint +// and extracts the container ID and pod ID from it. +// +// Note: this is a fairly naive implementation, we may need to make further +// improvements to account for other distributions of Kubernetes. +func mountpointSourceToContainerAndPodID(source string) (podID string, containerID string, err error) { + // From the mount, we need to extract the container ID and pod ID. + // Unfortunately this process can be a little fragile, as the format of + // the mountpoint varies across Kubernetes implementations. + // There's a collection of real world mountfiles in testdata/mountfile. + + matches := containerIDRegex.FindStringSubmatch(source) + if len(matches) != 2 { + return "", "", trace.BadParameter( + "expected 2 matches searching for container ID but found %d", + len(matches), + ) + } + containerID = matches[1] + if containerID == "" { + return "", "", trace.BadParameter( + "source does not contain container ID", + ) + } + + matches = podIDRegex.FindStringSubmatch(source) + if len(matches) != 2 { + return "", "", trace.BadParameter( + "expected 2 matches searching for pod ID but found %d", + len(matches), + ) + } + podID = matches[1] + if podID == "" { + return "", "", trace.BadParameter( + "source does not contain pod ID", + ) + } + + // When using the `systemd` cgroup driver, the dashes are replaced with + // underscores. So let's correct that. + podID = strings.ReplaceAll(podID, "_", "-") + + return podID, containerID, nil +} + +// getPodForID retrieves the pod information for the provided pod ID. +// https://github.com/kubernetes/kubernetes/blob/master/pkg/kubelet/server/server.go#L371 +func (a *KubernetesAttestor) getPodForID(ctx context.Context, podID string) (*v1.Pod, error) { + pods, err := a.kubeletClient.ListAllPods(ctx) + if err != nil { + return nil, trace.Wrap(err, "listing all pods") + } + for _, pod := range pods.Items { + if string(pod.UID) == podID { + return &pod, nil + } + } + return nil, trace.NotFound("pod %q not found", podID) +} + +// kubeletClient is a HTTP client for the Kubelet API +type kubeletClient struct { + cfg KubeletClientConfig + getEnv func(string) string +} + +func newKubeletClient(cfg KubeletClientConfig) *kubeletClient { + return &kubeletClient{ + cfg: cfg, + getEnv: os.Getenv, + } +} + +type roundTripperFn func(req *http.Request) (*http.Response, error) + +func (f roundTripperFn) RoundTrip(req *http.Request) (*http.Response, error) { + return f(req) +} + +func (c *kubeletClient) httpClient() (url.URL, *http.Client, error) { + host := c.getEnv(nodeNameEnv) + + if c.cfg.ReadOnlyPort != 0 { + return url.URL{ + Scheme: "http", + Host: net.JoinHostPort(host, strconv.Itoa(c.cfg.ReadOnlyPort)), + }, &http.Client{}, nil + } + + port := cmp.Or(c.cfg.SecurePort, defaultSecurePort) + + transport := &http.Transport{ + TLSClientConfig: &tls.Config{}, + } + + switch { + case c.cfg.SkipVerify: + transport.TLSClientConfig.InsecureSkipVerify = true + default: + caPath := cmp.Or(c.cfg.CAPath, defaultCAPath) + certPool := x509.NewCertPool() + caPEM, err := os.ReadFile(caPath) + if err != nil { + return url.URL{}, nil, trace.Wrap(err, "reading CA file %q", caPath) + } + if !certPool.AppendCertsFromPEM(caPEM) { + return url.URL{}, nil, trace.BadParameter("failed to append CA cert from %q", caPath) + } + transport.TLSClientConfig.RootCAs = certPool + } + + client := &http.Client{ + Transport: transport, + // 10 seconds is fairly generous given that we're expecting to talk to + // kubelet on the same physical machine. + Timeout: 10 * time.Second, + } + + switch { + case c.cfg.Anonymous: + // Nothing to do + case c.cfg.TokenPath != "": + fallthrough + default: + tokenPath := cmp.Or(c.cfg.TokenPath, defaultServiceAccountTokenPath) + token, err := os.ReadFile(tokenPath) + if err != nil { + return url.URL{}, nil, trace.Wrap(err, "reading token file %q", tokenPath) + } + client.Transport = roundTripperFn(func(req *http.Request) (*http.Response, error) { + req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", token)) + return transport.RoundTrip(req) + }) + } + + return url.URL{ + Scheme: "https", + Host: net.JoinHostPort(host, strconv.Itoa(port)), + }, client, nil +} + +func (c *kubeletClient) ListAllPods(ctx context.Context) (*v1.PodList, error) { + reqUrl, client, err := c.httpClient() + if err != nil { + return nil, trace.Wrap(err, "creating HTTP client") + } + reqUrl.Path = "/pods" + + req, err := http.NewRequestWithContext(ctx, http.MethodGet, reqUrl.String(), nil) + if err != nil { + return nil, trace.Wrap(err, "creating request") + } + + res, err := client.Do(req) + if err != nil { + return nil, trace.Wrap(err, "performing request") + } + defer res.Body.Close() + + out := &v1.PodList{} + if err := json.NewDecoder(res.Body).Decode(out); err != nil { + return nil, trace.Wrap(err, "decoding response") + } + return out, nil +} diff --git a/lib/tbot/spiffe/workloadattest/kubernetes_unix_test.go b/lib/tbot/spiffe/workloadattest/kubernetes_unix_test.go new file mode 100644 index 0000000000000..79704cb775cf8 --- /dev/null +++ b/lib/tbot/spiffe/workloadattest/kubernetes_unix_test.go @@ -0,0 +1,178 @@ +//go:build unix + +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package workloadattest + +import ( + "context" + "encoding/json" + "net" + "net/http" + "net/http/httptest" + "os" + "path/filepath" + "strconv" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" + + "github.com/gravitational/teleport/lib/utils" +) + +func TestKubernetesAttestor_getContainerAndPodID(t *testing.T) { + log := utils.NewSlogLoggerForTests() + tests := []struct { + name string + wantPodID string + wantContainerID string + }{ + { + name: "k8s-real-docker-desktop", + wantPodID: "941f292f-a62d-48ab-b9a8-eec84d87b928", + wantContainerID: "3f79e718744418736d0f6b9958e08d44e969c6577068c33de1cc400d35aacec8", + }, + { + name: "k8s-real-orbstack", + wantPodID: "36827f77-691f-45aa-a470-0989cf3749c4", + wantContainerID: "64dd9bf5199ff782835247cb072e4842dc3d0135ef02f6498cb6bb6f37a320d2", + }, + { + name: "k8s-real-k3s-ubuntu-v1.28.6+k3s2", + wantPodID: "fecd2321-17b5-49b9-9f75-8c5be777fbfb", + wantContainerID: "397529d07efebd566f15dbc7e8af9f3ef586033f5e753adfa96b2bf730102c64", + }, + { + name: "k8s-real-gcp-v1.29.5-gke.1091002", + wantPodID: "61c266b0-6f75-4490-8d92-3c9ae4d02787", + wantContainerID: "9da25af0b548c8c60aa60f77f299ba727bf72d58248bd7528eb5390ffcce555a", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + tempDir := t.TempDir() + require.NoError(t, os.MkdirAll(filepath.Join(tempDir, "proc", "1234"), 0755)) + require.NoError(t, utils.CopyFile( + filepath.Join("testdata", "mountfile", tt.name), + filepath.Join(tempDir, "proc", "1234", "mountinfo"), + 0755), + ) + attestor := &KubernetesAttestor{ + rootPath: tempDir, + log: log, + } + gotPodID, gotContainerID, err := attestor.getContainerAndPodID(1234) + assert.NoError(t, err) + assert.Equal(t, tt.wantPodID, gotPodID) + assert.Equal(t, tt.wantContainerID, gotContainerID) + }) + } +} + +func TestKubernetesAttestor_Attest(t *testing.T) { + t.Parallel() + log := utils.NewSlogLoggerForTests() + ctx := context.Background() + + mockToken := "FOOBARBUZZ" + mockPID := 1234 + // Value from k8s-real-gcp-v1.29.5-gke.1091002 + mockPodID := "61c266b0-6f75-4490-8d92-3c9ae4d02787" + + // Setup mock Kubelet Secure API + mockKubeletAPI := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + if req.URL.Path != "/pods" { + http.NotFound(w, req) + return + } + out := v1.PodList{ + Items: []v1.Pod{ + { + ObjectMeta: metav1.ObjectMeta{ + Name: "my-pod", + Namespace: "default", + UID: types.UID(mockPodID), + Labels: map[string]string{ + "my-label": "my-label-value", + }, + }, + Spec: v1.PodSpec{ + ServiceAccountName: "my-service-account", + }, + }, + }, + } + w.WriteHeader(200) + assert.NoError(t, json.NewEncoder(w).Encode(out)) + })) + t.Cleanup(mockKubeletAPI.Close) + kubeletAddr := mockKubeletAPI.Listener.Addr().String() + host, port, err := net.SplitHostPort(kubeletAddr) + require.NoError(t, err) + portInt, err := strconv.Atoi(port) + require.NoError(t, err) + + // Setup mock filesystem + tmpDir := t.TempDir() + tokenPath := filepath.Join(tmpDir, "token") + require.NoError(t, os.WriteFile(tokenPath, []byte(mockToken), 0644)) + procPath := filepath.Join(tmpDir, "proc") + procPIDPath := filepath.Join(procPath, strconv.Itoa(mockPID)) + pidMountInfoPath := filepath.Join(procPIDPath, "mountinfo") + require.NoError(t, os.MkdirAll(procPIDPath, 0755)) + require.NoError(t, utils.CopyFile( + filepath.Join("testdata", "mountfile", "k8s-real-gcp-v1.29.5-gke.1091002"), + pidMountInfoPath, + 0755), + ) + + // Setup Attestor for mocks + attestor := NewKubernetesAttestor(KubernetesAttestorConfig{ + Enabled: true, + Kubelet: KubeletClientConfig{ + TokenPath: tokenPath, + SkipVerify: true, + SecurePort: portInt, + }, + }, log) + attestor.rootPath = tmpDir + attestor.kubeletClient.getEnv = func(s string) string { + env := map[string]string{ + "TELEPORT_NODE_NAME": host, + } + return env[s] + } + + att, err := attestor.Attest(ctx, mockPID) + assert.NoError(t, err) + assert.Equal(t, KubernetesAttestation{ + Attested: true, + ServiceAccount: "my-service-account", + Namespace: "default", + PodName: "my-pod", + PodUID: mockPodID, + Labels: map[string]string{ + "my-label": "my-label-value", + }, + }, att) +} diff --git a/lib/tbot/spiffe/workloadattest/kubernetes_windows.go b/lib/tbot/spiffe/workloadattest/kubernetes_windows.go new file mode 100644 index 0000000000000..27b11b13227ca --- /dev/null +++ b/lib/tbot/spiffe/workloadattest/kubernetes_windows.go @@ -0,0 +1,41 @@ +//go:build windows + +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package workloadattest + +import ( + "context" + "log/slog" + + "github.com/gravitational/trace" +) + +// WindowsKubernetesAttestor is the windows stub for KubernetesAttestor. +type WindowsKubernetesAttestor struct { +} + +func (a WindowsKubernetesAttestor) Attest(_ context.Context, _ int) (KubernetesAttestation, error) { + return KubernetesAttestation{}, trace.NotImplemented("kubernetes attestation is not supported on windows") +} + +// NewKubernetesAttestor creates a new KubernetesAttestor. +func NewKubernetesAttestor(_ KubernetesAttestorConfig, _ *slog.Logger) *WindowsKubernetesAttestor { + return &WindowsKubernetesAttestor{} +} diff --git a/lib/tbot/spiffe/workloadattest/testdata/mountfile/k8s-real-docker-desktop b/lib/tbot/spiffe/workloadattest/testdata/mountfile/k8s-real-docker-desktop new file mode 100644 index 0000000000000..4b18eb32c96ef --- /dev/null +++ b/lib/tbot/spiffe/workloadattest/testdata/mountfile/k8s-real-docker-desktop @@ -0,0 +1,22 @@ +752 518 0:203 / / rw,relatime master:65 - overlay overlay rw,lowerdir=/var/lib/desktop-containerd/daemon/io.containerd.snapshotter.v1.overlayfs/snapshots/140/fs:/var/lib/desktop-containerd/daemon/io.containerd.snapshotter.v1.overlayfs/snapshots/134/fs,upperdir=/var/lib/desktop-containerd/daemon/io.containerd.snapshotter.v1.overlayfs/snapshots/141/fs,workdir=/var/lib/desktop-containerd/daemon/io.containerd.snapshotter.v1.overlayfs/snapshots/141/work +753 752 0:205 / /proc rw,nosuid,nodev,noexec,relatime - proc proc rw +754 752 0:206 / /dev rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755 +755 754 0:207 / /dev/pts rw,nosuid,noexec,relatime - devpts devpts rw,gid=5,mode=620,ptmxmode=666 +756 752 0:201 / /sys ro,nosuid,nodev,noexec,relatime - sysfs sysfs ro +757 756 0:31 /../../pod941f292f-a62d-48ab-b9a8-eec84d87b928/3f79e718744418736d0f6b9958e08d44e969c6577068c33de1cc400d35aacec8 /sys/fs/cgroup ro,nosuid,nodev,noexec,relatime - cgroup2 cgroup rw +758 754 0:197 / /dev/mqueue rw,nosuid,nodev,noexec,relatime - mqueue mqueue rw +759 754 0:196 / /dev/shm rw,nosuid,nodev,noexec,relatime - tmpfs shm rw,size=65536k +760 754 254:1 /kubelet/pods/941f292f-a62d-48ab-b9a8-eec84d87b928/containers/ubuntu/0a0e971b /dev/termination-log rw,relatime - ext4 /dev/vda1 rw,discard +761 752 254:1 /docker/containers/4bdc92c994044b7998d9288ce0dfd191bff269fe24040c7966381a32ee2566c6/resolv.conf /etc/resolv.conf rw,relatime - ext4 /dev/vda1 rw,discard +762 752 254:1 /docker/containers/4bdc92c994044b7998d9288ce0dfd191bff269fe24040c7966381a32ee2566c6/hostname /etc/hostname rw,relatime - ext4 /dev/vda1 rw,discard +763 752 254:1 /kubelet/pods/941f292f-a62d-48ab-b9a8-eec84d87b928/etc-hosts /etc/hosts rw,relatime - ext4 /dev/vda1 rw,discard +764 752 0:193 / /run/secrets/kubernetes.io/serviceaccount ro,relatime - tmpfs tmpfs rw,size=7926524k +519 753 0:205 /bus /proc/bus ro,nosuid,nodev,noexec,relatime - proc proc rw +536 753 0:205 /fs /proc/fs ro,nosuid,nodev,noexec,relatime - proc proc rw +537 753 0:205 /irq /proc/irq ro,nosuid,nodev,noexec,relatime - proc proc rw +538 753 0:205 /sys /proc/sys ro,nosuid,nodev,noexec,relatime - proc proc rw +539 753 0:205 /sysrq-trigger /proc/sysrq-trigger ro,nosuid,nodev,noexec,relatime - proc proc rw +540 753 0:206 /null /proc/kcore rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755 +541 753 0:206 /null /proc/keys rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755 +567 753 0:206 /null /proc/timer_list rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755 +582 756 0:208 / /sys/firmware ro,relatime - tmpfs tmpfs ro \ No newline at end of file diff --git a/lib/tbot/spiffe/workloadattest/testdata/mountfile/k8s-real-gcp-v1.29.5-gke.1091002 b/lib/tbot/spiffe/workloadattest/testdata/mountfile/k8s-real-gcp-v1.29.5-gke.1091002 new file mode 100644 index 0000000000000..308bb7dce070d --- /dev/null +++ b/lib/tbot/spiffe/workloadattest/testdata/mountfile/k8s-real-gcp-v1.29.5-gke.1091002 @@ -0,0 +1,24 @@ +2649 2422 0:419 / / rw,relatime master:943 - overlay overlay rw,lowerdir=/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/434/fs,upperdir=/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/448/fs,workdir=/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/448/work +2650 2649 0:421 / /proc rw,nosuid,nodev,noexec,relatime - proc proc rw +2651 2649 0:422 / /dev rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755 +2652 2651 0:423 / /dev/pts rw,nosuid,noexec,relatime - devpts devpts rw,gid=5,mode=620,ptmxmode=666 +2653 2651 0:411 / /dev/mqueue rw,nosuid,nodev,noexec,relatime - mqueue mqueue rw +2654 2649 0:415 / /sys ro,nosuid,nodev,noexec,relatime - sysfs sysfs ro +2655 2654 0:25 /../../kubepods-besteffort-pod61c266b0_6f75_4490_8d92_3c9ae4d02787.slice/cri-containerd-9da25af0b548c8c60aa60f77f299ba727bf72d58248bd7528eb5390ffcce555a.scope /sys/fs/cgroup ro,nosuid,nodev,noexec,relatime - cgroup2 cgroup rw +2656 2649 8:1 /var/lib/kubelet/pods/61c266b0-6f75-4490-8d92-3c9ae4d02787/etc-hosts /etc/hosts rw,relatime - ext4 /dev/sda1 rw,commit=30 +2657 2651 8:1 /var/lib/kubelet/pods/61c266b0-6f75-4490-8d92-3c9ae4d02787/containers/ubuntu/32ca55fa /dev/termination-log rw,relatime - ext4 /dev/sda1 rw,commit=30 +2658 2649 8:1 /var/lib/containerd/io.containerd.grpc.v1.cri/sandboxes/569976599cee4242e02a57be87909f6f08bc6615e346d57a1f07dfab7239c4ff/hostname /etc/hostname rw,nosuid,nodev,relatime - ext4 /dev/sda1 rw,commit=30 +2659 2649 8:1 /var/lib/containerd/io.containerd.grpc.v1.cri/sandboxes/569976599cee4242e02a57be87909f6f08bc6615e346d57a1f07dfab7239c4ff/resolv.conf /etc/resolv.conf rw,nosuid,nodev,relatime - ext4 /dev/sda1 rw,commit=30 +2660 2651 0:408 / /dev/shm rw,nosuid,nodev,noexec,relatime - tmpfs shm rw,size=65536k +2661 2649 0:407 / /run/secrets/kubernetes.io/serviceaccount ro,relatime - tmpfs tmpfs rw,size=2873312k +2423 2650 0:421 /bus /proc/bus ro,nosuid,nodev,noexec,relatime - proc proc rw +2424 2650 0:421 /fs /proc/fs ro,nosuid,nodev,noexec,relatime - proc proc rw +2425 2650 0:421 /irq /proc/irq ro,nosuid,nodev,noexec,relatime - proc proc rw +2426 2650 0:421 /sys /proc/sys ro,nosuid,nodev,noexec,relatime - proc proc rw +2427 2650 0:421 /sysrq-trigger /proc/sysrq-trigger ro,nosuid,nodev,noexec,relatime - proc proc rw +2428 2650 0:424 / /proc/acpi ro,relatime - tmpfs tmpfs ro +2429 2650 0:422 /null /proc/kcore rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755 +2430 2650 0:422 /null /proc/keys rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755 +2431 2650 0:422 /null /proc/timer_list rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755 +2432 2650 0:425 / /proc/scsi ro,relatime - tmpfs tmpfs ro +2433 2654 0:426 / /sys/firmware ro,relatime - tmpfs tmpfs ro \ No newline at end of file diff --git a/lib/tbot/spiffe/workloadattest/testdata/mountfile/k8s-real-k3s-ubuntu-v1.28.6+k3s2 b/lib/tbot/spiffe/workloadattest/testdata/mountfile/k8s-real-k3s-ubuntu-v1.28.6+k3s2 new file mode 100644 index 0000000000000..b7987523080fc --- /dev/null +++ b/lib/tbot/spiffe/workloadattest/testdata/mountfile/k8s-real-k3s-ubuntu-v1.28.6+k3s2 @@ -0,0 +1,27 @@ +3029 2813 0:398 / / rw,relatime master:1634 - overlay overlay rw,lowerdir=/ssd/k3s/agent/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/668/fs:/ssd/k3s/agent/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/667/fs:/ssd/k3s/agent/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/666/fs:/ssd/k3s/agent/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/665/fs:/ssd/k3s/agent/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/664/fs:/ssd/k3s/agent/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/663/fs:/ssd/k3s/agent/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/662/fs:/ssd/k3s/agent/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/661/fs:/ssd/k3s/agent/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/660/fs:/ssd/k3s/agent/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/659/fs,upperdir=/ssd/k3s/agent/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/1104/fs,workdir=/ssd/k3s/agent/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/1104/work,nouserxattr +2709 3029 0:418 / /proc rw,nosuid,nodev,noexec,relatime - proc proc rw +3030 3029 0:419 / /dev rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755,inode64 +2697 3030 0:420 / /dev/pts rw,nosuid,noexec,relatime - devpts devpts rw,gid=5,mode=620,ptmxmode=666 +3031 3030 0:264 / /dev/mqueue rw,nosuid,nodev,noexec,relatime - mqueue mqueue rw +3032 3029 0:272 / /sys ro,nosuid,nodev,noexec,relatime - sysfs sysfs ro +3033 3032 0:29 /../../kubepods-besteffort-podfecd2321_17b5_49b9_9f75_8c5be777fbfb.slice/cri-containerd-397529d07efebd566f15dbc7e8af9f3ef586033f5e753adfa96b2bf730102c64.scope /sys/fs/cgroup ro,nosuid,nodev,noexec,relatime - cgroup2 cgroup rw +3034 3029 0:39 /kubelet/pods/fecd2321-17b5-49b9-9f75-8c5be777fbfb/etc-hosts /etc/hosts rw,noatime - zfs ssd rw,xattr,posixacl,casesensitive +3035 3030 0:39 /kubelet/pods/fecd2321-17b5-49b9-9f75-8c5be777fbfb/containers/influxdb2/0b3cd38e /dev/termination-log rw,noatime - zfs ssd rw,xattr,posixacl,casesensitive +3036 3029 0:39 /k3s/agent/containerd/io.containerd.grpc.v1.cri/sandboxes/dfb5782367e348095bcac6bc52e3f2428dbfdc4704c1f94897b7095831de0f29/hostname /etc/hostname rw,noatime - zfs ssd rw,xattr,posixacl,casesensitive +3041 3029 0:39 /k3s/agent/containerd/io.containerd.grpc.v1.cri/sandboxes/dfb5782367e348095bcac6bc52e3f2428dbfdc4704c1f94897b7095831de0f29/resolv.conf /etc/resolv.conf rw,noatime - zfs ssd rw,xattr,posixacl,casesensitive +3056 3030 0:172 / /dev/shm rw,nosuid,nodev,noexec,relatime - tmpfs shm rw,size=65536k,inode64 +3057 3029 0:39 /k3s/agent/containerd/io.containerd.grpc.v1.cri/containers/397529d07efebd566f15dbc7e8af9f3ef586033f5e753adfa96b2bf730102c64/volumes/e8d71e077278681842902223965b71754c3cead29651ea453b1022a0715a64ae /etc/influxdb2 rw,noatime - zfs ssd rw,xattr,posixacl,casesensitive +3067 3029 0:39 /k3s/storage/pvc-fe4e77b2-8676-40b8-acca-bf0a7208ee37_influxdb_influxdb-influxdb2 /var/lib/influxdb2 rw,noatime - zfs ssd rw,xattr,posixacl,casesensitive +3068 3029 0:124 / /run/secrets/kubernetes.io/serviceaccount ro,relatime - tmpfs tmpfs rw,size=49238972k,inode64 +3362 2709 0:418 /bus /proc/bus ro,nosuid,nodev,noexec,relatime - proc proc rw +3364 2709 0:418 /fs /proc/fs ro,nosuid,nodev,noexec,relatime - proc proc rw +3365 2709 0:418 /irq /proc/irq ro,nosuid,nodev,noexec,relatime - proc proc rw +3381 2709 0:418 /sys /proc/sys ro,nosuid,nodev,noexec,relatime - proc proc rw +3382 2709 0:418 /sysrq-trigger /proc/sysrq-trigger ro,nosuid,nodev,noexec,relatime - proc proc rw +3383 2709 0:431 / /proc/asound ro,relatime - tmpfs tmpfs ro,inode64 +3384 2709 0:432 / /proc/acpi ro,relatime - tmpfs tmpfs ro,inode64 +3385 2709 0:419 /null /proc/kcore rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755,inode64 +3386 2709 0:419 /null /proc/keys rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755,inode64 +3387 2709 0:419 /null /proc/timer_list rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755,inode64 +3388 2709 0:433 / /proc/scsi ro,relatime - tmpfs tmpfs ro,inode64 +3389 3032 0:434 / /sys/firmware ro,relatime - tmpfs tmpfs ro,inode64 \ No newline at end of file diff --git a/lib/tbot/spiffe/workloadattest/testdata/mountfile/k8s-real-orbstack b/lib/tbot/spiffe/workloadattest/testdata/mountfile/k8s-real-orbstack new file mode 100644 index 0000000000000..7aff934e8cde8 --- /dev/null +++ b/lib/tbot/spiffe/workloadattest/testdata/mountfile/k8s-real-orbstack @@ -0,0 +1,24 @@ +705 559 0:163 / / ro,relatime master:126 - overlay overlay rw,lowerdir=/var/lib/docker/overlay2/l/Z45N3JIQYJQ54CBI7H3XMKVR5I:/var/lib/docker/overlay2/l/7KUPS4PU3O5IJL4EIRN7FMAOYD:/var/lib/docker/overlay2/l/ETEFQDOQ5PLMGLRYOA5RFON3OS:/var/lib/docker/overlay2/l/2B54A5B3XLE76YZCPIVK6UA7RI:/var/lib/docker/overlay2/l/KJGEGGJV7KZFUYQL46H7NCKSGR:/var/lib/docker/overlay2/l/UTJK53EUHIMBZO4NRBU7FR4KZ7:/var/lib/docker/overlay2/l/KHWFISJTIZFY3EZO27BU32LI6L:/var/lib/docker/overlay2/l/CD7NUI35TQGZLK6OY625DPG75E:/var/lib/docker/overlay2/l/MTGDF36JSTP6LT4N5SJM7JQVZF:/var/lib/docker/overlay2/l/56576N3DLXLKEFS4BVEDLETXGY:/var/lib/docker/overlay2/l/TEJQCUGT2ZHWVW65FILDOZNO3Y:/var/lib/docker/overlay2/l/ESKTCIGN4JBSHMNLLDE5UWBKGR:/var/lib/docker/overlay2/l/K4SEMZCPJSC5OOK4HNSTJ5EADF:/var/lib/docker/overlay2/l/OFXCSYIR4UIHYMYJQYQNAP2IVZ:/var/lib/docker/overlay2/l/HHM5GPXHH5O7FGYKI3DAF2TIE3:/var/lib/docker/overlay2/l/6EQX2D3HPZETMHLYONEJBT57GT:/var/lib/docker/overlay2/l/IB4VF3AIY6HVGYQ4CLLZD2HEMO:/var/lib/docker/overlay2/l/4SXNG5ILJTM4EGDS2DH2YODOHB:/var/lib/docker/overlay2/l/DA2FKFC5NFV4LTLQ7KXZJ7QH5N:/var/lib/docker/overlay2/l/W54AWW6M7O6OLVIFMHMPXIDZG5,upperdir=/var/lib/docker/overlay2/a5af8a9c1badd3ba20f186c2da75c1bd0a6a832227388d4936ce9e7729fbeec4/diff,workdir=/var/lib/docker/overlay2/a5af8a9c1badd3ba20f186c2da75c1bd0a6a832227388d4936ce9e7729fbeec4/work +706 705 0:169 / /proc rw,nosuid,nodev,noexec,relatime - proc proc rw +707 705 0:170 / /dev rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755 +708 707 0:171 / /dev/pts rw,nosuid,noexec,relatime - devpts devpts rw,gid=5,mode=620,ptmxmode=666 +709 705 0:138 / /sys ro,nosuid,nodev,noexec,relatime - sysfs sysfs ro +710 709 0:31 /../../pod36827f77-691f-45aa-a470-0989cf3749c4/64dd9bf5199ff782835247cb072e4842dc3d0135ef02f6498cb6bb6f37a320d2 /sys/fs/cgroup ro,nosuid,nodev,noexec,relatime - cgroup2 cgroup rw,nsdelegate +711 707 0:134 / /dev/mqueue rw,nosuid,nodev,noexec,relatime - mqueue mqueue rw +712 707 0:132 / /dev/shm rw,nosuid,nodev,noexec,relatime - tmpfs shm rw,size=65536k +713 707 0:36 /k8s/default/kubelet/pods/36827f77-691f-45aa-a470-0989cf3749c4/containers/teleport/d1a0d450 /dev/termination-log rw,noatime - btrfs /dev/vdb1 rw,nodatasum,nodatacow,ssd,discard,space_cache=v2,subvolid=5,subvol=/ +714 705 0:36 /k8s/default/kubelet/pods/36827f77-691f-45aa-a470-0989cf3749c4/volumes/kubernetes.io~configmap/config /etc/teleport ro,noatime - btrfs /dev/vdb1 rw,nodatasum,nodatacow,ssd,discard,space_cache=v2,subvolid=5,subvol=/ +715 705 0:119 / /etc/teleport-secrets ro,relatime - tmpfs tmpfs rw,size=8121144k +716 705 0:36 /docker/containers/1927b688b6cc740a4d73f211b67b7573503ff3dd401d3e8d43dd449d032ce8d2/resolv.conf /etc/resolv.conf ro,noatime - btrfs /dev/vdb1 rw,nodatasum,nodatacow,ssd,discard,space_cache=v2,subvolid=5,subvol=/ +717 705 0:36 /docker/containers/1927b688b6cc740a4d73f211b67b7573503ff3dd401d3e8d43dd449d032ce8d2/hostname /etc/hostname ro,noatime - btrfs /dev/vdb1 rw,nodatasum,nodatacow,ssd,discard,space_cache=v2,subvolid=5,subvol=/ +718 705 0:36 /k8s/default/kubelet/pods/36827f77-691f-45aa-a470-0989cf3749c4/etc-hosts /etc/hosts rw,noatime - btrfs /dev/vdb1 rw,nodatasum,nodatacow,ssd,discard,space_cache=v2,subvolid=5,subvol=/ +719 705 0:36 /k8s/default/kubelet/pods/36827f77-691f-45aa-a470-0989cf3749c4/volumes/kubernetes.io~empty-dir/data /var/lib/teleport rw,noatime - btrfs /dev/vdb1 rw,nodatasum,nodatacow,ssd,discard,space_cache=v2,subvolid=5,subvol=/ +720 705 0:114 / /var/run/secrets/kubernetes.io/serviceaccount ro,relatime - tmpfs tmpfs rw,size=8121144k +535 706 0:169 /bus /proc/bus ro,nosuid,nodev,noexec,relatime - proc proc rw +541 706 0:169 /fs /proc/fs ro,nosuid,nodev,noexec,relatime - proc proc rw +553 706 0:169 /irq /proc/irq ro,nosuid,nodev,noexec,relatime - proc proc rw +554 706 0:169 /sys /proc/sys ro,nosuid,nodev,noexec,relatime - proc proc rw +556 706 0:169 /sysrq-trigger /proc/sysrq-trigger ro,nosuid,nodev,noexec,relatime - proc proc rw +562 706 0:170 /null /proc/keys rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755 +566 706 0:170 /null /proc/timer_list rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755 +567 709 0:167 / /sys/firmware ro,relatime - tmpfs tmpfs ro \ No newline at end of file diff --git a/lib/tbot/spiffe/workloadattest/unix.go b/lib/tbot/spiffe/workloadattest/unix.go new file mode 100644 index 0000000000000..2f67fd7f6bad2 --- /dev/null +++ b/lib/tbot/spiffe/workloadattest/unix.go @@ -0,0 +1,122 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package workloadattest + +import ( + "context" + "log/slog" + + "github.com/gravitational/trace" + "github.com/shirou/gopsutil/v4/process" +) + +// UnixAttestation holds the Unix process information retrieved from the +// workload attestation process. +type UnixAttestation struct { + // Attested is true if the PID was successfully attested to a Unix + // process. This indicates the validity of the rest of the fields. + Attested bool + // PID is the process ID of the attested process. + PID int + // UID is the primary user ID of the attested process. + UID int + // GID is the primary group ID of the attested process. + GID int +} + +// LogValue implements slog.LogValue to provide a nicely formatted set of +// log keys for a given attestation. +func (a UnixAttestation) LogValue() slog.Value { + values := []slog.Attr{ + slog.Bool("attested", a.Attested), + } + if a.Attested { + values = append(values, + slog.Int("uid", a.UID), + slog.Int("pid", a.PID), + slog.Int("gid", a.GID), + ) + } + return slog.GroupValue(values...) +} + +// UnixAttestor attests a process id to a Unix process. +type UnixAttestor struct { +} + +// NewUnixAttestor returns a new UnixAttestor. +func NewUnixAttestor() *UnixAttestor { + return &UnixAttestor{} +} + +// Attest attests a process id to a Unix process. +func (a *UnixAttestor) Attest(ctx context.Context, pid int) (UnixAttestation, error) { + p, err := process.NewProcessWithContext(ctx, int32(pid)) + if err != nil { + return UnixAttestation{}, trace.Wrap(err, "getting process") + } + + att := UnixAttestation{ + Attested: true, + PID: pid, + } + // On Linux: + // Real, effective, saved, and file system GIDs + // On Darwin: + // Effective, effective, saved GIDs + gids, err := p.Gids() + if err != nil { + return UnixAttestation{}, trace.Wrap(err, "getting gids") + } + // We generally want to select the effective GID. + switch len(gids) { + case 0: + // error as none returned + return UnixAttestation{}, trace.BadParameter("no gids returned") + case 1: + // Only one GID - this is unusual but let's take it. + att.GID = int(gids[0]) + default: + // Take the index 1 entry as this is effective + att.GID = int(gids[1]) + } + + // On Linux: + // Real, effective, saved set, and file system UIDs + // On Darwin: + // Effective + uids, err := p.Uids() + if err != nil { + return UnixAttestation{}, trace.Wrap(err, "getting uids") + } + // We generally want to select the effective GID. + switch len(uids) { + case 0: + // error as none returned + return UnixAttestation{}, trace.BadParameter("no uids returned") + case 1: + // Only one UID, we expect this on Darwin to be the Effective UID + att.UID = int(uids[0]) + default: + // Take the index 1 entry as this is Effective UID on Linux + att.UID = int(uids[1]) + } + + return att, nil +} diff --git a/lib/tbot/spiffe/workloadattest/unix_test.go b/lib/tbot/spiffe/workloadattest/unix_test.go new file mode 100644 index 0000000000000..667fdcffb2634 --- /dev/null +++ b/lib/tbot/spiffe/workloadattest/unix_test.go @@ -0,0 +1,46 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package workloadattest + +import ( + "context" + "os" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestUnixAttestor_Attest(t *testing.T) { + t.Parallel() + ctx := context.Background() + + pid := os.Getpid() + uid := os.Getuid() + gid := os.Getgid() + + attestor := NewUnixAttestor() + att, err := attestor.Attest(ctx, pid) + require.NoError(t, err) + require.Equal(t, UnixAttestation{ + Attested: true, + PID: pid, + UID: uid, + GID: gid, + }, att) +} From 3da5efa45158b7b67db89e49afaa39d5219ca9f9 Mon Sep 17 00:00:00 2001 From: Grzegorz Zdunek Date: Thu, 1 Aug 2024 12:15:55 +0200 Subject: [PATCH 032/139] Update xterm (#44594) (#44741) (cherry picked from commit e6ff70667f87c09c18a898efd1546931057915b1) --- pnpm-lock.yaml | 129 +++++++++--------- web/packages/teleport/package.json | 12 +- .../Console/DocumentSsh/Terminal/Terminal.tsx | 2 +- .../src/Console/StyledXterm/StyledXterm.tsx | 2 +- .../teleport/src/lib/term/terminal.ts | 12 +- web/packages/teleterm/package.json | 4 +- .../src/ui/DocumentTerminal/Terminal/ctrl.ts | 6 +- 7 files changed, 81 insertions(+), 86 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fd95be8a0c03e..aa1e48dc003da 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -348,27 +348,27 @@ importers: '@opentelemetry/semantic-conventions': specifier: 1.25.1 version: 1.25.1 + '@xterm/addon-canvas': + specifier: ^0.7.0 + version: 0.7.0(@xterm/xterm@5.5.0) + '@xterm/addon-fit': + specifier: ^0.10.0 + version: 0.10.0(@xterm/xterm@5.5.0) + '@xterm/addon-web-links': + specifier: ^0.11.0 + version: 0.11.0(@xterm/xterm@5.5.0) + '@xterm/addon-webgl': + specifier: ^0.18.0 + version: 0.18.0(@xterm/xterm@5.5.0) + '@xterm/xterm': + specifier: ^5.5.0 + version: 5.5.0 create-react-class: specifier: ^15.6.3 version: 15.7.0 events: specifier: 3.3.0 version: 3.3.0 - xterm: - specifier: ^5.3.0 - version: 5.3.0 - xterm-addon-canvas: - specifier: ^0.5.0 - version: 0.5.0(xterm@5.3.0) - xterm-addon-fit: - specifier: ^0.8.0 - version: 0.8.0(xterm@5.3.0) - xterm-addon-web-links: - specifier: ^0.9.0 - version: 0.9.0(xterm@5.3.0) - xterm-addon-webgl: - specifier: ^0.16.0 - version: 0.16.0(xterm@5.3.0) devDependencies: '@gravitational/build': specifier: workspace:* @@ -446,6 +446,12 @@ importers: '@types/whatwg-url': specifier: ^11.0.5 version: 11.0.5 + '@xterm/addon-fit': + specifier: ^0.10.0 + version: 0.10.0(@xterm/xterm@5.5.0) + '@xterm/xterm': + specifier: ^5.5.0 + version: 5.5.0 electron: specifier: 31.1.0 version: 31.1.0 @@ -476,12 +482,6 @@ importers: whatwg-url: specifier: ^13.0.0 version: 13.0.0 - xterm: - specifier: ^5.3.0 - version: 5.3.0 - xterm-addon-fit: - specifier: ^0.8.0 - version: 0.8.0(xterm@5.3.0) zod: specifier: ^3.23.8 version: 3.23.8 @@ -2899,6 +2899,29 @@ packages: resolution: {integrity: sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==} engines: {node: '>=10.0.0'} + '@xterm/addon-canvas@0.7.0': + resolution: {integrity: sha512-LF5LYcfvefJuJ7QotNRdRSPc9YASAVDeoT5uyXS/nZshZXjYplGXRECBGiznwvhNL2I8bq1Lf5MzRwstsYQ2Iw==} + peerDependencies: + '@xterm/xterm': ^5.0.0 + + '@xterm/addon-fit@0.10.0': + resolution: {integrity: sha512-UFYkDm4HUahf2lnEyHvio51TNGiLK66mqP2JoATy7hRZeXaGMRDr00JiSF7m63vR5WKATF605yEggJKsw0JpMQ==} + peerDependencies: + '@xterm/xterm': ^5.0.0 + + '@xterm/addon-web-links@0.11.0': + resolution: {integrity: sha512-nIHQ38pQI+a5kXnRaTgwqSHnX7KE6+4SVoceompgHL26unAxdfP6IPqUTSYPQgSwM56hsElfoNrrW5V7BUED/Q==} + peerDependencies: + '@xterm/xterm': ^5.0.0 + + '@xterm/addon-webgl@0.18.0': + resolution: {integrity: sha512-xCnfMBTI+/HKPdRnSOHaJDRqEpq2Ugy8LEj9GiY4J3zJObo3joylIFaMvzBwbYRg8zLtkO0KQaStCeSfoaI2/w==} + peerDependencies: + '@xterm/xterm': ^5.0.0 + + '@xterm/xterm@5.5.0': + resolution: {integrity: sha512-hqJHYaQb5OptNunnyAnkHyM8aCjZ1MEIDTQu1iIbbTD/xops91NB5yq1ZK/dC2JDbVWtF23zUtl9JE2NqwT87A==} + '@xtuc/ieee754@1.2.0': resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} @@ -8264,34 +8287,6 @@ packages: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} - xterm-addon-canvas@0.5.0: - resolution: {integrity: sha512-QOo/eZCMrCleAgMimfdbaZCgmQRWOml63Ued6RwQ+UTPvQj3Av9QKx3xksmyYrDGRO/AVRXa9oNuzlYvLdmoLQ==} - deprecated: This package is now deprecated. Move to @xterm/addon-canvas instead. - peerDependencies: - xterm: ^5.0.0 - - xterm-addon-fit@0.8.0: - resolution: {integrity: sha512-yj3Np7XlvxxhYF/EJ7p3KHaMt6OdwQ+HDu573Vx1lRXsVxOcnVJs51RgjZOouIZOczTsskaS+CpXspK81/DLqw==} - deprecated: This package is now deprecated. Move to @xterm/addon-fit instead. - peerDependencies: - xterm: ^5.0.0 - - xterm-addon-web-links@0.9.0: - resolution: {integrity: sha512-LIzi4jBbPlrKMZF3ihoyqayWyTXAwGfu4yprz1aK2p71e9UKXN6RRzVONR0L+Zd+Ik5tPVI9bwp9e8fDTQh49Q==} - deprecated: This package is now deprecated. Move to @xterm/addon-web-links instead. - peerDependencies: - xterm: ^5.0.0 - - xterm-addon-webgl@0.16.0: - resolution: {integrity: sha512-E8cq1AiqNOv0M/FghPT+zPAEnvIQRDbAbkb04rRYSxUym69elPWVJ4sv22FCLBqM/3LcrmBLl/pELnBebVFKgA==} - deprecated: This package is now deprecated. Move to @xterm/addon-webgl instead. - peerDependencies: - xterm: ^5.0.0 - - xterm@5.3.0: - resolution: {integrity: sha512-8QqjlekLUFTrU6x7xck1MsPzPA571K5zNqWm0M0oroYEWVOptZ0+ubQSkQ3uxIEhcIHRujJy6emDWX4A7qyFzg==} - deprecated: This package is now deprecated. Move to @xterm/xterm instead. - y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -11846,6 +11841,24 @@ snapshots: '@xmldom/xmldom@0.8.10': {} + '@xterm/addon-canvas@0.7.0(@xterm/xterm@5.5.0)': + dependencies: + '@xterm/xterm': 5.5.0 + + '@xterm/addon-fit@0.10.0(@xterm/xterm@5.5.0)': + dependencies: + '@xterm/xterm': 5.5.0 + + '@xterm/addon-web-links@0.11.0(@xterm/xterm@5.5.0)': + dependencies: + '@xterm/xterm': 5.5.0 + + '@xterm/addon-webgl@0.18.0(@xterm/xterm@5.5.0)': + dependencies: + '@xterm/xterm': 5.5.0 + + '@xterm/xterm@5.5.0': {} + '@xtuc/ieee754@1.2.0': {} '@xtuc/long@4.2.2': {} @@ -18379,24 +18392,6 @@ snapshots: xtend@4.0.2: {} - xterm-addon-canvas@0.5.0(xterm@5.3.0): - dependencies: - xterm: 5.3.0 - - xterm-addon-fit@0.8.0(xterm@5.3.0): - dependencies: - xterm: 5.3.0 - - xterm-addon-web-links@0.9.0(xterm@5.3.0): - dependencies: - xterm: 5.3.0 - - xterm-addon-webgl@0.16.0(xterm@5.3.0): - dependencies: - xterm: 5.3.0 - - xterm@5.3.0: {} - y18n@5.0.8: {} yallist@2.1.2: {} diff --git a/web/packages/teleport/package.json b/web/packages/teleport/package.json index 3f4aa00aee9a1..cf7bbcafc55d9 100644 --- a/web/packages/teleport/package.json +++ b/web/packages/teleport/package.json @@ -32,13 +32,13 @@ "@opentelemetry/sdk-trace-base": "1.25.1", "@opentelemetry/sdk-trace-web": "1.25.1", "@opentelemetry/semantic-conventions": "1.25.1", + "@xterm/xterm": "^5.5.0", + "@xterm/addon-canvas": "^0.7.0", + "@xterm/addon-fit": "^0.10.0", + "@xterm/addon-web-links": "^0.11.0", + "@xterm/addon-webgl": "^0.18.0", "create-react-class": "^15.6.3", - "events": "3.3.0", - "xterm": "^5.3.0", - "xterm-addon-canvas": "^0.5.0", - "xterm-addon-fit": "^0.8.0", - "xterm-addon-web-links": "^0.9.0", - "xterm-addon-webgl": "^0.16.0" + "events": "3.3.0" }, "devDependencies": { "@gravitational/build": "workspace:*", diff --git a/web/packages/teleport/src/Console/DocumentSsh/Terminal/Terminal.tsx b/web/packages/teleport/src/Console/DocumentSsh/Terminal/Terminal.tsx index c832e7c625460..027a756aaae5c 100644 --- a/web/packages/teleport/src/Console/DocumentSsh/Terminal/Terminal.tsx +++ b/web/packages/teleport/src/Console/DocumentSsh/Terminal/Terminal.tsx @@ -23,7 +23,7 @@ import React, { useRef, } from 'react'; import { Flex } from 'design'; -import { ITheme } from 'xterm'; +import { ITheme } from '@xterm/xterm'; import { getPlatformType } from 'design/platform'; diff --git a/web/packages/teleport/src/Console/StyledXterm/StyledXterm.tsx b/web/packages/teleport/src/Console/StyledXterm/StyledXterm.tsx index 7c20e10b45356..07f0aba027f99 100644 --- a/web/packages/teleport/src/Console/StyledXterm/StyledXterm.tsx +++ b/web/packages/teleport/src/Console/StyledXterm/StyledXterm.tsx @@ -19,7 +19,7 @@ import styled from 'styled-components'; import { Box } from 'design'; -import 'xterm/css/xterm.css'; +import '@xterm/xterm/css/xterm.css'; const StyledXterm = styled(Box)( () => ` diff --git a/web/packages/teleport/src/lib/term/terminal.ts b/web/packages/teleport/src/lib/term/terminal.ts index 7816a78f92f2c..cc8f68a2ff12b 100644 --- a/web/packages/teleport/src/lib/term/terminal.ts +++ b/web/packages/teleport/src/lib/term/terminal.ts @@ -16,13 +16,13 @@ * along with this program. If not, see . */ -import 'xterm/css/xterm.css'; -import { ITheme, Terminal } from 'xterm'; -import { FitAddon } from 'xterm-addon-fit'; -import { WebglAddon } from 'xterm-addon-webgl'; +import '@xterm/xterm/css/xterm.css'; +import { ITheme, Terminal } from '@xterm/xterm'; +import { FitAddon } from '@xterm/addon-fit'; +import { WebglAddon } from '@xterm/addon-webgl'; +import { WebLinksAddon } from '@xterm/addon-web-links'; +import { CanvasAddon } from '@xterm/addon-canvas'; import { debounce, isInteger } from 'shared/utils/highbar'; -import { WebLinksAddon } from 'xterm-addon-web-links'; -import { CanvasAddon } from 'xterm-addon-canvas'; import Logger from 'shared/libs/logger'; import cfg from 'teleport/config'; diff --git a/web/packages/teleterm/package.json b/web/packages/teleterm/package.json index 8a81331e986d1..760d33cec8c16 100644 --- a/web/packages/teleterm/package.json +++ b/web/packages/teleterm/package.json @@ -42,6 +42,8 @@ "@types/node-forge": "^1.3.11", "@types/tar-fs": "^2.0.4", "@types/whatwg-url": "^11.0.5", + "@xterm/xterm": "^5.5.0", + "@xterm/addon-fit": "^0.10.0", "electron": "31.1.0", "electron-builder": "^25.0.1", "electron-notarize": "^1.2.2", @@ -52,8 +54,6 @@ "react-dnd": "^14.0.4", "react-dnd-html5-backend": "^14.0.2", "whatwg-url": "^13.0.0", - "xterm": "^5.3.0", - "xterm-addon-fit": "^0.8.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.23.1" }, diff --git a/web/packages/teleterm/src/ui/DocumentTerminal/Terminal/ctrl.ts b/web/packages/teleterm/src/ui/DocumentTerminal/Terminal/ctrl.ts index 1af5663dda7f3..1a30c9aa78a6b 100644 --- a/web/packages/teleterm/src/ui/DocumentTerminal/Terminal/ctrl.ts +++ b/web/packages/teleterm/src/ui/DocumentTerminal/Terminal/ctrl.ts @@ -16,9 +16,9 @@ * along with this program. If not, see . */ -import 'xterm/css/xterm.css'; -import { IDisposable, ITheme, Terminal } from 'xterm'; -import { FitAddon } from 'xterm-addon-fit'; +import '@xterm/xterm/css/xterm.css'; +import { IDisposable, ITheme, Terminal } from '@xterm/xterm'; +import { FitAddon } from '@xterm/addon-fit'; import { debounce } from 'shared/utils/highbar'; import { WindowsPty } from 'teleterm/services/pty'; From 77b6d0021ea873d7bdcba7d413958672fd2e1de7 Mon Sep 17 00:00:00 2001 From: Bartosz Leper Date: Thu, 1 Aug 2024 13:41:45 +0200 Subject: [PATCH 033/139] Backport part of the typography changes (#44811) This is not a typical backport. It doesn't change the UI appearance, but instead aims to make it a bit easier to backport changes to v16 by providing the same additional components as v17 have. The new styles are prefixed with the word "new", so if you are specifying typography manually, you are still responsible for verifying that it works as intended and changing the typography attributes if required. --- web/packages/design/src/Text/Text.jsx | 80 +++++++++++++++++++++ web/packages/design/src/Text/index.js | 12 ++++ web/packages/design/src/index.ts | 23 +++++- web/packages/design/src/theme/typography.js | 79 ++++++++++++++++++++ 4 files changed, 193 insertions(+), 1 deletion(-) diff --git a/web/packages/design/src/Text/Text.jsx b/web/packages/design/src/Text/Text.jsx index 40983bc206ac7..d08de66e486c6 100644 --- a/web/packages/design/src/Text/Text.jsx +++ b/web/packages/design/src/Text/Text.jsx @@ -52,3 +52,83 @@ Text.defaultProps = { }; export default Text; + +/** + * H1 heading. Example usage: page titles and empty result set notifications. + * + * Do not use where `h1` typography is used only to make the text bigger (i.e. + * there's no following content that is logically tied to the heading). + */ +export const H1 = props => ; + +/** Subtitle for heading level 1. Renders as a paragraph. */ +export const Subtitle1 = props => ( + +); + +/** + * H2 heading. Example usage: dialog titles, dialog-like side panel titles. + * + * Do not use where `h2` typography is used only to make the text bigger (i.e. + * there's no following content that is logically tied to the heading). + */ +export const H2 = props => ; + +/** Subtitle for heading level 2. Renders as a paragraph. */ +export const Subtitle2 = props => ( + +); + +/** + * H3 heading. Example usage: explanatory side panel titles, resource enrollment + * step boxes. + * + * Do not use where `h3` typography is used only to make the text stand out more + * (i.e. there's no following content that is logically tied to the heading). + */ +export const H3 = props => ; + +/** Subtitle for heading level 3. Renders as a paragraph. */ +export const Subtitle3 = props => ( + +); + +/** + * H4 heading. + * + * Do not use where `h4` typography is used only to make the text stand out more + * (i.e. there's no following content that is logically tied to the heading). + */ +export const H4 = props => ; + +/** + * A paragraph. Use for text consisting of actual sentences. Applies + * inter-paragraph spacing if grouped with other paragraphs, but doesn't apply + * typography. Use directly when typography is expected to be set by the parent + * component; prefer {@link P1}, {@link P2}, {@link P3} otherwise. + */ +export const P = styled(Text).attrs({ as: 'p' })` + p + & { + margin-top: ${props => props.theme.space[3]}px; + // Allow overriding. + ${space} + } +`; + +/** + * A {@link P} that uses `body1` typography. Applies inter-paragraph spacing if + * grouped with other paragraphs. + */ +export const P1 = props => ; + +/** + * A {@link P} that uses `body2` typography. Applies inter-paragraph spacing if + * grouped with other paragraphs. + */ +export const P2 = props => ; + +/** + * A {@link P} that uses `body3` typography. Applies inter-paragraph spacing if + * grouped with other paragraphs. + */ +export const P3 = props => ; diff --git a/web/packages/design/src/Text/index.js b/web/packages/design/src/Text/index.js index 6b30a4e21e4bb..d4c1d1a1bbaf6 100644 --- a/web/packages/design/src/Text/index.js +++ b/web/packages/design/src/Text/index.js @@ -17,4 +17,16 @@ */ import Text from './Text'; +export { + H1, + H2, + H3, + H4, + P1, + P2, + P3, + Subtitle1, + Subtitle2, + Subtitle3, +} from './Text'; export default Text; diff --git a/web/packages/design/src/index.ts b/web/packages/design/src/index.ts index 1fde350b6e23f..c9cd66f1222ad 100644 --- a/web/packages/design/src/index.ts +++ b/web/packages/design/src/index.ts @@ -39,7 +39,18 @@ import LabelState from './LabelState'; import Link from './Link'; import { Mark } from './Mark'; import Image from './Image'; -import Text from './Text'; +import Text, { + H1, + H2, + H3, + H4, + P1, + P2, + P3, + Subtitle1, + Subtitle2, + Subtitle3, +} from './Text'; import SideNav, { SideNavItem } from './SideNav'; import { StepSlider } from './StepSlider'; import TopNav from './TopNav'; @@ -69,6 +80,10 @@ export { CardSuccessLogin, DocumentTitle, Flex, + H1, + H2, + H3, + H4, Indicator, Input, Label, @@ -88,8 +103,14 @@ export { Menu, MenuItem, MenuItemIcon, + P1, + P2, + P3, TextArea, Toggle, + Subtitle1, + Subtitle2, + Subtitle3, }; export type { TextAreaProps } from './TextArea'; export * from './keyframes'; diff --git a/web/packages/design/src/theme/typography.js b/web/packages/design/src/theme/typography.js index 30b5a3f79946e..bb2fe53c706a0 100644 --- a/web/packages/design/src/theme/typography.js +++ b/web/packages/design/src/theme/typography.js @@ -18,6 +18,7 @@ const light = 300; const regular = 400; +const medium = 500; const bold = 600; export const fontSizes = [10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 34]; @@ -101,6 +102,84 @@ const typography = { fontSize: '14px', lineHeight: '20px', }, + + newBody1: { + fontSize: '16px', + fontWeight: light, + lineHeight: '24px', + letterSpacing: '0.08px', + }, + newBody2: { + fontSize: '14px', + fontWeight: light, + lineHeight: '24px', + letterSpacing: '0.035px', + }, + newBody3: { + fontSize: '12px', + fontWeight: regular, + lineHeight: '20px', + letterSpacing: '0.015px', + }, + newBody4: { + fontSize: '10px', + fontWeight: regular, + lineHeight: '16px', + letterSpacing: '0.013px', + }, + + /** + * Don't use directly, prefer the `H1` component except for text that doesn't + * introduce document structure. + */ + newH1: { + fontWeight: medium, + fontSize: '24px', + lineHeight: '32px', + }, + /** + * Don't use directly, prefer the `H2` component except for text that doesn't + * introduce document structure. + */ + newH2: { + fontWeight: medium, + fontSize: '18px', + lineHeight: '24px', + }, + /** + * Don't use directly, prefer the `H3` component except for text that doesn't + * introduce document structure. + */ + newH3: { + fontWeight: bold, + fontSize: '14px', + lineHeight: '20px', + }, + newH4: { + fontWeight: medium, + fontSize: '12px', + lineHeight: '20px', + letterSpacing: '0.03px', + textTransform: 'uppercase', + }, + newSubtitle1: { + fontSize: '16px', + fontWeight: regular, + lineHeight: '24px', + letterSpacing: '0.024px', + }, + newSubtitle2: { + fontSize: '14px', + fontWeight: regular, + lineHeight: '20px', + letterSpacing: '0.014px', + }, + newSubtitle3: { + fontSize: '12px', + fontWeight: bold, + lineHeight: '20px', + letterSpacing: '0.012px', + }, }; export default typography; From bcddb6d2b85acf1c86c31e5863a8efddf9df46bb Mon Sep 17 00:00:00 2001 From: Tiago Silva Date: Thu, 1 Aug 2024 20:47:47 +0100 Subject: [PATCH 034/139] [v16] [kube] fix greedy deny rule blocking namespace list when blocking other resources (#44974) * [kube] fix greedy deny rule blocking namespace list when blocking other resources This PR fixes an edge case where the deny rule for blocking access to a resource becomes greedy and blocks access to the whole namespace. eg: ``` allow: kubernetes_labels: '*': '*' kubernetes_resources: - kind: '*' name: '*' namespace: '*' verbs: - '*' deny: kubernetes_resources: - kind: secret name: '*' namespace: '*' verbs: - '*' ``` With the example above, access to secrets must be blocked but the user is allowed to access every other resource in any namespace. The previous model was greedy and blocked access to namespace list. * add extra test * handle comments --- lib/kube/proxy/forwarder.go | 4 +- lib/services/role.go | 2 +- lib/utils/replace.go | 17 ++-- lib/utils/replace_test.go | 155 +++++++++++++++++++++++++++++++++++- 4 files changed, 161 insertions(+), 17 deletions(-) diff --git a/lib/kube/proxy/forwarder.go b/lib/kube/proxy/forwarder.go index 51f9299c91f8a..418e758893c15 100644 --- a/lib/kube/proxy/forwarder.go +++ b/lib/kube/proxy/forwarder.go @@ -1112,14 +1112,14 @@ func matchKubernetesResource(resource types.KubernetesResource, allowed, denied // utils.KubeResourceMatchesRegex checks if the resource.Kind is strictly equal // to each entry and validates if the Name and Namespace fields matches the // regex allowed by each entry. - result, err := utils.KubeResourceMatchesRegex(resource, denied) + result, err := utils.KubeResourceMatchesRegex(resource, denied, types.Deny) if err != nil { return false, trace.Wrap(err) } else if result { return false, nil } - result, err = utils.KubeResourceMatchesRegex(resource, allowed) + result, err = utils.KubeResourceMatchesRegex(resource, allowed, types.Allow) if err != nil { return false, trace.Wrap(err) } diff --git a/lib/services/role.go b/lib/services/role.go index 8c760d56e98e6..21589e2b41cc3 100644 --- a/lib/services/role.go +++ b/lib/services/role.go @@ -2421,7 +2421,7 @@ func NewKubernetesResourceMatcher(resource types.KubernetesResource) *Kubernetes // Match matches a Kubernetes Resource against provided role and condition. func (m *KubernetesResourceMatcher) Match(role types.Role, condition types.RoleConditionType) (bool, error) { - result, err := utils.KubeResourceMatchesRegex(m.resource, role.GetKubeResources(condition)) + result, err := utils.KubeResourceMatchesRegex(m.resource, role.GetKubeResources(condition), condition) return result, trace.Wrap(err) } diff --git a/lib/utils/replace.go b/lib/utils/replace.go index cf3448247e6f0..686c39127d532 100644 --- a/lib/utils/replace.go +++ b/lib/utils/replace.go @@ -149,14 +149,14 @@ const ( // input is the resource we are checking for access. // resources is a list of resources that the user has access to - collected from // their roles that match the Kubernetes cluster where the resource is defined. -func KubeResourceMatchesRegex(input types.KubernetesResource, resources []types.KubernetesResource) (bool, error) { +// cond is the deny or allow condition of the role that we are evaluating. +func KubeResourceMatchesRegex(input types.KubernetesResource, resources []types.KubernetesResource, cond types.RoleConditionType) (bool, error) { if len(input.Verbs) != 1 { return false, trace.BadParameter("only one verb is supported, input: %v", input.Verbs) } // isClusterWideResource is true if the resource is cluster-wide, e.g. a // namespace resource or a clusterrole. isClusterWideResource := slices.Contains(types.KubernetesClusterWideResourceKinds, input.Kind) - verb := input.Verbs[0] // If the user is list/read/watch a namespace, they should be able to see the // namespace they have resources defined for. @@ -191,7 +191,7 @@ func KubeResourceMatchesRegex(input types.KubernetesResource, resources []types. if ok, err := MatchString(input.Namespace, resource.Name); err != nil || ok { return ok, trace.Wrap(err) } - case targetsReadOnlyNamespace && resource.Kind != types.KindKubeNamespace && resource.Namespace != "": + case targetsReadOnlyNamespace && cond == types.Allow && resource.Kind != types.KindKubeNamespace && resource.Namespace != "": // If the user requests a read-only namespace get/list/watch, they should // be able to see the list of namespaces they have resources defined in. // This means that if the user has access to pods in the "foo" namespace, @@ -250,7 +250,6 @@ func KubeResourceCouldMatchRules(input types.KubernetesResource, resources []typ // permissions for. targetsReadOnlyNamespace := input.Kind == types.KindKubeNamespace && slices.Contains([]string{types.KubeVerbGet, types.KubeVerbList, types.KubeVerbWatch}, verb) - for _, resource := range resources { // If the resource has a wildcard verb, it matches all verbs. // Otherwise, the resource must have the verb we're looking for otherwise @@ -278,19 +277,13 @@ func KubeResourceCouldMatchRules(input types.KubernetesResource, resources []typ if ok, err := MatchString(input.Namespace, resource.Name); err != nil || ok && isAllowOrFullDeny { return isAllowOrFullDeny || isDeny, trace.Wrap(err) } - case targetsReadOnlyNamespace && resource.Kind != types.KindKubeNamespace && resource.Namespace != "": + case targetsReadOnlyNamespace && !isDeny && resource.Kind != types.KindKubeNamespace && resource.Namespace != "": // If the user requests a read-only namespace get/list/watch, they should // be able to see the list of namespaces they have resources defined in. // This means that if the user has access to pods in the "foo" namespace, // they should be able to see the "foo" namespace in the list of namespaces // but only if the request is read-only. - isAllowOrFullDeny := !isDeny || resource.Name == types.Wildcard && resource.Namespace == types.Wildcard - if isAllowOrFullDeny { - return isAllowOrFullDeny, nil - } - if ok, err := MatchString(input.Name, resource.Namespace); err != nil || ok && isAllowOrFullDeny { - return ok && isAllowOrFullDeny, trace.Wrap(err) - } + return true, nil default: if input.Kind != resource.Kind && resource.Kind != types.Wildcard { continue diff --git a/lib/utils/replace_test.go b/lib/utils/replace_test.go index 1c424ec2f30a7..e2583d4606500 100644 --- a/lib/utils/replace_test.go +++ b/lib/utils/replace_test.go @@ -162,6 +162,7 @@ func TestKubeResourceMatchesRegex(t *testing.T) { name string input types.KubernetesResource resources []types.KubernetesResource + action types.RoleConditionType matches bool assert require.ErrorAssertionFunc }{ @@ -180,8 +181,102 @@ func TestKubeResourceMatchesRegex(t *testing.T) { }, }, assert: require.Error, + action: types.Allow, + matches: false, + }, + { + name: "list namespace matches resource", + input: types.KubernetesResource{ + Kind: types.KindNamespace, + Verbs: []string{types.KubeVerbList}, + }, + resources: []types.KubernetesResource{ + { + Kind: types.KindKubeSecret, + Namespace: "*", + Name: "*", + Verbs: []string{types.Wildcard}, + }, + }, + assert: require.NoError, + action: types.Allow, + matches: true, + }, + { + name: "list namespace doesn't match denying secrets", + input: types.KubernetesResource{ + Kind: types.KindNamespace, + Verbs: []string{types.KubeVerbList}, + }, + resources: []types.KubernetesResource{ + { + Kind: types.KindKubeSecret, + Namespace: "*", + Name: "*", + Verbs: []string{types.Wildcard}, + }, + }, + assert: require.NoError, + action: types.Deny, matches: false, }, + { + name: "get namespace match denying everything", + input: types.KubernetesResource{ + Kind: types.KindNamespace, + Name: "default", + Verbs: []string{types.KubeVerbGet}, + }, + resources: []types.KubernetesResource{ + { + Kind: types.Wildcard, + Namespace: types.Wildcard, + Name: types.Wildcard, + Verbs: []string{types.Wildcard}, + }, + }, + assert: require.NoError, + action: types.Deny, + matches: true, + }, + { + name: "get namespace doesn't match denying secrets", + input: types.KubernetesResource{ + Kind: types.KindNamespace, + Name: "default", + Verbs: []string{types.KubeVerbGet}, + }, + resources: []types.KubernetesResource{ + { + Kind: types.KindKubeSecret, + Namespace: "*", + Name: "*", + Verbs: []string{types.Wildcard}, + }, + }, + assert: require.NoError, + action: types.Deny, + matches: false, + }, + { + name: "get secret matches denying secrets", + input: types.KubernetesResource{ + Kind: types.KindKubeSecret, + Name: "default", + Verbs: []string{types.KubeVerbGet}, + }, + resources: []types.KubernetesResource{ + { + Kind: types.KindKubeSecret, + Namespace: "*", + Name: "*", + Verbs: []string{types.Wildcard}, + }, + }, + assert: require.NoError, + action: types.Deny, + matches: true, + }, { name: "input matches single resource with wildcard verb", input: types.KubernetesResource{ @@ -199,6 +294,7 @@ func TestKubeResourceMatchesRegex(t *testing.T) { }, }, assert: require.NoError, + action: types.Allow, matches: true, }, { @@ -218,6 +314,7 @@ func TestKubeResourceMatchesRegex(t *testing.T) { }, }, assert: require.NoError, + action: types.Allow, matches: true, }, { @@ -237,6 +334,7 @@ func TestKubeResourceMatchesRegex(t *testing.T) { }, }, assert: require.NoError, + action: types.Allow, matches: false, }, { @@ -255,6 +353,7 @@ func TestKubeResourceMatchesRegex(t *testing.T) { }, }, assert: require.NoError, + action: types.Allow, matches: false, }, { @@ -286,6 +385,7 @@ func TestKubeResourceMatchesRegex(t *testing.T) { }, }, assert: require.NoError, + action: types.Allow, matches: true, }, { @@ -305,6 +405,7 @@ func TestKubeResourceMatchesRegex(t *testing.T) { }, }, assert: require.NoError, + action: types.Allow, matches: true, }, { @@ -324,6 +425,7 @@ func TestKubeResourceMatchesRegex(t *testing.T) { }, }, assert: require.NoError, + action: types.Allow, matches: false, }, { @@ -342,6 +444,7 @@ func TestKubeResourceMatchesRegex(t *testing.T) { Verbs: []string{types.Wildcard}, }, }, + action: types.Allow, assert: require.Error, }, { @@ -359,6 +462,7 @@ func TestKubeResourceMatchesRegex(t *testing.T) { Name: "podname", }, }, + action: types.Allow, assert: require.NoError, }, { @@ -376,6 +480,7 @@ func TestKubeResourceMatchesRegex(t *testing.T) { }, }, assert: require.NoError, + action: types.Allow, matches: true, }, { @@ -394,6 +499,7 @@ func TestKubeResourceMatchesRegex(t *testing.T) { }, }, assert: require.NoError, + action: types.Allow, matches: true, }, { @@ -412,6 +518,7 @@ func TestKubeResourceMatchesRegex(t *testing.T) { }, }, assert: require.NoError, + action: types.Allow, matches: false, }, { @@ -430,6 +537,7 @@ func TestKubeResourceMatchesRegex(t *testing.T) { }, }, assert: require.NoError, + action: types.Allow, matches: true, }, @@ -449,6 +557,7 @@ func TestKubeResourceMatchesRegex(t *testing.T) { }, }, assert: require.NoError, + action: types.Allow, matches: false, }, @@ -468,6 +577,7 @@ func TestKubeResourceMatchesRegex(t *testing.T) { }, }, assert: require.NoError, + action: types.Allow, matches: true, }, { @@ -486,6 +596,7 @@ func TestKubeResourceMatchesRegex(t *testing.T) { }, }, assert: require.NoError, + action: types.Allow, matches: false, }, @@ -505,6 +616,7 @@ func TestKubeResourceMatchesRegex(t *testing.T) { }, }, assert: require.NoError, + action: types.Allow, matches: true, }, { @@ -523,6 +635,7 @@ func TestKubeResourceMatchesRegex(t *testing.T) { }, }, assert: require.NoError, + action: types.Allow, matches: false, }, { @@ -547,12 +660,13 @@ func TestKubeResourceMatchesRegex(t *testing.T) { }, }, assert: require.NoError, + action: types.Allow, matches: false, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - got, err := KubeResourceMatchesRegex(tt.input, tt.resources) + got, err := KubeResourceMatchesRegex(tt.input, tt.resources, tt.action) tt.assert(t, err) require.Equal(t, tt.matches, got) }) @@ -619,6 +733,42 @@ func TestKubeResourceCouldMatchRules(t *testing.T) { assert: require.NoError, matches: true, }, + { + name: "input doesn't match kind deny", + input: types.KubernetesResource{ + Kind: types.KindNamespace, + Verbs: []string{types.KubeVerbList}, + }, + resources: []types.KubernetesResource{ + { + Kind: types.KindKubeSecret, + Namespace: "*", + Name: "*", + Verbs: []string{types.Wildcard}, + }, + }, + action: types.Deny, + assert: require.NoError, + matches: false, + }, + { + name: "input doesn't match kind allow", + input: types.KubernetesResource{ + Kind: types.KindNamespace, + Verbs: []string{types.KubeVerbList}, + }, + resources: []types.KubernetesResource{ + { + Kind: types.KindKubeSecret, + Namespace: "*", + Name: "*", + Verbs: []string{types.Wildcard}, + }, + }, + action: types.Allow, + assert: require.NoError, + matches: true, + }, { name: "input matches single resource with wildcard verb", input: types.KubernetesResource{ @@ -1030,9 +1180,10 @@ func TestKubeResourceCouldMatchRules(t *testing.T) { }, }, assert: require.NoError, - matches: true, + matches: false, action: types.Deny, }, + { name: "list namespace with resource denying update access to namespace", input: types.KubernetesResource{ From 50219e7f74eb479c72ab2a16d0feaec614b719df Mon Sep 17 00:00:00 2001 From: Michael Date: Thu, 1 Aug 2024 15:43:24 -0500 Subject: [PATCH 035/139] Add device trust web redirect to githubCallback (#44906) --- lib/web/apiserver.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/web/apiserver.go b/lib/web/apiserver.go index 3b3ba1c5e0a92..07f87c6ab53f2 100644 --- a/lib/web/apiserver.go +++ b/lib/web/apiserver.go @@ -1857,6 +1857,11 @@ func (h *Handler) githubCallback(w http.ResponseWriter, r *http.Request, p httpr if dwt := response.Session.GetDeviceWebToken(); dwt != nil { logger.Debug("GitHub WebSession created with device web token") + // if a device web token is present, we must send the user to the device authorize page + // to upgrade the session. + // TODO (avatus) the web client currently doesn't handle any redirects after authorizing a web + // session with device trust. Once it does, append a redirect_url here as a query parameter + return fmt.Sprintf("/web/device/authorize/%s/%s", dwt.Id, dwt.Token) } return res.ClientRedirectURL } From 760b12f29afa7f45e0b5e34856af1ce52a5ebdb0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Cie=C5=9Blak?= Date: Thu, 1 Aug 2024 22:45:16 +0200 Subject: [PATCH 036/139] [v16] VNet: Use NSObject instead of C struct in XPC message (#44918) * Clean up Obj-C properties * Use NSObject instead of C struct in XPC message --- lib/vnet/daemon/client_darwin.go | 25 ++++--------- lib/vnet/daemon/client_darwin.h | 8 +++- lib/vnet/daemon/client_darwin.m | 31 ++++++++-------- lib/vnet/daemon/common_darwin.h | 30 +++++++++++---- lib/vnet/daemon/common_darwin.m | 25 +++++++++++++ lib/vnet/daemon/service_darwin.m | 63 ++++++++++++-------------------- 6 files changed, 102 insertions(+), 80 deletions(-) diff --git a/lib/vnet/daemon/client_darwin.go b/lib/vnet/daemon/client_darwin.go index 56775166e8d95..3b531604bcbc9 100644 --- a/lib/vnet/daemon/client_darwin.go +++ b/lib/vnet/daemon/client_darwin.go @@ -30,7 +30,6 @@ import ( "fmt" "os" "path/filepath" - "runtime" "strconv" "strings" "time" @@ -261,28 +260,20 @@ func startByCalling(ctx context.Context, bundlePath string, config Config) error errC := make(chan error, 1) go func() { - var pinner runtime.Pinner - defer pinner.Unpin() - req := C.StartVnetRequest{ bundle_path: C.CString(bundlePath), - vnet_config: &C.VnetConfig{ - socket_path: C.CString(config.SocketPath), - ipv6_prefix: C.CString(config.IPv6Prefix), - dns_addr: C.CString(config.DNSAddr), - home_path: C.CString(config.HomePath), - }, + socket_path: C.CString(config.SocketPath), + ipv6_prefix: C.CString(config.IPv6Prefix), + dns_addr: C.CString(config.DNSAddr), + home_path: C.CString(config.HomePath), } defer func() { C.free(unsafe.Pointer(req.bundle_path)) - C.free(unsafe.Pointer(req.vnet_config.socket_path)) - C.free(unsafe.Pointer(req.vnet_config.ipv6_prefix)) - C.free(unsafe.Pointer(req.vnet_config.dns_addr)) - C.free(unsafe.Pointer(req.vnet_config.home_path)) + C.free(unsafe.Pointer(req.socket_path)) + C.free(unsafe.Pointer(req.ipv6_prefix)) + C.free(unsafe.Pointer(req.dns_addr)) + C.free(unsafe.Pointer(req.home_path)) }() - // Structs passed directly as arguments to cgo functions are automatically pinned. - // However, structs within structs have to be pinned by hand. - pinner.Pin(req.vnet_config) var res C.StartVnetResult defer func() { diff --git a/lib/vnet/daemon/client_darwin.h b/lib/vnet/daemon/client_darwin.h index e362c4add527b..5afa0dffe7db5 100644 --- a/lib/vnet/daemon/client_darwin.h +++ b/lib/vnet/daemon/client_darwin.h @@ -38,7 +38,11 @@ void OpenSystemSettingsLoginItems(void); typedef struct StartVnetRequest { const char *bundle_path; - VnetConfig *vnet_config; + + const char *socket_path; + const char *ipv6_prefix; + const char *dns_addr; + const char *home_path; } StartVnetRequest; typedef struct StartVnetResult { @@ -73,7 +77,7 @@ void StartVnet(StartVnetRequest *request, StartVnetResult *outResult); void InvalidateDaemonClient(void); @interface VNEDaemonClient : NSObject -- (void)startVnet:(VnetConfig *)vnetConfig completion:(void (^)(NSError *error))completion; +- (void)startVnet:(VNEConfig *)config completion:(void (^)(NSError *error))completion; // invalidate executes all outstanding reply blocks, error handling blocks, // and invalidation blocks and forbids from sending or receiving new messages. - (void)invalidate; diff --git a/lib/vnet/daemon/client_darwin.m b/lib/vnet/daemon/client_darwin.m index b131926d04038..3d5d50226570f 100644 --- a/lib/vnet/daemon/client_darwin.m +++ b/lib/vnet/daemon/client_darwin.m @@ -73,15 +73,11 @@ void OpenSystemSettingsLoginItems(void) { } } -@interface VNEDaemonClient () - -@property(nonatomic, strong, readwrite) NSXPCConnection *connection; -@property(nonatomic, strong, readonly) NSString *bundlePath; -@property(nonatomic, strong, readonly) NSString *codeSigningRequirement; - -@end - -@implementation VNEDaemonClient +@implementation VNEDaemonClient { + NSXPCConnection *_connection; + NSString *_bundlePath; + NSString *_codeSigningRequirement; +} - (id)initWithBundlePath:(NSString *)bundlePath codeSigningRequirement:(NSString *)codeSigningRequirement { self = [super init]; @@ -115,7 +111,7 @@ - (NSXPCConnection *)connection { return _connection; } -- (void)startVnet:(VnetConfig *)vnetConfig completion:(void (^)(NSError *))completion { +- (void)startVnet:(VNEConfig *)config completion:(void (^)(NSError *))completion { // This way of calling the XPC proxy ensures either the error handler or // the reply block gets called. // https://forums.developer.apple.com/forums/thread/713429 @@ -123,10 +119,9 @@ - (void)startVnet:(VnetConfig *)vnetConfig completion:(void (^)(NSError *))compl completion(error); }]; - [(id)proxy startVnet:vnetConfig - completion:^(NSError *error) { - completion(error); - }]; + [(id)proxy startVnet:config completion:^(NSError *error) { + completion(error); + }]; } - (void)invalidate { @@ -155,9 +150,15 @@ void StartVnet(StartVnetRequest *request, StartVnetResult *outResult) { daemonClient = [[VNEDaemonClient alloc] initWithBundlePath:@(request->bundle_path) codeSigningRequirement:requirement]; } + VNEConfig *config = [[VNEConfig alloc] init]; + [config setSocketPath:@(request->socket_path)]; + [config setIpv6Prefix:@(request->ipv6_prefix)]; + [config setDnsAddr:@(request->dns_addr)]; + [config setHomePath:@(request->home_path)]; + dispatch_semaphore_t sema = dispatch_semaphore_create(0); - [daemonClient startVnet:request->vnet_config + [daemonClient startVnet:config completion:^(NSError *error) { if (error) { outResult->ok = false; diff --git a/lib/vnet/daemon/common_darwin.h b/lib/vnet/daemon/common_darwin.h index 92c73b310f4b3..b8491fc5a81d2 100644 --- a/lib/vnet/daemon/common_darwin.h +++ b/lib/vnet/daemon/common_darwin.h @@ -15,12 +15,28 @@ extern const int VNEAlreadyRunningError; // https://developer.apple.com/documentation/security/1395809-seccodecopysigninginformation?language=objc extern const int VNEMissingCodeSigningIdentifiersError; -typedef struct VnetConfig { - const char *socket_path; - const char *ipv6_prefix; - const char *dns_addr; - const char *home_path; -} VnetConfig; +// VNEConfig is used to send a config necessary to start VNet between the client and the daemon +// service. When adding or removing properties, remember to adjust the implementation of VNEConfig +// as well. +// +// Although it's not the primary use case, it's possible for the client to connect to a service +// of a different version of tsh where VNEConfig does not have the same properties. +// Thanks to the conformance to NSSecureCoding, adding and removing properties does not cause either +// end of the connection to blow up: +// +// * If the client sends a property that the daemon doesn't know about, the property will be ignored +// on the daemon side. +// * If the client does not send a property that the daemon expects, the property will not be set on +// the daemon side. +// +// In either case, the expectation is that the Obj-C side pushes the config to the Go side which +// actually validates the config. +@interface VNEConfig : NSObject +@property(copy) NSString *socketPath; +@property(copy) NSString *ipv6Prefix; +@property(copy) NSString *dnsAddr; +@property(copy) NSString *homePath; +@end @protocol VNEDaemonProtocol // startVnet passes the config back to Go code (which then starts VNet in a separate thread) @@ -29,7 +45,7 @@ typedef struct VnetConfig { // Only the first call to this method starts VNet. Subsequent calls return VNEAlreadyRunningError. // The daemon process exits after VNet is stopped, after which it can be spawned again by calling // this method. -- (void)startVnet:(VnetConfig *)vnetConfig completion:(void (^)(NSError *error))completion; +- (void)startVnet:(VNEConfig *)vnetConfig completion:(void (^)(NSError *error))completion; @end // Returns the label for the daemon by getting the identifier of the bundle diff --git a/lib/vnet/daemon/common_darwin.m b/lib/vnet/daemon/common_darwin.m index 3a405209893f8..ca9eb1d96b048 100644 --- a/lib/vnet/daemon/common_darwin.m +++ b/lib/vnet/daemon/common_darwin.m @@ -16,6 +16,7 @@ // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . +#include "common_darwin.h" #import #import @@ -118,3 +119,27 @@ bool getCodeSigningRequirement(NSString **outRequirement, NSError **outError) { return true; } + +@implementation VNEConfig ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (void)encodeWithCoder:(nonnull NSCoder *)coder { + [coder encodeObject:self.socketPath forKey:@"socketPath"]; + [coder encodeObject:self.ipv6Prefix forKey:@"ipv6Prefix"]; + [coder encodeObject:self.dnsAddr forKey:@"dnsAddr"]; + [coder encodeObject:self.homePath forKey:@"homePath"]; +} + +- (nullable instancetype)initWithCoder:(nonnull NSCoder *)coder { + if (self = [super init]) { + [self setSocketPath:[coder decodeObjectOfClass:[NSString class] forKey:@"socketPath"]]; + [self setIpv6Prefix:[coder decodeObjectOfClass:[NSString class] forKey:@"ipv6Prefix"]]; + [self setDnsAddr:[coder decodeObjectOfClass:[NSString class] forKey:@"dnsAddr"]]; + [self setHomePath:[coder decodeObjectOfClass:[NSString class] forKey:@"homePath"]]; + } + return self; +} + +@end diff --git a/lib/vnet/daemon/service_darwin.m b/lib/vnet/daemon/service_darwin.m index 613ec18f116c5..10d586535adf7 100644 --- a/lib/vnet/daemon/service_darwin.m +++ b/lib/vnet/daemon/service_darwin.m @@ -26,38 +26,27 @@ #include @interface VNEClientCred : NSObject -{ - BOOL valid; - gid_t egid; - uid_t euid; -} -@property(nonatomic, readwrite) BOOL valid; -@property(nonatomic, readwrite) gid_t egid; -@property(nonatomic, readwrite) uid_t euid; +@property BOOL valid; +@property gid_t egid; +@property uid_t euid; @end @implementation VNEClientCred -@synthesize valid,egid,euid; @end @interface VNEDaemonService () -@property(nonatomic, strong, readwrite) NSXPCListener *listener; // started describes whether the XPC listener is listening for new connections. -@property(nonatomic, readwrite) BOOL started; -// gotConfig describes if the daemon received a VNet config from a client. -@property(nonatomic, readwrite) BOOL gotConfig; - -@property(nonatomic, readwrite) NSString *socketPath; -@property(nonatomic, readwrite) NSString *ipv6Prefix; -@property(nonatomic, readwrite) NSString *dnsAddr; -@property(nonatomic, readwrite) NSString *homePath; -@property(nonatomic, readwrite) VNEClientCred *clientCred; -@property(nonatomic, readwrite) dispatch_semaphore_t gotVnetConfigSema; +@property(readonly) BOOL started; +@property(readonly) VNEConfig *config; +@property(readonly) VNEClientCred *clientCred; @end -@implementation VNEDaemonService +@implementation VNEDaemonService { + NSXPCListener *_listener; + dispatch_semaphore_t _gotVnetConfigSema; +} - (id)initWithBundlePath:(NSString *)bundlePath codeSigningRequirement:(NSString *)codeSigningRequirement { self = [super init]; @@ -99,7 +88,7 @@ - (void)waitForVnetConfig { #pragma mark - VNEDaemonProtocol -- (void)startVnet:(VnetConfig *)vnetConfig completion:(void (^)(NSError *error))completion { +- (void)startVnet:(VNEConfig *)config completion:(void (^)(NSError *error))completion { @synchronized(self) { // startVnet is expected to be called only once per daemon's lifetime. // Between the process with the daemon client exiting and the admin process (which runs the @@ -108,7 +97,7 @@ - (void)startVnet:(VnetConfig *)vnetConfig completion:(void (^)(NSError *error)) // // In such scenarios, we want to return an error so that the client can wait for the daemon // to exit and retry the call. - if (_gotConfig) { + if (_config != nil) { NSError *error = [[NSError alloc] initWithDomain:@(VNEErrorDomain) code:VNEAlreadyRunningError userInfo:nil]; @@ -116,11 +105,7 @@ - (void)startVnet:(VnetConfig *)vnetConfig completion:(void (^)(NSError *error)) return; } - _gotConfig = YES; - _socketPath = @(vnetConfig->socket_path); - _ipv6Prefix = @(vnetConfig->ipv6_prefix); - _dnsAddr = @(vnetConfig->dns_addr); - _homePath = @(vnetConfig->home_path); + _config = config; NSXPCConnection *currentConn = [NSXPCConnection currentConnection]; _clientCred = [[VNEClientCred alloc] init]; @@ -175,7 +160,7 @@ void DaemonStart(const char *bundle_path, DaemonStartResult *outResult) { } void DaemonStop(void) { - if (daemonService && [daemonService started]) { + if (daemonService && daemonService.started) { [daemonService stop]; } } @@ -186,26 +171,26 @@ void WaitForVnetConfig(VnetConfigResult *outResult, ClientCred *outClientCred) { return; } - if (![daemonService started]) { + if (!daemonService.started) { outResult->error_description = strdup("daemon was not started yet"); } [daemonService waitForVnetConfig]; - if (![daemonService started]) { + if (!daemonService.started) { outResult->error_description = strdup("daemon was stopped while waiting for VNet config"); return; } @synchronized(daemonService) { - outResult->socket_path = VNECopyNSString([daemonService socketPath]); - outResult->ipv6_prefix = VNECopyNSString([daemonService ipv6Prefix]); - outResult->dns_addr = VNECopyNSString([daemonService dnsAddr]); - outResult->home_path = VNECopyNSString([daemonService homePath]); - - if ([daemonService clientCred] && [[daemonService clientCred] valid]) { - outClientCred->egid = [[daemonService clientCred] egid]; - outClientCred->euid = [[daemonService clientCred] euid]; + outResult->socket_path = VNECopyNSString(daemonService.config.socketPath); + outResult->ipv6_prefix = VNECopyNSString(daemonService.config.ipv6Prefix); + outResult->dns_addr = VNECopyNSString(daemonService.config.dnsAddr); + outResult->home_path = VNECopyNSString(daemonService.config.homePath); + + if (daemonService.clientCred && [daemonService.clientCred valid]) { + outClientCred->egid = daemonService.clientCred.egid; + outClientCred->euid = daemonService.clientCred.euid; outClientCred->valid = true; } From 10f194df52bc9c88dcc448a4171e28b53dafcce1 Mon Sep 17 00:00:00 2001 From: Gavin Frazar Date: Thu, 1 Aug 2024 13:55:56 -0700 Subject: [PATCH 037/139] update db enrollment task role instructions (#44895) Ask for task role name, not role ARN --- .../Database/DeployService/AutoDeploy/AutoDeploy.tsx | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/web/packages/teleport/src/Discover/Database/DeployService/AutoDeploy/AutoDeploy.tsx b/web/packages/teleport/src/Discover/Database/DeployService/AutoDeploy/AutoDeploy.tsx index 86fdac8008ebe..3208ce6205ab5 100644 --- a/web/packages/teleport/src/Discover/Database/DeployService/AutoDeploy/AutoDeploy.tsx +++ b/web/packages/teleport/src/Discover/Database/DeployService/AutoDeploy/AutoDeploy.tsx @@ -373,24 +373,21 @@ const CreateAccessRole = ({ Step 1 - Name a Task Role ARN for this Database Service and generate a configure - command. This command will configure the required permissions in your - AWS account. + Name an IAM role for the Teleport Database Service and generate a + configuration command. The generated command will create the role and + configure permissions for it in your AWS account. setTaskRoleArn(e.target.value)} - toolTipContent={`Amazon Resource Names (ARNs) uniquely identify AWS \ - resources. In this case you will naming an IAM role that this \ - deployed service will be using`} /> {scriptUrl ? 'Regenerate Command' : 'Generate Command'} From 9716a2af4e851686271cc07ce5f63f7334f6abfc Mon Sep 17 00:00:00 2001 From: Gavin Frazar Date: Thu, 1 Aug 2024 13:56:06 -0700 Subject: [PATCH 038/139] link to ECS service for RDS enrollment (#44973) The old behavior linked to the ECS cluster dashboard because we were doing potentially multiple deployments. This behavior is maintained, except now if there is only one deployment, which is the nominal case now, then it will link to that deployment's ECS service specifically. --- .../integration/v1/awsoidc_service.pb.go | 3 ++- .../integration/v1/awsoidc_service.proto | 3 ++- .../awsoidc/deploydatabaseservice.go | 26 +++++++++++++++---- .../awsoidc/deploydatabaseservice_test.go | 4 +-- 4 files changed, 27 insertions(+), 9 deletions(-) diff --git a/api/gen/proto/go/teleport/integration/v1/awsoidc_service.pb.go b/api/gen/proto/go/teleport/integration/v1/awsoidc_service.pb.go index a5ab858bad303..fa462fc591c21 100644 --- a/api/gen/proto/go/teleport/integration/v1/awsoidc_service.pb.go +++ b/api/gen/proto/go/teleport/integration/v1/awsoidc_service.pb.go @@ -1583,7 +1583,8 @@ type DeployDatabaseServiceResponse struct { // ClusterArn identifies the cluster where the deployment was made. ClusterArn string `protobuf:"bytes,1,opt,name=cluster_arn,json=clusterArn,proto3" json:"cluster_arn,omitempty"` - // ClusterDashboardUrl is the URL for Amazon Web Console that links directly to the Amazon ECS Cluster. + // ClusterDashboardURL is a link to the Amazon ECS cluster dashboard or a + // specific cluster service if a single deployment was requested. ClusterDashboardUrl string `protobuf:"bytes,2,opt,name=cluster_dashboard_url,json=clusterDashboardUrl,proto3" json:"cluster_dashboard_url,omitempty"` } diff --git a/api/proto/teleport/integration/v1/awsoidc_service.proto b/api/proto/teleport/integration/v1/awsoidc_service.proto index 0c0813df5ad7f..583dc68a8fd2b 100644 --- a/api/proto/teleport/integration/v1/awsoidc_service.proto +++ b/api/proto/teleport/integration/v1/awsoidc_service.proto @@ -359,7 +359,8 @@ message DeployDatabaseServiceDeployment { message DeployDatabaseServiceResponse { // ClusterArn identifies the cluster where the deployment was made. string cluster_arn = 1; - // ClusterDashboardUrl is the URL for Amazon Web Console that links directly to the Amazon ECS Cluster. + // ClusterDashboardURL is a link to the Amazon ECS cluster dashboard or a + // specific cluster service if a single deployment was requested. string cluster_dashboard_url = 2; } diff --git a/lib/integrations/awsoidc/deploydatabaseservice.go b/lib/integrations/awsoidc/deploydatabaseservice.go index d6d35ef91585c..457e224882091 100644 --- a/lib/integrations/awsoidc/deploydatabaseservice.go +++ b/lib/integrations/awsoidc/deploydatabaseservice.go @@ -147,7 +147,8 @@ type DeployDatabaseServiceResponse struct { // ClusterARN is the Amazon ECS Cluster ARN where the task was started. ClusterARN string - // ClusterDashboardURL is a link to the Cluster's Dashboard URL in Amazon Console. + // ClusterDashboardURL is a link to the Amazon ECS cluster dashboard or + // a specific cluster service if a single deployment was requested. ClusterDashboardURL string } @@ -214,7 +215,7 @@ func DeployDatabaseService(ctx context.Context, clt DeployServiceClient, req Dep ) log.DebugContext(ctx, "Upsert ECS Cluster") - cluster, err := upsertCluster(ctx, clt, req.ecsClusterName, req.ResourceCreationTags) + ecsCluster, err := upsertCluster(ctx, clt, req.ecsClusterName, req.ResourceCreationTags) if err != nil { return nil, trace.Wrap(err) } @@ -260,11 +261,22 @@ func DeployDatabaseService(ctx context.Context, clt DeployServiceClient, req Dep } return &DeployDatabaseServiceResponse{ - ClusterARN: aws.ToString(cluster.ClusterArn), - ClusterDashboardURL: ecsClusterDashboardURL(req.Region, aws.ToString(cluster.ClusterName)), + ClusterARN: aws.ToString(ecsCluster.ClusterArn), + ClusterDashboardURL: deploymentURL(req.Region, aws.ToString(ecsCluster.ClusterName), req.Deployments), }, nil } +// deploymentURL returns a link to the service in the ECS cluster for a single +// deployment, which is the nominal case since we updated the enrollment flow +// to deploy a single VPC at a time, or a link to the ECS cluster overview +// if multiple deployments are requested. +func deploymentURL(region, ecsClusterName string, deps []DeployDatabaseServiceRequestDeployment) string { + if len(deps) == 1 { + return ecsServiceDashboardURL(region, ecsClusterName, deps[0].VPCID) + } + return ecsClusterDashboardURL(region, ecsClusterName) +} + // ecsTaskName returns the normalized ECS TaskDefinition Family func ecsTaskName(teleportClusterName, deploymentMode, vpcid string) string { return normalizeECSResourceName(fmt.Sprintf("%s-teleport-%s-%s", teleportClusterName, deploymentMode, vpcid)) @@ -294,7 +306,11 @@ func ECSDatabaseServiceDashboardURL(region, teleportClusterName, vpcID string) ( return "", trace.BadParameter("empty VPC ID") } ecsClusterName := normalizeECSClusterName(teleportClusterName) + return ecsServiceDashboardURL(region, ecsClusterName, vpcID), nil +} + +func ecsServiceDashboardURL(region, ecsClusterName, vpcID string) string { ecsClusterDashboard := ecsClusterDashboardURL(region, ecsClusterName) serviceName := ecsServiceName(DatabaseServiceDeploymentMode, vpcID) - return fmt.Sprintf("%s/%s", ecsClusterDashboard, serviceName), nil + return fmt.Sprintf("%s/%s", ecsClusterDashboard, serviceName) } diff --git a/lib/integrations/awsoidc/deploydatabaseservice_test.go b/lib/integrations/awsoidc/deploydatabaseservice_test.go index ec871eaf092ac..96026dcfbbd40 100644 --- a/lib/integrations/awsoidc/deploydatabaseservice_test.go +++ b/lib/integrations/awsoidc/deploydatabaseservice_test.go @@ -439,7 +439,7 @@ func TestDeployDatabaseService(t *testing.T) { }, ) require.NoError(t, err) - require.Equal(t, "https://us-east-1.console.aws.amazon.com/ecs/v2/clusters/cluster-name-teleport/services", resp.ClusterDashboardURL) + require.Equal(t, "https://us-east-1.console.aws.amazon.com/ecs/v2/clusters/cluster-name-teleport/services/database-service-vpc-123", resp.ClusterDashboardURL) require.Equal(t, "ARNcluster-name-teleport", resp.ClusterARN) require.Contains(t, mockClient.clusters, "cluster-name-teleport") require.Contains(t, mockClient.services, "database-service-vpc-123") @@ -550,7 +550,7 @@ func TestDeployDatabaseService(t *testing.T) { }, ) require.NoError(t, err) - require.Equal(t, "https://us-east-1.console.aws.amazon.com/ecs/v2/clusters/cluster-name-teleport/services", resp.ClusterDashboardURL) + require.Equal(t, "https://us-east-1.console.aws.amazon.com/ecs/v2/clusters/cluster-name-teleport/services/database-service-vpc-123", resp.ClusterDashboardURL) require.Equal(t, "ARNcluster-name-teleport", resp.ClusterARN) }) } From 31b1643e95ace18f050b53c3de15d1af80f14a48 Mon Sep 17 00:00:00 2001 From: Lisa Kim Date: Thu, 1 Aug 2024 14:38:10 -0700 Subject: [PATCH 039/139] [v16] Add discovery label account ID when deploying services (#44886) * Add discovery label account ID when deploying services * Fix acronyms --- lib/web/integrations_awsoidc.go | 5 +++-- lib/web/ui/integration.go | 3 +++ .../Database/DeployService/AutoDeploy/AutoDeploy.tsx | 5 +++++ web/packages/teleport/src/services/integrations/types.ts | 2 ++ 4 files changed, 13 insertions(+), 2 deletions(-) diff --git a/lib/web/integrations_awsoidc.go b/lib/web/integrations_awsoidc.go index cd70b482fa7ad..eb71ab36dff37 100644 --- a/lib/web/integrations_awsoidc.go +++ b/lib/web/integrations_awsoidc.go @@ -195,8 +195,9 @@ func (h *Handler) awsOIDCDeployDatabaseServices(w http.ResponseWriter, r *http.R h.PublicProxyAddr(), iamTokenName, types.Labels{ - types.DiscoveryLabelVPCID: []string{d.VPCID}, - types.DiscoveryLabelRegion: []string{req.Region}, + types.DiscoveryLabelVPCID: []string{d.VPCID}, + types.DiscoveryLabelRegion: []string{req.Region}, + types.DiscoveryLabelAccountID: []string{req.AccountID}, }, ) if err != nil { diff --git a/lib/web/ui/integration.go b/lib/web/ui/integration.go index 3de8c7bbce860..fe0a3c305f21c 100644 --- a/lib/web/ui/integration.go +++ b/lib/web/ui/integration.go @@ -237,6 +237,9 @@ type AWSOIDCDeployDatabaseServiceRequest struct { // Region is the AWS Region for the Service. Region string `json:"region"` + // AccountID is the AWS account to deploy service to. + AccountID string `json:"accountId"` + // TaskRoleARN is the AWS Role's ARN used within the Task execution. // Ensure the AWS Client's Role has `iam:PassRole` for this Role's ARN. // This can be either the ARN or the short name of the AWS Role. diff --git a/web/packages/teleport/src/Discover/Database/DeployService/AutoDeploy/AutoDeploy.tsx b/web/packages/teleport/src/Discover/Database/DeployService/AutoDeploy/AutoDeploy.tsx index 3208ce6205ab5..e60eadf209d91 100644 --- a/web/packages/teleport/src/Discover/Database/DeployService/AutoDeploy/AutoDeploy.tsx +++ b/web/packages/teleport/src/Discover/Database/DeployService/AutoDeploy/AutoDeploy.tsx @@ -40,6 +40,7 @@ import { DiscoverServiceDeployType, } from 'teleport/services/userEvent'; import cfg from 'teleport/config'; +import { splitAwsIamArn } from 'teleport/services/integrations/aws'; import { ActionButtons, @@ -100,9 +101,13 @@ export function AutoDeploy({ toggleDeployMethod }: DeployServiceProp) { dbMeta.autoDiscovery.requiredVpcsAndSubnets; const vpcIds = Object.keys(requiredVpcsAndSubnets); + const { awsAccountId } = splitAwsIamArn( + agentMeta.awsIntegration.spec.roleArn + ); integrationService .deployDatabaseServices(integrationName, { region: dbMeta.awsRegion, + accountId: awsAccountId, taskRoleArn, deployments: vpcIds.map(vpcId => ({ vpcId, diff --git a/web/packages/teleport/src/services/integrations/types.ts b/web/packages/teleport/src/services/integrations/types.ts index 025472b22bc90..9c971917b0f40 100644 --- a/web/packages/teleport/src/services/integrations/types.ts +++ b/web/packages/teleport/src/services/integrations/types.ts @@ -324,6 +324,8 @@ type DeployDatabaseServiceDeployment = { // -account-id: s // -vpc-id: export type AwsOidcDeployDatabaseServicesRequest = { + // The AWS account to deploy the db service to. + accountId: string; // Region is the AWS Region for the Service. region: string; // TaskRoleARN is the AWS Role's ARN used within the Task execution. From 84fcdfdd249704f9801e06fc16046218e53277d4 Mon Sep 17 00:00:00 2001 From: Lisa Kim Date: Thu, 1 Aug 2024 14:39:22 -0700 Subject: [PATCH 040/139] Web: fix undefined limit sending undefined as a value to backend (#44963) --- .../teleport/src/generateResourcePath.test.ts | 68 +++++++++++++++++++ .../teleport/src/generateResourcePath.ts | 2 +- 2 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 web/packages/teleport/src/generateResourcePath.test.ts diff --git a/web/packages/teleport/src/generateResourcePath.test.ts b/web/packages/teleport/src/generateResourcePath.test.ts new file mode 100644 index 0000000000000..f224dc024662c --- /dev/null +++ b/web/packages/teleport/src/generateResourcePath.test.ts @@ -0,0 +1,68 @@ +/** + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import cfg, { UrlResourcesParams } from './config'; +import generateResourcePath from './generateResourcePath'; + +test('undefined params are set to empty string', () => { + expect( + generateResourcePath(cfg.api.unifiedResourcesPath, { clusterId: 'cluster' }) + ).toStrictEqual( + '/v1/webapi/sites/cluster/resources?searchAsRoles=&limit=&startKey=&kinds=&query=&search=&sort=&pinnedOnly=&includedResourceMode=' + ); +}); + +test('defined params are set', () => { + const unifiedParams: UrlResourcesParams = { + query: 'query', + search: 'search', + sort: { fieldName: 'field', dir: 'DESC' }, + limit: 100, + startKey: 'startkey', + searchAsRoles: 'yes', + pinnedOnly: true, + includedResourceMode: 'all', + kinds: ['app'], + }; + expect( + generateResourcePath(cfg.api.unifiedResourcesPath, { + clusterId: 'cluster', + ...unifiedParams, + }) + ).toStrictEqual( + '/v1/webapi/sites/cluster/resources?searchAsRoles=yes&limit=100&startKey=startkey&kinds=app&query=query&search=search&sort=field:desc&pinnedOnly=true&includedResourceMode=all' + ); +}); + +test('defined params but set to empty values are set to empty string', () => { + const unifiedParams: UrlResourcesParams = { + query: '', + search: null, + limit: 0, + pinnedOnly: false, + kinds: [], + }; + expect( + generateResourcePath(cfg.api.unifiedResourcesPath, { + clusterId: 'cluster', + ...unifiedParams, + }) + ).toStrictEqual( + '/v1/webapi/sites/cluster/resources?searchAsRoles=&limit=&startKey=&kinds=&query=&search=&sort=&pinnedOnly=&includedResourceMode=' + ); +}); diff --git a/web/packages/teleport/src/generateResourcePath.ts b/web/packages/teleport/src/generateResourcePath.ts index 3c0abd1747a13..a3a034af33d92 100644 --- a/web/packages/teleport/src/generateResourcePath.ts +++ b/web/packages/teleport/src/generateResourcePath.ts @@ -50,7 +50,7 @@ export default function generateResourcePath( const output = path .replace(':clusterId', params.clusterId) - .replace(':limit?', params.limit) + .replace(':limit?', params.limit || '') .replace(':startKey?', params.startKey || '') .replace(':query?', processedParams.query || '') .replace(':search?', processedParams.search || '') From c80cea52a0161336fbe7634970323a7d0515eb01 Mon Sep 17 00:00:00 2001 From: Noah Stride Date: Fri, 2 Aug 2024 11:14:39 +0100 Subject: [PATCH 041/139] [v16] Add `application-tunnel` to Machine ID docs (#44536) * Add `application-tunnel` to the config reference page * Update App Access Machine ID guide --- .../machine-id/access-guides/applications.mdx | 98 ++++++++++++------- .../machine-id/reference/configuration.mdx | 28 ++++++ 2 files changed, 91 insertions(+), 35 deletions(-) diff --git a/docs/pages/enroll-resources/machine-id/access-guides/applications.mdx b/docs/pages/enroll-resources/machine-id/access-guides/applications.mdx index ca514e3c7c007..edffac5e66dfa 100644 --- a/docs/pages/enroll-resources/machine-id/access-guides/applications.mdx +++ b/docs/pages/enroll-resources/machine-id/access-guides/applications.mdx @@ -56,16 +56,53 @@ with the name of the role you just created: $ tctl bots update example --add-roles example-role ``` -## Step 2/3. Configure an application `tbot` output +## Step 2/3. Configure `tbot` + +There are two implementation options available when using `tbot` to grant +a client access to an application. The option you choose will depend on your +specific needs. + +The first option is the `application-tunnel` service. This operates a local +proxy that your client can connect to. The service will automatically attach +the credentials to the connection, meaning that the client does not need to +support client certificates. However, this does mean that the `tbot` process +must be running for the client to access the application. + +The second option is the `application` output. This will write TLS credentials +to a destination where your client will read them from. The client must support +client certificates and reloading them from disk when they are renewed. In +addition, this option is not compatible with a TLS-terminating load-balancer +between the client and the Teleport Proxy service. Unlike the +`application-tunnel`, the `tbot` process does not need to be running for the +client to access the application - this can be ideal for CI/CD pipelines. + +If you aren't sure which to use, we recommend starting with the +`application-tunnel` service as this is compatible with more clients. + + + +To configure the `application-tunnel` service, first determine where you want +the listener to bind to. As any client that can connect to the service listener +will be able to access the application, it is recommended to bind to the +loopback interface (e.g `127.0.0.1`) as this will prevent access from other +hosts. + +Modify your `tbot` configuration to add an `application-tunnel` service: -Now, `tbot` needs to be configured with an output to produce the -credentials needed to access applications in your infrastructure. To do this, the `application` output -type is used. +```yaml +services: +- type: application-tunnel + app_name: dumper + listen: tcp://127.0.0.1:1234 +``` -The application you want the credentials to have access to must be specified -using the `app_name` field. In this example, the debug application (`dumper`) -will be used. +Replace: +- `dumper` with the name of the application you registered in Teleport. +- `listen` with the address and port you wish the service to bind to. +Restart `tbot` to apply the new configuration. + + Outputs must be configured with a destination. In this example, the `directory` destination will be used. This will write artifacts to a specified directory on disk. Ensure that this directory can be written to by the Linux user that @@ -93,9 +130,23 @@ Teleport. If operating `tbot` as a background service, restart it. If running `tbot` in one-shot mode, it must be executed before you attempt to use the credentials. + + ## Step 3/3. Connect to your web application with the Machine ID identity + + +Once the `application-tunnel` service has been configured, you can connect to +the application using the listen address you specified. + +For example, to access the application using `curl`: + +```code +$ curl http://127.0.0.1:1234/ +``` + + Once `tbot` has been run, credentials will be output to the directory specified in the destination. Using the example of `/opt/machine-id`: @@ -113,9 +164,9 @@ For example, to access the application using `curl`: ```code $ curl \ - --cert /opt/machine-id/tlscert \ - --key /opt/machine-id/key \ - https://dumper.example.teleport.sh/ +--cert /opt/machine-id/tlscert \ +--key /opt/machine-id/key \ +https://dumper.example.teleport.sh/ ``` No CA certificate needs to be specified so long as your Teleport Proxy is @@ -124,31 +175,8 @@ certificate authority. Note that if the certificates are invalid or otherwise misconfigured, clients will be redirected to the Teleport login page when attempting to access the app. - -### Authenticated tunnel - -For cases where the client you wish to use to connect to the application does not -support client certificates, it is possible to open an authenticated tunnel. -This will listen on a local port and automatically attach the credentials, -meaning that the client itself does not need to support them. - -To open an authenticated tunnel to the `dumper` application on port 1234, run: - -```code -$ tbot proxy --destination-dir=/opt/machine-id --proxy=example.teleport.sh:443 app --port=1234 dumper -``` - -Whilst this command is running, you can connect to the app at -`http://localhost:1234`: - -```code -$ curl http://localhost:1234/ -``` - -The tunnel listens only on the loopback interface, meaning that this port -cannot be used from other hosts. Care should still be taken though, as any -process running on that host will be able to connect to the application without -authentication through this port. + + ## Troubleshooting diff --git a/docs/pages/enroll-resources/machine-id/reference/configuration.mdx b/docs/pages/enroll-resources/machine-id/reference/configuration.mdx index 3ba11f0878b01..52c03b4dec839 100644 --- a/docs/pages/enroll-resources/machine-id/reference/configuration.mdx +++ b/docs/pages/enroll-resources/machine-id/reference/configuration.mdx @@ -451,6 +451,34 @@ database: postgres username: postgres ``` +#### `application-tunnel` + +The `application-tunnel` service opens a listener that tunnels connections to +an application in Teleport. It supports both HTTP and TCP applications. This is +useful for applications which cannot be configured to use client certificates, +when using TCP application or where using a L7 load-balancer in front of your +Teleport proxies. + +The tunnel authenticates connections for the client, meaning that any +client that connects to the listener will be able to access the application. +For this reason, ensure that the listener is only accessible by the intended +clients by using the Unix socket listener or binding to `127.0.0.1`. + +```yaml +# type specifies the type of the service. For the application tunnel service, +# this will always be `application-tunnel`. +type: application-tunnel +# listen specifies the address that the service should listen on. +# +# Two types of listener are supported: +# - TCP: `tcp://
:` +# - Unix socket: `unix:///` +listen: tcp://127.0.0.1:8084 +# app_name is the name of the application, as configured in Teleport, that +# the service should open a tunnel to. +app_name: my-application +``` + #### `ssh-multiplexer` The `ssh-multiplexer` service opens a listener for a high-performance local From e11493e5ebeb4c1bd3f4ea27723e30aaedd2972b Mon Sep 17 00:00:00 2001 From: Edoardo Spadolini Date: Fri, 2 Aug 2024 12:46:56 +0200 Subject: [PATCH 042/139] [v16] re-add grace period to Upload completer (again) (#44978) * re-add grace period to Upload completer (again) * Check parts' last modified time for the grace period * Add test --------- Co-authored-by: Zac Bergquist --- lib/events/api.go | 3 ++ lib/events/auditlog.go | 4 ++ lib/events/azsessions/azsessions.go | 21 ++++++-- lib/events/complete.go | 26 ++++++++++ lib/events/complete_test.go | 74 ++++++++++++++++++++++++++- lib/events/eventstest/uploader.go | 37 ++++++++++---- lib/events/filesessions/filestream.go | 14 +++-- lib/events/gcssessions/gcsstream.go | 3 +- lib/events/s3sessions/s3stream.go | 19 +++++-- lib/events/stream_test.go | 8 ++- 10 files changed, 182 insertions(+), 27 deletions(-) diff --git a/lib/events/api.go b/lib/events/api.go index 9a700529da890..7998ada4c120a 100644 --- a/lib/events/api.go +++ b/lib/events/api.go @@ -875,6 +875,9 @@ type StreamPart struct { Number int64 // ETag is a part e-tag ETag string + // LastModified is the time of last modification of this part (if + // available). + LastModified time.Time } // StreamUpload represents stream multipart upload diff --git a/lib/events/auditlog.go b/lib/events/auditlog.go index 709e2c7a23d95..5cb3ab744c31d 100644 --- a/lib/events/auditlog.go +++ b/lib/events/auditlog.go @@ -111,6 +111,10 @@ const ( // AbandonedUploadPollingRate defines how often to check for // abandoned uploads which need to be completed. AbandonedUploadPollingRate = apidefaults.SessionTrackerTTL / 6 + + // UploadCompleterGracePeriod is the default period after which an upload's + // session tracker will be checked to see if it's an abandoned upload. + UploadCompleterGracePeriod = 24 * time.Hour ) var ( diff --git a/lib/events/azsessions/azsessions.go b/lib/events/azsessions/azsessions.go index 85aa13d39084d..527f024670825 100644 --- a/lib/events/azsessions/azsessions.go +++ b/lib/events/azsessions/azsessions.go @@ -28,6 +28,7 @@ import ( "slices" "strconv" "strings" + "time" "github.com/Azure/azure-sdk-for-go/sdk/azcore" "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" @@ -450,7 +451,8 @@ func (h *Handler) UploadPart(ctx context.Context, upload events.StreamUpload, pa // our parts are just over 5 MiB (events.MinUploadPartSizeBytes) so we can // upload them in one shot - if _, err := cErr(partBlob.Upload(ctx, streaming.NopCloser(partBody), nil)); err != nil { + response, err := cErr(partBlob.Upload(ctx, streaming.NopCloser(partBody), nil)) + if err != nil { return nil, trace.Wrap(err) } h.log.WithFields(logrus.Fields{ @@ -459,7 +461,11 @@ func (h *Handler) UploadPart(ctx context.Context, upload events.StreamUpload, pa fieldPartNumber: partNumber, }).Debug("Uploaded part.") - return &events.StreamPart{Number: partNumber}, nil + var lastModified time.Time + if response.LastModified != nil { + lastModified = *response.LastModified + } + return &events.StreamPart{Number: partNumber, LastModified: lastModified}, nil } // ListParts implements [events.MultipartUploader]. @@ -492,8 +498,15 @@ func (h *Handler) ListParts(ctx context.Context, upload events.StreamUpload) ([] if err != nil { continue } - - parts = append(parts, events.StreamPart{Number: partNumber}) + var lastModified time.Time + if b.Properties != nil && + b.Properties.LastModified != nil { + lastModified = *b.Properties.LastModified + } + parts = append(parts, events.StreamPart{ + Number: partNumber, + LastModified: lastModified, + }) } } diff --git a/lib/events/complete.go b/lib/events/complete.go index b335363e667c2..62e610df1d7ce 100644 --- a/lib/events/complete.go +++ b/lib/events/complete.go @@ -19,6 +19,7 @@ package events import ( + "cmp" "context" "fmt" "os" @@ -59,6 +60,11 @@ type UploadCompleterConfig struct { Component string // CheckPeriod is a period for checking the upload CheckPeriod time.Duration + // GracePeriod is the period after which an upload's session tracker will be + // checked to see if it's an abandoned upload. A duration of zero will + // result in a sensible default, any negative value will result in no grace + // period. + GracePeriod time.Duration // Clock is used to override clock in tests Clock clockwork.Clock // ClusterName identifies the originating teleport cluster @@ -221,11 +227,21 @@ func (u *UploadCompleter) CheckUploads(ctx context.Context) error { } }() + gracePeriod := cmp.Or(u.cfg.GracePeriod, UploadCompleterGracePeriod) incompleteSessionUploads.Set(float64(len(uploads))) // Complete upload for any uploads without an active session tracker for _, upload := range uploads { log := u.log.WithField("upload", upload.ID).WithField("session", upload.SessionID) + if gracePeriod > 0 && u.cfg.Clock.Since(upload.Initiated) <= gracePeriod { + log.Debug("Found incomplete upload within grace period, terminating check early.") + // not only we can skip this upload, but since uploads are sorted by + // Initiated oldest-to-newest, we can actually just stop checking as + // all further uploads will be closer in time to now and thus they + // will all be within the grace period + break + } + switch _, err := u.cfg.SessionTracker.GetSessionTracker(ctx, upload.SessionID.String()); { case err == nil: // session is still in progress, continue to other uploads log.Debug("session has active tracker and is not ready to be uploaded") @@ -247,6 +263,16 @@ func (u *UploadCompleter) CheckUploads(ctx context.Context) error { } return trace.Wrap(err, "listing parts") } + var lastModified time.Time + for _, part := range parts { + if part.LastModified.After(lastModified) { + lastModified = part.LastModified + } + } + if u.cfg.Clock.Since(lastModified) <= gracePeriod { + log.Debug("Found incomplete upload with recently uploaded part, skipping.") + continue + } log.Debugf("upload has %d parts", len(parts)) diff --git a/lib/events/complete_test.go b/lib/events/complete_test.go index e21b20e1e2058..a810f690682f2 100644 --- a/lib/events/complete_test.go +++ b/lib/events/complete_test.go @@ -71,6 +71,7 @@ func TestUploadCompleterCompletesAbandonedUploads(t *testing.T) { SessionTracker: sessionTrackerService, Clock: clock, ClusterName: "teleport-cluster", + GracePeriod: 24 * time.Hour, }) require.NoError(t, err) @@ -81,7 +82,18 @@ func TestUploadCompleterCompletesAbandonedUploads(t *testing.T) { require.NoError(t, err) require.False(t, mu.IsCompleted(upload.ID)) - clock.Advance(1 * time.Hour) + // enough to expire the session tracker, not enough to pass the grace period + clock.Advance(2 * time.Hour) + + err = uc.CheckUploads(context.Background()) + require.NoError(t, err) + require.False(t, mu.IsCompleted(upload.ID)) + + trackers, err := sessionTrackerService.GetActiveSessionTrackers(context.Background()) + require.NoError(t, err) + require.Empty(t, trackers) + + clock.Advance(22*time.Hour + time.Nanosecond) err = uc.CheckUploads(context.Background()) require.NoError(t, err) @@ -147,6 +159,7 @@ func TestUploadCompleterAcquiresSemaphore(t *testing.T) { }, acquireErr: nil, }, + GracePeriod: -1, }) require.NoError(t, err) @@ -193,6 +206,7 @@ func TestUploadCompleterEmitsSessionEnd(t *testing.T) { Clock: clock, SessionTracker: &mockSessionTrackerService{}, ClusterName: "teleport-cluster", + GracePeriod: -1, }) require.NoError(t, err) @@ -224,6 +238,63 @@ func TestUploadCompleterEmitsSessionEnd(t *testing.T) { } } +func TestCheckUploadsSkipsUploadsInProgress(t *testing.T) { + clock := clockwork.NewFakeClock() + sessionTrackers := []types.SessionTracker{} + + sessionTrackerService := &mockSessionTrackerService{ + clock: clock, + trackers: sessionTrackers, + } + + // simulate an upload that started well before the grace period, + // but the most recently uploaded part is still within the grace period + gracePeriod := 10 * time.Minute + uploadInitiated := clock.Now().Add(-3 * gracePeriod) + lastPartUploaded := clock.Now().Add(-2 * gracePeriod / 3) + + var completedUploads []events.StreamUpload + + uploader := &eventstest.MockUploader{ + MockListUploads: func(ctx context.Context) ([]events.StreamUpload, error) { + return []events.StreamUpload{ + { + ID: "upload-1234", + SessionID: session.NewID(), + Initiated: uploadInitiated, + }, + }, nil + }, + MockListParts: func(ctx context.Context, upload events.StreamUpload) ([]events.StreamPart, error) { + return []events.StreamPart{ + { + Number: int64(1), + ETag: "foo", + LastModified: lastPartUploaded, + }, + }, nil + }, + MockCompleteUpload: func(ctx context.Context, upload events.StreamUpload, parts []events.StreamPart) error { + completedUploads = append(completedUploads, upload) + return nil + }, + } + + uc, err := events.NewUploadCompleter(events.UploadCompleterConfig{ + Uploader: uploader, + AuditLog: &eventstest.MockAuditLog{}, + SessionTracker: sessionTrackerService, + Clock: clock, + ClusterName: "teleport-cluster", + GracePeriod: gracePeriod, + }) + require.NoError(t, err) + + uc.CheckUploads(context.Background()) + require.Empty(t, completedUploads) + +} + func TestCheckUploadsContinuesOnError(t *testing.T) { clock := clockwork.NewFakeClock() expires := clock.Now().Add(time.Hour * 1) @@ -286,6 +357,7 @@ func TestCheckUploadsContinuesOnError(t *testing.T) { SessionTracker: sessionTrackerService, Clock: clock, ClusterName: "teleport-cluster", + GracePeriod: -1, }) require.NoError(t, err) diff --git a/lib/events/eventstest/uploader.go b/lib/events/eventstest/uploader.go index 63a30cd242684..99cee3b1e3f94 100644 --- a/lib/events/eventstest/uploader.go +++ b/lib/events/eventstest/uploader.go @@ -55,6 +55,8 @@ type MemoryUploader struct { objects map[session.ID][]byte eventsC chan events.UploadEvent + // Clock is an optional [clockwork.Clock] to determine the time to associate + // with uploads and parts. Clock clockwork.Clock } @@ -63,7 +65,7 @@ type MemoryUpload struct { // id is the upload ID id string // parts is the upload parts - parts map[int64][]byte + parts map[int64]part // sessionID is the session ID associated with the upload sessionID session.ID //completed specifies upload as completed @@ -73,6 +75,11 @@ type MemoryUpload struct { Initiated time.Time } +type part struct { + data []byte + lastModified time.Time +} + func (m *MemoryUploader) trySendEvent(event events.UploadEvent) { if m.eventsC == nil { return @@ -98,6 +105,7 @@ func (m *MemoryUploader) CreateUpload(ctx context.Context, sessionID session.ID) upload := &events.StreamUpload{ ID: uuid.New().String(), SessionID: sessionID, + Initiated: time.Now(), } if m.Clock != nil { upload.Initiated = m.Clock.Now() @@ -105,7 +113,7 @@ func (m *MemoryUploader) CreateUpload(ctx context.Context, sessionID session.ID) m.uploads[upload.ID] = &MemoryUpload{ id: upload.ID, sessionID: sessionID, - parts: make(map[int64][]byte), + parts: make(map[int64]part), Initiated: upload.Initiated, } return upload, nil @@ -127,11 +135,11 @@ func (m *MemoryUploader) CompleteUpload(ctx context.Context, upload events.Strea partsSet := make(map[int64]bool, len(parts)) for _, part := range parts { partsSet[part.Number] = true - data, ok := up.parts[part.Number] + upPart, ok := up.parts[part.Number] if !ok { return trace.NotFound("part %v has not been uploaded", part.Number) } - result = append(result, data...) + result = append(result, upPart.data...) } // exclude parts that are not requested to be completed for number := range up.parts { @@ -157,8 +165,15 @@ func (m *MemoryUploader) UploadPart(ctx context.Context, upload events.StreamUpl if !ok { return nil, trace.NotFound("upload %q is not found", upload.ID) } - up.parts[partNumber] = data - return &events.StreamPart{Number: partNumber}, nil + lastModified := time.Now() + if m.Clock != nil { + lastModified = m.Clock.Now() + } + up.parts[partNumber] = part{ + data: data, + lastModified: lastModified, + } + return &events.StreamPart{Number: partNumber, LastModified: lastModified}, nil } // ListUploads lists uploads that have been initiated but not completed with @@ -199,7 +214,7 @@ func (m *MemoryUploader) GetParts(uploadID string) ([][]byte, error) { return partNumbers[i] < partNumbers[j] }) for _, partNumber := range partNumbers { - sortedParts = append(sortedParts, up.parts[partNumber]) + sortedParts = append(sortedParts, up.parts[partNumber].data) } return sortedParts, nil } @@ -290,8 +305,8 @@ type MockUploader struct { CreateUploadError error ReserveUploadPartError error - ListPartsError error + MockListParts func(ctx context.Context, upload events.StreamUpload) ([]events.StreamPart, error) MockListUploads func(ctx context.Context) ([]events.StreamUpload, error) MockCompleteUpload func(ctx context.Context, upload events.StreamUpload, parts []events.StreamPart) error } @@ -311,9 +326,9 @@ func (m *MockUploader) ReserveUploadPart(_ context.Context, _ events.StreamUploa return m.ReserveUploadPartError } -func (m *MockUploader) ListParts(_ context.Context, _ events.StreamUpload) ([]events.StreamPart, error) { - if m.ListPartsError != nil { - return nil, m.ListPartsError +func (m *MockUploader) ListParts(ctx context.Context, upload events.StreamUpload) ([]events.StreamPart, error) { + if m.MockListParts != nil { + return m.MockListParts(ctx, upload) } return []events.StreamPart{}, nil diff --git a/lib/events/filesessions/filestream.go b/lib/events/filesessions/filestream.go index c9c5ff5ccd855..0e0399ce89835 100644 --- a/lib/events/filesessions/filestream.go +++ b/lib/events/filesessions/filestream.go @@ -124,12 +124,19 @@ func (h *Handler) UploadPart(ctx context.Context, upload events.StreamUpload, pa } // Rename reservation to part file. - err = os.Rename(reservationPath, h.partPath(upload, partNumber)) + partPath := h.partPath(upload, partNumber) + err = os.Rename(reservationPath, partPath) if err != nil { return nil, trace.ConvertSystemError(err) } - return &events.StreamPart{Number: partNumber}, nil + var lastModified time.Time + fi, err := os.Stat(partPath) + if err == nil { + lastModified = fi.ModTime() + } + + return &events.StreamPart{Number: partNumber, LastModified: lastModified}, nil } // CompleteUpload completes the upload @@ -254,7 +261,8 @@ func (h *Handler) ListParts(ctx context.Context, upload events.StreamUpload) ([] return nil } parts = append(parts, events.StreamPart{ - Number: part, + Number: part, + LastModified: info.ModTime(), }) return nil }) diff --git a/lib/events/gcssessions/gcsstream.go b/lib/events/gcssessions/gcsstream.go index f18487fed85e9..f51a5df111b22 100644 --- a/lib/events/gcssessions/gcsstream.go +++ b/lib/events/gcssessions/gcsstream.go @@ -99,7 +99,7 @@ func (h *Handler) UploadPart(ctx context.Context, upload events.StreamUpload, pa if err != nil { return nil, convertGCSError(err) } - return &events.StreamPart{Number: partNumber}, nil + return &events.StreamPart{Number: partNumber, LastModified: writer.Attrs().Created}, nil } // CompleteUpload completes the upload @@ -249,6 +249,7 @@ func (h *Handler) ListParts(ctx context.Context, upload events.StreamUpload) ([] if err != nil { return nil, trace.Wrap(err) } + part.LastModified = attrs.Updated parts = append(parts, *part) } return parts, nil diff --git a/lib/events/s3sessions/s3stream.go b/lib/events/s3sessions/s3stream.go index c855ca564180f..ec04d7ae9d761 100644 --- a/lib/events/s3sessions/s3stream.go +++ b/lib/events/s3sessions/s3stream.go @@ -103,9 +103,18 @@ func (h *Handler) UploadPart(ctx context.Context, upload events.StreamUpload, pa return nil, trace.Wrap(awsutils.ConvertS3Error(err), "UploadPart(upload %v) part(%v) session(%v)", upload.ID, partNumber, upload.SessionID) } - + // TODO(espadolini): the AWS SDK v1 doesn't expose the Date of the response + // in [s3.UploadPartOutput] so we use the current time instead; AWS SDK v2 + // might expose the returned Date as part of the metadata, so we should + // check if that matches the actual LastModified of the part. It doesn't + // make much sense to do an additional request to check the LastModified of + // the part we just uploaded, however. log.Infof("Uploaded part %v in %v", partNumber, time.Since(start)) - return &events.StreamPart{ETag: aws.StringValue(resp.ETag), Number: partNumber}, nil + return &events.StreamPart{ + ETag: aws.StringValue(resp.ETag), + Number: partNumber, + LastModified: time.Now(), + }, nil } func (h *Handler) abortUpload(ctx context.Context, upload events.StreamUpload) error { @@ -205,10 +214,10 @@ func (h *Handler) ListParts(ctx context.Context, upload events.StreamUpload) ([] return nil, awsutils.ConvertS3Error(err) } for _, part := range re.Parts { - parts = append(parts, events.StreamPart{ - Number: aws.Int64Value(part.PartNumber), - ETag: aws.StringValue(part.ETag), + Number: aws.Int64Value(part.PartNumber), + ETag: aws.StringValue(part.ETag), + LastModified: aws.TimeValue(part.LastModified), }) } if !aws.BoolValue(re.IsTruncated) { diff --git a/lib/events/stream_test.go b/lib/events/stream_test.go index 3371b5c56ca19..6b1dab52e6575 100644 --- a/lib/events/stream_test.go +++ b/lib/events/stream_test.go @@ -134,8 +134,12 @@ func TestNewStreamErrors(t *testing.T) { expectedErr error }{ { - desc: "ListPartsError", - uploader: &eventstest.MockUploader{ListPartsError: expectedErr}, + desc: "ListPartsError", + uploader: &eventstest.MockUploader{ + MockListParts: func(ctx context.Context, upload events.StreamUpload) ([]events.StreamPart, error) { + return nil, expectedErr + }, + }, }, { desc: "ReserveUploadPartError", From 6a52a12c94639454ad1b8d532eec9a5b09c8ada2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Cie=C5=9Blak?= Date: Fri, 2 Aug 2024 15:41:08 +0200 Subject: [PATCH 043/139] [v16] Remove feature flag for VNet launch daemon (#44994) * Do not execute vnet-admin-setup if tsh was built with daemon support * Remove feature flag * Don't show background item notification when launch daemon is not supported * Update docs * Fix typo Co-authored-by: Grzegorz Zdunek --------- Co-authored-by: Grzegorz Zdunek --- docs/img/use-teleport/vnet-starting@2x.png | Bin 274294 -> 176699 bytes docs/pages/connect-your-client/vnet.mdx | 7 +- .../lib/teleterm/vnet/v1/vnet_service.pb.go | 80 ++++++++++-------- .../lib/teleterm/vnet/v1/vnet_service_pb.ts | 6 +- lib/teleterm/vnet/service_daemon_darwin.go | 8 +- lib/vnet/daemon/client_darwin.go | 4 + lib/vnet/setup_daemon_darwin.go | 10 +-- .../lib/teleterm/vnet/v1/vnet_service.proto | 1 + tool/tsh/common/vnet_daemon_darwin.go | 43 ++++++++++ tool/tsh/common/vnet_darwin.go | 41 +-------- tool/tsh/common/vnet_nodaemon_darwin.go | 56 ++++++++++++ .../teleterm/src/mainProcess/mainProcess.ts | 3 - .../src/services/config/appConfigSchema.ts | 4 - .../teleterm/src/ui/Vnet/vnetContext.tsx | 6 +- 14 files changed, 167 insertions(+), 102 deletions(-) create mode 100644 tool/tsh/common/vnet_daemon_darwin.go create mode 100644 tool/tsh/common/vnet_nodaemon_darwin.go diff --git a/docs/img/use-teleport/vnet-starting@2x.png b/docs/img/use-teleport/vnet-starting@2x.png index 2d59067e99fe46154a499c07d127d59be202ee96..67e321dfc6a1c1554a17d90ad2ce0c48883693bc 100644 GIT binary patch literal 176699 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

KXA-+n8;I?yzi}`mLdhS! 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 Y9G|_V&%uc_c3r=?u(VLVfR6kB0X-zVMgRZ+ literal 274294 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≈(0{e^ zh~afSxGbvGk&VlnCHbi}W?3!ZH3TfY3irFr*mp&kl1-b8_9x)b33M!hw&StXD@8-q) zPnGsscm2Y&^tP6!zh?Q!g6Nql!fN3L+t5)a`)>6679SYRes_6tS;)WGhQ{-D0pD{d zvN5vogOdw%ARS@&wa4?q!38MtQWzLw4n`tKP8~czo7!-kmH;_-S}1bERRCvv*yymB zln#KS5Ro7ecB=}_oOb=tLsp=JTs@;*4992^79pLVC=UB+lT8|Hu@-vNf9Jvb-E!Q6 z9HYX`i{V^=D{};Gd7j9MS`;3#Z@|NDqYH|xO^t;Yf72BAcRHA@8FLeYHgS7JLGKz) z50K!dcOuk{A2s+5%e+V?JxP$poRjkRBtf(!0hcHO3VA#ooOBap+;+<8 ztxlglq9UWjDEO$c6`t0o_TKw6A2io0@b*^N`8Fl4!uiLqE{R;W_a5FgQ$3$i5n9n4 zj<-M3(=&R_@T8F8T36WNndcWqm6Wiq?6)P*I!AdifBzXKe$-0xh>OMA^CPL{(j_T^ z-btKs^E^{b4&}=Ck+@Zotx>W42-bnkes&hdp%&6ql=1y-taI!EbY+_zNtL~G=qk$iE<%bos# zNvryz`}RB8p+WYm)uv3lQ>zwS;=4G`9MC&i-}l$)plaU_IjzHsY_nqJJW6_Ti&@Ns zT;J0{u9PsRHs<*5M%}L9T$`b3dx1&!Vmqq>8--L_&pT)NjTAH#b=`2-xjY)~RP-)X z^5Q;=x;1y|>8dqJZnS$5eSD7Nd|LEg{)n9Arhbj8&Di=$=Yt7nQ+f}CQ}asYr*mx| zG#eKLXvAN-W;qM5mf}0NdE0s?T6ps=Z5IJ0fWRB6R+LMoDh&NHcOX6?;iY(!+;0_Q)Y(6ZpP$b>XNhxNte3sD2dK57yK$>fjlj1QFn~Hu9Tg-O-_}9zI4=n=>14|hBuhgoSWXkOj^I>Aq}Y*g z?skg=+|exMkMDkVe0tn&(thxjlvTjk)RRxs3o-RAJvCzZZykI`uss(n8xquGCxjI2 z&RbR>A2-$PqC`y#lif}&i9{tP{AKDZR#5}VS#BR{X#Nv3&v$3E+NMynr5PfEcc=ZY zCt%)v(+=CJOA!wq8*aNXW4&YbZs*T|{NB5#P8%l3Jr>Da398Kgd_4`(ysZ?10xbG*?pP=PabTYd3l_Rr`CU(6->DsY?;c{XA_5<&e3%;(pN~5Zg+>lW0;6Zs>3r*%!aHTn% zoBX4tbrNj-GZK8jWBaqs11i@Ns%!WCSRwuRb%!cM6Ta#;vRCVF@Y%?o#?qx4E>->o zqSWwNj--^y6AA=ZOHTVR0dUI-teT>DkDaTuNj$#WJ}t|p;ydkw={qCYgWK4z)KBvELmbI;- zOMA*4J*!-W_AV^+gjT?# z^^c`3MFk4iY3YcDsd1rCfj&Flyw~Sy@vol4vFUuPj~;_A3-r(lSg*QG*Xo z%;K5Yn*}1=TxAJc3<-(osW_^WHSfCvp6H~H>`mKIkAI3P%MvjClnIlp=NAp=|6Ila zRUQ8v{}Z9n#&dG3J9HeDm|P+QIV6hF-ouYf!A@g(e$9Oh`BgOfD?6bN-Br5t?9)i8 z8OxC^Ll_+a#Kl?)th@sER7hTwP89lwfoyjM<+R0tN=MDV4!efA#GJ18|Akf5^Q_Y6 zQvB3Yaz*m{s7uYp_i@8ev&q`ViHz)rOTW=l?_4oddpP5D(X+dbWuVqUrC8Llf z5wfpQDH4+GX4;epA^Vmk*~w1K$d<^yg^XRY@7v5ge@Cxg@Av!q{yy_hE|)IOeeQGa z``q{Aemw4v6qc)94-B^WQPfAsFQAQ}u6TQGX$4DIM$JJX$; zUFGf2c=c$?W>ccZnwP4I=ej6A=i)}}%eay0o|0z+`{LO9;&VioWIY(?&pxmH;dm!l z-{=bHzq!@fEPZs>{Ym}7NN?#AN#+)e_j`)D43XBXfKqZI&pCD_$TCqvYjxs3p^&g5 z-o*6P^U@ebj?(v@S2J4j5;w0Q`YM>dX3SYr{-g-_GXt1NH)Y0xUue!0u=gRhW!6cJ z0_hna&mHi=N29~Fydp12>h=yT}XZ4>#J(qv>3Sv(GZrTHe zHr!KYpF(S{3N~E+8BvthrZ2KS)fR^vUnQPI4u#O_7CBzw*H>4Gq`t8i!*Q0l{3uEt z76J*;!4Mg_`T>NC<)r=Hl_A}BZOd_{zkNUWs+Xdl(>{%%t7mg_HHaU?$Qxm?> z(XPSOxo0bWsDM-Oa6{ueX?3SKrAtG-@)Ne5X!GmJa*Px6&a>2C=PYm|2j$!Lj0aX6 zeC>W4Lo%B^67=cmr-kZ+IvR6Nnl+Pwa%Ko|i*|uoR~!DvyOqaGv+a*ndcC}U0&;Iv zuIz>Q`?b9xfd0$Y-Y`Ti1cLA}^pt_Gkk4uN;04J=j*%~9Gihow$I``HGFR5(G)p;h zq)x|PqiJvcA7*_ zwSjvV<<7^435>rDi88x-f73o#q-sq9+v=|wuDi>@R|^H*+pQ_F-z!reG!i*#H%eRs ztzYRj*dcSaNpjxxk;;-M1%R8c3GuP?L4hA)A$A;Y>+c1rOH+0gt0R6l>fY{KcNi$h z(?ZREso5>tiL=+Umk666^vAH`5P z&hS#WV|(MwGjaK)yW}4q!TO9dnQcXPDnysLNY%qxwNJ9OPJ2<1mC@#x)6ZDo~Yynh$GAu<((<2$FWnu?7##%SxmIdq}+IJbfL z{hPiAs@m#&niKP@dj?wlC5EHyh^cDeend-<7w&`(g4 zuUnc~OixYw{dUNllsiy6Z^sBmSTo+!KVkP7M8swO;r1=@a1V< zEWvZfES3PdT6ddQjp9=3XBF+um<7Nm%)xo9!9}xDx}2X^6({i(Qj-CrIJWHxrmd)< ze4>lr9Bxv!;MQVX66D$Y$Fl!pVgYZRT<;fhGXB`^q~81|YFp$RXmgWEJTHQ}BUpqu zZ3OVjg(0Lk5BGE|!GR$j+8*gFOI+EC4k0%ntjXxxLzjhid8;X7R5aP2P z)(!58yrt0w&KcKAgc3tKmPifO59X@dRQDZqrEssRo#6fnx zbco)^Y>h)gnMYLg!F{8$NA|HOR7tfOPoxId46HVPq}t(`0E(HB>r%>gaX}eO2V+RZ zbn|wf(B>>T%ftt8SgCK%15_j0oEz2B9x}3wV*$a;<_yd<{Sw_f??5NtLwB5JwdtB*Rav>X*3_Yx3plYi%l0MB=5T;HitWMYDBPv z9u5^$h8t@CyWl3}GkJ64b-rCGa*J%wFIu-7-^nc6T^8rl{qJ1mvOrej{%IFp{eQSw|MES83>;@ly*N(H{r>hoxfV`V(Ylj}aIUk5pH2>ufCDpu zHpuSJ$+0O&3HW8tzpdg|k4kX; zv;7?jQq3A(0|Fy+3PJ5~rXh@VF_Ob})(JH~rf2Fu{`T@+r_!lMw)eXl@)*)b1pHr4 zakaEsVPKkj(*Nj1EgMOhO^!ru?6dt34;wbbweJ?Olvo=j#wL|GhZ40{&%I*;3o*aQ z8l7;WWvV-9?j=bv104Q+9FuAaswb*l-z@dDU4G;6eS{%Bt_kV5=+#`lHb~}UR^tP@Wc0y$QYfIe z*q96L(?>r-?d1a=3WraGq8%E{entHqtYbok<*F2H@e@(q>E8<%*8KiHm-@ zXqG@XKPRt7%M*bw7G~gX0Q!*{FM1t+xrk9u@+9o}z_ zSX*?Di$oKO#Kq>NF`qb%2w4G!HkCTeYd)l zDGC?H_3jY0j7!{-nNjvNY40924Uwe_b@_*1bQkVY!YOZwhEI&hJXV|C3@dB8Aq==@ z#7eB0FTDK1FyUXm3i;i>+`5b3x+#utBGi4?cbl7|ISZlq9;FV= zIf_#zFoSe9u(Xm6$0ns4vbU;(H4c;*=Gb3S?H9gk!pyE!cIt)HXO3bwNc+}ZDZi^~ zLds*BOKZ%!Z`Jlq)*JftrCU~~Use~y3!hUjS$f5?dudB(pZ_!V6zV1QvP(BBG6uit zm;y|0e8YbH*9ArFyt(!7MyTR=LACMRi zek`za>p#S(6(Ie-X2F#Wky!{hK4AzZw86{6q1N(~cz#6M`Jht+J{H|`KmeRywXA@n zmmotOC~ST6<`d6nE--{CQTcf7wIh?#JGH1@njH-5@G*Nv5&Lkc*E4P|T>;40&&%B` zxIGoxah`XFTTnE6t)NsOF0mW3Wwkb)D>8$e{$*>^qA=pLLWp;M;+}iUpW)-`mxFCx z#ontviPQ@fw>=zw8WFX64Sfn!92PsfP2Y@jrWw4avzgp>*Sk1R*U_tP*S`{s0O`F+tfjQDaGF1X=j{U(p621##N@nPO zVZJvZn`6R%wSOi1?Gz&(Ct!U|1}27AL)BiF*wBcz9|S#_?}b&I2|CY}t^zVlK|V$f zsw~3EYh>5+59g=>EMTU>+Ys#I#=-&ZUuy=B_g&%U^udQxl$be_QRB!CpXL{9alB{? z(bmOoq&E8b|8a9O{^FHm2hz7|>XvMO} zWe5Ez@q^m#L9X}sy?fUc+3WphDYCK7u8bm5tq+37(|9xBC3shM z;YZ72d)+C{YmD`dffQjXWpY_=`YgR&=&jId-V|)WwU6}$@MSn5#n_~objAWVST3w@ z#N`n!oVd|C9`~c{SxDg*!Pg`07C!H06CSl_RbMKLnw6J0^h>Si{fQQzEamR_e)hd< zCi}t!WcXyLySzNixL+M+k#!N6kUbW6bZYLjQhr0t6es!#ZH3XhiAvU#H1*)1>l@$! zY}r%mebuE~YdCydME1T%wNpwnK{4yn!_on;G+T5G)qfiNKFQ?4m~)wM(@tjxVNps6 zgsnoB5sh@%@!8@L;;0s!INfKpzlA!pUZS-Y)0A2fHkl_rL-^l9INwX!Xk2!xKWcXU zYhh|joK&Sguunkc>;z*u(>7pU1B%ZO3uVB$`2`~G>U#Db;C~o&+n@>0knoXd%Kf{g z?K49QHzSC?yMU`#ZW%Z@hnGPvKuq!ecr?K*12wPI4$eUobmv{h95_VNbjAttqqGt? zTdJoZ1B?VoCw3-dLxcY^!6G1{cbz?7pnBK#-}e_=vM$F(@|w0gD|+oSQ_k5Rut)Dz zelVKdm)JcRw*<_yhFWSt5f33)G_(jsnt8FRF9LqS7AZLT1)l;FH+~@5{C(zoyRT9H z9%cZsJQnx%5TdT_1gx}RMzAwRS_XvA;0;+pN6D1~ly<`=rDW=y5f%uqcVj?iZi!bs zk5R1CPKc0L{ouECtc!n{ed<@PhsQ9bZy<&4e_J#;;j6?7p&GHY%~ykIL>D-9ahr%c zC{K>|Jdp#RA0lK#PL=iKyw5;cdsHhklb*nmD z`)5{Gwu}EIus;rh8cxI6f&;oc%vnIkMv@=UO>`(kRH8kN$)MOIpc+l6?L{KHaAk3& zcP8zx>pBmjv)n6cxxS%oYgJuI|k>L0Ye!>PNhYGLT7;6wCBAY}rJhDg@qv2tvy15Kx z&jhA%f*-Mit9KlwApmJZFQOOe;v((y1%q{E`~*q*@b7p&!x+1tYs2cr^kDDQg*&IU zHP*VuV%7v(pmY4w@NTY~WI`^Ecj}6qSV(xh5X}wrtqN)1oArvCV&=^Xk(Ck#aQyuG z*^+5s?hVKt3giQ{BNM(QC?7R)qFa?EKcxdGZ83sxY_<2mSO-KPE4Kql@Q z*i8ax0_2zj_W7U*MdEmnzNL5?5rIDgde$QMf-dUBEErsqK=nVQIUhqCH-i*Ls)#({ zhiZ8&aX*PYw#>?bif|oTI`|pS-gj;@&d^De3 z<7w++z)gQplEg%bY8L;gWQi^&o~ZkbSR*_Bq6!Hqzm|)!gU|$FmBh)da_nH$o7k6A z6B*Ryrj=WOBD%;1gI?PAeheE(Q#lga`sfcqC%NKx#E|GP)`@{v7opXkw#*X>-4YA^DA!Lyseoq@mF^Z*O#5au%+ z3SlFa<|*zlCog^AC*6HMaPQsmRer*h-^4B{)G8z@fGy5H5E6pG5saF1Iq%O7#|nFs zv-u(GN5wpNFg++zQ0A#0v@l7MNEJR)o-n5h+3=)xc$7fvxT1@z@G~|2aCiQCat{j$ zjtQBc1)^2>k)!8fc8q-i^8L!Z z-A@4j$nU379t)~F;vsi9%zQL}y)??$*_#pE*}(i$YBWBiXTtokTni;BPb$Ga@hF49|3<2%FUaTC5HjA->dN4N`R zA_P`2%|?o){akh|H=l!ZOjPV(B_`+JUoZY<6^qd$(vvDJtj+}}WfngLmimjrXUp+CgPP{s+0UPgJ~p=9 znt|e}X)@#+fZx;g^COdz!MpEAW9sN-o-$P0CK-L~z>?E(|ja;S! zMN5`vP{;F7_C&h*pAbh94JwWf>}3T<*;q)~sv5v7P6{ym6Nzj89A^0KJZkn1g8Wa7 z-%ZStq*egW39~lo2W?Gg2f@`Weg7ck<*`HS>5f7>@Np9pGH1u}|MAQ|r(XP_!(!?q zHB%?e+Q!!o(R{-yrC8W!B&wE!Hqvga+YP0BqDORC)L|fWZ-VzlB0s_C4A{$0p!+xI zZNY)6STM`BeNn7_nB%^PT+jf{i4HNH=$=jWkR@W~7rfJ6?IRHP9eUqo01Il%9a8AT zt4*A<$Ii!`-X6+=7QyE@KS;Ob)jZ(I_?+>Z*=VKs%~w@&w7ONfQchI22y_VPL3*Obx=A|E9S|EJs`n{HKqW@G6zNVuu&EaKv`~pr|QhMU6V%m&TvJ?|T1tjcfgvSp} z?u*zowq5%!D=)_C*dMp$h+OUAVEi?5A3c8Z$Y_7?x23r^b4Wfp`TK+5(Dd7{eFc%) zm?Tg<*FaXv1`n7))D-^RzH4Ysj9e-|WPs)vaN?xBe|m)$RWKZP4Hf+veQ+?Qi62Bt z@E~tKs67k#c%J+@TUKd2N^_p)Z!rrpbN}rMe2p^yt#n=7D>E{oxs$`tOcWKl%uZd< zOUC8vP_#2ByVN%0zTsbQ43$v?_b!)y)}`!Ne}8Ndrg_gXf^sz2G?*V><-d56qb-Y^ z-02oG8-{E5kkH^-AAMHin#xr&sEVuZU!xTdj5*vZ`}E<&)KYJ_O~lkgV!CbE!c$yV zmj8?1wcCwtC7Ws!7bd$e9_w;;HSRUJ()HE&r_tJ1m)T}&3G!nupgBNva^u-Wk5t*` zem7i2yY)9^kb!mDy6A+jVyW3cO6Q$-v707t>l=ZJq&{tCz!h{ERF^%2x{Hx(d%xme z@Kfi0Fq)8`eut{SxPVZ=l~MJ)?i>Iz2QhO`?|I)`+jD@((OM4|pUqt$MK5CM{Af zOwHj-ywu95!HseL;2fhH-Tan@GU~>HMlO~xq6bEBlD7;|Ev6_+P0JtI;*U`HEg`Ps z19{Q*=+^Ncy5@W&Y>6G(MCs7KEK4c@d$+-6=!s_C~ zajZaq8CaPcgZxDf5-X_$>d*&*Y=1e>*vSjLR0mDQJ20gE^1aiA_ZBR@LTIJNT*a6O zrSH`T#tT$&ua8Ow+?Ks_tH~;%ahF+K%!uT?>-v4YUeOyKmlUG{9X{z!aE*q%E)d=M z&e_6~U#|8Z@39nHvn?)rJoE@L3*?ve1-D~iRwt6*NM?4CmgX8O@a(tM#wu$96bILuc(iypwgdmKzlVQquTxxIxg{K$K| z+TFK2za~?$et1#1w23JG7?vfdGPE<}gdi`e-aM6+5B>g%OAQTraF{I}En9L@P}`CHPQ^37~HN{Xc$ z9Qlxi@?JliH;KQy;{@o%$lbp4SMOGpdW}zREc}zC5V%a+Aq@6baWW64f5R6!7v0M< zVUMVJk@Zaw3AN-bdCth3#W3(yG?C5h2FUMa2h`h-_k$YBx|uxBN(hY|Bge!Cn}yHI z`-{RT?(AT0puDWYeQs7aXZ|hm2wS26nAQ5WYM3dde5xim=h3u^fhedRiCCU(1I$m*9E`LMADX15Y6T6E3HccyvQC+ip{$Taw~<#VV6ZV z8ZZ*mYoG=IS)3kZz8WK*IPwW2h?-|r0!5I3D^MHo(VTuU5PGwdJ8(Ka1a5I2TJqAy zKCS$wtsa-mx7kPhcI<>{6#QW1{`>=qWvV5J5mN@s+Ha;Br|HepukG|3He&;P)PhLt zu$eRCyp9GqFjM0ih`8|($a|D&+ES;{>-#ZsSI@hx&kt>m*gkFJ)J%{_HWXsYIawRy zKvK=uT72gtrpcCZo6+*Le5AR^rP_lTZiwImzu3J}2i`n8x^k$V=aTv9Z|4MUg?+eb z<=#F5%PBZ&zR9+gW#Dh!?@m zDDk5BH^c(Kna$xi=HQEp(mn((PuDvbdp49+HL=M{>({yLn3EJN4p$}A_W$nld;87J zwG<4iS;~}yh^Zz``@0H3ls41Cfx2G+1=bI!(DH;g#F9ZF`!2+M7g@Ub57*PKsUpFY2@g(F2>DnETMR6aK zcUpUHJ>E0IoEduF<$UKpRgugqm##ZSr)m4vn*Npyl6&n|L%U6XN-6Yw!ZefO+nZ_X zhcZL$14iF=`Tn!8qUNs3I9w3PFJYqRSM%9eywchhxg<|Ndp2&y2*7UpegHLYhVTS? zo(~8_2hG^D(GR9;qN8C?#WQr(Tm_@H%@g+t6W$Iyv%`J5AFsu!U_Og39zT0Dj*|j& z%Pmbmg?6N!te0h>as2DJ9gP4AO~$e4yBTcQUa1_>xEFumEGu3DBRF_We?rC4CeZt<T z=3}(4UVB_Y_H9%laK~J&uExpR@XG$PN(dSF^97-S4>iu7M70r6SI10CMp05$3f52Q zi}{{aSP%=Qlk2SgetKu|1$0kq!(tZbG0iu+hBglcj_5&Mnmfe>&qD}HA9K5FDL8Vl z_JuFu+4FzA&RKXZ!4+E?$>;X)eI__lH$bew{@{oT0qsytEstp z8edkI^f&zc*QukIiC$W&Ua65vm}X!61||D&#p6j0X7dj`z;Ms785Ajf3vl*cY!KMu zgXg9vaM8`b9wqvN_0fJ_QaJ-5h&TGCs^Z}@AtIfE+G#pImg0TohEuUBK?XO7Rxc~H z!;j9z)#BJJqi2s$Wy6&7yDna1t{>r}(wN=a;1&}pR6fr=7nrr;=2v*iAW6v@pH{L)Bx5rA* zoQ}&06=z|y6={l_HUb@YYtFf~YQO#ME%^CB%n9aOX`SKWQpxmPlP>eOPNrWX96Ixy zmbkJQl2Z91z+U~7GRu|A7B{v`eK=J;g$L@0+jQ;f{{h~!IS9mQJlbs^Dn8UJuItq za*4z`wfc^m(Jj3-RIn27C`qs${^PjFvjx zS2!Xj>(z9g)0kzAF%qg%7yX}IeXSTY{0JX%$?#3L@##aE44dt7w7M2Du{ljvEVX%a zviPSN+{%$TybHukVhIMIL-tm0)aN3u2E5)d{UAS$4<#-D7_fx5Mpya+u;j9u^5|6; z?=A_Z^AcegmvS-WUJNf(bNYw#W4mzr_q1N+!;GH}DL(VaM8`%#U~47FRBJQt{V0(a z-NcK!^58Wm!WTqI!H@(|!a7Qcs~Km$(3{ueFQemIF{CA`KQPUl&8*`txqMH>yW01> ziDN`^=~oMvZ|`dFi26M?zM4BS>XMwY73gDY@ia&&>{iM4;gIN!fcev}cZow_xG*RYte|8~&)A2bh8c)Ot4yaNIOY=Z1K=dWen;Xy%xc zK-m|FmOXqf5o&wvG`bkeblK;sW}t!JOr-yt-#0WW+B}0_yB3|3utJF&TUD9P8xHMhd0T1j&7;QJU#OB1-q|xW-30L}+ zKJ%a;C&FI1NMQqbSB3GCYF}Q&=EQ+;ZQy8~7eFm=O4r=f{yrr`>+bf7zCw*19qCr7 z&{h1qxBp2L&+)43m`#0lXoIBw7Umw(TW%@@e=X#G4D+pr4DlEegm>Z4J?)5sD(dqv z^smYDeZSH1E=7{);x~xY-b>(fk+HQ*LK0SmSyVa1WT@s~3U9__Y3@f|zAwLI6El6a zvVUhOj3j#7OcRX$P6bb0Otz zB=aSH?`1p5`b32Y-k+AwdD9$j;OAP~(x;cUy+G_b{taPeB0zTTsp-#aXbMpVS*Pxs zSu-0jJN5;NZdk$e;0*}He5781fA*(Ki*b@viK+sA)axdC^Eb#0Jwexwj+aI^>?Oi~ zUWrM3jxKLK%$idb?~2KZWAU1vP}y$qY=8dEr_U*W|}c4HPiBfYuj#ks15^ z04Wfhlcedb+zH&)x}a&tKqiI_4P}};%ra}2i4b6@NwVYcgZa3TYO!*v%9YgHLHx$v zLdiSpYtj@hh263?5=%4b%QB;E)ogBsi4{?XH1N@GA2p_tU%^UITNP%+{`oblW@E;G$}^+XSAdz5Mh1@ppkAoA>^)kQQ<{aG4b& zt~o=A!XY0Deoj zlmHMGs;eQsYD0{{jl-}o!nkM#<#cIzVN`b(AcAU9I>mp<;^Sc(X=~m)35Ft6o7Ep0 z_@zl*3Jc;vlTkT1K&F!$iGZb)oNG3Q{iYejjq#|0EYH=6X5N5bOHUqu*N!*l7t&_U z#jAZ3{yn#L;m@+wkoC_CPPS716x%vG8YS5L%teh(yZ$F+q{R#A{BaXjVm9Nh5)3GL z1p$aHq}z5tiGM(x6iEACU`V_)gO%m6D?tdQIGARYBti0N8u-LRabiYoC2-us|Kkz= z&Dbulx(D;h=_G~~Gj~&yLJhFZ)dCZ_f$h*&N||tHN(NUp zvS)5D(wpj>y6F2fnb~ zNcks14w4i}ln6?jP=Yo#M$Z;`U z7b1uv*n0evA`A3jB|Rab<9#xc%tR{a{FJ&|MJ%yXuv$6NAm8#T6w{r`PI+4qi(X%z z)Sen~L7M0X+kOk)thyb@p&Bl%QG^(>Pp=xU`Rme^Eer=fwIwa+6^VUo}h2uOt3sBXOvK zM-bgi3)Zwp$5T~?91Z|FF)-eXT!Eej7*4GXo2j8rqprJr>^Uy(ceDAf4a%r_MlX?M z<@n^^+vY!^sI2L+mq@$12>GEc^$f|VLFVgj!VH$M^6{?Qo0eFxUR?mXmT>{E@KB0{ z1=twx9(;WbVuLGwxuN85`>4P1Iq~9VcKVXe>(pNzi5lg??X9h?1?y+aivx2l-iqSQ z&OB7RzqP*k{o(FGj@hMhcjU|-+@AKK!Rx=%DMMQMqn`Wr%6`Zmafnpozjyj@GL`E2 zmPu#l+ofytLer&Hm7H%h(x)n}wbf6m9NxPtb^5f^vLQ9&g5t-y;H=lzd9=wKVsv@| zn;j`M0)O(!)Mc zy^D$tMr34BcN)eQDjg1>O!`Vf*+{lR1Yz*)?zY6o{j7aG*MLVy8(RMdM2jY?vYxM9 zef6TH@hYpyjpvg+3tHW`?vGoMn{R-OTcqa6?nk|!O_K&piA;M;JYmg(jikO;8gY$f z^W6-Oo@mQUn{sw9yLTq4-XT#M5_xKzr#<`}a#F__kC+luy6MK3Tz}84Ox;K`Jl)!S z_;=r0PD!$9=Zb~r8rAW7+-8Sak(X7;o{Y~~g3qS!XDn@{I9{W&+$@nM|8Dq7CFgIE zJzd?=@kz)%bo?}{2Rc3s@oPc56i^^Bw)Z#u`BLgze$$%WPz}zbz{zB(?p@(1krX-@Y!SU~1qV$Q&7i)` zB)<8+p9o>c=6@wh$r=$>p`KT1l|vJ z+;Y4kAG!G7t_ORc*(*qA$%skh<=roD@oH@BYJbxY_vWJ<$IQNe671!3Go?Iowz67v zaZb9KL|u^4N>9PaZJ-8j0G6pyq8yQ)z^$5-!OQ|A!xjn!GxsZo7+CE2F!HVX@~!ao zaNQt5T|K?NMRLH26BW6Z?h#pQ0m5|i5RHGyOQ?ea2grgjq>MmoC1&)bOTv%)TDNcM z?31pr>K79eYj=>bl$YIHx8!>@{a|*LEGDKsCeGCsFO#w+vS#C*ro!g77(J2a_a)%= z?H`Im9Ue>6Fq=@TlLZ+FB|Kmw967M0xcV*s*U@Yv#n1i@+;>~4D;m|8UL05# z&_-o=g|MLlb+u8A9RlFg3M)w$c&OyCk`(sQku>92wNk=MGK`(j@s65)Ei0j_4;=hP zx}VC(ca}j7Uk|sT_SK3D&U1@4nFWRV&Pb)_+~YvT#Bn<)+imfh<)W2Pz^Y}5J8jlxe=Z5AN6+utJH4jle{?}_Jp0C6Nnzo*0Do;?(AU+WV_uW1L3RaC#g*qA zmU}dj+KRK3w~0!WBIk-d+~(Vw4J(q`L+6|AWz?%-!l&q=gj89%5uIv zZmjcYoO|rWWWTT(DrKy1!i2EJZ0bF7rb=#&JM86Ix>vI?m%c>a!pN111ws`XVL~VV zM&PnVFfD99a*Gu^k3B&!(+*%=88#D8A*_~!QbrxPvGYPt=>Ha6{#$DT1g~4-E5^#a zsRt)DetkgqC=(2K_VcG_f-G1c79yl=ibeof!G}cv33&Iil7fR3ASg9)f8`g2AR=s5Dd@5%HTkOD1yEkUpn< zi0+Xb;*fD6r4o`47Hd=paH;YRgzc6!<3mabCT5OeP+nr*hYcF=Md^+nv%2sDr7A@K}cM$>%qv~^i=_B zkQDbkX%e6Rn!?`FNsN3%H-Dy57epO4cZ#zb!-a1B=96YdMG{N->+h& zbFUNNKQC3L_EmFLe%^O0;oBQADqCWKPA@>a*~!1tJ*vbyG`rp+G@$&=4^^<~Eh z$2tBK8kV4~eG)uGb5;&>WO@W#vN6w7 zNA=(0gQYV;UM(QyfvY*eGKNzuMX#TY27&?D;GG|bW_)_dhRmJiF#_nlatHr;azh)U z{^nBvPLq7p^Htg4fwRB8-R8lDjr&TUGa>XFmEncSqqtyNT@P#nA$%tYd>a};50iH4 z>jAr=JiYmnYL`YmE_- zTAl`{PMsOn)6-K)JJB6S`P#%3VaEcbf2d$c`t?`0a_LXuaAwEypwhPS<7~4s-M``_s58R8~JPo z;Rat;J{$BmvqmOBPZX_Nk_stmy&s_waO51~=?Gs;zs^`obNSSq7He@;CB-75mk(H+=VM2_GF~bT`l$5G>vhws7;XZ}}jZ3E)@M{Am$hi;enFU>xu%ZV#aE|o7 zzZvc^B|MTGeYb5DO8L;@!iW-y6VZDQ!UD;w>z-o7iI(~61^5qINvaPgO!}|HjckqG zJ}g=RGEy_hUvoP|L7p;~|yssB9BJt-K&v?`^o3dG(D>em}4tNJo8L@Zc z^xoF3g{1xH&)xrZ$pqVkC&nPHxw&2+LFh702SqW8q6wfmndUU~X_8W;Gbl(b;g^ao zoW%EKfV*?u3TVG6Ic{n|_W|8?cN1Kp4Ok)mYrB8b0|3^?PU){%e#}zOgLCPdlQe2Qw<7FVK)MT?bR6KlO{eg3<5nMc?K0Y*}!1V#20cm7s_TO ziI-fdTzt)J{3R`2Y+r?IU=VUZL_U4E_WKcQue=|l-IwXa_0EkqO)(7q>?FHQ^j*+- zH#fUrlK(SMdTYIGt|EP4EJc;+J}XV6 zbD}w>%A>K4B06z(^EmGDf^_DKQhz2zXsqtR8T5CoB>GewX=5&XJ7kbjg;Jr|x!e;v zxhG>d!(^JC4!D{iksXZ|)W=@e0(7B>3*U{yP$}%z{V$F&&}K)bv;j*Shi2SE+d~SA ze_z7@4s`u%H#dgeZaKZm#$LFGjboH{RLn}Sk}7`eB|b3OXt zBo^k!Pr+As+p-}pP~GezJK&S9S7qicyCu;nY<1|0f=?2?yi^G<)!_?yWvZK+@FC>) zgVaam|!Pi zdBx{@x-`CdWceS^{1ln37@U!}ai)Y}NrGbuU%2r!J(gYT`_=GGvOooGp&(D8`{Tr( z2(CX4g^xjE83>Ow8=Ih$|leA=vT!pjNHu5DS72Fve zfXJ7_ev~k^h&!f(I;MJS=`mkDcI>D8YoULWbV%f?7D!{d5uByNGFm(@Z==T?Ppj1P z+RrwralCKS>;xjgPYoEuy`c>m{l;Tc8`_6Cs&M&v6e|{BfacYwP4S@YdnR1Roqh+6 z+(?@*exD|?r^K?7Pg%T*N1irR_3|A!CoMJRtIE&F8t%%|xIUeS=(Y_^PoHeg#*lP< zPY@LMw_*v`;>L!;*N_caUyrdZFSfPj1i7Gh=Ww3C;)!l6X=cTRgI0T+^UZLsiwaUx z9jV%B4}yYI3g>!E8D6_%v)J#rc!j9{a`c{SYn({?Cgbrq_GSfMl6=F+LU!EJ%Xw); zN@VTfn~_6>v(f$z8jq>FSu6e5_RYl<(`q*O=$i0xG5EB)xpzQ$g^1Zr@R&1a23I>g zUw*|uS4F0b(Y&Jr${12F!=RqcD9$(OBJoZ;GMZcdvZJq&nxeX9sm5xrRF7Bww@mdv zVS^;bu$3s3>6D6}RE2ZhahD)yrZD1woCva@djFaZXi$YL@1Y2z7ILD%J(_0445VP_ zYSWm*kaFJ&URM5TamB_(bn=GQo3BFpk>2#D<|?+b@JHLXLLZ1ZyvgY>tF3Dq3+d3S z_i&yYNM3u;%priv(a{0EA>k9t##lo1^rJx%O;|I~|DxM;c$h+J1|=iW%hk2y{A&3~ zU0>ZXx25X^wzjt4i5Hjrow<|pU&Ju{YO~m9g%;NP(() ztjwX?2ZK%~9S^?kn;@MRc;M^CSDb?%sXbyu^9IwDbT5XW``3X;$*E20vd(q`VxJMMi!*aksWt@=?1Qwt*AtGRgm_fpu2aZA~8=L^JFOIOoo9^J22)L%Yv zo=EeNIhg$Esi}r3qM+;u9T&!$+yOq&b`e#Hj!y%3^l2=G^X1Bc$PIM-JMaRxpBqU& zLD(==O-Aa!ZDV{g=syM{>m@ZGsHwKtNsU?UG7Z|Zj%%N)LvT6tebZJY29W1m;7 zO0bI>)3cJk^V?dY0%;ZD7(OgvnKr_5E!C;<+4XZcTyu82aJB6X4H-$vMCPQ!Z)Rwl zD^tRk0(GVRwdn#D$(4)ok#QHE)Ufbn&C4F%qE0xx>vk30HYM&m<>}4KBH1SxoJ4|! z2i3Fj`3xs%oyG`y??1lUqrZ;@IMK~J7N7^&E(g8hIS(NpwYtCvCH@u&-urf*8bC)% z!h|QZFB4%Iu9GN~KQF)>?`YuhuiecMdprXT^jRb`P9c+lX$C z{>tO%=%{m;++=d$-Sm*ExA#lRk31{tw<=aXT4qMZ`imFo$@&Z3#o37kn-reJDq1ie zKg@B_?LZKkhxfFoaoKoEN{XvDo8~g*A?qpi#BcY;x?>{jD)1(D^>Hu}=U9q+SkV#b zcr5$=?!Mh6wM;Q4$f(r&@y)uWNyib&THgl8u_*&O@p^nT_!#ueX^*`jWbcAkoi~i| zEQ@CP(ozOmKnKlv6GJ+kE#b3_b2Pg<%faGATrJ^yJA0OX;SZOuZ zQg;pz>5*D>!}(!1SYBbgNAC!vPKuTr2^aZaVzRsw%Mp;)T&H&P&7-@MGFzdo-P!wr zULA7yFx0`sVF}#IP-pL`dx@Rc#@Y!G>-n48yHgxpeE&7<4F4=D>oVLOq^9H6cCL$h zje98G>4zl`lRR}-X1Bs*o8Qm4*%jW85~l0J!xrwYuJ@c?oh#Ky6dWPqm+UR$a>+Fc zj2CE3)Df!ATH{tTLfx*LBVts(GgBLhqeV5=ZXc)znsHvp*_kz*r$;H7iKM3&3+^gx z%ysn{z;XZeNFIVa>}o<-(zErjh;3L>O$RPp6wQ#!Pa9jBgs>#_ZCFz9{{c%ncXT+M z-1w7sGu7Majx8pqlWT`6C2BVTA4CbGA0|IyoVVoz=c(JUBuG(6#uig1I$P+?v4pK- zsOjMvZp|+TQ*~qM_0KAf5TXPOUH<_j{eNto2UJr_+qQQiD2R%56cwaO5yXZ95-cFS z_Z9>d0RfR-lcQKDf)wcx6zNT+N=pO*5u|rSdY4WpA<6y+%X#1b`@X%-I-JE?NB7L^ zdFGj!`?>D>#Q~D>C)M9|^H__WUJn~n)Rykj@jG^VrS+70b`;Oct`7&=`Beo-Kh9Er zwRTsK^!PweorJ0CRAiaquX}KecX{jXrP0Rckyzfu2~@)-pEB~i<1`cD@kgMtX;jhH z;I&jjTO2_oDiGLKoIc=KrF*0!o}g|{8+u~@hO@s3;c~qY)Uu>WFJiK*MCzGDb?;V2 zG-e*>9Gc>(5Y<+2CN_)M^mPW(5kt?EWn>% zWbn9|SF+wt)z&!8c0t%MIIQNr2E8Xnn_|X!JdP$pN7tn5q03OTHt`4^-S%6^aXKYR zSO0n{_D{>)OF+}E(_@eBDv*2z-c8_nAiDxy1eh#9rVA8EZh~-NrQzC@B&D(8_ye&l z@YGJL*U^y?1mCU@efRmhD?Rk|{D22w*m4%SY20HfPp(4=P}7J5bR$Gof=_71z}t0H z4E%Xt%lsEiwzsgvw&qroF9);QmAJp=x zQ>%1$f#YrvDl~qKKOJWYK>cpw-vkx=c-P}KR@cDQ-%l)|`?43gKoQPQhe5@B1WoJ& z>NSo0O&~pznF7)y8GiUkClg^@pqd#fC@28!^mLd0{EXSC97^Svx7N))jrwY!kR_ip_?~0C!DH8unbcC{*)x@&b~>xL2E#IKN(c>deRV zAOvFP;&v966wI)gWQuJ{@88^@$+g>L^@9aBN`1_xv>rx9q}Z`4KAh7%im>&IDk^66 z%ZGPnciVdvQ|oQ#(0V2&$$V_E$YSBdud97jg=Yz#hA?jr>^$Mi%+SGM7w}rM7z+WY zUJ~Gkvg|Odov_9uXl88q2Ba4FZG}-fYBl$YWdvMwD8L!d=&C`}s5$NGe+QP45&T_I z{Ga4tWIB>6rK!>=p}+Qg#BD_a2dmz+SH_4V?g|3^BMwi7R8fnK-SMrEFfqG3+)jU-Q!Vx0mBk|w&FQnrg6wH$=!u%+ z+&S9yehQn)yeq}S=lH|dojNHO*53lL6=sGaa6!VGT68os@AC?{s}Eh;9KK)Dio*Y} zL8eG5LtUJfgVt(bu4)1SiRO6&(y+V_&-)1I9mGw`8lCdDMt&J7-NLJ#?pMHhGig_5b{`p$@3GV0y()n*C_Qlv_0r=Cs*s zP=e=oq~?OiF`ckpA#~~G7ROc^4M7Z1JoRp)aq@LTt9J8LSR4bjINoIk7EsP>JXV!ri~&Z_H2MU+B>m7B8jckVkcEygbd z3f5&`$B;TN=R2g%X zY&s^36k-%kNmrJTq_k?SqFE8Wkx<=j^3t;-jTm8I*p9^)&H+)JfgmFKK>|! zFAHEIi3(@CYridPe!V6<*+?5vqQoi8d?dys#QB?UsjPm`Z=L8;BTyWyM0N7~r2QBM zA{m9caBI+?SWr;P4KIuX`Cc@Vla?^Nx1P!?0ILH59Mn~M1fJSR8|I&m#T z*FEagm-{OCsRl(B^+rSg;lq-?vUdY1svI|>M);$TtFqo0=qT8Juf6ZIpyu{;l*pZj zbi1E=>dY|tV~_o=OzC0;`jj06e3XLyd7^}c8I{Qb!cn5{&Tk9iJ)>>}UJm7}yf1)A1 z{UcHm_euZ%Ry{-og9g1p?MBH%< z+~xQlg$|`0K>V^iGE)&F$iyEKpSzotFyirwgt_f;Tue%@qaXs*1jP>zE5iOeL#k=O zT%G2@@VQe!=mHk%nVlC=NY5tDRU9X#`N2)*6v-oqpW_%13A%R>KL9Gh@H{)*tYC8DC#ICQtG}GBB?;a|)DNoWUz2e7CuDXbV?}k^Y*8rwwDGM`p3^TdO86WxELaxMt=C&_xLbq@%u`A z2Ry}x)ihv+0G1GhCcC5C386x{Dp(VnPfJ8ah;O&DefRl$GH@*RFy|!Rw;;^il!*qT zMM57#{B*0q)dt&`?&F8Q)x+6Sz%cD=_!h^??%qjd98e6S;78yJ8&~x+CZrUVoQxXs z-&|TMZN+c-?ljH{@ttgJFk$BojJtQ;KMpM_-WRfT&LrZDN)sP<%$)TJju!!}+9zxa z?N$DXP}8~T_A62G2g;)Ma^g`%YN&NGW*=n-^N=*Vu^r4YxCF0JHppYf5i1+utaug^ z0Tpi9*aMjvKTv`}pz~Rnmcv3Bu*&4Z?Da{F2-sCt8B`x|j(ooDbeV}N7>IRg4=egL z&{+6`2TDf$hBhZ5hEsAzm(!fnO&~nuq~m^u{ZHy^karhP$FiQ{A9-Z5)4*|Mqj_?w zX{GOC#3_a9I*I8G_pd|hf^lIk&z~dYd4E0Lhi~C4+>tlxlGkeTZQShQxR7S=5rl1X zXr;yrq>U`dqMv~3O)~_8AF>-9$DvzObR+j|N2Q?}3l~lAs$^G*avjzuMTa)-l=ep{ zTJQUZJ*4=Cyx=|?wHbw5PNI$GwCd1azB9#w#60Qp%W>^5@q1O;n7%%hW8E+_6n;Ft z=9>(kYLQAs>koxO`9gyOvy4MzPk2YOW!UziEo%BE|`~+S$n^1&yo&BJieR?#I`968s={&pQ<@=Wk za*E=mke3Wgsi_*+vgCjMbb%H0^7*f4v1z~@GmiEq5zthBgJm$^YIp{(_}S` z>O`gcrD-8ouRYf(Nu@C_Rn1eT)2SCzxo`i3cdl6bYs!3}meLVbx>Bpx#Uwes3mA@$ z@?3wX{Jbb{2X_7&c`vCJ1h+fXys>Rr+%zg^&F#4ACkn_qZM!`rm-Km;FpOj}XX-KB zv8LJWEHiVoGG^Ia+9pG1@O#@b&Ls8__9QQKPZ|QYZ3cIc*e#(aQgTq{edqyc3rz!k z3WK{ZJi@eyl*6}8&rPv9Sq4pN7* z>#0ZS;HrFCV}Aj6@>0{+j?YMUC_r;wXE3+%mNWlQQ~vjL$J>{Vez|u(qTTaS_}qi@ zJ#GVVxE)nCxogx@Y#jG<=$pzh?Zb5|Zl6OUJm~I@^D6O@E(+$n^f-)`cNU`CD5{>B z`Pe&Vq&N6xD-f;=n_F~F5C13qsZY7djza~P9`Q#`8dYO(sPAC*Y+uU2={4%RV}9fh zy?xyJ4J#!BfPn+^{Xjhg>ilg~-S(gjqenif+q3(#o480Xp3$EgJXtpfNJMTAy(^_< zrOhZi+@DZBPGOJ%-qQ3twvXL5S4!GX zBbeaz$)FOQMvLx#QaWGbd=OdxrqFIbbXO*@7PHzZ%XG7Q6o1>)>K{K5h!ecU;8|J- z?~7SN$b0o@eZK1al7hf;Y)E-sg6fH3OYo~YJ!K-@92*I!X-*20g@9)06_nx~2R`Dq z9UL&Y;Dur-K_Xck6`SFNVYAfX$PNaB$*0V{U8&I&W^&UY4dqt={^QlaJ>;Jqjr4!L zG+k%N9cI1lmVhH0it%d(DFfRJsBIJ<2U&WNo#>&UTFga2L^?(_#U(;hXZM}3(C!bc{l;R(g?#D#<69rnvy^|_P}dWAdNDAmI!ZA8 zInSFn!6x%>1R_hg(w<`s#Lb=u70sDewv0|KKk#()_ed|g%Zv|Z#LJwUP5)<+ zUAtqI(>-Bu5ZQ7*0eWm9)z$rA{2*55N*+|AI$L7^?HnEHK7c6cfkO)b3t|s;4A|fP zY1<>nvIwp-OW8|crVdKqp?%;j6NS>#+G;g`qIEo=mz$&Z|j)Nh?MGX)Cg zvhVh+l9~U18wRmd zcV{CWnD%r*r%I?&$!iaK!b#cnkjyClNy z@ctQP$Z}h4ZZ>yP!f312)G$%1xbI1R@}1K&HJ5(KTp&*`V8%`oxXRlcbD=|k=yf=y z7@AV>p@&pTV24-i1Xa;o!0p-tKA2rIQFRoD8t5Ne82IabHRjV`fS(+o*2SsUUmm=@ zT!1RobU<{G-|D(YJi^q+!(&AsTZ^t?yf1QHE%5X2o~^I_=eL(Dn76;WY`W;+yQ-;P zQ{-u=Y-GQs_H{KrvQT+|`26g(68OnM1~@Pe+E~WTL{u>%qLnv@08dwO0$TUV3xLMWxEVfKvIOOUEEt@R=HF+9SjYpCYl8tRs{0pkspK zgoGiZ3j^?K^D^!c_Jh!m&`vgiJ3tQ|bxO~gwBU-zSsOUWubVQRl+`>s1@Js`A|sAas6 zC3?jfPSdaDu`KV|eUm>Xl!**$=8sBxvID8+nD%l{x;AlNx0AVTxa3;L(NVl>?d`4B znX!u8x+XWT>b;jFdIh*V#}2sBzC&VT42=GGYgNN^P`nY$^#SpYX4jCd1ZgyivWI+y z4i-Qbg(K*%{f$7px_^X=57=s!OkZ(=I}2N160annR4dRQ^a(B(;CAY-$j|e;+OJHD z+;P6eeI9Ku@Su>QX}5zLEC#$%YE$RIQus+^@Us2|gvpjfYsv<&-!=jh(< zZx?ar+=8A#gQL|KDaUTf?{*M``1ONeoDiU}2eXm<1i=-Pf3})h`jmRjoQ-1u#J@)1 zXhJp2=VyQ%OAP_zMGKf=(`-%2?-{vkj_{59FPBcEI<>=Rq0IhUIk^anaDzQ5pr^SY zfj!uGTrT2)Q0vRW*e9?oolye3T3pfZ2(52-PIYnIr}F(iIRDcxMuL$sE9Zbg=d=h$ zkvvv1jgSXncn#RpZE5m9#_TzWwYNhY1Fli_sJYjlvs`v!@SCH&grR;wdC)9VO-Y90DyIPCEZ zhx)nbyFROP5wfFQ<`M#ytCz1WU|#1!8g|e+Fsz5bkY5spF7enDT;e)OxEfpv&tASq zbb5TZ-}m^s@t%{vdh&0F(zY3GSKM-Zk%zdraDiZlFx%X~`?51YCVNt%Aj>`tlRb%} zU=E_)6iyP%5Q!F|qF5;f1fgsu?C?kj4SWbyHGKR#{Jz3(eMjufN+n~u?DjN%g%iBK z5X0!s(jzK$XJm5C5ktD^u}st)8nr=7s6%IV<0=&!53MEea-- z9Cmqo=m0yUc2~2K;^Zm5zTLjZ|6A{vi$m;T^8Ytkgd#7axEycJ;wVH?Wo1>Jgf|#} zQ4EI@)ZDoT>pXYX=M2OdGdebpnKaQ_2Hvp=qS)(Ziwy#>4h`sk-%>{E6{^ou=(nY< z`S}GHrbGVNo>+XC3ngoGLzhy!@unY6K zZgS@=GUCY_&0Ns+ivVq>RdS#9fecMwt9XvH$sWslG%(34t68g76kE$HimgIuIX>-? zjaxTqt>1%DUMf|mqx@PB{siRcy4x$b(!Fd~2B(R}Q*`j`x}ZEQ{I(dlT!U4RJdGeY zB-y6{$rEg{XJl3sI~>%B#2%sM0FEL83?UOzHeq>q-_WP3jDFJ1-OJrGNGzFZb7;x0 z*Kc|BnN2q^xr0274`QuBe1zHzAvBn4d59L{FORYNsdfE_;J{Y9%bkI=@YKOQq;fP4 z#pQslq8I&rjq_*m;!rYQ81zK{T6R5NA$7mt@$W12#-lANWV-0R<3U<)ILW2M-q>0-mp#dkJwJ)Qr7^x68wG zrfC$3^T6sGam+6-|9;2t3`lSkRQCG z&{A4*XMDh_6xKI|ODbUHtuW#f$SG?X_wo>y%v;F>jOi4fK#fRK2(SNzozOYEUhE1L z0pHY!KJut?HKh}^-6A2eIx`7+ z`@^Tg+1e+v*ZX^`V}B1F#nv8N@x1FtXwgDD$~U^M(QP?dxMh|szIYoi z(=s~f)6Y#d@E^38SQsx{HQlT{Lc@>q_ruH{hlFXqAP7?YP-ZRWQ7@00G}Kex{!!M0 zVI<*(1KgA^{vGjP@ggBUcj0!G&H3xt=H$Yz@{$qBYrea|1C zGQGK0H^obGux$Vj2V>p}kNy|Na`k9Zm)t23o#r4K2eOtQQ4*lvOWV7ZyjU%1s z#JVr%91dcwID>0gbGiUig(up#-pxO#a9iIbA0DY{@S0y-T$P42fH0<#A0hAjqL&@a zu#R5D^3xiGyj2Nw;`@X&eg`e(Z%7M!@4=Q>7g8CIcTC3hVg<7CzE%;QVzmyH zq3ynb>=tpgu6`zWeVl)@dD#`#NNElHBKz&C{yux;kReUAX8w+2^XAsEc_UiaE{gWI zz->v?6nbHMvRu=DYMbR%>`ecwyErFLYF^*)utKlfKd!byjEvNj5g7*tSt**W#;w~~ z$Dun6BU0-7gljQgj>Q7sQ5) z4ZBTB5%TvD2Y!Dye?mS)*#ACB%ZLxUXHh=jfXOr1L{%I#!$9xa=^tF&66$t@2l2GP zxOV^{pDz{U@jL()p@${?wKZQ=z*(oULM-0x_{2qwV*w3?I=4jjSU=Cmoj5h>5oUL( zZr`CVpLyAsJ+rpVCa?$gna`YK4xm34AS{bXKc!D=>C2>#eLNK*Zfb$#CYg<3mELB{ zxUb+JHxN(6-K@st-|}w`+m`rD&N=}+&6ko@nO9ZybpM$iR)HzA{)QofVRKF+HZIZ# ze>Hrhe`V1jECoTZA3M7b>L0w}2Js&wrw;TXV*%Lj5rRPFNm(EZxfqn&)0J`bYY06j6sS(JAur9zU^||&<*FeIkC=uohO;t;<7U1y4kGJe~gi{Q62$Kl=6qh44*frp2kW>S zo@J4aw8v1Sl_kU}1#f_?1L+HndC-Fz85yaQ$VwHdky za#DhmlZ6a1%FQp;kyKX` z7ExYrF5PNv^!pBPOzt>!Z#v15-hL2)s{OZOzIhCjK6M_3?Dvm&u@MdqqLrvQuAq(q zA|18dnS5qjPD0ndMX58*VJes{@q0ZhNW-TPPxa<3C`>x2HQxET0+?e$3>Y8|V5BPJR$3acUufr95}6ZzEMGl;eot6W4h;I%Ao z)2jmFkLR=t2ZT?;Txj&iFs!20rR`=hrT(dNpQ8qk{t z;HO{k^IOE&#sZv9MLLa;}>%uY}HI%W)i(dj$fpmK1zAz^7^P%{--W<`%>D}4q&3~yQhSa}1L z8NghVD9yf`UKR(1vA4p~s}e;p#l!RDYf2f^-cYv_+5U{c$2!v2f#t70=U>GGuk&@6 zo%t7!HTGMw?isJ`Ux7 zwF+{AT8bWqjV?OLk>67BoVpMglNXyB$zUJ0c0saF2pUMP`HWIegUZ)YqcrlhhLAn_ zHWA;h|Ld?uh1wt7IU|Yo=lAzS>w=_TJnm_+`7g@RcfGq#lV2&*yuVZtnzz)* z0#du%^iKqzA7ED2iQu;i)D$S~eVF#S)o_Ua&lIV%X2#LTYYQ@O;;VM3!_{lgzI|)Z z?6JpUw%b9iN-sa5dmSH>M>S*~`QY)sDx~8Deo+K_Fc90Thwweqt_hjtz%RydcQeTc zr;nF2r-Y`Cl$z82pQZX$WR79`Vtc=<4+hs!ulHMi)6cKi*Ge=B*gsNCLaX~6u1b6)DHEZNlFpR%Et4fR;ets5zk8HBL|g|>_t0XE9mL#0wbGgMmFMX?S~$MYf~ z$_~>m#d!Dm8v?|0={SvjluQC^a8*B4?=ewjWtU$trvL)sv#-2BR-u9nL5_$fpF$Xz zt>U!4C4)6{R@R_@nwAhFhFG4Z!*0r1utCGV>y3&26EuOhG++ic!kuKV_*7*H+hk@d z{%;}DnlJPU67Dh0a~At284PjirbbXIZ@(-K$TIu+eX5NbV&Qt;2uC!=F!p$Shy@S| z#cooxG#L8fO;jimt_Pk*z1*mz{Ubg$Gz1QQsGgM&Q$;f~iArFj$66o(Dk2Hgoa_;^ z0z`Mhe2pp)_=%z~7VSH5?&lG=(<$@QyY=!J;{a*%tL5Ol_)k%1jK<-vVxn}h#^eBO zvBy{c)NVC-5)B~~@@#v+Y|{+fQkkHIixD3T*zQQz$hGGP65AD)m`L= z_EwJu;wMJwkd`QQlMm>`_spK4p7pc*??(NrN3^-PEy2wFHlO~V8bioq5;e+VnLl?) z?oudkN>0)|sJzfZh~3@Ruoswj%PbQGe%jug%471XL(x){rQT=$w$gz zwJ07LhDD6eHf7ki=p5o*I&6%z91>NFg|@nZ+y?0L!1fUcF`t5e{OPZ);;ti8mTj9% z^`M-+MzbyFZb_7>sF4S&k!8%A_5A;CCwP9h)NHR~nK1v>leet!vVQMEJjQ%I5=I(| z$_dv8?&5@Y5m-i%aEKe?9cUQfBR-9R^K*fh(YDi64IP$QSj`}=GwZ2r--Sp6!LMS4 zU6(a(=QN8&+!}a)SAh2G=QH8wi~VJ|J06I*9Z={F&6{fvh`;?RJlnmRh|Y3E(_?SfllKfNxiFE&~4^lvBb49oe$G6j&FtZX8!yehTO*7euYS?mA)>P}*T zDe@seIjj_@YZqjZdhaUTVV47LSFsSM0zu>814A0t`9SQgz0$pmhyUjsO+M`yV0U3f zT>`1G9szMlFO6i6mMB5K#7;KC=<6arJ*eU62!}fIXBX_KjWEjqif{wS(ESu7*MC64 zE$I4*^jV6MuBv6mlX(RwLKdl81nQq>UTz3elSs_XSri#Hf7u{&^!B? zU6MWR(yO!QOg`wuzl%yw+gs>Y-Sai4rhY^rOfSO+cgoAl;a-D*#O1EIXWJCpOI682 z>xEz#bMgD;O&9VPQ4409WoKWX#}_q%My~GQx3?O_cXRPRe_I0Z!dhU4@KXA@N16PlTV6P)B^WY&+?(wcmL{R89XPP>T zl}e*vNi(aqN{81*?^m6K%dGV0Yb!OX(l5y9hezCaC=(i}^SC7vA00^(?rsqwpne*I z>B0MX`nbT9orKh#n+a#xsT5;aC*Nr`ZV`2d+N`}PsC_YRXSmuAuF!-keKz$V-^C~8 z=zB&)pv-CT{8Yxg8;v$-2=qb#+$W(79RTyz%md&*ktv}=)dicXyh#JYa`W9)gF?s? zJO}=6{CR$Nftjr1))8lAk*j+{bS%*{UGLL1y#mM33XCE1#i8Ws4p`O#nXAiKB*R8v z1F|$4P913BY6XaQX|Vb!+O`ujOJzU^W_gk6+E_pVBz`AO*)2Nz^ZBUI3sc|rF{1hs zeYZxZY6Hi|$G?r&kJqO*gk8M3#O>fX{IP1gy#nQkOHeGW=Ccuyxs!G^i}`~RiPKfQ z|Awtr=Q>;X<0OtARQv=!GBR@3N2WhyDTKUJNS!ppx14RZ*D$)WbVj`!4q65I=Fcl6 zuZm|P>KFP+-(m6Zn|L3@y9I_r;LFGW())XT7OCoun5Tgl2a|~R3l3`JglW;~bbu0j zD{OHAP@}Gadlisio?7zE3;${4ZGG-x`3Bbi{_ef3FTwrUT7mfTtJu z>^gzE#rRrZb$SB7M_`w=V~F@UiF*C)XCckZ1h6g?l|(E*iBW^T+agE486Xm^$2$5Z z@JCdu&eGpa%*bckOg`)E`_OC>A1D%Kn@o0mlho@ao5bzpPg=vpCB7yG9~U~FK%+C2 zWiR-A;+5T(Pa-@-FeUY_jbx-eEyHP?{-AHGVKNjf280<~0)R3v8E)lBph7 z0Cf#7NdF*iU(!1Mg!a}>Ix5uVDGB}igZXz6Q&myB-2R@9QKR;;;mQ624?lD28slSq zmg!FGnmu>WGD5Qw5A!;5AOqge2~^q?P_v!LH58+?z65|d`Ek*Dg={GLly+svYoH}G zGzqPnU=u2vG3t(K;J%1>r&D)!WpGo9k^73>n||j=q-MIY0KwFs66IT*s(&f{XWikz zIWPy z7WqG3f**mY1Q@_3w9Bf~U>{NiEMhMf-(1 zug9z3x@54d`0eQ63s=qWeM>Ks zem1LN6@^&TmZsyX$4!Ez2R__ynl5ykd#0QmS}XEFPlQ!H^TmSFESZCwUE$&T8y!4! zGizv(M_sqcm%ZQf&&o-*We!s3h)zyUb|)iEp>a|w)zAnXnA56ky2hMOS>iy!6a9_z zl(n#S68Xp`rgRZDpq2L*x^(5-X{-a1r^@uwwr1N!f*h?DP!SJO4R7`$jaZ<`p|2TG zNeN`IKGXuZS&8J$`(KNeH57*&e;7)IZ*TBy{mFU%)2Yyi=BK-;Mi>8((s1<<)Nhp>4%;-hr2Yu4&H4@PCJoSHN8-Fs4YJVpsrZ%;~Tq2S6N}RUs3+Al%(M~v)^lVuwem6)Sp;w1lww+Sh2@%jKWz--W z6e)O4fl2U2+ZkH}-Vz#& zPL98|U9KpZ2EcYgHQlnPlijZbO}eMuTz%gT-#Hs@-`cxG9!s3=Cw)%rU^ZU1ey`A( zuk`$_Uu;uT@ECQ}Vy^QG##9F$0g&A5a}qh@x+Z+|Vc*{vx8OS)djk^H-fEc+qcLor z$X4fR?%T!%n6+W_fy^*cfiCJ*(+7;k=ly&?^NQE}KCMY8CUtI*89rin@Vc9r3VLi8 z)zB0&gwLlSN4Q?WYFw6H`v9lrktVGBma^ni^A*#)?i z@MN!hoJ+)noP;vXg!S5Yvq9^i`_5i&%GZuEI6b>*oiCx2@Z4QBe9QIrM+aZoo+3i5 zGiB%5z8~lf^PmHUdE*Wo9Mi>Tu6@?YuZTJN(AN+quRfZe7;5nzw9>`BO&;8-(5GZ< z7byuV*Rb_gR#!)Sz8-PRzEL2xs5+WdnLJ-78yBUh0_!?EEAPau2?YksZSJFFpDv_( zrFb^6VhyY|Ob%Ac(P};#SxYS#fu*;08mvbel%(UtpN+s&5iM>aI>SGEJ|kt`)=~Yo z-ny!UCsiT(>%Ggxvap^~F#RUx*&S z*fuo{oa(?u!p&!`BjJg{h73x-8Wu09$ zzP4B=nWM_0fb~qv+<0T+4HqTODC-sJEZp?vJVSOD=B1Fbvq>7Z2^KLTY%k{vbCn*A zO$rnr7W^0%xt(4p?2xgRzGmnw5MTvc8mam;&BebT@%*Ixq;?eB66uvFmshXJZ>d!y+c%$Y^{$e2c^6^FA$UOuM6D5w9y8DDC8l_4Lo7Stksw53Cs;sYl4H25 zw1mAAL&5dz^zXtYc0=0s_hdzfC#YADn<>}J--<9WfBxn=fN;Uq*0H*oG>+yfLbw-| zAlO%&S~K9r4aBw@4_%i}vM00OQ#dG(vywg$Ur_a;KPT(l4%gv8-W*8pSK~{eJ zC@ejs!E|Gl?jMvy%)n8pN#)y&Dryl9MY&`9zA?Uzf`nYn-e{Bs7jbtNOslPvZ7sSx zVrV~d#Yaw8E|SS=bGn08S*@!nT^t&Mk@}P$DTYqy=xI-Z8V1$Shn2xiF1k3*o(LSB zKgHk44XWt{V8hGfjOQ(lYP8N}I2XV_z&>SPSq=8-h= z$_Jx2_c`pjKZ$?A3{Yw;m1LnWKH(+QZdUmiNC}Xm#uemo)Lyd1%rJM=NH59QR%3JL z|E%RkUp<;K*b^J7BeB!!lQ7n4`kk>Vol>BLkx+sr+8MCtYcM+-ZFun$pU!bwVjocsEF{}Z_34IGA4?V%{^kmAELhlbo2S#C(FmVaUQT^3C@ZE9H86p9tU0 z*%LeA-oXtK*XikkNj~#u}U3jmtmElz$iVX;o2f7+WOM9m!!ptauStPL82~& zUG?h%dlu1A(bVZ!W&b9f_0}Q|S=h>PQ&U8zmp`u+2l{@2iixLG1CV7#Mg;Wb-uy80 z30PPdn?R5KHj9z12Fl8_B*2}bdJTYOz^$tbbwq*Ye!4k%ZGH&#cIE>ntay+UpCm71 z`FBP6dnExuzE}D#;*&iT*X=o|vJ0oNn|ga)QQ|&`Wt&&{z<2nRot~5vmrCKzzO_YqOx3S z6l&mR!1<$I$^KJsQ5w(zk&WZWUA`tWA=2uWI)4W0zS2p)jX8JIj$Y46+HY(pvNMrW zegEsC33cI&jq0;uEQj{lH~Q`y-xGhGD3H|VhaRicV9_gLn@VA36VTWC%*oEB@LaZY zTQT5u`9pObmDY6oD-T4i*r4KS+o4(76IIj~#KNfV)MjTQF?Rp&HG*CJ@+<8&kfx$w zvNQjrM5F;hna+NMx->w6&kxxld0x|FhwmXr1W#l2q4m>Pd^?SN?_Q%HPb%p$$GBfO ztm38(3!BO2&SS$*&!#wS+W$aN%BMb~ipaEor^DZ4dWc{c;IJ_G!J?lp*>r>cbdcjF zIBTMAPj0XixY8m2k#J12csqB6lq2GPCtOKxNTr?vRnZ~)v6Gp=4}k^3`Ab+et5w`M zYW?+mQnohm$O&eXM?XSVPRqRwpfwFKVBitzovfSbESS4-_o1zBk>ODEBiNl z<|QprXRw2eYqHVPBF^_N;@YJ(rsmx$^w0`;QatyG(5&d6LcPP^BgH<<2u-U6`n!={ z<)eF$mS&nA*(vUyA5z6O8s)sHmCaUflwKrhoF!K2r8Z5G5=bfsM3!X@aqVk2e}$*> z9>nHA;U({y2i+C0*jW2iR6g%ih{gRmCl&IyzRf^=Tq&v3oZVSWjxLE|g5a2{cU{JsX|JJ~l0T62NTqb+5=6YOVhbc!MT&#dC!&|_Dxdj><9(ddIiBKP)kI)eAo^P)&h6K+e+Ef6;*Ti=Rtq$|u zAdiQ~2(;fcg>a6BP?4>&w(0q)^C|=SA8ZZZTePtF8JrYceJB9=Td)__g-md$6Cx-N z)jtKv8W1>MU>7CW(`C6*HSbVtd8eU$ymcuL}?Z@v6zw@r$L=>#Wx^2luy%8ixv$ z6Tn72QPG8}7I8T-x#5~(Nss^P=xjI*ikWuS*9+fxoA=>Z5Y_RSePYtZpM(*CirWv zUj~&3iH|C%pj=*T)68DQ4?~&cj4N1zsdQa8DZN>mIG29$H-#^I0#HZrTiY3HtM7h| zM(-k=(GQ}+wwE|^WLOWF!{K`rp3 zKJvRB&3abP0g3Blzm&kc^WncD6hDF#eJ^itg9b;}r{S}T6YFIB6yQK-wpI3puYPNeH|G+pXSca--CQOTNvd;kGH^W}&$>G`GW^Hl%bV%_ z+|eq3}pgJTgql;MPVuN0BPYhifmikdnBfnYAi{u$KftIRb zR<_si-K(vNWP4V~&#I8}?2x)ww1>P9*eKK%?M%KmCZ)FLb`no7;T>?{$o~Udi_#|H zG*wn`3yj$gdD!EQRn(cBG451l$rtAtu&a-YI>aGw`nC+1DgEGb{qABlfxn;!UTVl2 znWDt3VvxamM<868CYVW}z39{JN8)R8YhI@z@u~9GqjBkHgeA4!pigg|_NuI^5)gjL zvU6f_NkJ<$ymXUPWy0GyV-obao+u$Mu9CHsdFdFpT?ATv?tzb{jLk`xL%}PaW-Z#c z9vF8t&g)h3SPfOToW?h~UhFPud>x^;$jz-bG#+WaU7f?4`{@B;*l@!uUan*F)McTo z+H-}UJ-q$D5+~&jZa&k&Jz=saAS&E=Q_?skTi{d>9NZMF^PrMf`Tw!?=J8OkVgL9& zW66>%Wr?Crp^~L+m9>pZq7+$&oEkf2&oa}3Q$i&vVn~tf+1Hr}l{K<2Gg9_t?87Xd z@2ykMb9#Qi{z%Kq_;sJcw&+4f+nNelPntj4b>SY5;)BfazdrsmR_$59L3JrQ)9_hkYq;Jn(%<(cGct?b zyi#{G&=|e0aD(h*o#Xag!v6b*%KEeo7VdwmACBBjF_e+*c(G;TaFmMvq+pTuYihbj zb#DKzZ<5^MPtG}P&baWVch)ILNaV*63Dh;5m+d5dK`{zvH(`=6jm^&lued;yFm8u#?*xy(41YzM=?`R^fQ~T_+xt1fd=( zr5kJw7c`eIOJ98K@IYp3cxM-#{gK_COOYJ;<6dRGA_Z4dWt63lPPY3z?n%v;-Bqon zt@RW67{2$WbJE-S^Z{!B6WKE@DJt3`oT`Ezb&fabbo#zHc1g!gg$vT==cSK7_cUuh zEY?{c)zSa(-tJG_A>o&t2Oe4J$F}O%2gPZBQ8UAcMd(5ASv`FFd&OQP;=>aw=KCbY zrG_AxZ0(2}u4R=9vO5(n9sEAGJo7YK6fzB^%NRr-FjCP!`C?=ttz~3Qy{qfT(}iLj z?m&|E1o2FemSn_1%q#7;vV;s~JG=*(ogOKpQZq>80J8lIfP?9@#78UludUA3FL_;A zXnwaGwNVcQPI8dq`2PYtuBY)ML1&d_-EitcJM0Emto|xU(c-3B$1||)Z{r8AKU(|$ zxr>}LT#Jr-e0q>)Z#|#*^yEm7*S07U(6|-CFH}1Po)YY}nQhu1%pBWt0qEkn6&mtVT7e(INqTG_wxzdG1 z9l}9xt5X!*yzqT>*WNU}Zsi+fsd+{XlUztg9M|Y-9J*&vf!Q2NyJkiAA%gPj`GA)z zo-D**+4mwme=*13lq?goglq#OC{4Y{P3~N+m|mI7<-T3lv|s*iU;NX0Frr>h@5O7! zyq?zYTZSnW@@Wirarqm;2z7DQNC-Igz-_=XU?S=}L@joplZGPP*)rz|Jb0YkBX(V< z&E=KsByxC(g1*4c`DdqjZAJciLSmQu_&vE-hH&rIZo{g_OeewPz4mcy(zm)CZ%02q z@Lc%Br6&juH9-VZVQ*h|`O4I=p$K59f^mav;dNw@1zazEd?-N1rzKJK8 zi^$Y~YxK4b|GK%@yj}ig81$X=YK|`^m$mOpXL$%FzDk@Cl*^NIF;M0$!k^hF^lbO; zcL^Yd%TI9dmD0tjLnXN;XR0ogxAas^zO`KWGWW!)w_}EZVN5J8HqPWde><2xVbGQJ zw7o7eYuY3wsDu6Ek~=pM*#a1hTVg0iMBV{7TR33y;Jr?k6UqyYxU%8vqCjWRqXFza}3w|LL3wV$Y3q&C1|F zyjVtX9oHun$#YEyKHa-NoX0d;1ObIY=!-O?V>HFNA)PNZe$Gfc8$C>)-xzpoL-iLW ztM1*}mu{hIUTA;(@i7Je!la~Q2d&8w@1Na6tFB&Vl-NxxX2m7H^SQzoA|jAClEzrz zxp#Tkq-$iQcQ+!PmuKIVETsr0%J9} zxqLMrLxP}r0n-Sw%s7AHUZEV`ZXkxT5=SyRB=5#bfZAdZDo9cQetYi1ZA3~T$hCzY z8xG+4(e9hx!A(}jA4e3vaM+#tMm{5}Qauk}OQSzNNB=t*r+T92S-sw_owZ^5W#yG= zB5(9ik1BZR`8ssP_pF(lDZ_47%#UP7+$4EE2nmn^jW>W2S#b|=SlObswj!Yb4&^TE zsDdLRKqah3j6yu9&0b=$k@e%!bc6XuWZb)ysc62NW>!_ae*^1t1immy%Jtt`@vmXp zAhBi33U1?!W)6ME^{n*QBIribK#)6#9+SZC+l61E_DVX02_)4aGESek;om(fw}8bV z9S+ch(bVO`w^S}=YzuCEb|T9)Blk?2Zn%`QBWf$}xsq0cm!8q*H5|5(1f~gv(Wb8F z+*H0N+!9hfw%V%y(lhzeXFJ?77J1!`Nx|r6Nul~?#xlpFe!k^E0gjcWxV#TM>qQ

hglm+*v#zlv8(LG@aYn%l)!r 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

h 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
- - If you are configuring the Application Service to proxy access to IAM roles - in another AWS account, we recommend checking the external ID of the AWS - account where the Application Service runs. Add the external ID to the trust - policy as follows, assigning to the external ID: - - ```json - { - "Version": "2012-10-17", - "Statement": [ - { - "Effect": "Allow", - "Principal": { - "AWS": "arn:aws:iam:::role/TeleportAWSAccess" - }, - "Action": "sts:AssumeRole", - "Condition": { - "StringEquals": { - "sts:ExternalId": "" - } - } - } - ] - } - ``` - - See the [AWS - documentation](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user_externalid.html) - for details on external IDs. -
- -1. Run the following commands to create the `ExampleReadOnlyAccess` role: - - ```code - $ aws iam create-role --role-name "ExampleReadOnlyAccess" \ - --assume-role-policy-document file://ro-access.json - ``` - -1. Get the ARN of the AWS-managed `ReadOnlyAccess` policy so you can attach it - to your role: - - ```code - $ ARN=$(aws iam list-policies --output text --query "Policies[?PolicyName=='ReadOnlyAccess'].Arn") - ``` - -1. Attach the `ReadOnlyAccess` policy to the role: - - ```code - $ aws iam attach-role-policy --role-name ExampleReadOnlyAccess --policy-arn $ARN - ``` - -### Give the Teleport Application Service permissions to assume other roles +### Create a role for the Teleport Application Service In this section, you will create an IAM role that allows the Teleport Application Service to assume other IAM roles in order to proxy user traffic to @@ -243,9 +155,7 @@ AWS APIs. -1. Create a role for the Teleport Application Service (this is the - `TeleportAWSAccess` role we authorized earlier to access the - `ExampleReadOnlyAccess` role): +1. Create a role for the Teleport Application Service: ```code $ aws iam create-role --role-name "TeleportAWSAccess" \ @@ -280,6 +190,93 @@ AWS APIs. --policy-arn ${POLICY_ARN} ``` +### Configure a role for Teleport users to request + +In this section, you will create a role that Teleport users can request access +to when making requests to AWS APIs. The Teleport Application Service assumes +this role when proxying requests: + +1. Obtain AWS credentials for the account where you will run the Teleport + Application Service and make them available to your terminal shell. + +1. Create a trust policy document, which authorizes an entity to assume the role + you want to protect access to. To do so, create a file called + `ro-access.json` with the following content, replacing with the ID of the AWS account where you will + run the Teleport Application Service: + + ```json + { + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Principal": { + "AWS": "arn:aws:iam:::role/TeleportAWSAccess" + }, + "Action": "sts:AssumeRole" + } + ] + } + ``` + + In the setup we show in this guide, the Teleport Application Service assumes + the `TeleportAWSAccess` role, then uses that role to assume the + `ExampleReadOnlyAccess` role. With the trust policy above, AWS authorizes + this operation. + +
+ + If you are configuring the Application Service to proxy access to IAM roles + in another AWS account, we recommend checking the external ID of the AWS + account where the Application Service runs. Add the external ID to the trust + policy as follows, assigning to the external ID: + + ```json + { + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Principal": { + "AWS": "arn:aws:iam:::role/TeleportAWSAccess" + }, + "Action": "sts:AssumeRole", + "Condition": { + "StringEquals": { + "sts:ExternalId": "" + } + } + } + ] + } + ``` + + See the [AWS + documentation](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user_externalid.html) + for details on external IDs. +
+ +1. Run the following commands to create the `ExampleReadOnlyAccess` role: + + ```code + $ aws iam create-role --role-name "ExampleReadOnlyAccess" \ + --assume-role-policy-document file://ro-access.json + ``` + +1. Get the ARN of the AWS-managed `ReadOnlyAccess` policy so you can attach it + to your role: + + ```code + $ ARN=$(aws iam list-policies --output text --query "Policies[?PolicyName=='ReadOnlyAccess'].Arn") + ``` + +1. Attach the `ReadOnlyAccess` policy to the role: + + ```code + $ aws iam attach-role-policy --role-name ExampleReadOnlyAccess --policy-arn $ARN + ``` + ### Associate a role with the Teleport Application Service Now that you have created a role for the Teleport Application Service, associate From e8b1b13f9f444a8be839a590ee514ec317355df3 Mon Sep 17 00:00:00 2001 From: Grzegorz Zdunek Date: Mon, 12 Aug 2024 16:27:00 +0200 Subject: [PATCH 129/139] Update pnpm to 9.7.0 (#45363) (#45370) (cherry picked from commit 2a42629a1edf898d049557c9a07bf2d8133f13e7) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 89e4f6c75e296..e2d9408139981 100644 --- a/package.json +++ b/package.json @@ -87,5 +87,5 @@ "tslib": "^2.6.3", "whatwg-fetch": "^3.6.20" }, - "packageManager": "pnpm@9.6.0" + "packageManager": "pnpm@9.7.0" } From a604158a319d2401d6fa999d01b2f291f330bdc0 Mon Sep 17 00:00:00 2001 From: rosstimothy <39066650+rosstimothy@users.noreply.github.com> Date: Mon, 12 Aug 2024 10:52:40 -0400 Subject: [PATCH 130/139] Prevent exiting a session prior to output being consumed (#45371) #17687 attempted to fix flakiness of TestIntegrations/AuditOn by sending an exit-status request _prior_ to consuming all output from the PTY. While this made the test more reliable, it created a scenario that allowed for a session to be completed without all of the data from the PTY being consumed by the client. This condition was hit by running an ansible playbook that output 1MB to stdout. The reason TestIntegrations/AuditOn was flaky is because the exit-status request was not received at times. The mechanism used to send that request requires sending the result over a channel and the request to be sent by another goroutine. That provides an opportunity for the request on the channel to be processed after the underlying ssh connection has been closed. To resolve the issue of missing output, the change in order of operations from #17687 was reverted and the exit-status request is now being sent directly in the same goroutine that waits for the session to end instead. This change now causes the exit-status to be sent later in time, which in the real world should not be noticed, however, some time dependent tests needed to have their timeout for sessions completing bumped. --- integration/integration_test.go | 16 ++++++++-------- lib/srv/sess.go | 19 +++++++++++-------- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/integration/integration_test.go b/integration/integration_test.go index 233e0609c48bb..592379d74f945 100644 --- a/integration/integration_test.go +++ b/integration/integration_test.go @@ -491,7 +491,7 @@ func testAuditOn(t *testing.T, suite *integrationTestSuite) { // wait until we've found the session in the audit log getSession := func(site authclient.ClientI) (types.SessionTracker, error) { - timeout, cancel := context.WithTimeout(context.Background(), 10*time.Second) + timeout, cancel := context.WithTimeout(context.Background(), 20*time.Second) defer cancel() sessions, err := waitForSessionToBeEstablished(timeout, defaults.Namespace, site) if err != nil { @@ -519,7 +519,7 @@ func testAuditOn(t *testing.T, suite *integrationTestSuite) { select { case err := <-endC: require.NoError(t, err) - case <-time.After(10 * time.Second): + case <-time.After(15 * time.Second): t.Fatalf("%s: Timeout waiting for session to finish.", tt.comment) } @@ -1250,7 +1250,7 @@ func testLeafProxySessionRecording(t *testing.T, suite *integrationTestSuite) { return } sessionID = trackers[0].GetSessionID() - }, time.Second*5, time.Millisecond*100) + }, time.Second*15, time.Millisecond*100) // Send stuff to the session. term.Type("echo Hello\n\r") @@ -1264,7 +1264,7 @@ func testLeafProxySessionRecording(t *testing.T, suite *integrationTestSuite) { // Wait for the session to terminate without error. term.Type("exit\n\r") - require.NoError(t, waitForError(errCh, 5*time.Second)) + require.NoError(t, waitForError(errCh, 15*time.Second)) // Wait for the session recording to be uploaded and available var uploaded bool @@ -1284,7 +1284,7 @@ func testLeafProxySessionRecording(t *testing.T, suite *integrationTestSuite) { events, err := authSrv.GetSessionEvents(defaults.Namespace, session.ID(sessionID), 0) assert.NoError(t, err) assert.NotEmpty(t, events) - }, 5*time.Second, 200*time.Millisecond) + }, 15*time.Second, 200*time.Millisecond) }) } } @@ -1896,7 +1896,7 @@ func testShutdown(t *testing.T, suite *integrationTestSuite) { select { case err := <-sshErr: require.NoError(t, err) - case <-time.After(5 * time.Second): + case <-time.After(15 * time.Second): require.FailNow(t, "failed to shutdown ssh session") } @@ -8548,7 +8548,7 @@ func TestConnectivityWithoutAuth(t *testing.T) { select { case err := <-errChan: require.NoError(t, err) - case <-time.After(5 * time.Second): + case <-time.After(15 * time.Second): t.Fatal("timeout waiting for session to exit") } require.Contains(t, term.AllOutput(), "hi") @@ -8580,7 +8580,7 @@ func TestConnectivityWithoutAuth(t *testing.T) { if !authRunning { require.Empty(t, term.AllOutput()) } - case <-time.After(5 * time.Second): + case <-time.After(15 * time.Second): t.Fatal("timeout waiting for session to exit") } }, diff --git a/lib/srv/sess.go b/lib/srv/sess.go index e5a3ebfb5a05d..e5172a5248f4e 100644 --- a/lib/srv/sess.go +++ b/lib/srv/sess.go @@ -1334,21 +1334,21 @@ func (s *session) startInteractive(ctx context.Context, scx *ServerContext, p *p s.log.WithError(err).Error("Received error waiting for the interactive session to finish") } - if result != nil { - if err := s.registry.broadcastResult(s.id, *result); err != nil { - s.log.Warningf("Failed to broadcast session result: %v", err) - } - } - // wait for copying from the pty to be complete or a timeout before // broadcasting the result (which will close the pty) if it has not been // closed already. select { case <-time.After(defaults.WaitCopyTimeout): - s.log.Error("Timed out waiting for PTY copy to finish, session data may be missing.") + s.log.Debug("Timed out waiting for PTY copy to finish, session data may be missing.") case <-s.doneCh: } + if result != nil { + if err := s.registry.broadcastResult(s.id, *result); err != nil { + s.log.Warningf("Failed to broadcast session result: %v", err) + } + } + if execRequest, err := scx.GetExecRequest(); err == nil && execRequest.GetCommand() != "" { emitExecAuditEvent(scx, execRequest.GetCommand(), err) } @@ -1515,8 +1515,11 @@ func (s *session) broadcastResult(r ExecResult) { s.mu.Lock() defer s.mu.Unlock() + payload := ssh.Marshal(struct{ C uint32 }{C: uint32(r.Code)}) for _, p := range s.parties { - p.ctx.SendExecResult(r) + if _, err := p.ch.SendRequest("exit-status", false, payload); err != nil { + s.log.Infof("Failed to send exit status for %v: %v", r.Command, err) + } } } From 2685f447941bda59f7d273702f0a4dbc7daf5054 Mon Sep 17 00:00:00 2001 From: Grzegorz Zdunek Date: Mon, 12 Aug 2024 16:53:51 +0200 Subject: [PATCH 131/139] Do not clear the init message on terminal launch when using ConPTY (#45360) --- web/packages/teleterm/src/sharedProcess/ptyHost/ptyProcess.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/web/packages/teleterm/src/sharedProcess/ptyHost/ptyProcess.ts b/web/packages/teleterm/src/sharedProcess/ptyHost/ptyProcess.ts index f38e1503ffacf..1762ca17a1ef2 100644 --- a/web/packages/teleterm/src/sharedProcess/ptyHost/ptyProcess.ts +++ b/web/packages/teleterm/src/sharedProcess/ptyHost/ptyProcess.ts @@ -85,6 +85,9 @@ export class PtyProcess extends EventEmitter implements IPtyProcess { cwd: this.options.cwd || getDefaultCwd(this.options.env), env: this.options.env, useConpty: this.options.useConpty, + // Do not clear the terminal on launch when using ConPTY. + conptyInheritCursor: + this.options.useConpty && !!this.options.initMessage, }); } catch (error) { this._logger.error(error); From 1a688cc8967db11c3b312da860c5bc1c3f68958b Mon Sep 17 00:00:00 2001 From: Alan Parra Date: Mon, 12 Aug 2024 12:15:10 -0300 Subject: [PATCH 132/139] [v16] Set all gogo -M options (#45374) * Set all gogo -M options * Update generated protos --- api/client/proto/authservice.pb.go | 2 +- api/types/device.pb.go | 2 +- api/types/events/events.pb.go | 36 ++++++++++++++---------------- api/types/types.pb.go | 2 +- buf-gogo.gen.yaml | 8 ++++++- 5 files changed, 27 insertions(+), 23 deletions(-) diff --git a/api/client/proto/authservice.pb.go b/api/client/proto/authservice.pb.go index cf70d87f7c8dd..84ff715ffe6de 100644 --- a/api/client/proto/authservice.pb.go +++ b/api/client/proto/authservice.pb.go @@ -8,6 +8,7 @@ import ( fmt "fmt" _ "github.com/gogo/protobuf/gogoproto" proto "github.com/gogo/protobuf/proto" + _ "github.com/gogo/protobuf/types" github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" v1 "github.com/gravitational/teleport/api/gen/proto/go/attestation/v1" v11 "github.com/gravitational/teleport/api/gen/proto/go/teleport/mfa/v1" @@ -22,7 +23,6 @@ import ( codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" emptypb "google.golang.org/protobuf/types/known/emptypb" - _ "google.golang.org/protobuf/types/known/timestamppb" io "io" math "math" math_bits "math/bits" diff --git a/api/types/device.pb.go b/api/types/device.pb.go index a806da7d9cac3..f7ee7ccc77d0b 100644 --- a/api/types/device.pb.go +++ b/api/types/device.pb.go @@ -7,8 +7,8 @@ import ( fmt "fmt" _ "github.com/gogo/protobuf/gogoproto" proto "github.com/gogo/protobuf/proto" + _ "github.com/gogo/protobuf/types" github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" - _ "google.golang.org/protobuf/types/known/timestamppb" io "io" math "math" math_bits "math/bits" diff --git a/api/types/events/events.pb.go b/api/types/events/events.pb.go index d1a4eed42ddcd..dd171941a066e 100644 --- a/api/types/events/events.pb.go +++ b/api/types/events/events.pb.go @@ -7,14 +7,12 @@ import ( fmt "fmt" _ "github.com/gogo/protobuf/gogoproto" proto "github.com/gogo/protobuf/proto" + _ "github.com/gogo/protobuf/types" github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" github_com_gravitational_teleport_api_types "github.com/gravitational/teleport/api/types" - types "github.com/gravitational/teleport/api/types" + types1 "github.com/gravitational/teleport/api/types" _ "github.com/gravitational/teleport/api/types/wrappers" github_com_gravitational_teleport_api_types_wrappers "github.com/gravitational/teleport/api/types/wrappers" - _ "google.golang.org/protobuf/types/known/structpb" - _ "google.golang.org/protobuf/types/known/timestamppb" - _ "google.golang.org/protobuf/types/known/wrapperspb" io "io" math "math" math_bits "math/bits" @@ -1173,10 +1171,10 @@ var xxx_messageInfo_AccessListReviewMetadata proto.InternalMessageInfo // LockMetadata contains common metadata for lock resource events. type LockMetadata struct { // Target describes the set of interactions that the lock applies to - Target types.LockTarget `protobuf:"bytes,4,opt,name=Target,proto3" json:"target"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Target types1.LockTarget `protobuf:"bytes,4,opt,name=Target,proto3" json:"target"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *LockMetadata) Reset() { *m = LockMetadata{} } @@ -4294,10 +4292,10 @@ type SAMLConnectorCreate struct { // User is a common user event metadata UserMetadata `protobuf:"bytes,3,opt,name=User,proto3,embedded=User" json:""` // Connector is the new SAML connector - Connector *types.SAMLConnectorV2 `protobuf:"bytes,4,opt,name=Connector,proto3" json:"connector"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Connector *types1.SAMLConnectorV2 `protobuf:"bytes,4,opt,name=Connector,proto3" json:"connector"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *SAMLConnectorCreate) Reset() { *m = SAMLConnectorCreate{} } @@ -4342,10 +4340,10 @@ type SAMLConnectorUpdate struct { // User is a common user event metadata UserMetadata `protobuf:"bytes,3,opt,name=User,proto3,embedded=User" json:""` // Connector is the updated SAML connector - Connector *types.SAMLConnectorV2 `protobuf:"bytes,4,opt,name=Connector,proto3" json:"connector"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Connector *types1.SAMLConnectorV2 `protobuf:"bytes,4,opt,name=Connector,proto3" json:"connector"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *SAMLConnectorUpdate) Reset() { *m = SAMLConnectorUpdate{} } @@ -6195,7 +6193,7 @@ type LockCreate struct { UserMetadata `protobuf:"bytes,3,opt,name=User,proto3,embedded=User" json:""` // Target describes the set of interactions that the lock applies to // Deprecated: use Lock instead. - Target types.LockTarget `protobuf:"bytes,4,opt,name=Target,proto3" json:"target"` // Deprecated: Do not use. + Target types1.LockTarget `protobuf:"bytes,4,opt,name=Target,proto3" json:"target"` // Deprecated: Do not use. // Lock is a common lock event metadata Lock LockMetadata `protobuf:"bytes,5,opt,name=Lock,proto3" json:"lock"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -59296,7 +59294,7 @@ func (m *SAMLConnectorCreate) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.Connector == nil { - m.Connector = &types.SAMLConnectorV2{} + m.Connector = &types1.SAMLConnectorV2{} } if err := m.Connector.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err @@ -59482,7 +59480,7 @@ func (m *SAMLConnectorUpdate) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.Connector == nil { - m.Connector = &types.SAMLConnectorV2{} + m.Connector = &types1.SAMLConnectorV2{} } if err := m.Connector.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err diff --git a/api/types/types.pb.go b/api/types/types.pb.go index 71cdcffcd6fd5..0ea2c9c4f96b8 100644 --- a/api/types/types.pb.go +++ b/api/types/types.pb.go @@ -9,12 +9,12 @@ import ( fmt "fmt" _ "github.com/gogo/protobuf/gogoproto" proto "github.com/gogo/protobuf/proto" + _ "github.com/gogo/protobuf/types" github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" github_com_gravitational_teleport_api_constants "github.com/gravitational/teleport/api/constants" v1 "github.com/gravitational/teleport/api/gen/proto/go/attestation/v1" _ "github.com/gravitational/teleport/api/types/wrappers" github_com_gravitational_teleport_api_types_wrappers "github.com/gravitational/teleport/api/types/wrappers" - _ "google.golang.org/protobuf/types/known/timestamppb" io "io" math "math" math_bits "math/bits" diff --git a/buf-gogo.gen.yaml b/buf-gogo.gen.yaml index be4708733309e..65a70e364414d 100644 --- a/buf-gogo.gen.yaml +++ b/buf-gogo.gen.yaml @@ -2,4 +2,10 @@ version: v1 plugins: - name: gogofast out: ./gogogen - opt: plugins=grpc + opt: + - Mgoogle/protobuf/any.proto=github.com/gogo/protobuf/types + - Mgoogle/protobuf/duration.proto=github.com/gogo/protobuf/types + - Mgoogle/protobuf/struct.proto=github.com/gogo/protobuf/types + - Mgoogle/protobuf/timestamp.proto=github.com/gogo/protobuf/types + - Mgoogle/protobuf/wrappers.proto=github.com/gogo/protobuf/types + - plugins=grpc From 09e044278d31e122825ce01308eddabb30eee961 Mon Sep 17 00:00:00 2001 From: Steven Martin Date: Mon, 12 Aug 2024 17:23:43 -0400 Subject: [PATCH 133/139] output spell fixes (#45378) Co-authored-by: Steven Martin --- lib/backend/dynamo/shards.go | 2 +- lib/integrations/diagnostics/profile.go | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/backend/dynamo/shards.go b/lib/backend/dynamo/shards.go index 1d912deec02d0..52641b6208dde 100644 --- a/lib/backend/dynamo/shards.go +++ b/lib/backend/dynamo/shards.go @@ -165,7 +165,7 @@ func (b *Backend) pollStreams(externalCtx context.Context) error { } delete(set, event.shardID) if !errors.Is(event.err, io.EOF) { - b.Debugf("Shard ID %v closed with error: %v, reseting buffers.", event.shardID, event.err) + b.Debugf("Shard ID %v closed with error: %v, resetting buffers.", event.shardID, event.err) return trace.Wrap(event.err) } b.Tracef("Shard ID %v exited gracefully.", event.shardID) diff --git a/lib/integrations/diagnostics/profile.go b/lib/integrations/diagnostics/profile.go index dc18ba8c028b5..5d185a271c8bd 100644 --- a/lib/integrations/diagnostics/profile.go +++ b/lib/integrations/diagnostics/profile.go @@ -41,31 +41,31 @@ func Profile(dir string) error { timestamp := strconv.FormatInt(time.Now().UnixMilli(), 10) traceFile, err := os.Create(filepath.Join(dir, timestamp+"-trace.profile")) if err != nil { - return trace.Wrap(err, "creating trace proile file") + return trace.Wrap(err, "creating trace profile file") } defer traceFile.Close() cpuFile, err := os.Create(filepath.Join(dir, timestamp+"-cpu.profile")) if err != nil { - return trace.Wrap(err, "creating cpu proile file") + return trace.Wrap(err, "creating cpu profile file") } defer cpuFile.Close() heapFile, err := os.Create(filepath.Join(dir, timestamp+"-heap.profile")) if err != nil { - return trace.Wrap(err, "creating heap proile file") + return trace.Wrap(err, "creating heap profile file") } defer heapFile.Close() goroutineFile, err := os.Create(filepath.Join(dir, timestamp+"-goroutine.profile")) if err != nil { - return trace.Wrap(err, "creating goroutine proile file") + return trace.Wrap(err, "creating goroutine profile file") } defer goroutineFile.Close() blockFile, err := os.Create(filepath.Join(dir, timestamp+"-block.profile")) if err != nil { - return trace.Wrap(err, "creating block proile file") + return trace.Wrap(err, "creating block profile file") } defer blockFile.Close() From 2210da98dc6e0e27315de1db346bd6f8128335b8 Mon Sep 17 00:00:00 2001 From: Paul Gottschling Date: Mon, 12 Aug 2024 17:59:35 -0400 Subject: [PATCH 134/139] [v16] Update the list of preset roles (#44762) * Update the list of preset roles Closes #44086 In the Access Controls reference, mention preset roles based on `constants.go`. Since we use a list of preset roles in two guides, extract the table of preset roles from the Access Controls reference into a partial. * Update docs/pages/includes/preset-roles-table.mdx Co-authored-by: Nic Klaassen --------- Co-authored-by: Nic Klaassen --- docs/pages/access-controls/getting-started.mdx | 13 ++----------- docs/pages/access-controls/reference.mdx | 12 +++--------- docs/pages/includes/preset-roles-table.mdx | 13 +++++++++++++ 3 files changed, 18 insertions(+), 20 deletions(-) create mode 100644 docs/pages/includes/preset-roles-table.mdx diff --git a/docs/pages/access-controls/getting-started.mdx b/docs/pages/access-controls/getting-started.mdx index 33cb5224b410b..0bc74d3710db5 100644 --- a/docs/pages/access-controls/getting-started.mdx +++ b/docs/pages/access-controls/getting-started.mdx @@ -20,18 +20,9 @@ wrap up with creating your own role. ## Step 1/3. Add local users with preset roles -Teleport provides several preset roles: `editor`, `auditor`, and `access`. +Teleport provides several preset roles: -- The `editor` role authorizes users to modify cluster configuration. -- The `auditor` role authorizes users to view audit logs. -- The `access` role authorizes users to access cluster resources. - -
-Teleport Enterprise contains two additional preset roles: `reviewer` and `requester`. - -- The `reviewer` role authorizes users to review Access Requests. -- The `requester` role authorizes users to request resources. -
+(!docs/pages/includes/preset-roles-table.mdx!) diff --git a/docs/pages/access-controls/reference.mdx b/docs/pages/access-controls/reference.mdx index ccdc012592432..68432fd468ff9 100644 --- a/docs/pages/access-controls/reference.mdx +++ b/docs/pages/access-controls/reference.mdx @@ -74,15 +74,9 @@ user: ## Preset roles -Teleport provides several pre-defined roles out-of-the-box: - -| Role | Description | -| --- | --- | -| `editor` | Allows editing of cluster configuration settings. | -| `auditor`| Allows reading cluster events, audit logs, and playing back session records. | -| `access`| Allows access to cluster resources. | -| `requester`| Enterprise-only role that allows a user to create Access Requests. | -| `reviewer`| Enterprise-only role that allows review of Access Requests. | +Teleport provides several preset roles: + +(!docs/pages/includes/preset-roles-table.mdx!) ### Role versions diff --git a/docs/pages/includes/preset-roles-table.mdx b/docs/pages/includes/preset-roles-table.mdx new file mode 100644 index 0000000000000..5d757ff8e2e00 --- /dev/null +++ b/docs/pages/includes/preset-roles-table.mdx @@ -0,0 +1,13 @@ +| Role | Description | +| --- | --- | +| `access`| Allows access to cluster resources. | +| `editor` | Allows editing of cluster configuration settings. | +| `auditor`| Allows reading cluster events, audit logs, and playing back session records. | +| `requester`| Enterprise-only role that allows a user to create Access Requests. | +| `reviewer`| Enterprise-only role that allows review of Access Requests. | +| `group-access`| Allows access to all user groups. | +| `device-admin`| Used to manage trusted devices. | +| `device-enroll`| Used to grant device enrollment powers to users. | +| `require-trusted-device`| Requires trusted device access to resources. | +| `terraform-provider`| Allows the Teleport Terraform provider to configure all of its supported Teleport resources. | + From efbef2fc6a1c2a47299dcb8f6e58000603d9c9d8 Mon Sep 17 00:00:00 2001 From: Forrest <30576607+fspmarshall@users.noreply.github.com> Date: Tue, 13 Aug 2024 05:40:03 -0700 Subject: [PATCH 135/139] ensure event handler starts loading next batch in background (#45171) (#45397) * ensure event handler starts loading next batch while current batch is being processed * go mod tidy --- integrations/event-handler/events_job.go | 10 ++++++++++ integrations/event-handler/go.mod | 2 +- .../event-handler/teleport_events_watcher.go | 17 ++++++++++++++++- 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/integrations/event-handler/events_job.go b/integrations/event-handler/events_job.go index 3362cb19b2c5a..54229b1daf563 100644 --- a/integrations/event-handler/events_job.go +++ b/integrations/event-handler/events_job.go @@ -16,6 +16,7 @@ package main import ( "context" + "time" "github.com/gravitational/trace" limiter "github.com/sethvargo/go-limiter" @@ -91,6 +92,11 @@ func (j *EventsJob) runPolling(ctx context.Context) error { evtCh, errCh := j.app.EventWatcher.Events(ctx) + logTicker := time.NewTicker(time.Minute) + defer logTicker.Stop() + + var eventsProcessed int + for { select { case err := <-errCh: @@ -107,6 +113,10 @@ func (j *EventsJob) runPolling(ctx context.Context) error { return trace.Wrap(err) } + eventsProcessed++ + case <-logTicker.C: + log.WithField("events_per_minute", eventsProcessed).Info("event processing rate") + eventsProcessed = 0 case <-ctx.Done(): return ctx.Err() } diff --git a/integrations/event-handler/go.mod b/integrations/event-handler/go.mod index 15a3450563467..a89fbc2679b07 100644 --- a/integrations/event-handler/go.mod +++ b/integrations/event-handler/go.mod @@ -16,6 +16,7 @@ require ( github.com/sethvargo/go-limiter v1.0.0 github.com/sirupsen/logrus v1.9.3 github.com/stretchr/testify v1.9.0 + golang.org/x/time v0.5.0 google.golang.org/protobuf v1.34.1 ) @@ -279,7 +280,6 @@ require ( golang.org/x/sys v0.21.0 // indirect golang.org/x/term v0.21.0 // indirect golang.org/x/text v0.16.0 // indirect - golang.org/x/time v0.5.0 // indirect google.golang.org/api v0.177.0 // indirect google.golang.org/genproto v0.0.0-20240401170217-c3f982113cda // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240429193739-8cf5692501f6 // indirect diff --git a/integrations/event-handler/teleport_events_watcher.go b/integrations/event-handler/teleport_events_watcher.go index d35680523fa2f..0221b44aaefaf 100644 --- a/integrations/event-handler/teleport_events_watcher.go +++ b/integrations/event-handler/teleport_events_watcher.go @@ -24,6 +24,7 @@ import ( "github.com/gravitational/trace" log "github.com/sirupsen/logrus" + "golang.org/x/time/rate" "github.com/gravitational/teleport/api/client" "github.com/gravitational/teleport/api/client/proto" @@ -304,13 +305,15 @@ func (t *TeleportEventsWatcher) pause(ctx context.Context) error { // Next returns next event from a batch or requests next batch if it has been ended func (t *TeleportEventsWatcher) Events(ctx context.Context) (chan *TeleportEvent, chan error) { - ch := make(chan *TeleportEvent) + ch := make(chan *TeleportEvent, t.config.BatchSize) e := make(chan error, 1) go func() { defer close(ch) defer close(e) + logLimiter := rate.NewLimiter(rate.Every(time.Minute), 6) + for { // If there is nothing in the batch, request if len(t.batch) == 0 { @@ -372,6 +375,18 @@ func (t *TeleportEventsWatcher) Events(ctx context.Context) (chan *TeleportEvent t.pos++ t.id = event.ID + // attempt non-blocking send first, falling back to blocking send + // if we encounter backpressure. + select { + case ch <- event: + continue + default: + } + + if logLimiter.Allow() { + log.Warn("encountering backpressure from outbound event processing") + } + select { case ch <- event: case <-ctx.Done(): From afe08c2099e4735f224733d7a3d54101d913ee62 Mon Sep 17 00:00:00 2001 From: Forrest <30576607+fspmarshall@users.noreply.github.com> Date: Tue, 13 Aug 2024 05:40:54 -0700 Subject: [PATCH 136/139] heartbeat slightly more frequently on disruption (#45399) --- lib/srv/heartbeatv2.go | 44 +++++++++++++---- lib/utils/interval/interval.go | 39 +++++++++++++-- lib/utils/interval/interval_test.go | 77 +++++++++++++++++++++++++++++ 3 files changed, 146 insertions(+), 14 deletions(-) diff --git a/lib/srv/heartbeatv2.go b/lib/srv/heartbeatv2.go index b5b59ae516bed..d59b573a612d9 100644 --- a/lib/srv/heartbeatv2.go +++ b/lib/srv/heartbeatv2.go @@ -60,6 +60,9 @@ type HeartbeatV2Config[T any] struct { OnHeartbeat func(error) // AnnounceInterval is the interval at which heartbeats are attempted (optional). AnnounceInterval time.Duration + // DisruptionAnnounceInterval is the interval at which heartbeats are attempted when + // if there was a disuption in the control stream since the last heartbeat (optional). + DisruptionAnnounceInterval time.Duration // PollInterval is the interval at which checks for change are performed (optional). PollInterval time.Duration } @@ -100,9 +103,10 @@ func NewSSHServerHeartbeat(cfg HeartbeatV2Config[*types.ServerV2]) (*HeartbeatV2 } return newHeartbeatV2(cfg.InventoryHandle, inner, heartbeatV2Config{ - onHeartbeatInner: cfg.OnHeartbeat, - announceInterval: cfg.AnnounceInterval, - pollInterval: cfg.PollInterval, + onHeartbeatInner: cfg.OnHeartbeat, + announceInterval: cfg.AnnounceInterval, + disruptionAnnounceInterval: cfg.DisruptionAnnounceInterval, + pollInterval: cfg.PollInterval, }), nil } @@ -119,9 +123,10 @@ func NewAppServerHeartbeat(cfg HeartbeatV2Config[*types.AppServerV3]) (*Heartbea } return newHeartbeatV2(cfg.InventoryHandle, inner, heartbeatV2Config{ - onHeartbeatInner: cfg.OnHeartbeat, - announceInterval: cfg.AnnounceInterval, - pollInterval: cfg.PollInterval, + onHeartbeatInner: cfg.OnHeartbeat, + announceInterval: cfg.AnnounceInterval, + disruptionAnnounceInterval: cfg.DisruptionAnnounceInterval, + pollInterval: cfg.PollInterval, }), nil } @@ -209,9 +214,10 @@ type HeartbeatV2 struct { } type heartbeatV2Config struct { - announceInterval time.Duration - pollInterval time.Duration - onHeartbeatInner func(error) + announceInterval time.Duration + disruptionAnnounceInterval time.Duration + pollInterval time.Duration + onHeartbeatInner func(error) // -- below values only used in tests @@ -227,6 +233,11 @@ func (c *heartbeatV2Config) SetDefaults() { // from the average of ~5m30s that was used for V1 ssh server heartbeats. c.announceInterval = 2 * (apidefaults.ServerAnnounceTTL / 3) } + if c.disruptionAnnounceInterval == 0 { + // if there was a disruption in the control stream, we want to heartbeat a bit + // sooner in case the disruption affected the most recent announce's success. + c.disruptionAnnounceInterval = 2 * (c.announceInterval / 3) + } if c.pollInterval == 0 { c.pollInterval = defaults.HeartbeatCheckPeriod } @@ -357,6 +368,21 @@ func (h *HeartbeatV2) runWithSender(sender inventory.DownstreamSender) { h.shouldAnnounce = true } + // in the event of disruption, we want to heartbeat a bit sooner than the normal. + // this helps prevent node heartbeats from getting too stale when auth servers fail + // in a manner that isn't immediately detected by the agent (e.g. deadlock, + // i/o timeout, etc). Since we're heartbeating over a channel, such failure modes + // can sometimes mean that the last announce failed "silently" from our perspective. + if t, ok := h.announce.LastTick(); ok { + elapsed := time.Since(t) + dai := utils.SeventhJitter(h.disruptionAnnounceInterval) + if elapsed >= dai { + h.shouldAnnounce = true + } else { + h.announce.ResetTo(dai - elapsed) + } + } + for { if h.shouldAnnounce { if ok := h.inner.Announce(h.closeContext, sender); ok { diff --git a/lib/utils/interval/interval.go b/lib/utils/interval/interval.go index 67003c98c4416..2bde9f81f66b5 100644 --- a/lib/utils/interval/interval.go +++ b/lib/utils/interval/interval.go @@ -21,6 +21,7 @@ package interval import ( "errors" "sync" + "sync/atomic" "time" "github.com/jonboulle/clockwork" @@ -38,8 +39,9 @@ import ( type Interval struct { cfg Config ch chan time.Time - reset chan struct{} + reset chan time.Duration fire chan struct{} + lastTick atomic.Pointer[time.Time] closeOnce sync.Once done chan struct{} } @@ -88,7 +90,7 @@ func New(cfg Config) *Interval { interval := &Interval{ ch: make(chan time.Time, 1), cfg: cfg, - reset: make(chan struct{}), + reset: make(chan time.Duration), fire: make(chan struct{}), done: make(chan struct{}), } @@ -121,7 +123,15 @@ func (i *Interval) Stop() { // jitter(duration) regardless of current timer progress). func (i *Interval) Reset() { select { - case i.reset <- struct{}{}: + case i.reset <- time.Duration(0): + case <-i.done: + } +} + +// ResetTo resets the interval to the target duration for the next tick. +func (i *Interval) ResetTo(d time.Duration) { + select { + case i.reset <- d: case <-i.done: } } @@ -140,6 +150,20 @@ func (i *Interval) Next() <-chan time.Time { return i.ch } +// LastTick gets the most recent tick if the interval has fired at least once. Note that the +// tick returned by this method is the last *generated* tick, not necessarily the last tick +// that was *observed* by the consumer of the interval. +func (i *Interval) LastTick() (tick time.Time, ok bool) { + if t := i.lastTick.Load(); t != nil { + return *t, true + } + return time.Time{}, false +} + +func (i *Interval) setLastTick(tick time.Time) { + i.lastTick.Store(&tick) +} + // duration gets the duration of the interval. Each call applies the jitter // if one was supplied. func (i *Interval) duration() time.Duration { @@ -163,13 +187,17 @@ func (i *Interval) run(timer clockwork.Timer) { // output channel is set. timer.Reset(i.duration()) ch = i.ch - case <-i.reset: + i.setLastTick(tick) + case d := <-i.reset: // stop and drain timer if !timer.Stop() { <-timer.Chan() } + if d == 0 { + d = i.duration() + } // re-set the timer - timer.Reset(i.duration()) + timer.Reset(d) // ensure we don't send any pending ticks ch = nil case <-i.fire: @@ -182,6 +210,7 @@ func (i *Interval) run(timer clockwork.Timer) { // simulate firing of the timer tick = time.Now() ch = i.ch + i.setLastTick(tick) case ch <- tick: // tick has been sent, set ch back to nil to prevent // double-send and wait for next timer firing diff --git a/lib/utils/interval/interval_test.go b/lib/utils/interval/interval_test.go index 281df018f9919..52a0692f91b87 100644 --- a/lib/utils/interval/interval_test.go +++ b/lib/utils/interval/interval_test.go @@ -24,9 +24,39 @@ import ( "testing" "time" + "github.com/jonboulle/clockwork" "github.com/stretchr/testify/require" ) +// TestLastTick verifies that the LastTick method returns the last tick time as expected. +func TestLastTick(t *testing.T) { + clock := clockwork.NewFakeClock() + interval := New(Config{ + Duration: time.Minute, + Clock: clock, + }) + + _, ok := interval.LastTick() + require.False(t, ok) + + timeout := time.After(time.Second * 30) + for i := 0; i < 3; i++ { + clock.Advance(time.Minute) + + var tick time.Time + select { + case tick = <-interval.Next(): + case <-timeout: + t.Fatal("timeout waiting for tick") + } + require.Equal(t, clock.Now(), tick) + + tick, ok = interval.LastTick() + require.True(t, ok) + require.Equal(t, clock.Now(), tick) + } +} + // TestIntervalReset verifies the basic behavior of the interval reset functionality. // Since time based tests tend to be flaky, this test passes if it has a >50% success // rate (i.e. >50% of resets seemed to have actually extended the timer successfully). @@ -83,6 +113,53 @@ func TestIntervalReset(t *testing.T) { require.Greater(t, success.Load(), failure.Load()) } +// TestIntervalResetTo verifies the basic behavior of the interval ResetTo method. +// Since time based tests tend to be flaky, this test passes if it has a >50% success +// rate (i.e. >50% of ResetTo calls seemed to have changed the timer's behavior as expected). +func TestIntervalResetTo(t *testing.T) { + const workers = 1_000 + const ticks = 12 + const longDuration = time.Millisecond * 800 + const shortDuration = time.Millisecond * 200 + t.Parallel() + + var success, failure atomic.Uint64 + var wg sync.WaitGroup + + for i := 0; i < workers; i++ { + wg.Add(1) + go func() { + defer wg.Done() + + interval := New(Config{ + Duration: longDuration, + }) + defer interval.Stop() + + start := time.Now() + + for i := 0; i < ticks; i++ { + interval.ResetTo(shortDuration) + <-interval.Next() + } + + elapsed := time.Since(start) + // if the above works completed before the expected minimum time + // to complete all ticks as long ticks, we assume that ResetTo has + // successfully shortened the interval. + if elapsed < longDuration*time.Duration(ticks) { + success.Add(1) + } else { + failure.Add(1) + } + }() + } + + wg.Wait() + + require.Greater(t, success.Load(), failure.Load()) +} + func TestNewNoop(t *testing.T) { t.Parallel() i := NewNoop() From 2ce2f0af5f3bf1ddf4e3267f9392b1d955bdf18b Mon Sep 17 00:00:00 2001 From: Alan Parra Date: Tue, 13 Aug 2024 09:53:20 -0300 Subject: [PATCH 137/139] feat: Backfill WebauthnDevice.ResidentKey field (#45222) (#45395) * Test key "upgrade" during passwordless logins * feat: Backfill WebauthnDevice.ResidentKey field --- lib/auth/webauthn/login.go | 19 +++++++--- lib/auth/webauthn/login_test.go | 62 +++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+), 4 deletions(-) diff --git a/lib/auth/webauthn/login.go b/lib/auth/webauthn/login.go index 8af8cab5cce80..575e80f1368c3 100644 --- a/lib/auth/webauthn/login.go +++ b/lib/auth/webauthn/login.go @@ -357,7 +357,7 @@ func (f *loginFlow) finish(ctx context.Context, user string, resp *wantypes.Cred } // Update last used timestamp and device counter. - if err := setCounterAndTimestamps(dev, credential); err != nil { + if err := updateCredentialAndTimestamps(dev, credential, discoverableLogin); err != nil { return nil, trace.Wrap(err) } // Retroactively write the credential RPID, now that it cleared authn. @@ -420,15 +420,26 @@ func findDeviceByID(devices []*types.MFADevice, id []byte) (*types.MFADevice, bo return nil, false } -func setCounterAndTimestamps(dev *types.MFADevice, credential *wan.Credential) error { - switch d := dev.Device.(type) { +func updateCredentialAndTimestamps( + dest *types.MFADevice, + credential *wan.Credential, + discoverableLogin bool, +) error { + switch d := dest.Device.(type) { case *types.MFADevice_U2F: d.U2F.Counter = credential.Authenticator.SignCount case *types.MFADevice_Webauthn: d.Webauthn.SignatureCounter = credential.Authenticator.SignCount + + // Backfill ResidentKey field. + // This may happen if an authenticator created for "MFA" was actually + // resident all along (eg, Safari/Touch ID registrations). + if discoverableLogin && !d.Webauthn.ResidentKey { + d.Webauthn.ResidentKey = true + } default: return trace.BadParameter("unexpected device type for webauthn: %T", d) } - dev.LastUsed = time.Now() + dest.LastUsed = time.Now() return nil } diff --git a/lib/auth/webauthn/login_test.go b/lib/auth/webauthn/login_test.go index 3ce55ea748c6d..acc60765f7242 100644 --- a/lib/auth/webauthn/login_test.go +++ b/lib/auth/webauthn/login_test.go @@ -1018,6 +1018,68 @@ func TestLoginFlow_userVerification(t *testing.T) { } } +func TestPasswordlessFlow_backfillResidentKey(t *testing.T) { + t.Parallel() + + key, err := mocku2f.Create() + require.NoError(t, err, "Create failed") + key.SetPasswordless() + + const user = "llama" + const origin = "https://example.com" + webIdentity := newFakeIdentity(user) + webConfig := &types.Webauthn{RPID: "example.com"} + ctx := context.Background() + + // Register passwordless device as MFA. + // (Providers might make it passwordless regardless.) + rf := &wanlib.RegistrationFlow{ + Webauthn: webConfig, + Identity: webIdentity, + } + cc, err := rf.Begin(ctx, user, false /* passwordless */) + require.NoError(t, err, "Begin failed") + ccr, err := key.SignCredentialCreation(origin, cc) + require.NoError(t, err, "SignCredentialCreation failed") + mfaDev, err := rf.Finish(ctx, wanlib.RegisterResponse{ + User: user, + DeviceName: "mydevice", + CreationResponse: ccr, + }) + require.NoError(t, err, "Finish failed") + // Sanity check. + require.False(t, + mfaDev.GetWebauthn().ResidentKey, + "MFA device unexpectedly marked as resident key", + ) + + // Set the UserHandle in our fake key. A "regular" authenticator would save + // the handle during registration, but our fake only does that for + // "passwordless" registrations. + wla, err := webIdentity.GetWebauthnLocalAuth(ctx, user) + require.NoError(t, err, "GetWebauthnLocalAuth failed") + key.UserHandle = wla.UserID + + t.Run("ok", func(t *testing.T) { + lf := &wanlib.PasswordlessFlow{ + Webauthn: webConfig, + Identity: webIdentity, + } + + // Login. + assertion, err := lf.Begin(ctx) + require.NoError(t, err, "Begin failed") + assertionResp, err := key.SignAssertion(origin, assertion) + require.NoError(t, err, "SignAssertion failed") + loginData, err := lf.Finish(ctx, assertionResp) + require.NoError(t, err, "Finish failed") + + // Verify that we corrected the ResidentKey field. + mfaDev := loginData.Device + assert.True(t, mfaDev.GetWebauthn().ResidentKey, "ResidentKey field not corrected") + }) +} + type fakeIdentity struct { User *types.UserV2 // MappedUser is used as the reply to GetTeleportUserByWebauthnID. From 7c80068229e1fb8e9e4020029e983ef4b6a8489b Mon Sep 17 00:00:00 2001 From: Tiago Silva Date: Tue, 13 Aug 2024 15:01:30 +0100 Subject: [PATCH 138/139] [kube] init `stsclient` when assuming a role (#45382) When assuming a role, we didn't properly init `a.stsClient` which caused a panic later on. Fixes #45298 Signed-off-by: Tiago Silva --- lib/srv/discovery/fetchers/eks.go | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/srv/discovery/fetchers/eks.go b/lib/srv/discovery/fetchers/eks.go index 01e6812988693..1dc89d2baeb34 100644 --- a/lib/srv/discovery/fetchers/eks.go +++ b/lib/srv/discovery/fetchers/eks.go @@ -563,6 +563,9 @@ func (a *eksFetcher) upsertRoleAndBinding(ctx context.Context, cluster *eks.Clus } func (a *eksFetcher) createKubeClient(cluster *eks.Cluster) (*kubernetes.Clientset, error) { + if a.stsClient == nil { + return nil, trace.BadParameter("STS client is not set") + } token, _, err := kubeutils.GenAWSEKSToken(a.stsClient, aws.StringValue(cluster.Name), a.Clock) if err != nil { return nil, trace.Wrap(err, "unable to generate EKS token for cluster %q", aws.StringValue(cluster.Name)) @@ -666,10 +669,6 @@ func (a *eksFetcher) upsertAccessEntry(ctx context.Context, client eksiface.EKSA } func (a *eksFetcher) setCallerIdentity(ctx context.Context) error { - if a.AssumeRole.RoleARN != "" { - a.callerIdentity = a.AssumeRole.RoleARN - return nil - } var err error a.stsClient, err = a.ClientGetter.GetAWSSTSClient( ctx, @@ -679,6 +678,11 @@ func (a *eksFetcher) setCallerIdentity(ctx context.Context) error { if err != nil { return trace.Wrap(err) } + + if a.AssumeRole.RoleARN != "" { + a.callerIdentity = a.AssumeRole.RoleARN + return nil + } identity, err := a.stsClient.GetCallerIdentityWithContext(ctx, &sts.GetCallerIdentityInput{}) if err != nil { return trace.Wrap(err) From 9f929079de97035e18bbfb42edade8ece96224d5 Mon Sep 17 00:00:00 2001 From: Anton Miniailo Date: Tue, 13 Aug 2024 10:38:38 -0400 Subject: [PATCH 139/139] Fix error reporting for EKS enrollment in Discover UI. (#45415) --- .../Discover/Kubernetes/EnrollEKSCluster/EnrollEksCluster.tsx | 2 +- web/packages/teleport/src/services/integrations/types.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/web/packages/teleport/src/Discover/Kubernetes/EnrollEKSCluster/EnrollEksCluster.tsx b/web/packages/teleport/src/Discover/Kubernetes/EnrollEKSCluster/EnrollEksCluster.tsx index f7a6aed57f582..ac0a80847f580 100644 --- a/web/packages/teleport/src/Discover/Kubernetes/EnrollEKSCluster/EnrollEksCluster.tsx +++ b/web/packages/teleport/src/Discover/Kubernetes/EnrollEKSCluster/EnrollEksCluster.tsx @@ -286,7 +286,7 @@ export function EnrollEksCluster(props: AgentStepProps) { ); } else if ( result.error && - !result.error.message.includes( + !result.error.includes( 'teleport-kube-agent is already installed on the cluster' ) ) { diff --git a/web/packages/teleport/src/services/integrations/types.ts b/web/packages/teleport/src/services/integrations/types.ts index 9c971917b0f40..0c25eada27039 100644 --- a/web/packages/teleport/src/services/integrations/types.ts +++ b/web/packages/teleport/src/services/integrations/types.ts @@ -368,7 +368,7 @@ export type EnrollEksClustersResponse = { results: { clusterName: string; resourceId: string; - error: { message: string }; + error: string; }[]; };

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 diff --git a/docs/pages/connect-your-client/vnet.mdx b/docs/pages/connect-your-client/vnet.mdx index 5a6254e32861c..a576d1b15257a 100644 --- a/docs/pages/connect-your-client/vnet.mdx +++ b/docs/pages/connect-your-client/vnet.mdx @@ -32,9 +32,10 @@ have `tcp://` as the protocol in their addresses. Click "Connect" next to the TCP app. This starts VNet if it's not already running. Alternatively, you can start VNet through the connection list in the top left. -VNet needs to set up a network device and configure DNS on your device, so it'll ask for admin -permissions. For now your password is needed each time you start VNet, but we're working on showing -the prompt only once. +During the first launch, macOS will prompt you to enable a background item for tsh.app. VNet needs +this background item in order to configure DNS on your device. To enable the background item, either +interact with the system notification or go to System Settings > General > Login Items and look for +tsh.app under "Allow in the Background". ![VNet starting up](../../img/use-teleport/vnet-starting@2x.png) diff --git a/gen/proto/go/teleport/lib/teleterm/vnet/v1/vnet_service.pb.go b/gen/proto/go/teleport/lib/teleterm/vnet/v1/vnet_service.pb.go index cec9257d5e554..c7992b01c7f86 100644 --- a/gen/proto/go/teleport/lib/teleterm/vnet/v1/vnet_service.pb.go +++ b/gen/proto/go/teleport/lib/teleterm/vnet/v1/vnet_service.pb.go @@ -48,6 +48,7 @@ const ( BackgroundItemStatus_BACKGROUND_ITEM_STATUS_ENABLED BackgroundItemStatus = 2 BackgroundItemStatus_BACKGROUND_ITEM_STATUS_REQUIRES_APPROVAL BackgroundItemStatus = 3 BackgroundItemStatus_BACKGROUND_ITEM_STATUS_NOT_FOUND BackgroundItemStatus = 4 + BackgroundItemStatus_BACKGROUND_ITEM_STATUS_NOT_SUPPORTED BackgroundItemStatus = 5 ) // Enum value maps for BackgroundItemStatus. @@ -58,6 +59,7 @@ var ( 2: "BACKGROUND_ITEM_STATUS_ENABLED", 3: "BACKGROUND_ITEM_STATUS_REQUIRES_APPROVAL", 4: "BACKGROUND_ITEM_STATUS_NOT_FOUND", + 5: "BACKGROUND_ITEM_STATUS_NOT_SUPPORTED", } BackgroundItemStatus_value = map[string]int32{ "BACKGROUND_ITEM_STATUS_UNSPECIFIED": 0, @@ -65,6 +67,7 @@ var ( "BACKGROUND_ITEM_STATUS_ENABLED": 2, "BACKGROUND_ITEM_STATUS_REQUIRES_APPROVAL": 3, "BACKGROUND_ITEM_STATUS_NOT_FOUND": 4, + "BACKGROUND_ITEM_STATUS_NOT_SUPPORTED": 5, } ) @@ -452,7 +455,7 @@ var file_teleport_lib_teleterm_vnet_v1_vnet_service_proto_rawDesc = []byte{ 0x62, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x2e, 0x76, 0x6e, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2a, - 0xe1, 0x01, 0x0a, 0x14, 0x42, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x49, 0x74, + 0x8b, 0x02, 0x0a, 0x14, 0x42, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x26, 0x0a, 0x22, 0x42, 0x41, 0x43, 0x4b, 0x47, 0x52, 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x49, 0x54, 0x45, 0x4d, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, @@ -466,43 +469,46 @@ var file_teleport_lib_teleterm_vnet_v1_vnet_service_proto_rawDesc = []byte{ 0x45, 0x53, 0x5f, 0x41, 0x50, 0x50, 0x52, 0x4f, 0x56, 0x41, 0x4c, 0x10, 0x03, 0x12, 0x24, 0x0a, 0x20, 0x42, 0x41, 0x43, 0x4b, 0x47, 0x52, 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x49, 0x54, 0x45, 0x4d, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, - 0x44, 0x10, 0x04, 0x32, 0xe6, 0x03, 0x0a, 0x0b, 0x56, 0x6e, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x12, 0x62, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x2b, 0x2e, 0x74, - 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6c, 0x69, 0x62, 0x2e, 0x74, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x72, 0x6d, 0x2e, 0x76, 0x6e, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x74, 0x65, 0x6c, 0x65, + 0x44, 0x10, 0x04, 0x12, 0x28, 0x0a, 0x24, 0x42, 0x41, 0x43, 0x4b, 0x47, 0x52, 0x4f, 0x55, 0x4e, + 0x44, 0x5f, 0x49, 0x54, 0x45, 0x4d, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x4e, 0x4f, + 0x54, 0x5f, 0x53, 0x55, 0x50, 0x50, 0x4f, 0x52, 0x54, 0x45, 0x44, 0x10, 0x05, 0x32, 0xe6, 0x03, + 0x0a, 0x0b, 0x56, 0x6e, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x62, 0x0a, + 0x05, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x2b, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x2e, 0x6c, 0x69, 0x62, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x2e, 0x76, + 0x6e, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6c, + 0x69, 0x62, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x2e, 0x76, 0x6e, 0x65, 0x74, + 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x5f, 0x0a, 0x04, 0x53, 0x74, 0x6f, 0x70, 0x12, 0x2a, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6c, 0x69, 0x62, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x72, - 0x6d, 0x2e, 0x76, 0x6e, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5f, 0x0a, 0x04, 0x53, 0x74, 0x6f, 0x70, 0x12, - 0x2a, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6c, 0x69, 0x62, 0x2e, 0x74, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x2e, 0x76, 0x6e, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, - 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x74, 0x65, - 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6c, 0x69, 0x62, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x72, 0x6d, 0x2e, 0x76, 0x6e, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x70, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x77, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, - 0x44, 0x4e, 0x53, 0x5a, 0x6f, 0x6e, 0x65, 0x73, 0x12, 0x32, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, - 0x6f, 0x72, 0x74, 0x2e, 0x6c, 0x69, 0x62, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x72, 0x6d, - 0x2e, 0x76, 0x6e, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x4e, 0x53, - 0x5a, 0x6f, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x74, - 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6c, 0x69, 0x62, 0x2e, 0x74, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x72, 0x6d, 0x2e, 0x76, 0x6e, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x44, 0x4e, 0x53, 0x5a, 0x6f, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x98, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, - 0x75, 0x6e, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3d, 0x2e, - 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6c, 0x69, 0x62, 0x2e, 0x74, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x72, 0x6d, 0x2e, 0x76, 0x6e, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, - 0x74, 0x42, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3e, 0x2e, 0x74, - 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6c, 0x69, 0x62, 0x2e, 0x74, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x72, 0x6d, 0x2e, 0x76, 0x6e, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, - 0x42, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x55, 0x5a, 0x53, - 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x72, 0x61, 0x76, 0x69, - 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, - 0x74, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x74, - 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x6c, 0x69, 0x62, 0x2f, 0x74, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x72, 0x6d, 0x2f, 0x76, 0x6e, 0x65, 0x74, 0x2f, 0x76, 0x31, 0x3b, 0x76, 0x6e, 0x65, - 0x74, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6d, 0x2e, 0x76, 0x6e, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x2e, 0x6c, 0x69, 0x62, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x2e, 0x76, 0x6e, + 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x77, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x4e, 0x53, 0x5a, 0x6f, 0x6e, + 0x65, 0x73, 0x12, 0x32, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6c, 0x69, + 0x62, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x2e, 0x76, 0x6e, 0x65, 0x74, 0x2e, + 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x4e, 0x53, 0x5a, 0x6f, 0x6e, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x2e, 0x6c, 0x69, 0x62, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x2e, 0x76, + 0x6e, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x4e, 0x53, 0x5a, 0x6f, + 0x6e, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x98, 0x01, 0x0a, 0x17, + 0x47, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x49, 0x74, 0x65, + 0x6d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3d, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, + 0x72, 0x74, 0x2e, 0x6c, 0x69, 0x62, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x2e, + 0x76, 0x6e, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x67, + 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3e, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x2e, 0x6c, 0x69, 0x62, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x2e, 0x76, + 0x6e, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x67, 0x72, + 0x6f, 0x75, 0x6e, 0x64, 0x49, 0x74, 0x65, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x55, 0x5a, 0x53, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x61, 0x6c, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x67, 0x65, 0x6e, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x2f, 0x6c, 0x69, 0x62, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x2f, 0x76, + 0x6e, 0x65, 0x74, 0x2f, 0x76, 0x31, 0x3b, 0x76, 0x6e, 0x65, 0x74, 0x76, 0x31, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/gen/proto/ts/teleport/lib/teleterm/vnet/v1/vnet_service_pb.ts b/gen/proto/ts/teleport/lib/teleterm/vnet/v1/vnet_service_pb.ts index 4943b89350b34..c9a8b7aa6bea2 100644 --- a/gen/proto/ts/teleport/lib/teleterm/vnet/v1/vnet_service_pb.ts +++ b/gen/proto/ts/teleport/lib/teleterm/vnet/v1/vnet_service_pb.ts @@ -125,7 +125,11 @@ export enum BackgroundItemStatus { /** * @generated from protobuf enum value: BACKGROUND_ITEM_STATUS_NOT_FOUND = 4; */ - NOT_FOUND = 4 + NOT_FOUND = 4, + /** + * @generated from protobuf enum value: BACKGROUND_ITEM_STATUS_NOT_SUPPORTED = 5; + */ + NOT_SUPPORTED = 5 } // @generated message type with reflection information, may provide speed optimized methods class StartRequest$Type extends MessageType { diff --git a/lib/teleterm/vnet/service_daemon_darwin.go b/lib/teleterm/vnet/service_daemon_darwin.go index 67b55d15b8b40..bbcb01c80bad0 100644 --- a/lib/teleterm/vnet/service_daemon_darwin.go +++ b/lib/teleterm/vnet/service_daemon_darwin.go @@ -21,20 +21,14 @@ package vnet import ( "context" - "os" "github.com/gravitational/trace" api "github.com/gravitational/teleport/gen/proto/go/teleport/lib/teleterm/vnet/v1" - "github.com/gravitational/teleport/lib/vnet" vnetdaemon "github.com/gravitational/teleport/lib/vnet/daemon" ) func (s *Service) GetBackgroundItemStatus(ctx context.Context, req *api.GetBackgroundItemStatusRequest) (*api.GetBackgroundItemStatusResponse, error) { - if os.Getenv(vnet.EnvFeatureFlag) != "yes" { - return nil, trace.NotImplemented("tsh was built with VNet daemon support, but the feature flag is not enabled") - } - status, err := vnetdaemon.DaemonStatus() if err != nil { return nil, trace.Wrap(err) @@ -55,6 +49,8 @@ func backgroundItemStatusFromServiceStatus(status vnetdaemon.ServiceStatus) api. return api.BackgroundItemStatus_BACKGROUND_ITEM_STATUS_REQUIRES_APPROVAL case vnetdaemon.ServiceStatusNotFound: return api.BackgroundItemStatus_BACKGROUND_ITEM_STATUS_NOT_FOUND + case vnetdaemon.ServiceStatusNotSupported: + return api.BackgroundItemStatus_BACKGROUND_ITEM_STATUS_NOT_SUPPORTED default: return api.BackgroundItemStatus_BACKGROUND_ITEM_STATUS_UNSPECIFIED } diff --git a/lib/vnet/daemon/client_darwin.go b/lib/vnet/daemon/client_darwin.go index 3b531604bcbc9..cdaddab625603 100644 --- a/lib/vnet/daemon/client_darwin.go +++ b/lib/vnet/daemon/client_darwin.go @@ -200,6 +200,8 @@ const ( ServiceStatusEnabled ServiceStatus = 1 ServiceStatusRequiresApproval ServiceStatus = 2 ServiceStatusNotFound ServiceStatus = 3 + // ServiceStatusNotSupported is returned by us when macOS version is < 13.0. + ServiceStatusNotSupported ServiceStatus = -1 ) func (s ServiceStatus) String() string { @@ -212,6 +214,8 @@ func (s ServiceStatus) String() string { return "requires approval" case ServiceStatusNotFound: return "not found" + case ServiceStatusNotSupported: + return "not supported" default: return strconv.Itoa(int(s)) } diff --git a/lib/vnet/setup_daemon_darwin.go b/lib/vnet/setup_daemon_darwin.go index b777dfbd674f5..dd6676b02b850 100644 --- a/lib/vnet/setup_daemon_darwin.go +++ b/lib/vnet/setup_daemon_darwin.go @@ -21,22 +21,14 @@ package vnet import ( "context" - "os" "github.com/gravitational/trace" "github.com/gravitational/teleport/lib/vnet/daemon" ) -const EnvFeatureFlag = "VNETDAEMON" - func execAdminProcess(ctx context.Context, config daemon.Config) error { - // TODO(ravicious): Remove the feature env var after the daemon gets implemented. - if os.Getenv(EnvFeatureFlag) == "yes" { - return trace.Wrap(daemon.RegisterAndCall(ctx, config)) - } - - return trace.Wrap(execAdminSubcommand(ctx, config)) + return trace.Wrap(daemon.RegisterAndCall(ctx, config)) } func DaemonSubcommand(ctx context.Context) error { diff --git a/proto/teleport/lib/teleterm/vnet/v1/vnet_service.proto b/proto/teleport/lib/teleterm/vnet/v1/vnet_service.proto index c9d7e5d90f606..895985b043cb1 100644 --- a/proto/teleport/lib/teleterm/vnet/v1/vnet_service.proto +++ b/proto/teleport/lib/teleterm/vnet/v1/vnet_service.proto @@ -80,4 +80,5 @@ enum BackgroundItemStatus { BACKGROUND_ITEM_STATUS_ENABLED = 2; BACKGROUND_ITEM_STATUS_REQUIRES_APPROVAL = 3; BACKGROUND_ITEM_STATUS_NOT_FOUND = 4; + BACKGROUND_ITEM_STATUS_NOT_SUPPORTED = 5; } diff --git a/tool/tsh/common/vnet_daemon_darwin.go b/tool/tsh/common/vnet_daemon_darwin.go new file mode 100644 index 0000000000000..771ee9a22834c --- /dev/null +++ b/tool/tsh/common/vnet_daemon_darwin.go @@ -0,0 +1,43 @@ +// Teleport +// Copyright (C) 2024 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +//go:build vnetdaemon +// +build vnetdaemon + +package common + +import ( + "log/slog" + + "github.com/gravitational/trace" + + "github.com/gravitational/teleport/lib/utils" + "github.com/gravitational/teleport/lib/vnet" +) + +func (c *vnetDaemonCommand) run(cf *CLIConf) error { + if cf.Debug { + utils.InitLogger(utils.LoggingForDaemon, slog.LevelDebug) + } else { + utils.InitLogger(utils.LoggingForDaemon, slog.LevelInfo) + } + + return trace.Wrap(vnet.DaemonSubcommand(cf.Context)) +} + +func (c *vnetAdminSetupCommand) run(cf *CLIConf) error { + return trace.NotImplemented("tsh was built with support for VNet daemon, use %s instead", vnetDaemonSubCommand) +} diff --git a/tool/tsh/common/vnet_darwin.go b/tool/tsh/common/vnet_darwin.go index 9a155298e41f1..a5fcbc9cb2438 100644 --- a/tool/tsh/common/vnet_darwin.go +++ b/tool/tsh/common/vnet_darwin.go @@ -21,17 +21,12 @@ package common import ( "fmt" - "log/slog" - "os" "github.com/alecthomas/kingpin/v2" "github.com/gravitational/trace" "github.com/gravitational/teleport" - "github.com/gravitational/teleport/api/types" - "github.com/gravitational/teleport/lib/utils" "github.com/gravitational/teleport/lib/vnet" - "github.com/gravitational/teleport/lib/vnet/daemon" ) type vnetCommand struct { @@ -100,28 +95,6 @@ func newVnetAdminSetupCommand(app *kingpin.Application) *vnetAdminSetupCommand { return cmd } -func (c *vnetAdminSetupCommand) run(cf *CLIConf) error { - homePath := os.Getenv(types.HomeEnvVar) - if homePath == "" { - // This runs as root so we need to be configured with the user's home path. - return trace.BadParameter("%s must be set", types.HomeEnvVar) - } - - config := daemon.Config{ - SocketPath: c.socketPath, - IPv6Prefix: c.ipv6Prefix, - DNSAddr: c.dnsAddr, - HomePath: homePath, - ClientCred: daemon.ClientCred{ - Valid: true, - Egid: c.egid, - Euid: c.euid, - }, - } - - return trace.Wrap(vnet.AdminSetup(cf.Context, config)) -} - type vnetDaemonCommand struct { *kingpin.CmdClause // Launch daemons added through SMAppService are launched from a static .plist file, hence @@ -131,17 +104,9 @@ type vnetDaemonCommand struct { func newVnetDaemonCommand(app *kingpin.Application) *vnetDaemonCommand { return &vnetDaemonCommand{ - // The command must match the command provided in the .plist file. - CmdClause: app.Command("vnet-daemon", "Start the VNet daemon").Hidden(), + CmdClause: app.Command(vnetDaemonSubCommand, "Start the VNet daemon").Hidden(), } } -func (c *vnetDaemonCommand) run(cf *CLIConf) error { - if cf.Debug { - utils.InitLogger(utils.LoggingForDaemon, slog.LevelDebug) - } else { - utils.InitLogger(utils.LoggingForDaemon, slog.LevelInfo) - } - - return trace.Wrap(vnet.DaemonSubcommand(cf.Context)) -} +// The command must match the command provided in the .plist file. +const vnetDaemonSubCommand = "vnet-daemon" diff --git a/tool/tsh/common/vnet_nodaemon_darwin.go b/tool/tsh/common/vnet_nodaemon_darwin.go new file mode 100644 index 0000000000000..b383c03197a4b --- /dev/null +++ b/tool/tsh/common/vnet_nodaemon_darwin.go @@ -0,0 +1,56 @@ +// Teleport +// Copyright (C) 2024 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +//go:build !vnetdaemon +// +build !vnetdaemon + +package common + +import ( + "os" + + "github.com/gravitational/trace" + + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/vnet" + "github.com/gravitational/teleport/lib/vnet/daemon" +) + +func (c *vnetDaemonCommand) run(cf *CLIConf) error { + return trace.NotImplemented("tsh was built without support for VNet daemon") +} + +func (c *vnetAdminSetupCommand) run(cf *CLIConf) error { + homePath := os.Getenv(types.HomeEnvVar) + if homePath == "" { + // This runs as root so we need to be configured with the user's home path. + return trace.BadParameter("%s must be set", types.HomeEnvVar) + } + + config := daemon.Config{ + SocketPath: c.socketPath, + IPv6Prefix: c.ipv6Prefix, + DNSAddr: c.dnsAddr, + HomePath: homePath, + ClientCred: daemon.ClientCred{ + Valid: true, + Egid: c.egid, + Euid: c.euid, + }, + } + + return trace.Wrap(vnet.AdminSetup(cf.Context, config)) +} diff --git a/web/packages/teleterm/src/mainProcess/mainProcess.ts b/web/packages/teleterm/src/mainProcess/mainProcess.ts index 813658ae24111..58cf66059aeed 100644 --- a/web/packages/teleterm/src/mainProcess/mainProcess.ts +++ b/web/packages/teleterm/src/mainProcess/mainProcess.ts @@ -188,9 +188,6 @@ export default class MainProcess { env: { ...process.env, TELEPORT_HOME: homeDir, - VNETDAEMON: this.configService.get('feature.vnetDaemon').value - ? 'yes' - : undefined, }, } ); diff --git a/web/packages/teleterm/src/services/config/appConfigSchema.ts b/web/packages/teleterm/src/services/config/appConfigSchema.ts index bc8713886aa58..453198daca3af 100644 --- a/web/packages/teleterm/src/services/config/appConfigSchema.ts +++ b/web/packages/teleterm/src/services/config/appConfigSchema.ts @@ -131,10 +131,6 @@ export const createAppConfigSchema = (platform: Platform) => { .boolean() .default(false) .describe('Disables SSH connection resumption.'), - 'feature.vnetDaemon': z - .boolean() - .default(false) - .describe('Use daemon instead of osascript for VNet'), }); }; diff --git a/web/packages/teleterm/src/ui/Vnet/vnetContext.tsx b/web/packages/teleterm/src/ui/Vnet/vnetContext.tsx index f77086d4ccab3..4caf7ece9b3e5 100644 --- a/web/packages/teleterm/src/ui/Vnet/vnetContext.tsx +++ b/web/packages/teleterm/src/ui/Vnet/vnetContext.tsx @@ -207,7 +207,11 @@ const notifyAboutDaemonBackgroundItem = async (ctx: IAppContext) => { throw error; } - if (backgroundItemStatus === BackgroundItemStatus.ENABLED) { + if ( + backgroundItemStatus === BackgroundItemStatus.ENABLED || + backgroundItemStatus === BackgroundItemStatus.NOT_SUPPORTED || + backgroundItemStatus === BackgroundItemStatus.UNSPECIFIED + ) { return; } From be975a05dcd4ccd7ff5439d91baf7fe36bb5010c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Cie=C5=9Blak?= Date: Fri, 2 Aug 2024 15:46:13 +0200 Subject: [PATCH 044/139] teleterm: Close VNet service before stopping gRPC server (#44995) --- lib/teleterm/apiserver/apiserver.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/teleterm/apiserver/apiserver.go b/lib/teleterm/apiserver/apiserver.go index d54531afca218..f622fe5614437 100644 --- a/lib/teleterm/apiserver/apiserver.go +++ b/lib/teleterm/apiserver/apiserver.go @@ -92,10 +92,14 @@ func (s *APIServer) Serve() error { // Stop stops the server and closes all listeners func (s *APIServer) Stop() { - s.grpcServer.GracefulStop() + // Gracefully stopping the gRPC server takes a second or two. Closing the VNet service is almost + // immediate. Closing the VNet service before the gRPC server gives some time for the VNet admin + // process to notice that the client is gone and shut down as well. if err := s.vnetService.Close(); err != nil { log.WithError(err).Error("Error while closing VNet service") } + + s.grpcServer.GracefulStop() } func newListener(hostAddr string, listeningC chan<- utils.NetAddr) (net.Listener, error) { From 857c8103bfbb359f295915eb73e4f105aabc03c2 Mon Sep 17 00:00:00 2001 From: "M.C.M." Date: Fri, 2 Aug 2024 07:01:11 -0700 Subject: [PATCH 045/139] [v16] docs: monitoring and metrics overhaul (#44850) * monitoring and metrics overhaul - draft * monitoring and metrics overhaul - post-feedback * monitoring and metrics overhaul - conf link changed * monitoring and metrics - link fix * monitoring and metrics - small vale corrections --- docs/pages/management/diagnostics.mdx | 286 +++++++++++++++++++++++++- 1 file changed, 281 insertions(+), 5 deletions(-) diff --git a/docs/pages/management/diagnostics.mdx b/docs/pages/management/diagnostics.mdx index a708bde9818e4..f1ecb5095ab76 100644 --- a/docs/pages/management/diagnostics.mdx +++ b/docs/pages/management/diagnostics.mdx @@ -1,10 +1,286 @@ --- title: Monitoring your Cluster description: Monitoring your Teleport deployment -layout: tocless-doc --- -- [Health Monitoring](./diagnostics/monitoring.mdx): How to monitor the health of a Teleport instance. -- [Metrics](./diagnostics/metrics.mdx): How to enable exporting Prometheus metrics. -- [Collecting Profiles](./diagnostics/profiles.mdx): How to collect runtime profiling data from a Teleport instance. -- [Distributed Tracing](./diagnostics/tracing.mdx): How to enable distributed tracing for a Teleport instance. \ No newline at end of file +Teleport provides health checking mechanisms in order to verify that it is healthy and ready to serve traffic. +Metrics, tracing, and profiling provide in-depth data, tracking cluster performance and responsiveness. + +## Enable health monitoring + +How to monitor the health of a Teleport instance. + +(!docs/pages/includes/diagnostics/diag-addr-prereqs-tabs.mdx!) + +Now you can collect monitoring information from several endpoints. These can be used by things like +Kubernetes probes to monitor the health of a Teleport process. + +## `/healthz` + +The `http://127.0.0.1:3000/healthz` endpoint responds with a body of +`{"status":"ok"}` and an HTTP 200 OK status code if the process is running. + +This is a check to determine if the Teleport process is still running. + +## `/readyz` + +The `http://127.0.0.1:3000/readyz` endpoint is similar to `/healthz`, but its +response includes information about the state of the process. + +The response body is a JSON object of the form: + +``` +{ "status": "a status message here"} +``` + +### `/readyz` and heartbeats + +If a Teleport component fails to execute its heartbeat procedure, it will enter +a degraded state. Teleport will begin recovering from this state when a +heartbeat completes successfully. + +The first successful heartbeat will transition Teleport into a recovering state. A second consecutive +successful heartbeat will cause Teleport to transition to the OK state. + +Teleport heartbeats run approximately every 60 seconds when healthy, and failed +heartbeats are retried approximately every 5 seconds. This means that depending +on the timing of heartbeats, it can take 60-70 seconds after connectivity is +restored for `/readyz` to start reporting healthy again. + +### Status codes + +The status code of the response can be one of: + +- HTTP 200 OK: Teleport is operating normally +- HTTP 503 Service Unavailable: Teleport has encountered a connection error and + is running in a degraded state. This happens when a Teleport heartbeat fails. +- HTTP 400 Bad Request: Teleport is either entering its initial startup phase or + has begun recovering from a degraded state. + +The same state information is also available via the `process_state` metric +under the `/metrics` endpoint. + +## Metrics + +Teleport exposes metrics for all of its components, helping you get insight +into the state of your cluster. This guide explains the metrics that you can +collect from your Teleport cluster. + +## Enabling metrics + +(!docs/pages/includes/diagnostics/diag-addr-prereqs-tabs.mdx!) + +This will enable the `http://127.0.0.1:3000/metrics` endpoint, which serves the +metrics that Teleport tracks. It is compatible with [Prometheus](https://prometheus.io/) collectors. + +The following metrics are available: + + + + Teleport Enterprise (cloud-hosted) does not expose monitoring endpoints for the Auth Service and Proxy Service. + + + +(!docs/pages/includes/metrics.mdx!) + + +## Distributed tracing + +How to enable distributed tracing for a Teleport instance. + +Teleport leverages [OpenTelemetry](https://opentelemetry.io/) to generate traces +and export them to any [OpenTelemetry Protocol (OTLP)](https://opentelemetry.io/docs/reference/specification/protocol/otlp/) +capable exporter. In the event that your telemetry backend doesn't support receiving OTLP traces, you may be able to +leverage the [OpenTelemetry Collector](https://opentelemetry.io/docs/collector/) to proxy traces from OTLP +to a format that your telemetry backend accepts. + +## Configure Teleport + +In order to enable tracing for a `teleport` instance, add the following section to that instance's configuration file (`/etc/teleport.yaml`). +For a detailed description of these configuration fields, see the [configuration reference](../reference/config.mdx) page. + +```yaml +tracing_service: + enabled: yes + exporter_url: grpc://collector.example.com:4317 + sampling_rate_per_million: 1000000 +``` + +### Sampling rate + +It is important to choose the sampling rate wisely. Sampling at a rate of 100% could have a negative impact on the +performance of your cluster. Teleport honors the sampling rate included in any incoming requests, which means +that even when the `tracing_service` is enabled and the sampling rate is 0, if Teleport receives a request that has a span which is +sampled, then Teleport will sample and export all spans that are generated in response to that request. + +### Exporter URL + +The `exporter_url` setting indicates where Teleport should send spans to. Supported schemes are `grpc://`, `http://`, +`https://`, and `file://` (if no scheme is provided, then `grpc://` is used). + +When using `file://`, the url must be a path to a directory that Teleport has write permissions for. Spans will be saved to files within +the provided directory, each file containing one proto encoded span per line. Files are rotated after exceeding 100MB, in order to +override the default limit add `?limit=` to the `exporter_url` (i.e. `file:///var/lib/teleport/traces?limit=100`). + +By default the connection to the exporter is insecure, to support TLS add the following to the `tracing_service` configuration: + +```yaml + # Optional path to CA certificates are used to validate the exporter. + ca_certs: + - /var/lib/teleport/exporter_ca.pem + # Optional path tp TLS certificates are used to enable mTLS for the exporter + https_keypairs: + - key_file: /var/lib/teleport/exporter_key.pem + cert_file: /var/lib/teleport/exporter_cert.pem +```` + +After updating `teleport.yaml`, start your `teleport` instance to apply the new configuration. + +## tsh + +To capture traces from `tsh` add the `--trace` flag to your command. All traces generated by `tsh --trace` will be +proxied to the `exporter_url` defined for the Auth Service of the cluster the command is being run on. + +```code +$ tsh --trace ssh root@myserver +$ tsh --trace ls +``` + +Exporting traces from `tsh` to a different exporter than the one defined in the Auth Service config +is also possible via the `--trace-exporter` flag. A URL must be provided that adheres to the same +format as the `exporter_url` of the `tracing_service`. + +```code +$ tsh --trace --trace-exporter=grpc://collector.example.com:4317 ssh root@myserver +$ tsh --trace --trace-exporter=file:///var/lib/teleport/traces ls +``` + +## Collecting profiles + +How to collect runtime profiling data from a Teleport instance. + +Teleport leverages Go's diagnostic capabilities to collect and export +profiling data. Profiles can help identify the cause of spikes in CPU, +the source of memory leaks, or the reason for a deadlock. + +## Using the Debug Service + +The Teleport Debug Service enables administrators to collect diagnostic profiles +without enabling pprof endpoints at startup. The service, enabled by default, +ensures local-only access and must be consumed from inside the same instance. + +`teleport debug profile` collects a list of pprof profiles. It outputs a +compressed tarball (`.tar.gz`) to STDOUT. You decompress it using `tar` or +direct the result to a file. + +By default, it collects `goroutine`, `heap` and `profile` profiles. + +Each profile collected will have a correspondent file inside the tarball. For +example, collecting `goroutine,trace,heap` will result in `goroutine.pprof`, +`trace.pprof`, and `heap.pprof` files. + +```code +# Collect default profiles and save to a file. +$ teleport debug profile > pprof.tar.gz +$ tar xvf pprof.tar.gz + +# Collect default profiles and decompress it. +$ teleport debug profile | tar xzv -C ./ + +# Collect "trace" and "mutex" profiles and save to a file. +$ teleport debug profile trace,mutex > pprof.tar.gz + +# Collect profiles setting the profiling time in seconds +$ teleport debug profile -s 20 trace > pprof.tar.gz +``` + +(!docs/pages/includes/diagnostics/teleport-debug-config.mdx!) + +If you're running Teleport on a Kubernetes cluster you can directly collect +profiles to a local directory without an interactive session: + +```code +$ kubectl -n teleport exec my-pod -- teleport debug profile > pprof.tar.gz +``` + +After extracting the contents, you can use `go tool` commands to explore and +visualize them: + +```code +# Opens the terminal interactive explorer +$ go tool pprof heap.pprof + +# Opens the web visualizer +$ go tool pprof -http : heap.pprof + +# Visualize trace profiles +$ go tool trace trace.pprof +``` + +## Using diagnostics endpoints + +The profiling endpoint is only enabled if the `--debug` flag is supplied. + +(!docs/pages/includes/diagnostics/diag-addr-prereqs-tabs.mdx flags="--debug" !) + +### Collecting profiles + +Go's standard profiling endpoints are served at `http://127.0.0.1:3000/debug/pprof/`. +Retrieving a profile requires sending a request to the endpoint corresponding +to the desired profile type. When debugging an issue it is helpful to collect +a series of profiles over a period of time. + +#### CPU +CPU profile show execution statistics gathered over a user specified period: + +``` code +# Download the profile into a file: +$ curl -o cpu.profile http://127.0.0.1:3000/debug/pprof/profile?seconds=30 + +# Visualize the profile +$ go tool pprof -http : cpu.profile +``` + +#### Goroutine + +Goroutine profiles show the stack traces for all running goroutines in the system: + +``` code +# Download the profile into a file: +$ curl -o goroutine.profile http://127.0.0.1:3000/debug/pprof/goroutine + +# Visualize the profile +$ go tool pprof -http : goroutine.profile +``` + +#### Heap + +Heap profiles show allocated objects in the system: + +```code +# Download the profile into a file: +$ curl -o heap.profile http://127.0.0.1:3000/debug/pprof/heap + +# Visualize the profile +$ go tool pprof -http : heap.profile +``` + +#### Trace + +Trace profiles capture scheduling, system calls, garbage collections, heap size, and other events that are collected by the Go runtime +over a user specified period of time: + +```code +# Download the profile into a file: +$ curl -o trace.out http://127.0.0.1:3000/debug/pprof/trace?seconds=5 + +# Visualize the profile +$ go tool trace trace.out +``` + +## Further Reading + +- More information about diagnostics in the Go ecosystem: https://go.dev/doc/diagnostics +- Go's profiling endpoints: https://golang.org/pkg/net/http/pprof/ +- A deep dive on profiling Go programs: https://go.dev/blog/pprof + From 22c01dc5adecdc48fae58314c3bb8f41907019d1 Mon Sep 17 00:00:00 2001 From: Steven Martin Date: Fri, 2 Aug 2024 12:51:59 -0400 Subject: [PATCH 046/139] docs: include apps in locking description (#44970) Co-authored-by: Steven Martin --- docs/pages/access-controls/guides/locking.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/pages/access-controls/guides/locking.mdx b/docs/pages/access-controls/guides/locking.mdx index 02d67087d10d6..cf2cd01c65eec 100644 --- a/docs/pages/access-controls/guides/locking.mdx +++ b/docs/pages/access-controls/guides/locking.mdx @@ -8,7 +8,7 @@ prevent access during cluster maintenance—by placing a lock on a session, user or host identity. Teleport will reject new API requests and terminate active -connections to SSH, database, desktop, and Kubernetes sessions +connections to SSH, application, database, desktop, and Kubernetes sessions matching the lock's target. A lock can target the following objects or attributes: From 99d70cadb03cf22ccd731571bf0f23f1bb0d7a20 Mon Sep 17 00:00:00 2001 From: Paul Gottschling Date: Fri, 2 Aug 2024 13:03:43 -0400 Subject: [PATCH 047/139] Add OneLogin entity descriptor URL instructions (#44946) Closes #24803 Show how to include the entity descriptor URL for OneLogin when configuring the authentication connector. In `tctl sso configure`, the flag is the same if you are using a URL or a local file. The current guide includes a separate H3 for downloading the XML file. This change uses a single set of numbered steps to make the instructions easier to follow. --- docs/pages/access-controls/sso/one-login.mdx | 91 +++++++++++--------- 1 file changed, 49 insertions(+), 42 deletions(-) diff --git a/docs/pages/access-controls/sso/one-login.mdx b/docs/pages/access-controls/sso/one-login.mdx index dc18423316adc..71ad9a6070eca 100644 --- a/docs/pages/access-controls/sso/one-login.mdx +++ b/docs/pages/access-controls/sso/one-login.mdx @@ -25,69 +25,76 @@ to define policies like: ## Step 1/3. Create Teleport application in OneLogin -In the OneLogin control panel's main menu navigate to **Applications** -> -**Add App**. Using the search box, select "SAML Custom Connector (SP Shibboleth)": +1. In the OneLogin control panel's main menu navigate to **Applications** -> + **Add App**. Using the search box, select "SAML Custom Connector (SP + Shibboleth)": -![SAML Custom Connector (SP Shibboleth)](../../../img/sso/onelogin/onelogin-saml-1.png) + ![SAML Custom Connector (SP Shibboleth)](../../../img/sso/onelogin/onelogin-saml-1.png) -Define the new application: +1. Define the new application: -![SAML Config](../../../img/sso/onelogin/onelogin-saml-1a.png) + ![SAML Config](../../../img/sso/onelogin/onelogin-saml-1a.png) -You can find Teleport icons to upload from the following links: + You can find Teleport icons to upload from the following links: -- [Square Icon](../../../img/sso/onelogin/teleport.png) -- [Rectangular Icon](../../../img/sso/onelogin/teleportlogo@2x.png) + - [Square Icon](../../../img/sso/onelogin/teleport.png) + - [Rectangular Icon](../../../img/sso/onelogin/teleportlogo@2x.png) -From the application's **Configuration** page, set the following values: +1. From the application's **Configuration** page, set the following values: - -Set -here with your Teleport Proxy Service address and port, or Teleport Enterprise -Cloud tenant (e.g. `company.teleport.sh:443`) to fill out the values below. - + + Set + here with your Teleport Proxy Service address and port, or Teleport Enterprise + Cloud tenant (e.g. `company.teleport.sh:443`) to fill out the values below. + + + - **Login URL**: + - `https://``/web/login` + - **ACS (Consumer) URL**, **SAML Recipient**, **ACS (Consumer) URL Validator**, & **Audience**: + - `https://``/v1/webapi/saml/acs/onelogin` -- **Login URL**: - - `https://``/web/login` -- **ACS (Consumer) URL**, **SAML Recipient**, **ACS (Consumer) URL Validator**, & **Audience**: - - `https://``/v1/webapi/saml/acs/onelogin` + ![Configure SAML](../../../img/sso/onelogin/onelogin-saml-2.png) -![Configure SAML](../../../img/sso/onelogin/onelogin-saml-2.png) +1. Teleport needs to assign groups to users. From the **Parameters** page, + configure the application with some parameters exposed as SAML attribute + statements: -Teleport needs to assign groups to users. From the **Parameters** page, configure -the application with some parameters exposed as SAML attribute statements: + ![New Field](../../../img/sso/onelogin/onelogin-saml-3.png) + + ![New Field Group](../../../img/sso/onelogin/onelogin-saml-4.png) + + + Make sure to check `Include in SAML assertion` checkbox. + -![New Field](../../../img/sso/onelogin/onelogin-saml-3.png) +1. Add users to the application: -![New Field Group](../../../img/sso/onelogin/onelogin-saml-4.png) + ![Add User](../../../img/sso/onelogin/onelogin-saml-5.png) - - Make sure to check `Include in SAML assertion` checkbox. - +1. Obtain SAML metadata for your authentication connector. Once the application + is set up, navigate to the the **More Actions** menu and find the **SAML + Metadata** option: -Add users to the application: + ![Download XML](../../../img/sso/onelogin/saml-download.png) -![Add User](../../../img/sso/onelogin/onelogin-saml-5.png) - -### Download SAML XML metadata - -Once the application is set up, download `SAML Metadata` from the -**More Actions** menu: - -![Download XML](../../../img/sso/onelogin/saml-download.png) + You can either left-click the option and download the XML document as a local + file or right-click the option and copy the link address. The Teleport Auth + Service either reads the provided document or queries the address to obtain + SAML metadata. We recommend copying the address so the Auth Service can use + the most up-to-date information. ## Step 2/3. Create a SAML connector -Create a SAML connector using `tctl`. Update - with the path to the XML metadata -file downloaded in the previous step: +Create a SAML connector using `tctl`. Update to the URL +of the XML document that you copied in the previous step. If you downloaded the +XML document instead, use the path to the XML metadata file: ```code $ tctl sso configure saml --preset onelogin \ ---entity-descriptor \ +--entity-descriptor \ --attributes-to-roles groups,admin,editor \ --attributes-to-roles groups,dev,access > onelogin.yaml ``` From 55d9237b603d71d8df190d64faf5cf44d70b0d18 Mon Sep 17 00:00:00 2001 From: Zac Bergquist Date: Fri, 2 Aug 2024 11:23:20 -0600 Subject: [PATCH 048/139] [v16] Update TeleportGearIcon with new logo (#45003) * Update TeleportGearIcon with new logo * Fix SVG attributes --- .../design/src/SVGIcon/TeleportGearIcon.tsx | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/web/packages/design/src/SVGIcon/TeleportGearIcon.tsx b/web/packages/design/src/SVGIcon/TeleportGearIcon.tsx index 66fc90d5b237b..2c58ed8e54a66 100644 --- a/web/packages/design/src/SVGIcon/TeleportGearIcon.tsx +++ b/web/packages/design/src/SVGIcon/TeleportGearIcon.tsx @@ -33,9 +33,18 @@ export function TeleportGearIcon({ size = 16 }: Omit) { } return ( - - - + + + + ); From 4dbb792a4ca62d7cf5c75aa64a7ea98c0d96b326 Mon Sep 17 00:00:00 2001 From: Hugo Shaka Date: Fri, 2 Aug 2024 13:26:31 -0400 Subject: [PATCH 049/139] fix errors.As() panic in msteams plugin (#45011) --- integrations/access/msteams/msapi/graph_client.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/integrations/access/msteams/msapi/graph_client.go b/integrations/access/msteams/msapi/graph_client.go index 4c7c66da889ee..0b142b0d9242e 100644 --- a/integrations/access/msteams/msapi/graph_client.go +++ b/integrations/access/msteams/msapi/graph_client.go @@ -101,8 +101,8 @@ func (e graphError) Error() string { // GetErrorCode returns the func GetErrorCode(err error) string { - var graphErr *graphError - ok := errors.As(err, graphErr) + var graphErr graphError + ok := errors.As(err, &graphErr) if !ok { return "" } From cfdcc0226c9e35daae474b059611694d523ce0b0 Mon Sep 17 00:00:00 2001 From: Tim Buckley Date: Fri, 2 Aug 2024 11:44:19 -0600 Subject: [PATCH 050/139] Machine ID: Document 24h TTL limit and warn when exceeded (#44989) This adds some notes to the Machine ID docs explaining that a TTL limit exists, and an explanation in the FAQ explaining why. It also adds a logged warning on bot startup if the TTL request exceeds the server limit. Fixes https://github.com/gravitational/teleport/issues/44894 --- .../pages/enroll-resources/machine-id/faq.mdx | 20 ++++++++++++++++++- .../machine-id/reference/configuration.mdx | 3 ++- lib/tbot/config/config.go | 9 +++++++++ 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/docs/pages/enroll-resources/machine-id/faq.mdx b/docs/pages/enroll-resources/machine-id/faq.mdx index 48b6099956cb8..49d2ae61b5390 100644 --- a/docs/pages/enroll-resources/machine-id/faq.mdx +++ b/docs/pages/enroll-resources/machine-id/faq.mdx @@ -69,4 +69,22 @@ credentials produced by Machine ID from being used to connect to resources. As a work-around, configure Device Trust enforcement on a role-by-role basis and ensure that it is not required for roles that you will impersonate using -Machine ID. \ No newline at end of file +Machine ID. + +## Can Machine ID be used to generate long-lived certificates? + +Machine ID cannot currently be used to generate certificates valid for longer +than 24 hours, and requests for longer certificates using the `certificate_ttl` +parameter will be reduced to this 24 hour limit. + +This limit serves multiple purposes. For one, it encourages security best +practices by only ever issuing very short lived certificates. Additionally, as +Machine ID allows for certificate renewal, this limit helps to prevent further +exploitation should a Machine ID identity be compromised: an attacker could use +a stolen renewable certificate to request very long lived certificates and +maintain access for a much longer period. + +If your use case absolutely requires long-lived certificates, +[`tctl auth sign`](../../reference/cli/tctl.mdx#tctl-auth-sign) can +alternatively be used, however this loses the security benefits of Machine ID's +short-lived renewable certificates. diff --git a/docs/pages/enroll-resources/machine-id/reference/configuration.mdx b/docs/pages/enroll-resources/machine-id/reference/configuration.mdx index 52c03b4dec839..ed64c25c775e0 100644 --- a/docs/pages/enroll-resources/machine-id/reference/configuration.mdx +++ b/docs/pages/enroll-resources/machine-id/reference/configuration.mdx @@ -49,6 +49,7 @@ proxy_server: "teleport.example.com:443" # or "example.teleport.sh:443" for Tele # certificate_ttl specifies how long certificates generated by `tbot` should # live for. It should be a positive, numeric value with an `m` (for minutes) or # `h` (for hours) suffix. By default, this value is `1h`. +# This has a maximum value of `24h`. certificate_ttl: "1h" # renewal_interval specifies how often `tbot` should aim to renew the @@ -703,7 +704,7 @@ appropriate. #### `directory` The `directory` destination type stores artifacts as files in a specified -directory. +directory. ```yaml # type specifies the type of the destination. For the directory destination, diff --git a/lib/tbot/config/config.go b/lib/tbot/config/config.go index bebde8968c81c..bb4ca66d35449 100644 --- a/lib/tbot/config/config.go +++ b/lib/tbot/config/config.go @@ -445,6 +445,15 @@ func (conf *BotConfig) CheckAndSetDefaults() error { ) } + if conf.CertificateTTL > defaults.MaxRenewableCertTTL { + log.WarnContext( + context.TODO(), + "Requested certificate TTL exceeds the maximum TTL allowed and will likely be reduced by the Teleport server", + "requested_ttl", conf.CertificateTTL, + "maximum_ttl", defaults.MaxRenewableCertTTL, + ) + } + return nil } From 16b345f61f873b2ab0d11eeb094ce994232392f0 Mon Sep 17 00:00:00 2001 From: Michelle Bergquist <11967646+michellescripts@users.noreply.github.com> Date: Fri, 2 Aug 2024 12:02:31 -0600 Subject: [PATCH 051/139] [v16] entitlements (#44892) * Surface Cloud Entitlements (#42394) - Cloud entitlements are now available on Features - Legacy logic applies if entitlements are not present * Surface entitlements to auth (#42932) * Surface entitlements to webCfg & UI (#43622) * Type the UI entitlements to match the response (#44329) * leverage entitlements instead of legacy feature fields (#44627) * Harden backwards compatibility for entitlements (#44783) * resolve branch issues * Update AccessList Entitlement Enforcement to handle infinite limit (#44318) * Update AccessList Entitlement Enforcement to handle infinite limit The AccessList service was not correctly handling a zero-value limit (i.e. an infinite limit) when checking to see if creating an AccessList would breach the cluster Access List entitlement. This patch: * Adds a centralized implementation of a limit check, so that we only have to get the calculation right once. * Tests for same * Updates the AccessList limit check to use the new limit check * Adds table-driven tests to exercise the limit check in various scenarios, replacing several almost identical tests. * Review feedback --------- Co-authored-by: Trent Clarke --- api/client/proto/authservice.pb.go | 2798 ++++++++++------- api/client/webclient/webconfig.go | 50 +- .../legacy/client/proto/authservice.proto | 44 +- api/types/license.go | 33 +- entitlements/entitlements.go | 58 + integration/appaccess/appaccess_test.go | 5 +- integration/db/db_integration_test.go | 7 +- integration/hsm/hsm_test.go | 5 +- integration/kube_integration_test.go | 5 +- .../proxy/proxy_tunnel_strategy_test.go | 7 +- integrations/access/accesslist/app_test.go | 5 +- .../operator/controllers/resources/setup.go | 11 +- .../controllers/resources/testlib/env.go | 7 +- .../terraform/testlib/device_trust_test.go | 9 +- .../terraform/testlib/loginrule_test.go | 12 +- .../terraform/testlib/oidc_connector_test.go | 26 +- .../terraform/testlib/saml_connector_test.go | 14 +- lib/auth/access_request_test.go | 5 +- lib/auth/auth.go | 43 +- lib/auth/auth_with_roles.go | 17 +- .../clusterconfig/clusterconfigv1/service.go | 3 +- .../clusterconfigv1/service_test.go | 9 +- lib/auth/db.go | 5 +- lib/auth/desktop.go | 3 +- lib/auth/desktop_test.go | 5 +- lib/auth/grpcserver_test.go | 15 +- lib/auth/kube_test.go | 5 +- lib/auth/sessions.go | 7 +- lib/auth/usage_test.go | 21 +- lib/auth/userloginstate/generator_test.go | 7 +- .../externalauditstorage/configurator.go | 3 +- .../externalauditstorage/configurator_test.go | 31 +- lib/kube/proxy/forwarder.go | 16 +- lib/kube/proxy/forwarder_test.go | 13 +- lib/kube/proxy/moderated_sessions_test.go | 13 +- lib/kube/proxy/utils_testing.go | 9 +- lib/modules/modules.go | 318 +- lib/modules/modules_test.go | 197 ++ lib/service/kubernetes.go | 6 +- lib/service/service_test.go | 7 +- lib/services/local/access_list.go | 15 +- lib/services/local/access_list_test.go | 377 ++- lib/srv/db/access_test.go | 5 +- lib/srv/discovery/access_graph.go | 5 +- lib/web/apiserver.go | 145 +- lib/web/apiserver_test.go | 593 +++- tool/tctl/common/admin_action_test.go | 7 +- tool/tctl/common/edit_command_test.go | 7 +- tool/tctl/common/resource_command_test.go | 7 +- tool/teleport/testenv/test_server.go | 9 +- tool/tsh/common/access_request_test.go | 5 +- tool/tsh/common/db_test.go | 5 +- tool/tsh/common/hardware_key_test.go | 5 +- tool/tsh/common/kube_test.go | 5 +- tool/tsh/common/tsh_test.go | 9 +- .../src/Sessions/Sessions.story.test.tsx | 3 +- .../Sessions.story.test.tsx.snap | 2 +- .../teleport/src/Sessions/useSessions.ts | 2 +- .../src/Support/Support.story.test.tsx | 1 - .../__snapshots__/Support.story.test.tsx.snap | 2 +- web/packages/teleport/src/config.ts | 41 +- web/packages/teleport/src/entitlement.ts | 72 + .../teleport/src/services/sales/index.ts | 8 +- .../src/services/storageService/types.ts | 2 +- web/packages/teleport/src/teleportContext.tsx | 15 +- 65 files changed, 3431 insertions(+), 1770 deletions(-) create mode 100644 entitlements/entitlements.go create mode 100644 web/packages/teleport/src/entitlement.ts diff --git a/api/client/proto/authservice.pb.go b/api/client/proto/authservice.pb.go index 34aa03b4ba113..cf70d87f7c8dd 100644 --- a/api/client/proto/authservice.pb.go +++ b/api/client/proto/authservice.pb.go @@ -450,7 +450,7 @@ func (x DatabaseCertRequest_Requester) String() string { } func (DatabaseCertRequest_Requester) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{75, 0} + return fileDescriptor_0ffcffcda38ae159, []int{76, 0} } // Extensions are the extensions to add to the certificate. @@ -478,7 +478,7 @@ func (x DatabaseCertRequest_Extensions) String() string { } func (DatabaseCertRequest_Extensions) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{75, 1} + return fileDescriptor_0ffcffcda38ae159, []int{76, 1} } // Watch specifies watch parameters @@ -2061,34 +2061,31 @@ func (m *PingResponse) GetLoadAllCAs() bool { // Features are auth server features. type Features struct { // Kubernetes enables Kubernetes Access product + // Deprecated remove in v18; leverage entitlements Kubernetes bool `protobuf:"varint,1,opt,name=Kubernetes,proto3" json:"kubernetes"` // App enables Application Access product + // Deprecated remove in v18; leverage entitlements App bool `protobuf:"varint,2,opt,name=App,proto3" json:"app"` // DB enables database access product + // Deprecated remove in v18; leverage entitlements DB bool `protobuf:"varint,3,opt,name=DB,proto3" json:"db"` // OIDC enables OIDC connectors + // Deprecated remove in v18; leverage entitlements OIDC bool `protobuf:"varint,4,opt,name=OIDC,proto3" json:"oidc"` // SAML enables SAML connectors + // Deprecated remove in v18; leverage entitlements SAML bool `protobuf:"varint,5,opt,name=SAML,proto3" json:"saml"` // AccessControls enables FIPS access controls AccessControls bool `protobuf:"varint,6,opt,name=AccessControls,proto3" json:"access_controls"` - // Currently this flag is to gate actions from OSS clusters. - // - // Determining support for access request is currently determined by: - // 1) Enterprise + [Features.IdentityGovernanceSecurity] == true, new flag - // introduced with Enterprise Usage Based (EUB) product. - // 2) Enterprise + [Features.IsUsageBasedBilling] == false, legacy support - // where before EUB, it was unlimited. - // - // AdvancedAccessWorkflows is currently set to true for all - // enterprise editions (team, cloud, on-prem). Historically, access request - // was only available for enterprise cloud and enterprise on-prem. + // AdvancedAccessWorkflows is currently set to the value of the Cloud AccessRequests entitlement AdvancedAccessWorkflows bool `protobuf:"varint,7,opt,name=AdvancedAccessWorkflows,proto3" json:"advanced_access_workflows"` // Cloud enables some cloud-related features Cloud bool `protobuf:"varint,8,opt,name=Cloud,proto3" json:"cloud"` // HSM enables PKCS#11 HSM support + // Deprecated remove in v18; leverage entitlements HSM bool `protobuf:"varint,9,opt,name=HSM,proto3" json:"hsm"` // Desktop enables desktop access product + // Deprecated remove in v18; leverage entitlements Desktop bool `protobuf:"varint,10,opt,name=Desktop,proto3" json:"desktop"` // RecoveryCodes enables recovery codes RecoveryCodes bool `protobuf:"varint,14,opt,name=RecoveryCodes,proto3" json:"recovery_codes"` @@ -2099,17 +2096,22 @@ type Features struct { // IsUsageBased enables some usage-based billing features IsUsageBased bool `protobuf:"varint,17,opt,name=IsUsageBased,proto3" json:"is_usage_based"` // Assist enables the Assistant feature + // Deprecated remove in v18; leverage entitlements Assist bool `protobuf:"varint,18,opt,name=Assist,proto3" json:"assist"` // DeviceTrust holds its namesake feature settings. + // Deprecated remove in v18; leverage entitlements DeviceTrust *DeviceTrustFeature `protobuf:"bytes,19,opt,name=DeviceTrust,proto3" json:"device_trust,omitempty"` // FeatureHiding enables hiding features from being discoverable for users who don't have the necessary permissions. + // Deprecated remove in v18; leverage entitlements FeatureHiding bool `protobuf:"varint,20,opt,name=FeatureHiding,proto3" json:"feature_hiding,omitempty"` // AccessRequests holds its namesake feature settings. + // Deprecated remove in v18; leverage entitlements AccessRequests *AccessRequestsFeature `protobuf:"bytes,21,opt,name=AccessRequests,proto3" json:"access_requests,omitempty"` // CustomTheme holds the name of WebUI custom theme. CustomTheme string `protobuf:"bytes,22,opt,name=CustomTheme,proto3" json:"custom_theme,omitempty"` // IdentityGovernance indicates whether IGS related features are enabled: // access list, access request, access monitoring, device trust. + // Deprecated remove in v18; leverage entitlements IdentityGovernance bool `protobuf:"varint,23,opt,name=IdentityGovernance,proto3" json:"identity_governance,omitempty"` // AccessGraph enables the usage of access graph. // NOTE: this is a legacy flag that is currently used to signal @@ -2118,29 +2120,41 @@ type Features struct { // TODO(justinas): remove this field once "TAG enabled" status is moved to a resource in the backend. AccessGraph bool `protobuf:"varint,24,opt,name=AccessGraph,proto3" json:"access_graph,omitempty"` // AccessListFeature holds its namesake feature settings. + // Deprecated remove in v18; leverage entitlements AccessList *AccessListFeature `protobuf:"bytes,25,opt,name=AccessList,proto3" json:"access_list,omitempty"` // AccessMonitoringFeature holds its namesake feature settings. + // Deprecated remove in v18; leverage entitlements for access and AccessMonitoringConfigured for enabled AccessMonitoring *AccessMonitoringFeature `protobuf:"bytes,26,opt,name=AccessMonitoring,proto3" json:"access_monitoring,omitempty"` // ProductType describes the product being used. ProductType ProductType `protobuf:"varint,27,opt,name=ProductType,proto3,enum=proto.ProductType" json:"product_type,omitempty"` // Policy enables the Teleport Policy feature set. // At the time of writing, this includes Teleport Access Graph (TAG). + // Deprecated remove in v18; leverage entitlements Policy *PolicyFeature `protobuf:"bytes,28,opt,name=Policy,proto3" json:"policy,omitempty"` // Questionnaire indicates whether cluster users should get an onboarding questionnaire Questionnaire bool `protobuf:"varint,29,opt,name=Questionnaire,proto3" json:"questionnaire,omitempty"` // IsStripeManaged indicates if the cluster billing is managed via Stripe IsStripeManaged bool `protobuf:"varint,30,opt,name=IsStripeManaged,proto3" json:"is_stripe_managed,omitempty"` // ExternalAuditStorage indicates whether the EAS feature is enabled in the cluster. + // Deprecated remove in v18; leverage entitlements ExternalAuditStorage bool `protobuf:"varint,31,opt,name=ExternalAuditStorage,proto3" json:"external_audit_storage,omitempty"` // SupportType indicates the type of the customer's support SupportType SupportType `protobuf:"varint,32,opt,name=SupportType,proto3,enum=proto.SupportType" json:"support_type,omitempty"` // JoinActiveSessions indicates whether joining active sessions via web UI is enabled + // Deprecated remove in v18; leverage entitlements JoinActiveSessions bool `protobuf:"varint,33,opt,name=JoinActiveSessions,proto3" json:"join_active_sessions,omitempty"` // MobileDeviceManagement indicates whether endpoint management (like Jamf Plugin) can be used in the cluster - MobileDeviceManagement bool `protobuf:"varint,34,opt,name=MobileDeviceManagement,proto3" json:"mobile_device_management,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + // Deprecated remove in v18; leverage entitlements + MobileDeviceManagement bool `protobuf:"varint,34,opt,name=MobileDeviceManagement,proto3" json:"mobile_device_management,omitempty"` + // entitlements define a customer’s access to a specific features + Entitlements map[string]*EntitlementInfo `protobuf:"bytes,35,rep,name=entitlements,proto3" json:"entitlements,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // AccessMonitoringConfigured contributes to the enablement of access monitoring. + // NOTE: this flag is used to signal that Access Monitoring is *enabled* on a cluster. + // *Access* to the feature is gated on the `AccessMonitoring` entitlement. + AccessMonitoringConfigured bool `protobuf:"varint,36,opt,name=AccessMonitoringConfigured,proto3" json:"AccessMonitoringConfigured,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *Features) Reset() { *m = Features{} } @@ -2393,6 +2407,78 @@ func (m *Features) GetMobileDeviceManagement() bool { return false } +func (m *Features) GetEntitlements() map[string]*EntitlementInfo { + if m != nil { + return m.Entitlements + } + return nil +} + +func (m *Features) GetAccessMonitoringConfigured() bool { + if m != nil { + return m.AccessMonitoringConfigured + } + return false +} + +// EntitlementInfo is the state and limits of a particular entitlement +type EntitlementInfo struct { + // enabled indicates the feature is 'on' if true + Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"` + // limit indicates the allotted amount of use when limited + Limit int32 `protobuf:"varint,2,opt,name=limit,proto3" json:"limit,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *EntitlementInfo) Reset() { *m = EntitlementInfo{} } +func (m *EntitlementInfo) String() string { return proto.CompactTextString(m) } +func (*EntitlementInfo) ProtoMessage() {} +func (*EntitlementInfo) Descriptor() ([]byte, []int) { + return fileDescriptor_0ffcffcda38ae159, []int{20} +} +func (m *EntitlementInfo) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *EntitlementInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_EntitlementInfo.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *EntitlementInfo) XXX_Merge(src proto.Message) { + xxx_messageInfo_EntitlementInfo.Merge(m, src) +} +func (m *EntitlementInfo) XXX_Size() int { + return m.Size() +} +func (m *EntitlementInfo) XXX_DiscardUnknown() { + xxx_messageInfo_EntitlementInfo.DiscardUnknown(m) +} + +var xxx_messageInfo_EntitlementInfo proto.InternalMessageInfo + +func (m *EntitlementInfo) GetEnabled() bool { + if m != nil { + return m.Enabled + } + return false +} + +func (m *EntitlementInfo) GetLimit() int32 { + if m != nil { + return m.Limit + } + return 0 +} + // DeviceTrustFeature holds the Device Trust feature general and usage-based // settings. // Limits have no affect if [Features.IdentityGovernance] is enabled. @@ -2417,7 +2503,7 @@ func (m *DeviceTrustFeature) Reset() { *m = DeviceTrustFeature{} } func (m *DeviceTrustFeature) String() string { return proto.CompactTextString(m) } func (*DeviceTrustFeature) ProtoMessage() {} func (*DeviceTrustFeature) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{20} + return fileDescriptor_0ffcffcda38ae159, []int{21} } func (m *DeviceTrustFeature) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2476,7 +2562,7 @@ func (m *AccessRequestsFeature) Reset() { *m = AccessRequestsFeature{} } func (m *AccessRequestsFeature) String() string { return proto.CompactTextString(m) } func (*AccessRequestsFeature) ProtoMessage() {} func (*AccessRequestsFeature) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{21} + return fileDescriptor_0ffcffcda38ae159, []int{22} } func (m *AccessRequestsFeature) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2527,7 +2613,7 @@ func (m *AccessListFeature) Reset() { *m = AccessListFeature{} } func (m *AccessListFeature) String() string { return proto.CompactTextString(m) } func (*AccessListFeature) ProtoMessage() {} func (*AccessListFeature) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{22} + return fileDescriptor_0ffcffcda38ae159, []int{23} } func (m *AccessListFeature) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2579,7 +2665,7 @@ func (m *AccessMonitoringFeature) Reset() { *m = AccessMonitoringFeature func (m *AccessMonitoringFeature) String() string { return proto.CompactTextString(m) } func (*AccessMonitoringFeature) ProtoMessage() {} func (*AccessMonitoringFeature) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{23} + return fileDescriptor_0ffcffcda38ae159, []int{24} } func (m *AccessMonitoringFeature) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2635,7 +2721,7 @@ func (m *PolicyFeature) Reset() { *m = PolicyFeature{} } func (m *PolicyFeature) String() string { return proto.CompactTextString(m) } func (*PolicyFeature) ProtoMessage() {} func (*PolicyFeature) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{24} + return fileDescriptor_0ffcffcda38ae159, []int{25} } func (m *PolicyFeature) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2684,7 +2770,7 @@ func (m *DeleteUserRequest) Reset() { *m = DeleteUserRequest{} } func (m *DeleteUserRequest) String() string { return proto.CompactTextString(m) } func (*DeleteUserRequest) ProtoMessage() {} func (*DeleteUserRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{25} + return fileDescriptor_0ffcffcda38ae159, []int{26} } func (m *DeleteUserRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2732,7 +2818,7 @@ func (m *Semaphores) Reset() { *m = Semaphores{} } func (m *Semaphores) String() string { return proto.CompactTextString(m) } func (*Semaphores) ProtoMessage() {} func (*Semaphores) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{26} + return fileDescriptor_0ffcffcda38ae159, []int{27} } func (m *Semaphores) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2789,7 +2875,7 @@ func (m *AuditStreamRequest) Reset() { *m = AuditStreamRequest{} } func (m *AuditStreamRequest) String() string { return proto.CompactTextString(m) } func (*AuditStreamRequest) ProtoMessage() {} func (*AuditStreamRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{27} + return fileDescriptor_0ffcffcda38ae159, []int{28} } func (m *AuditStreamRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2914,7 +3000,7 @@ func (m *AuditStreamStatus) Reset() { *m = AuditStreamStatus{} } func (m *AuditStreamStatus) String() string { return proto.CompactTextString(m) } func (*AuditStreamStatus) ProtoMessage() {} func (*AuditStreamStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{28} + return fileDescriptor_0ffcffcda38ae159, []int{29} } func (m *AuditStreamStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2962,7 +3048,7 @@ func (m *CreateStream) Reset() { *m = CreateStream{} } func (m *CreateStream) String() string { return proto.CompactTextString(m) } func (*CreateStream) ProtoMessage() {} func (*CreateStream) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{29} + return fileDescriptor_0ffcffcda38ae159, []int{30} } func (m *CreateStream) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3013,7 +3099,7 @@ func (m *ResumeStream) Reset() { *m = ResumeStream{} } func (m *ResumeStream) String() string { return proto.CompactTextString(m) } func (*ResumeStream) ProtoMessage() {} func (*ResumeStream) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{30} + return fileDescriptor_0ffcffcda38ae159, []int{31} } func (m *ResumeStream) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3068,7 +3154,7 @@ func (m *CompleteStream) Reset() { *m = CompleteStream{} } func (m *CompleteStream) String() string { return proto.CompactTextString(m) } func (*CompleteStream) ProtoMessage() {} func (*CompleteStream) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{31} + return fileDescriptor_0ffcffcda38ae159, []int{32} } func (m *CompleteStream) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3108,7 +3194,7 @@ func (m *FlushAndCloseStream) Reset() { *m = FlushAndCloseStream{} } func (m *FlushAndCloseStream) String() string { return proto.CompactTextString(m) } func (*FlushAndCloseStream) ProtoMessage() {} func (*FlushAndCloseStream) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{32} + return fileDescriptor_0ffcffcda38ae159, []int{33} } func (m *FlushAndCloseStream) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3150,7 +3236,7 @@ func (m *UpsertApplicationServerRequest) Reset() { *m = UpsertApplicatio func (m *UpsertApplicationServerRequest) String() string { return proto.CompactTextString(m) } func (*UpsertApplicationServerRequest) ProtoMessage() {} func (*UpsertApplicationServerRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{33} + return fileDescriptor_0ffcffcda38ae159, []int{34} } func (m *UpsertApplicationServerRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3203,7 +3289,7 @@ func (m *DeleteApplicationServerRequest) Reset() { *m = DeleteApplicatio func (m *DeleteApplicationServerRequest) String() string { return proto.CompactTextString(m) } func (*DeleteApplicationServerRequest) ProtoMessage() {} func (*DeleteApplicationServerRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{34} + return fileDescriptor_0ffcffcda38ae159, []int{35} } func (m *DeleteApplicationServerRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3266,7 +3352,7 @@ func (m *DeleteAllApplicationServersRequest) Reset() { *m = DeleteAllApp func (m *DeleteAllApplicationServersRequest) String() string { return proto.CompactTextString(m) } func (*DeleteAllApplicationServersRequest) ProtoMessage() {} func (*DeleteAllApplicationServersRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{35} + return fileDescriptor_0ffcffcda38ae159, []int{36} } func (m *DeleteAllApplicationServersRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3324,7 +3410,7 @@ func (m *GenerateAppTokenRequest) Reset() { *m = GenerateAppTokenRequest func (m *GenerateAppTokenRequest) String() string { return proto.CompactTextString(m) } func (*GenerateAppTokenRequest) ProtoMessage() {} func (*GenerateAppTokenRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{36} + return fileDescriptor_0ffcffcda38ae159, []int{37} } func (m *GenerateAppTokenRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3400,7 +3486,7 @@ func (m *GenerateAppTokenResponse) Reset() { *m = GenerateAppTokenRespon func (m *GenerateAppTokenResponse) String() string { return proto.CompactTextString(m) } func (*GenerateAppTokenResponse) ProtoMessage() {} func (*GenerateAppTokenResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{37} + return fileDescriptor_0ffcffcda38ae159, []int{38} } func (m *GenerateAppTokenResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3449,7 +3535,7 @@ func (m *GetAppSessionRequest) Reset() { *m = GetAppSessionRequest{} } func (m *GetAppSessionRequest) String() string { return proto.CompactTextString(m) } func (*GetAppSessionRequest) ProtoMessage() {} func (*GetAppSessionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{38} + return fileDescriptor_0ffcffcda38ae159, []int{39} } func (m *GetAppSessionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3498,7 +3584,7 @@ func (m *GetAppSessionResponse) Reset() { *m = GetAppSessionResponse{} } func (m *GetAppSessionResponse) String() string { return proto.CompactTextString(m) } func (*GetAppSessionResponse) ProtoMessage() {} func (*GetAppSessionResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{39} + return fileDescriptor_0ffcffcda38ae159, []int{40} } func (m *GetAppSessionResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3556,7 +3642,7 @@ func (m *ListAppSessionsRequest) Reset() { *m = ListAppSessionsRequest{} func (m *ListAppSessionsRequest) String() string { return proto.CompactTextString(m) } func (*ListAppSessionsRequest) ProtoMessage() {} func (*ListAppSessionsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{40} + return fileDescriptor_0ffcffcda38ae159, []int{41} } func (m *ListAppSessionsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3622,7 +3708,7 @@ func (m *ListAppSessionsResponse) Reset() { *m = ListAppSessionsResponse func (m *ListAppSessionsResponse) String() string { return proto.CompactTextString(m) } func (*ListAppSessionsResponse) ProtoMessage() {} func (*ListAppSessionsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{41} + return fileDescriptor_0ffcffcda38ae159, []int{42} } func (m *ListAppSessionsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3678,7 +3764,7 @@ func (m *GetSnowflakeSessionsResponse) Reset() { *m = GetSnowflakeSessio func (m *GetSnowflakeSessionsResponse) String() string { return proto.CompactTextString(m) } func (*GetSnowflakeSessionsResponse) ProtoMessage() {} func (*GetSnowflakeSessionsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{42} + return fileDescriptor_0ffcffcda38ae159, []int{43} } func (m *GetSnowflakeSessionsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3736,7 +3822,7 @@ func (m *ListSAMLIdPSessionsRequest) Reset() { *m = ListSAMLIdPSessionsR func (m *ListSAMLIdPSessionsRequest) String() string { return proto.CompactTextString(m) } func (*ListSAMLIdPSessionsRequest) ProtoMessage() {} func (*ListSAMLIdPSessionsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{43} + return fileDescriptor_0ffcffcda38ae159, []int{44} } func (m *ListSAMLIdPSessionsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3802,7 +3888,7 @@ func (m *ListSAMLIdPSessionsResponse) Reset() { *m = ListSAMLIdPSessions func (m *ListSAMLIdPSessionsResponse) String() string { return proto.CompactTextString(m) } func (*ListSAMLIdPSessionsResponse) ProtoMessage() {} func (*ListSAMLIdPSessionsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{44} + return fileDescriptor_0ffcffcda38ae159, []int{45} } func (m *ListSAMLIdPSessionsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3878,7 +3964,7 @@ func (m *CreateAppSessionRequest) Reset() { *m = CreateAppSessionRequest func (m *CreateAppSessionRequest) String() string { return proto.CompactTextString(m) } func (*CreateAppSessionRequest) ProtoMessage() {} func (*CreateAppSessionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{45} + return fileDescriptor_0ffcffcda38ae159, []int{46} } func (m *CreateAppSessionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3990,7 +4076,7 @@ func (m *CreateAppSessionResponse) Reset() { *m = CreateAppSessionRespon func (m *CreateAppSessionResponse) String() string { return proto.CompactTextString(m) } func (*CreateAppSessionResponse) ProtoMessage() {} func (*CreateAppSessionResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{46} + return fileDescriptor_0ffcffcda38ae159, []int{47} } func (m *CreateAppSessionResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4043,7 +4129,7 @@ func (m *CreateSnowflakeSessionRequest) Reset() { *m = CreateSnowflakeSe func (m *CreateSnowflakeSessionRequest) String() string { return proto.CompactTextString(m) } func (*CreateSnowflakeSessionRequest) ProtoMessage() {} func (*CreateSnowflakeSessionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{47} + return fileDescriptor_0ffcffcda38ae159, []int{48} } func (m *CreateSnowflakeSessionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4105,7 +4191,7 @@ func (m *CreateSnowflakeSessionResponse) Reset() { *m = CreateSnowflakeS func (m *CreateSnowflakeSessionResponse) String() string { return proto.CompactTextString(m) } func (*CreateSnowflakeSessionResponse) ProtoMessage() {} func (*CreateSnowflakeSessionResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{48} + return fileDescriptor_0ffcffcda38ae159, []int{49} } func (m *CreateSnowflakeSessionResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4158,7 +4244,7 @@ func (m *CreateSAMLIdPSessionRequest) Reset() { *m = CreateSAMLIdPSessio func (m *CreateSAMLIdPSessionRequest) String() string { return proto.CompactTextString(m) } func (*CreateSAMLIdPSessionRequest) ProtoMessage() {} func (*CreateSAMLIdPSessionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{49} + return fileDescriptor_0ffcffcda38ae159, []int{50} } func (m *CreateSAMLIdPSessionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4220,7 +4306,7 @@ func (m *CreateSAMLIdPSessionResponse) Reset() { *m = CreateSAMLIdPSessi func (m *CreateSAMLIdPSessionResponse) String() string { return proto.CompactTextString(m) } func (*CreateSAMLIdPSessionResponse) ProtoMessage() {} func (*CreateSAMLIdPSessionResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{50} + return fileDescriptor_0ffcffcda38ae159, []int{51} } func (m *CreateSAMLIdPSessionResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4269,7 +4355,7 @@ func (m *GetSnowflakeSessionRequest) Reset() { *m = GetSnowflakeSessionR func (m *GetSnowflakeSessionRequest) String() string { return proto.CompactTextString(m) } func (*GetSnowflakeSessionRequest) ProtoMessage() {} func (*GetSnowflakeSessionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{51} + return fileDescriptor_0ffcffcda38ae159, []int{52} } func (m *GetSnowflakeSessionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4318,7 +4404,7 @@ func (m *GetSnowflakeSessionResponse) Reset() { *m = GetSnowflakeSession func (m *GetSnowflakeSessionResponse) String() string { return proto.CompactTextString(m) } func (*GetSnowflakeSessionResponse) ProtoMessage() {} func (*GetSnowflakeSessionResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{52} + return fileDescriptor_0ffcffcda38ae159, []int{53} } func (m *GetSnowflakeSessionResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4367,7 +4453,7 @@ func (m *GetSAMLIdPSessionRequest) Reset() { *m = GetSAMLIdPSessionReque func (m *GetSAMLIdPSessionRequest) String() string { return proto.CompactTextString(m) } func (*GetSAMLIdPSessionRequest) ProtoMessage() {} func (*GetSAMLIdPSessionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{53} + return fileDescriptor_0ffcffcda38ae159, []int{54} } func (m *GetSAMLIdPSessionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4416,7 +4502,7 @@ func (m *GetSAMLIdPSessionResponse) Reset() { *m = GetSAMLIdPSessionResp func (m *GetSAMLIdPSessionResponse) String() string { return proto.CompactTextString(m) } func (*GetSAMLIdPSessionResponse) ProtoMessage() {} func (*GetSAMLIdPSessionResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{54} + return fileDescriptor_0ffcffcda38ae159, []int{55} } func (m *GetSAMLIdPSessionResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4464,7 +4550,7 @@ func (m *DeleteAppSessionRequest) Reset() { *m = DeleteAppSessionRequest func (m *DeleteAppSessionRequest) String() string { return proto.CompactTextString(m) } func (*DeleteAppSessionRequest) ProtoMessage() {} func (*DeleteAppSessionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{55} + return fileDescriptor_0ffcffcda38ae159, []int{56} } func (m *DeleteAppSessionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4512,7 +4598,7 @@ func (m *DeleteSnowflakeSessionRequest) Reset() { *m = DeleteSnowflakeSe func (m *DeleteSnowflakeSessionRequest) String() string { return proto.CompactTextString(m) } func (*DeleteSnowflakeSessionRequest) ProtoMessage() {} func (*DeleteSnowflakeSessionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{56} + return fileDescriptor_0ffcffcda38ae159, []int{57} } func (m *DeleteSnowflakeSessionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4560,7 +4646,7 @@ func (m *DeleteSAMLIdPSessionRequest) Reset() { *m = DeleteSAMLIdPSessio func (m *DeleteSAMLIdPSessionRequest) String() string { return proto.CompactTextString(m) } func (*DeleteSAMLIdPSessionRequest) ProtoMessage() {} func (*DeleteSAMLIdPSessionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{57} + return fileDescriptor_0ffcffcda38ae159, []int{58} } func (m *DeleteSAMLIdPSessionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4609,7 +4695,7 @@ func (m *DeleteUserAppSessionsRequest) Reset() { *m = DeleteUserAppSessi func (m *DeleteUserAppSessionsRequest) String() string { return proto.CompactTextString(m) } func (*DeleteUserAppSessionsRequest) ProtoMessage() {} func (*DeleteUserAppSessionsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{58} + return fileDescriptor_0ffcffcda38ae159, []int{59} } func (m *DeleteUserAppSessionsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4658,7 +4744,7 @@ func (m *DeleteUserSAMLIdPSessionsRequest) Reset() { *m = DeleteUserSAML func (m *DeleteUserSAMLIdPSessionsRequest) String() string { return proto.CompactTextString(m) } func (*DeleteUserSAMLIdPSessionsRequest) ProtoMessage() {} func (*DeleteUserSAMLIdPSessionsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{59} + return fileDescriptor_0ffcffcda38ae159, []int{60} } func (m *DeleteUserSAMLIdPSessionsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4707,7 +4793,7 @@ func (m *GetWebSessionResponse) Reset() { *m = GetWebSessionResponse{} } func (m *GetWebSessionResponse) String() string { return proto.CompactTextString(m) } func (*GetWebSessionResponse) ProtoMessage() {} func (*GetWebSessionResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{60} + return fileDescriptor_0ffcffcda38ae159, []int{61} } func (m *GetWebSessionResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4756,7 +4842,7 @@ func (m *GetWebSessionsResponse) Reset() { *m = GetWebSessionsResponse{} func (m *GetWebSessionsResponse) String() string { return proto.CompactTextString(m) } func (*GetWebSessionsResponse) ProtoMessage() {} func (*GetWebSessionsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{61} + return fileDescriptor_0ffcffcda38ae159, []int{62} } func (m *GetWebSessionsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4805,7 +4891,7 @@ func (m *GetWebTokenResponse) Reset() { *m = GetWebTokenResponse{} } func (m *GetWebTokenResponse) String() string { return proto.CompactTextString(m) } func (*GetWebTokenResponse) ProtoMessage() {} func (*GetWebTokenResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{62} + return fileDescriptor_0ffcffcda38ae159, []int{63} } func (m *GetWebTokenResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4854,7 +4940,7 @@ func (m *GetWebTokensResponse) Reset() { *m = GetWebTokensResponse{} } func (m *GetWebTokensResponse) String() string { return proto.CompactTextString(m) } func (*GetWebTokensResponse) ProtoMessage() {} func (*GetWebTokensResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{63} + return fileDescriptor_0ffcffcda38ae159, []int{64} } func (m *GetWebTokensResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4903,7 +4989,7 @@ func (m *UpsertKubernetesServerRequest) Reset() { *m = UpsertKubernetesS func (m *UpsertKubernetesServerRequest) String() string { return proto.CompactTextString(m) } func (*UpsertKubernetesServerRequest) ProtoMessage() {} func (*UpsertKubernetesServerRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{64} + return fileDescriptor_0ffcffcda38ae159, []int{65} } func (m *UpsertKubernetesServerRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4954,7 +5040,7 @@ func (m *DeleteKubernetesServerRequest) Reset() { *m = DeleteKubernetesS func (m *DeleteKubernetesServerRequest) String() string { return proto.CompactTextString(m) } func (*DeleteKubernetesServerRequest) ProtoMessage() {} func (*DeleteKubernetesServerRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{65} + return fileDescriptor_0ffcffcda38ae159, []int{66} } func (m *DeleteKubernetesServerRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5008,7 +5094,7 @@ func (m *DeleteAllKubernetesServersRequest) Reset() { *m = DeleteAllKube func (m *DeleteAllKubernetesServersRequest) String() string { return proto.CompactTextString(m) } func (*DeleteAllKubernetesServersRequest) ProtoMessage() {} func (*DeleteAllKubernetesServersRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{66} + return fileDescriptor_0ffcffcda38ae159, []int{67} } func (m *DeleteAllKubernetesServersRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5050,7 +5136,7 @@ func (m *UpsertDatabaseServerRequest) Reset() { *m = UpsertDatabaseServe func (m *UpsertDatabaseServerRequest) String() string { return proto.CompactTextString(m) } func (*UpsertDatabaseServerRequest) ProtoMessage() {} func (*UpsertDatabaseServerRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{67} + return fileDescriptor_0ffcffcda38ae159, []int{68} } func (m *UpsertDatabaseServerRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5103,7 +5189,7 @@ func (m *DeleteDatabaseServerRequest) Reset() { *m = DeleteDatabaseServe func (m *DeleteDatabaseServerRequest) String() string { return proto.CompactTextString(m) } func (*DeleteDatabaseServerRequest) ProtoMessage() {} func (*DeleteDatabaseServerRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{68} + return fileDescriptor_0ffcffcda38ae159, []int{69} } func (m *DeleteDatabaseServerRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5166,7 +5252,7 @@ func (m *DeleteAllDatabaseServersRequest) Reset() { *m = DeleteAllDataba func (m *DeleteAllDatabaseServersRequest) String() string { return proto.CompactTextString(m) } func (*DeleteAllDatabaseServersRequest) ProtoMessage() {} func (*DeleteAllDatabaseServersRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{69} + return fileDescriptor_0ffcffcda38ae159, []int{70} } func (m *DeleteAllDatabaseServersRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5215,7 +5301,7 @@ func (m *DatabaseServiceV1List) Reset() { *m = DatabaseServiceV1List{} } func (m *DatabaseServiceV1List) String() string { return proto.CompactTextString(m) } func (*DatabaseServiceV1List) ProtoMessage() {} func (*DatabaseServiceV1List) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{70} + return fileDescriptor_0ffcffcda38ae159, []int{71} } func (m *DatabaseServiceV1List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5264,7 +5350,7 @@ func (m *UpsertDatabaseServiceRequest) Reset() { *m = UpsertDatabaseServ func (m *UpsertDatabaseServiceRequest) String() string { return proto.CompactTextString(m) } func (*UpsertDatabaseServiceRequest) ProtoMessage() {} func (*UpsertDatabaseServiceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{71} + return fileDescriptor_0ffcffcda38ae159, []int{72} } func (m *UpsertDatabaseServiceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5311,7 +5397,7 @@ func (m *DeleteAllDatabaseServicesRequest) Reset() { *m = DeleteAllDatab func (m *DeleteAllDatabaseServicesRequest) String() string { return proto.CompactTextString(m) } func (*DeleteAllDatabaseServicesRequest) ProtoMessage() {} func (*DeleteAllDatabaseServicesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{72} + return fileDescriptor_0ffcffcda38ae159, []int{73} } func (m *DeleteAllDatabaseServicesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5356,7 +5442,7 @@ func (m *DatabaseCSRRequest) Reset() { *m = DatabaseCSRRequest{} } func (m *DatabaseCSRRequest) String() string { return proto.CompactTextString(m) } func (*DatabaseCSRRequest) ProtoMessage() {} func (*DatabaseCSRRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{73} + return fileDescriptor_0ffcffcda38ae159, []int{74} } func (m *DatabaseCSRRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5414,7 +5500,7 @@ func (m *DatabaseCSRResponse) Reset() { *m = DatabaseCSRResponse{} } func (m *DatabaseCSRResponse) String() string { return proto.CompactTextString(m) } func (*DatabaseCSRResponse) ProtoMessage() {} func (*DatabaseCSRResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{74} + return fileDescriptor_0ffcffcda38ae159, []int{75} } func (m *DatabaseCSRResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5484,7 +5570,7 @@ func (m *DatabaseCertRequest) Reset() { *m = DatabaseCertRequest{} } func (m *DatabaseCertRequest) String() string { return proto.CompactTextString(m) } func (*DatabaseCertRequest) ProtoMessage() {} func (*DatabaseCertRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{75} + return fileDescriptor_0ffcffcda38ae159, []int{76} } func (m *DatabaseCertRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5578,7 +5664,7 @@ func (m *DatabaseCertResponse) Reset() { *m = DatabaseCertResponse{} } func (m *DatabaseCertResponse) String() string { return proto.CompactTextString(m) } func (*DatabaseCertResponse) ProtoMessage() {} func (*DatabaseCertResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{76} + return fileDescriptor_0ffcffcda38ae159, []int{77} } func (m *DatabaseCertResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5634,7 +5720,7 @@ func (m *SnowflakeJWTRequest) Reset() { *m = SnowflakeJWTRequest{} } func (m *SnowflakeJWTRequest) String() string { return proto.CompactTextString(m) } func (*SnowflakeJWTRequest) ProtoMessage() {} func (*SnowflakeJWTRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{77} + return fileDescriptor_0ffcffcda38ae159, []int{78} } func (m *SnowflakeJWTRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5689,7 +5775,7 @@ func (m *SnowflakeJWTResponse) Reset() { *m = SnowflakeJWTResponse{} } func (m *SnowflakeJWTResponse) String() string { return proto.CompactTextString(m) } func (*SnowflakeJWTResponse) ProtoMessage() {} func (*SnowflakeJWTResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{78} + return fileDescriptor_0ffcffcda38ae159, []int{79} } func (m *SnowflakeJWTResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5738,7 +5824,7 @@ func (m *GetRoleRequest) Reset() { *m = GetRoleRequest{} } func (m *GetRoleRequest) String() string { return proto.CompactTextString(m) } func (*GetRoleRequest) ProtoMessage() {} func (*GetRoleRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{79} + return fileDescriptor_0ffcffcda38ae159, []int{80} } func (m *GetRoleRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5787,7 +5873,7 @@ func (m *GetRolesResponse) Reset() { *m = GetRolesResponse{} } func (m *GetRolesResponse) String() string { return proto.CompactTextString(m) } func (*GetRolesResponse) ProtoMessage() {} func (*GetRolesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{80} + return fileDescriptor_0ffcffcda38ae159, []int{81} } func (m *GetRolesResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5842,7 +5928,7 @@ func (m *ListRolesRequest) Reset() { *m = ListRolesRequest{} } func (m *ListRolesRequest) String() string { return proto.CompactTextString(m) } func (*ListRolesRequest) ProtoMessage() {} func (*ListRolesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{81} + return fileDescriptor_0ffcffcda38ae159, []int{82} } func (m *ListRolesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5907,7 +5993,7 @@ func (m *ListRolesResponse) Reset() { *m = ListRolesResponse{} } func (m *ListRolesResponse) String() string { return proto.CompactTextString(m) } func (*ListRolesResponse) ProtoMessage() {} func (*ListRolesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{82} + return fileDescriptor_0ffcffcda38ae159, []int{83} } func (m *ListRolesResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5963,7 +6049,7 @@ func (m *CreateRoleRequest) Reset() { *m = CreateRoleRequest{} } func (m *CreateRoleRequest) String() string { return proto.CompactTextString(m) } func (*CreateRoleRequest) ProtoMessage() {} func (*CreateRoleRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{83} + return fileDescriptor_0ffcffcda38ae159, []int{84} } func (m *CreateRoleRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6012,7 +6098,7 @@ func (m *UpdateRoleRequest) Reset() { *m = UpdateRoleRequest{} } func (m *UpdateRoleRequest) String() string { return proto.CompactTextString(m) } func (*UpdateRoleRequest) ProtoMessage() {} func (*UpdateRoleRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{84} + return fileDescriptor_0ffcffcda38ae159, []int{85} } func (m *UpdateRoleRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6061,7 +6147,7 @@ func (m *UpsertRoleRequest) Reset() { *m = UpsertRoleRequest{} } func (m *UpsertRoleRequest) String() string { return proto.CompactTextString(m) } func (*UpsertRoleRequest) ProtoMessage() {} func (*UpsertRoleRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{85} + return fileDescriptor_0ffcffcda38ae159, []int{86} } func (m *UpsertRoleRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6110,7 +6196,7 @@ func (m *DeleteRoleRequest) Reset() { *m = DeleteRoleRequest{} } func (m *DeleteRoleRequest) String() string { return proto.CompactTextString(m) } func (*DeleteRoleRequest) ProtoMessage() {} func (*DeleteRoleRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{86} + return fileDescriptor_0ffcffcda38ae159, []int{87} } func (m *DeleteRoleRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6175,7 +6261,7 @@ func (m *MFAAuthenticateChallenge) Reset() { *m = MFAAuthenticateChallen func (m *MFAAuthenticateChallenge) String() string { return proto.CompactTextString(m) } func (*MFAAuthenticateChallenge) ProtoMessage() {} func (*MFAAuthenticateChallenge) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{87} + return fileDescriptor_0ffcffcda38ae159, []int{88} } func (m *MFAAuthenticateChallenge) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6241,7 +6327,7 @@ func (m *MFAAuthenticateResponse) Reset() { *m = MFAAuthenticateResponse func (m *MFAAuthenticateResponse) String() string { return proto.CompactTextString(m) } func (*MFAAuthenticateResponse) ProtoMessage() {} func (*MFAAuthenticateResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{88} + return fileDescriptor_0ffcffcda38ae159, []int{89} } func (m *MFAAuthenticateResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6326,7 +6412,7 @@ func (m *TOTPChallenge) Reset() { *m = TOTPChallenge{} } func (m *TOTPChallenge) String() string { return proto.CompactTextString(m) } func (*TOTPChallenge) ProtoMessage() {} func (*TOTPChallenge) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{89} + return fileDescriptor_0ffcffcda38ae159, []int{90} } func (m *TOTPChallenge) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6367,7 +6453,7 @@ func (m *TOTPResponse) Reset() { *m = TOTPResponse{} } func (m *TOTPResponse) String() string { return proto.CompactTextString(m) } func (*TOTPResponse) ProtoMessage() {} func (*TOTPResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{90} + return fileDescriptor_0ffcffcda38ae159, []int{91} } func (m *TOTPResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6420,7 +6506,7 @@ func (m *MFARegisterChallenge) Reset() { *m = MFARegisterChallenge{} } func (m *MFARegisterChallenge) String() string { return proto.CompactTextString(m) } func (*MFARegisterChallenge) ProtoMessage() {} func (*MFARegisterChallenge) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{91} + return fileDescriptor_0ffcffcda38ae159, []int{92} } func (m *MFARegisterChallenge) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6509,7 +6595,7 @@ func (m *MFARegisterResponse) Reset() { *m = MFARegisterResponse{} } func (m *MFARegisterResponse) String() string { return proto.CompactTextString(m) } func (*MFARegisterResponse) ProtoMessage() {} func (*MFARegisterResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{92} + return fileDescriptor_0ffcffcda38ae159, []int{93} } func (m *MFARegisterResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6612,7 +6698,7 @@ func (m *TOTPRegisterChallenge) Reset() { *m = TOTPRegisterChallenge{} } func (m *TOTPRegisterChallenge) String() string { return proto.CompactTextString(m) } func (*TOTPRegisterChallenge) ProtoMessage() {} func (*TOTPRegisterChallenge) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{93} + return fileDescriptor_0ffcffcda38ae159, []int{94} } func (m *TOTPRegisterChallenge) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6711,7 +6797,7 @@ func (m *TOTPRegisterResponse) Reset() { *m = TOTPRegisterResponse{} } func (m *TOTPRegisterResponse) String() string { return proto.CompactTextString(m) } func (*TOTPRegisterResponse) ProtoMessage() {} func (*TOTPRegisterResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{94} + return fileDescriptor_0ffcffcda38ae159, []int{95} } func (m *TOTPRegisterResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6765,7 +6851,7 @@ func (m *AddMFADeviceRequest) Reset() { *m = AddMFADeviceRequest{} } func (m *AddMFADeviceRequest) String() string { return proto.CompactTextString(m) } func (*AddMFADeviceRequest) ProtoMessage() {} func (*AddMFADeviceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{95} + return fileDescriptor_0ffcffcda38ae159, []int{96} } func (m *AddMFADeviceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6805,7 +6891,7 @@ func (m *AddMFADeviceResponse) Reset() { *m = AddMFADeviceResponse{} } func (m *AddMFADeviceResponse) String() string { return proto.CompactTextString(m) } func (*AddMFADeviceResponse) ProtoMessage() {} func (*AddMFADeviceResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{96} + return fileDescriptor_0ffcffcda38ae159, []int{97} } func (m *AddMFADeviceResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6845,7 +6931,7 @@ func (m *DeleteMFADeviceRequest) Reset() { *m = DeleteMFADeviceRequest{} func (m *DeleteMFADeviceRequest) String() string { return proto.CompactTextString(m) } func (*DeleteMFADeviceRequest) ProtoMessage() {} func (*DeleteMFADeviceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{97} + return fileDescriptor_0ffcffcda38ae159, []int{98} } func (m *DeleteMFADeviceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6885,7 +6971,7 @@ func (m *DeleteMFADeviceResponse) Reset() { *m = DeleteMFADeviceResponse func (m *DeleteMFADeviceResponse) String() string { return proto.CompactTextString(m) } func (*DeleteMFADeviceResponse) ProtoMessage() {} func (*DeleteMFADeviceResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{98} + return fileDescriptor_0ffcffcda38ae159, []int{99} } func (m *DeleteMFADeviceResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6940,7 +7026,7 @@ func (m *DeleteMFADeviceSyncRequest) Reset() { *m = DeleteMFADeviceSyncR func (m *DeleteMFADeviceSyncRequest) String() string { return proto.CompactTextString(m) } func (*DeleteMFADeviceSyncRequest) ProtoMessage() {} func (*DeleteMFADeviceSyncRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{99} + return fileDescriptor_0ffcffcda38ae159, []int{100} } func (m *DeleteMFADeviceSyncRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7020,7 +7106,7 @@ func (m *AddMFADeviceSyncRequest) Reset() { *m = AddMFADeviceSyncRequest func (m *AddMFADeviceSyncRequest) String() string { return proto.CompactTextString(m) } func (*AddMFADeviceSyncRequest) ProtoMessage() {} func (*AddMFADeviceSyncRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{100} + return fileDescriptor_0ffcffcda38ae159, []int{101} } func (m *AddMFADeviceSyncRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7096,7 +7182,7 @@ func (m *AddMFADeviceSyncResponse) Reset() { *m = AddMFADeviceSyncRespon func (m *AddMFADeviceSyncResponse) String() string { return proto.CompactTextString(m) } func (*AddMFADeviceSyncResponse) ProtoMessage() {} func (*AddMFADeviceSyncResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{101} + return fileDescriptor_0ffcffcda38ae159, []int{102} } func (m *AddMFADeviceSyncResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7151,7 +7237,7 @@ func (m *GetMFADevicesRequest) Reset() { *m = GetMFADevicesRequest{} } func (m *GetMFADevicesRequest) String() string { return proto.CompactTextString(m) } func (*GetMFADevicesRequest) ProtoMessage() {} func (*GetMFADevicesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{102} + return fileDescriptor_0ffcffcda38ae159, []int{103} } func (m *GetMFADevicesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7199,7 +7285,7 @@ func (m *GetMFADevicesResponse) Reset() { *m = GetMFADevicesResponse{} } func (m *GetMFADevicesResponse) String() string { return proto.CompactTextString(m) } func (*GetMFADevicesResponse) ProtoMessage() {} func (*GetMFADevicesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{103} + return fileDescriptor_0ffcffcda38ae159, []int{104} } func (m *GetMFADevicesResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7246,7 +7332,7 @@ func (m *UserSingleUseCertsRequest) Reset() { *m = UserSingleUseCertsReq func (m *UserSingleUseCertsRequest) String() string { return proto.CompactTextString(m) } func (*UserSingleUseCertsRequest) ProtoMessage() {} func (*UserSingleUseCertsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{104} + return fileDescriptor_0ffcffcda38ae159, []int{105} } func (m *UserSingleUseCertsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7286,7 +7372,7 @@ func (m *UserSingleUseCertsResponse) Reset() { *m = UserSingleUseCertsRe func (m *UserSingleUseCertsResponse) String() string { return proto.CompactTextString(m) } func (*UserSingleUseCertsResponse) ProtoMessage() {} func (*UserSingleUseCertsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{105} + return fileDescriptor_0ffcffcda38ae159, []int{106} } func (m *UserSingleUseCertsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7335,7 +7421,7 @@ func (m *IsMFARequiredRequest) Reset() { *m = IsMFARequiredRequest{} } func (m *IsMFARequiredRequest) String() string { return proto.CompactTextString(m) } func (*IsMFARequiredRequest) ProtoMessage() {} func (*IsMFARequiredRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{106} + return fileDescriptor_0ffcffcda38ae159, []int{107} } func (m *IsMFARequiredRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7473,7 +7559,7 @@ func (m *StreamSessionEventsRequest) Reset() { *m = StreamSessionEventsR func (m *StreamSessionEventsRequest) String() string { return proto.CompactTextString(m) } func (*StreamSessionEventsRequest) ProtoMessage() {} func (*StreamSessionEventsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{107} + return fileDescriptor_0ffcffcda38ae159, []int{108} } func (m *StreamSessionEventsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7531,7 +7617,7 @@ func (m *NodeLogin) Reset() { *m = NodeLogin{} } func (m *NodeLogin) String() string { return proto.CompactTextString(m) } func (*NodeLogin) ProtoMessage() {} func (*NodeLogin) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{108} + return fileDescriptor_0ffcffcda38ae159, []int{109} } func (m *NodeLogin) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7585,7 +7671,7 @@ func (m *AdminAction) Reset() { *m = AdminAction{} } func (m *AdminAction) String() string { return proto.CompactTextString(m) } func (*AdminAction) ProtoMessage() {} func (*AdminAction) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{109} + return fileDescriptor_0ffcffcda38ae159, []int{110} } func (m *AdminAction) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7630,7 +7716,7 @@ func (m *IsMFARequiredResponse) Reset() { *m = IsMFARequiredResponse{} } func (m *IsMFARequiredResponse) String() string { return proto.CompactTextString(m) } func (*IsMFARequiredResponse) ProtoMessage() {} func (*IsMFARequiredResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{110} + return fileDescriptor_0ffcffcda38ae159, []int{111} } func (m *IsMFARequiredResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7700,7 +7786,7 @@ func (m *GetEventsRequest) Reset() { *m = GetEventsRequest{} } func (m *GetEventsRequest) String() string { return proto.CompactTextString(m) } func (*GetEventsRequest) ProtoMessage() {} func (*GetEventsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{111} + return fileDescriptor_0ffcffcda38ae159, []int{112} } func (m *GetEventsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7801,7 +7887,7 @@ func (m *GetSessionEventsRequest) Reset() { *m = GetSessionEventsRequest func (m *GetSessionEventsRequest) String() string { return proto.CompactTextString(m) } func (*GetSessionEventsRequest) ProtoMessage() {} func (*GetSessionEventsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{112} + return fileDescriptor_0ffcffcda38ae159, []int{113} } func (m *GetSessionEventsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7881,7 +7967,7 @@ func (m *Events) Reset() { *m = Events{} } func (m *Events) String() string { return proto.CompactTextString(m) } func (*Events) ProtoMessage() {} func (*Events) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{113} + return fileDescriptor_0ffcffcda38ae159, []int{114} } func (m *Events) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7939,7 +8025,7 @@ func (m *GetLocksRequest) Reset() { *m = GetLocksRequest{} } func (m *GetLocksRequest) String() string { return proto.CompactTextString(m) } func (*GetLocksRequest) ProtoMessage() {} func (*GetLocksRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{114} + return fileDescriptor_0ffcffcda38ae159, []int{115} } func (m *GetLocksRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7994,7 +8080,7 @@ func (m *GetLocksResponse) Reset() { *m = GetLocksResponse{} } func (m *GetLocksResponse) String() string { return proto.CompactTextString(m) } func (*GetLocksResponse) ProtoMessage() {} func (*GetLocksResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{115} + return fileDescriptor_0ffcffcda38ae159, []int{116} } func (m *GetLocksResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8042,7 +8128,7 @@ func (m *GetLockRequest) Reset() { *m = GetLockRequest{} } func (m *GetLockRequest) String() string { return proto.CompactTextString(m) } func (*GetLockRequest) ProtoMessage() {} func (*GetLockRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{116} + return fileDescriptor_0ffcffcda38ae159, []int{117} } func (m *GetLockRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8090,7 +8176,7 @@ func (m *DeleteLockRequest) Reset() { *m = DeleteLockRequest{} } func (m *DeleteLockRequest) String() string { return proto.CompactTextString(m) } func (*DeleteLockRequest) ProtoMessage() {} func (*DeleteLockRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{117} + return fileDescriptor_0ffcffcda38ae159, []int{118} } func (m *DeleteLockRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8140,7 +8226,7 @@ func (m *ReplaceRemoteLocksRequest) Reset() { *m = ReplaceRemoteLocksReq func (m *ReplaceRemoteLocksRequest) String() string { return proto.CompactTextString(m) } func (*ReplaceRemoteLocksRequest) ProtoMessage() {} func (*ReplaceRemoteLocksRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{118} + return fileDescriptor_0ffcffcda38ae159, []int{119} } func (m *ReplaceRemoteLocksRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8196,7 +8282,7 @@ func (m *GetWindowsDesktopServicesResponse) Reset() { *m = GetWindowsDes func (m *GetWindowsDesktopServicesResponse) String() string { return proto.CompactTextString(m) } func (*GetWindowsDesktopServicesResponse) ProtoMessage() {} func (*GetWindowsDesktopServicesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{119} + return fileDescriptor_0ffcffcda38ae159, []int{120} } func (m *GetWindowsDesktopServicesResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8245,7 +8331,7 @@ func (m *GetWindowsDesktopServiceRequest) Reset() { *m = GetWindowsDeskt func (m *GetWindowsDesktopServiceRequest) String() string { return proto.CompactTextString(m) } func (*GetWindowsDesktopServiceRequest) ProtoMessage() {} func (*GetWindowsDesktopServiceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{120} + return fileDescriptor_0ffcffcda38ae159, []int{121} } func (m *GetWindowsDesktopServiceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8294,7 +8380,7 @@ func (m *GetWindowsDesktopServiceResponse) Reset() { *m = GetWindowsDesk func (m *GetWindowsDesktopServiceResponse) String() string { return proto.CompactTextString(m) } func (*GetWindowsDesktopServiceResponse) ProtoMessage() {} func (*GetWindowsDesktopServiceResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{121} + return fileDescriptor_0ffcffcda38ae159, []int{122} } func (m *GetWindowsDesktopServiceResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8343,7 +8429,7 @@ func (m *DeleteWindowsDesktopServiceRequest) Reset() { *m = DeleteWindow func (m *DeleteWindowsDesktopServiceRequest) String() string { return proto.CompactTextString(m) } func (*DeleteWindowsDesktopServiceRequest) ProtoMessage() {} func (*DeleteWindowsDesktopServiceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{122} + return fileDescriptor_0ffcffcda38ae159, []int{123} } func (m *DeleteWindowsDesktopServiceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8392,7 +8478,7 @@ func (m *GetWindowsDesktopsResponse) Reset() { *m = GetWindowsDesktopsRe func (m *GetWindowsDesktopsResponse) String() string { return proto.CompactTextString(m) } func (*GetWindowsDesktopsResponse) ProtoMessage() {} func (*GetWindowsDesktopsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{123} + return fileDescriptor_0ffcffcda38ae159, []int{124} } func (m *GetWindowsDesktopsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8445,7 +8531,7 @@ func (m *DeleteWindowsDesktopRequest) Reset() { *m = DeleteWindowsDeskto func (m *DeleteWindowsDesktopRequest) String() string { return proto.CompactTextString(m) } func (*DeleteWindowsDesktopRequest) ProtoMessage() {} func (*DeleteWindowsDesktopRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{124} + return fileDescriptor_0ffcffcda38ae159, []int{125} } func (m *DeleteWindowsDesktopRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8506,7 +8592,7 @@ func (m *WindowsDesktopCertRequest) Reset() { *m = WindowsDesktopCertReq func (m *WindowsDesktopCertRequest) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopCertRequest) ProtoMessage() {} func (*WindowsDesktopCertRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{125} + return fileDescriptor_0ffcffcda38ae159, []int{126} } func (m *WindowsDesktopCertRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8569,7 +8655,7 @@ func (m *WindowsDesktopCertResponse) Reset() { *m = WindowsDesktopCertRe func (m *WindowsDesktopCertResponse) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopCertResponse) ProtoMessage() {} func (*WindowsDesktopCertResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{126} + return fileDescriptor_0ffcffcda38ae159, []int{127} } func (m *WindowsDesktopCertResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8618,7 +8704,7 @@ func (m *DesktopBootstrapScriptResponse) Reset() { *m = DesktopBootstrap func (m *DesktopBootstrapScriptResponse) String() string { return proto.CompactTextString(m) } func (*DesktopBootstrapScriptResponse) ProtoMessage() {} func (*DesktopBootstrapScriptResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{127} + return fileDescriptor_0ffcffcda38ae159, []int{128} } func (m *DesktopBootstrapScriptResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8669,7 +8755,7 @@ func (m *ListSAMLIdPServiceProvidersRequest) Reset() { *m = ListSAMLIdPS func (m *ListSAMLIdPServiceProvidersRequest) String() string { return proto.CompactTextString(m) } func (*ListSAMLIdPServiceProvidersRequest) ProtoMessage() {} func (*ListSAMLIdPServiceProvidersRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{128} + return fileDescriptor_0ffcffcda38ae159, []int{129} } func (m *ListSAMLIdPServiceProvidersRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8729,7 +8815,7 @@ func (m *ListSAMLIdPServiceProvidersResponse) Reset() { *m = ListSAMLIdP func (m *ListSAMLIdPServiceProvidersResponse) String() string { return proto.CompactTextString(m) } func (*ListSAMLIdPServiceProvidersResponse) ProtoMessage() {} func (*ListSAMLIdPServiceProvidersResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{129} + return fileDescriptor_0ffcffcda38ae159, []int{130} } func (m *ListSAMLIdPServiceProvidersResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8792,7 +8878,7 @@ func (m *GetSAMLIdPServiceProviderRequest) Reset() { *m = GetSAMLIdPServ func (m *GetSAMLIdPServiceProviderRequest) String() string { return proto.CompactTextString(m) } func (*GetSAMLIdPServiceProviderRequest) ProtoMessage() {} func (*GetSAMLIdPServiceProviderRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{130} + return fileDescriptor_0ffcffcda38ae159, []int{131} } func (m *GetSAMLIdPServiceProviderRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8841,7 +8927,7 @@ func (m *DeleteSAMLIdPServiceProviderRequest) Reset() { *m = DeleteSAMLI func (m *DeleteSAMLIdPServiceProviderRequest) String() string { return proto.CompactTextString(m) } func (*DeleteSAMLIdPServiceProviderRequest) ProtoMessage() {} func (*DeleteSAMLIdPServiceProviderRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{131} + return fileDescriptor_0ffcffcda38ae159, []int{132} } func (m *DeleteSAMLIdPServiceProviderRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8892,7 +8978,7 @@ func (m *ListUserGroupsRequest) Reset() { *m = ListUserGroupsRequest{} } func (m *ListUserGroupsRequest) String() string { return proto.CompactTextString(m) } func (*ListUserGroupsRequest) ProtoMessage() {} func (*ListUserGroupsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{132} + return fileDescriptor_0ffcffcda38ae159, []int{133} } func (m *ListUserGroupsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8952,7 +9038,7 @@ func (m *ListUserGroupsResponse) Reset() { *m = ListUserGroupsResponse{} func (m *ListUserGroupsResponse) String() string { return proto.CompactTextString(m) } func (*ListUserGroupsResponse) ProtoMessage() {} func (*ListUserGroupsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{133} + return fileDescriptor_0ffcffcda38ae159, []int{134} } func (m *ListUserGroupsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9015,7 +9101,7 @@ func (m *GetUserGroupRequest) Reset() { *m = GetUserGroupRequest{} } func (m *GetUserGroupRequest) String() string { return proto.CompactTextString(m) } func (*GetUserGroupRequest) ProtoMessage() {} func (*GetUserGroupRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{134} + return fileDescriptor_0ffcffcda38ae159, []int{135} } func (m *GetUserGroupRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9064,7 +9150,7 @@ func (m *DeleteUserGroupRequest) Reset() { *m = DeleteUserGroupRequest{} func (m *DeleteUserGroupRequest) String() string { return proto.CompactTextString(m) } func (*DeleteUserGroupRequest) ProtoMessage() {} func (*DeleteUserGroupRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{135} + return fileDescriptor_0ffcffcda38ae159, []int{136} } func (m *DeleteUserGroupRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9113,7 +9199,7 @@ func (m *CertAuthorityRequest) Reset() { *m = CertAuthorityRequest{} } func (m *CertAuthorityRequest) String() string { return proto.CompactTextString(m) } func (*CertAuthorityRequest) ProtoMessage() {} func (*CertAuthorityRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{136} + return fileDescriptor_0ffcffcda38ae159, []int{137} } func (m *CertAuthorityRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9162,7 +9248,7 @@ func (m *CRL) Reset() { *m = CRL{} } func (m *CRL) String() string { return proto.CompactTextString(m) } func (*CRL) ProtoMessage() {} func (*CRL) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{137} + return fileDescriptor_0ffcffcda38ae159, []int{138} } func (m *CRL) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9232,7 +9318,7 @@ func (m *ChangeUserAuthenticationRequest) Reset() { *m = ChangeUserAuthe func (m *ChangeUserAuthenticationRequest) String() string { return proto.CompactTextString(m) } func (*ChangeUserAuthenticationRequest) ProtoMessage() {} func (*ChangeUserAuthenticationRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{138} + return fileDescriptor_0ffcffcda38ae159, []int{139} } func (m *ChangeUserAuthenticationRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9318,7 +9404,7 @@ func (m *ChangeUserAuthenticationResponse) Reset() { *m = ChangeUserAuth func (m *ChangeUserAuthenticationResponse) String() string { return proto.CompactTextString(m) } func (*ChangeUserAuthenticationResponse) ProtoMessage() {} func (*ChangeUserAuthenticationResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{139} + return fileDescriptor_0ffcffcda38ae159, []int{140} } func (m *ChangeUserAuthenticationResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9391,7 +9477,7 @@ func (m *StartAccountRecoveryRequest) Reset() { *m = StartAccountRecover func (m *StartAccountRecoveryRequest) String() string { return proto.CompactTextString(m) } func (*StartAccountRecoveryRequest) ProtoMessage() {} func (*StartAccountRecoveryRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{140} + return fileDescriptor_0ffcffcda38ae159, []int{141} } func (m *StartAccountRecoveryRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9466,7 +9552,7 @@ func (m *VerifyAccountRecoveryRequest) Reset() { *m = VerifyAccountRecov func (m *VerifyAccountRecoveryRequest) String() string { return proto.CompactTextString(m) } func (*VerifyAccountRecoveryRequest) ProtoMessage() {} func (*VerifyAccountRecoveryRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{141} + return fileDescriptor_0ffcffcda38ae159, []int{142} } func (m *VerifyAccountRecoveryRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9581,7 +9667,7 @@ func (m *CompleteAccountRecoveryRequest) Reset() { *m = CompleteAccountR func (m *CompleteAccountRecoveryRequest) String() string { return proto.CompactTextString(m) } func (*CompleteAccountRecoveryRequest) ProtoMessage() {} func (*CompleteAccountRecoveryRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{142} + return fileDescriptor_0ffcffcda38ae159, []int{143} } func (m *CompleteAccountRecoveryRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9687,7 +9773,7 @@ func (m *RecoveryCodes) Reset() { *m = RecoveryCodes{} } func (m *RecoveryCodes) String() string { return proto.CompactTextString(m) } func (*RecoveryCodes) ProtoMessage() {} func (*RecoveryCodes) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{143} + return fileDescriptor_0ffcffcda38ae159, []int{144} } func (m *RecoveryCodes) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9750,7 +9836,7 @@ func (m *CreateAccountRecoveryCodesRequest) Reset() { *m = CreateAccount func (m *CreateAccountRecoveryCodesRequest) String() string { return proto.CompactTextString(m) } func (*CreateAccountRecoveryCodesRequest) ProtoMessage() {} func (*CreateAccountRecoveryCodesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{144} + return fileDescriptor_0ffcffcda38ae159, []int{145} } func (m *CreateAccountRecoveryCodesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9801,7 +9887,7 @@ func (m *GetAccountRecoveryTokenRequest) Reset() { *m = GetAccountRecove func (m *GetAccountRecoveryTokenRequest) String() string { return proto.CompactTextString(m) } func (*GetAccountRecoveryTokenRequest) ProtoMessage() {} func (*GetAccountRecoveryTokenRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{145} + return fileDescriptor_0ffcffcda38ae159, []int{146} } func (m *GetAccountRecoveryTokenRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9849,7 +9935,7 @@ func (m *GetAccountRecoveryCodesRequest) Reset() { *m = GetAccountRecove func (m *GetAccountRecoveryCodesRequest) String() string { return proto.CompactTextString(m) } func (*GetAccountRecoveryCodesRequest) ProtoMessage() {} func (*GetAccountRecoveryCodesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{146} + return fileDescriptor_0ffcffcda38ae159, []int{147} } func (m *GetAccountRecoveryCodesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9891,7 +9977,7 @@ func (m *UserCredentials) Reset() { *m = UserCredentials{} } func (m *UserCredentials) String() string { return proto.CompactTextString(m) } func (*UserCredentials) ProtoMessage() {} func (*UserCredentials) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{147} + return fileDescriptor_0ffcffcda38ae159, []int{148} } func (m *UserCredentials) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9945,7 +10031,7 @@ func (m *ContextUser) Reset() { *m = ContextUser{} } func (m *ContextUser) String() string { return proto.CompactTextString(m) } func (*ContextUser) ProtoMessage() {} func (*ContextUser) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{148} + return fileDescriptor_0ffcffcda38ae159, []int{149} } func (m *ContextUser) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9985,7 +10071,7 @@ func (m *Passwordless) Reset() { *m = Passwordless{} } func (m *Passwordless) String() string { return proto.CompactTextString(m) } func (*Passwordless) ProtoMessage() {} func (*Passwordless) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{149} + return fileDescriptor_0ffcffcda38ae159, []int{150} } func (m *Passwordless) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10049,7 +10135,7 @@ func (m *CreateAuthenticateChallengeRequest) Reset() { *m = CreateAuthen func (m *CreateAuthenticateChallengeRequest) String() string { return proto.CompactTextString(m) } func (*CreateAuthenticateChallengeRequest) ProtoMessage() {} func (*CreateAuthenticateChallengeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{150} + return fileDescriptor_0ffcffcda38ae159, []int{151} } func (m *CreateAuthenticateChallengeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10183,7 +10269,7 @@ func (m *CreatePrivilegeTokenRequest) Reset() { *m = CreatePrivilegeToke func (m *CreatePrivilegeTokenRequest) String() string { return proto.CompactTextString(m) } func (*CreatePrivilegeTokenRequest) ProtoMessage() {} func (*CreatePrivilegeTokenRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{151} + return fileDescriptor_0ffcffcda38ae159, []int{152} } func (m *CreatePrivilegeTokenRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10252,7 +10338,7 @@ func (m *CreateRegisterChallengeRequest) Reset() { *m = CreateRegisterCh func (m *CreateRegisterChallengeRequest) String() string { return proto.CompactTextString(m) } func (*CreateRegisterChallengeRequest) ProtoMessage() {} func (*CreateRegisterChallengeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{152} + return fileDescriptor_0ffcffcda38ae159, []int{153} } func (m *CreateRegisterChallengeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10340,7 +10426,7 @@ func (m *PaginatedResource) Reset() { *m = PaginatedResource{} } func (m *PaginatedResource) String() string { return proto.CompactTextString(m) } func (*PaginatedResource) ProtoMessage() {} func (*PaginatedResource) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{153} + return fileDescriptor_0ffcffcda38ae159, []int{154} } func (m *PaginatedResource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10581,7 +10667,7 @@ func (m *ListUnifiedResourcesRequest) Reset() { *m = ListUnifiedResource func (m *ListUnifiedResourcesRequest) String() string { return proto.CompactTextString(m) } func (*ListUnifiedResourcesRequest) ProtoMessage() {} func (*ListUnifiedResourcesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{154} + return fileDescriptor_0ffcffcda38ae159, []int{155} } func (m *ListUnifiedResourcesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10718,7 +10804,7 @@ func (m *ListUnifiedResourcesResponse) Reset() { *m = ListUnifiedResourc func (m *ListUnifiedResourcesResponse) String() string { return proto.CompactTextString(m) } func (*ListUnifiedResourcesResponse) ProtoMessage() {} func (*ListUnifiedResourcesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{155} + return fileDescriptor_0ffcffcda38ae159, []int{156} } func (m *ListUnifiedResourcesResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10814,7 +10900,7 @@ func (m *ListResourcesRequest) Reset() { *m = ListResourcesRequest{} } func (m *ListResourcesRequest) String() string { return proto.CompactTextString(m) } func (*ListResourcesRequest) ProtoMessage() {} func (*ListResourcesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{156} + return fileDescriptor_0ffcffcda38ae159, []int{157} } func (m *ListResourcesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10950,7 +11036,7 @@ func (m *GetSSHTargetsRequest) Reset() { *m = GetSSHTargetsRequest{} } func (m *GetSSHTargetsRequest) String() string { return proto.CompactTextString(m) } func (*GetSSHTargetsRequest) ProtoMessage() {} func (*GetSSHTargetsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{157} + return fileDescriptor_0ffcffcda38ae159, []int{158} } func (m *GetSSHTargetsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11006,7 +11092,7 @@ func (m *GetSSHTargetsResponse) Reset() { *m = GetSSHTargetsResponse{} } func (m *GetSSHTargetsResponse) String() string { return proto.CompactTextString(m) } func (*GetSSHTargetsResponse) ProtoMessage() {} func (*GetSSHTargetsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{158} + return fileDescriptor_0ffcffcda38ae159, []int{159} } func (m *GetSSHTargetsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11061,7 +11147,7 @@ func (m *ListResourcesResponse) Reset() { *m = ListResourcesResponse{} } func (m *ListResourcesResponse) String() string { return proto.CompactTextString(m) } func (*ListResourcesResponse) ProtoMessage() {} func (*ListResourcesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{159} + return fileDescriptor_0ffcffcda38ae159, []int{160} } func (m *ListResourcesResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11126,7 +11212,7 @@ func (m *CreateSessionTrackerRequest) Reset() { *m = CreateSessionTracke func (m *CreateSessionTrackerRequest) String() string { return proto.CompactTextString(m) } func (*CreateSessionTrackerRequest) ProtoMessage() {} func (*CreateSessionTrackerRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{160} + return fileDescriptor_0ffcffcda38ae159, []int{161} } func (m *CreateSessionTrackerRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11175,7 +11261,7 @@ func (m *GetSessionTrackerRequest) Reset() { *m = GetSessionTrackerReque func (m *GetSessionTrackerRequest) String() string { return proto.CompactTextString(m) } func (*GetSessionTrackerRequest) ProtoMessage() {} func (*GetSessionTrackerRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{161} + return fileDescriptor_0ffcffcda38ae159, []int{162} } func (m *GetSessionTrackerRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11224,7 +11310,7 @@ func (m *RemoveSessionTrackerRequest) Reset() { *m = RemoveSessionTracke func (m *RemoveSessionTrackerRequest) String() string { return proto.CompactTextString(m) } func (*RemoveSessionTrackerRequest) ProtoMessage() {} func (*RemoveSessionTrackerRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{162} + return fileDescriptor_0ffcffcda38ae159, []int{163} } func (m *RemoveSessionTrackerRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11272,7 +11358,7 @@ func (m *SessionTrackerUpdateState) Reset() { *m = SessionTrackerUpdateS func (m *SessionTrackerUpdateState) String() string { return proto.CompactTextString(m) } func (*SessionTrackerUpdateState) ProtoMessage() {} func (*SessionTrackerUpdateState) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{163} + return fileDescriptor_0ffcffcda38ae159, []int{164} } func (m *SessionTrackerUpdateState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11320,7 +11406,7 @@ func (m *SessionTrackerAddParticipant) Reset() { *m = SessionTrackerAddP func (m *SessionTrackerAddParticipant) String() string { return proto.CompactTextString(m) } func (*SessionTrackerAddParticipant) ProtoMessage() {} func (*SessionTrackerAddParticipant) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{164} + return fileDescriptor_0ffcffcda38ae159, []int{165} } func (m *SessionTrackerAddParticipant) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11368,7 +11454,7 @@ func (m *SessionTrackerRemoveParticipant) Reset() { *m = SessionTrackerR func (m *SessionTrackerRemoveParticipant) String() string { return proto.CompactTextString(m) } func (*SessionTrackerRemoveParticipant) ProtoMessage() {} func (*SessionTrackerRemoveParticipant) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{165} + return fileDescriptor_0ffcffcda38ae159, []int{166} } func (m *SessionTrackerRemoveParticipant) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11417,7 +11503,7 @@ func (m *SessionTrackerUpdateExpiry) Reset() { *m = SessionTrackerUpdate func (m *SessionTrackerUpdateExpiry) String() string { return proto.CompactTextString(m) } func (*SessionTrackerUpdateExpiry) ProtoMessage() {} func (*SessionTrackerUpdateExpiry) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{166} + return fileDescriptor_0ffcffcda38ae159, []int{167} } func (m *SessionTrackerUpdateExpiry) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11472,7 +11558,7 @@ func (m *UpdateSessionTrackerRequest) Reset() { *m = UpdateSessionTracke func (m *UpdateSessionTrackerRequest) String() string { return proto.CompactTextString(m) } func (*UpdateSessionTrackerRequest) ProtoMessage() {} func (*UpdateSessionTrackerRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{167} + return fileDescriptor_0ffcffcda38ae159, []int{168} } func (m *UpdateSessionTrackerRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11590,7 +11676,7 @@ func (m *PresenceMFAChallengeRequest) Reset() { *m = PresenceMFAChalleng func (m *PresenceMFAChallengeRequest) String() string { return proto.CompactTextString(m) } func (*PresenceMFAChallengeRequest) ProtoMessage() {} func (*PresenceMFAChallengeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{168} + return fileDescriptor_0ffcffcda38ae159, []int{169} } func (m *PresenceMFAChallengeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11641,7 +11727,7 @@ func (m *PresenceMFAChallengeSend) Reset() { *m = PresenceMFAChallengeSe func (m *PresenceMFAChallengeSend) String() string { return proto.CompactTextString(m) } func (*PresenceMFAChallengeSend) ProtoMessage() {} func (*PresenceMFAChallengeSend) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{169} + return fileDescriptor_0ffcffcda38ae159, []int{170} } func (m *PresenceMFAChallengeSend) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11728,7 +11814,7 @@ func (m *GetDomainNameResponse) Reset() { *m = GetDomainNameResponse{} } func (m *GetDomainNameResponse) String() string { return proto.CompactTextString(m) } func (*GetDomainNameResponse) ProtoMessage() {} func (*GetDomainNameResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{170} + return fileDescriptor_0ffcffcda38ae159, []int{171} } func (m *GetDomainNameResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11777,7 +11863,7 @@ func (m *GetClusterCACertResponse) Reset() { *m = GetClusterCACertRespon func (m *GetClusterCACertResponse) String() string { return proto.CompactTextString(m) } func (*GetClusterCACertResponse) ProtoMessage() {} func (*GetClusterCACertResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{171} + return fileDescriptor_0ffcffcda38ae159, []int{172} } func (m *GetClusterCACertResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11825,7 +11911,7 @@ func (m *GetLicenseResponse) Reset() { *m = GetLicenseResponse{} } func (m *GetLicenseResponse) String() string { return proto.CompactTextString(m) } func (*GetLicenseResponse) ProtoMessage() {} func (*GetLicenseResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{172} + return fileDescriptor_0ffcffcda38ae159, []int{173} } func (m *GetLicenseResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11873,7 +11959,7 @@ func (m *ListReleasesResponse) Reset() { *m = ListReleasesResponse{} } func (m *ListReleasesResponse) String() string { return proto.CompactTextString(m) } func (*ListReleasesResponse) ProtoMessage() {} func (*ListReleasesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{173} + return fileDescriptor_0ffcffcda38ae159, []int{174} } func (m *ListReleasesResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11922,7 +12008,7 @@ func (m *GetOIDCAuthRequestRequest) Reset() { *m = GetOIDCAuthRequestReq func (m *GetOIDCAuthRequestRequest) String() string { return proto.CompactTextString(m) } func (*GetOIDCAuthRequestRequest) ProtoMessage() {} func (*GetOIDCAuthRequestRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{174} + return fileDescriptor_0ffcffcda38ae159, []int{175} } func (m *GetOIDCAuthRequestRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11971,7 +12057,7 @@ func (m *GetSAMLAuthRequestRequest) Reset() { *m = GetSAMLAuthRequestReq func (m *GetSAMLAuthRequestRequest) String() string { return proto.CompactTextString(m) } func (*GetSAMLAuthRequestRequest) ProtoMessage() {} func (*GetSAMLAuthRequestRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{175} + return fileDescriptor_0ffcffcda38ae159, []int{176} } func (m *GetSAMLAuthRequestRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12020,7 +12106,7 @@ func (m *GetGithubAuthRequestRequest) Reset() { *m = GetGithubAuthReques func (m *GetGithubAuthRequestRequest) String() string { return proto.CompactTextString(m) } func (*GetGithubAuthRequestRequest) ProtoMessage() {} func (*GetGithubAuthRequestRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{176} + return fileDescriptor_0ffcffcda38ae159, []int{177} } func (m *GetGithubAuthRequestRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12069,7 +12155,7 @@ func (m *CreateOIDCConnectorRequest) Reset() { *m = CreateOIDCConnectorR func (m *CreateOIDCConnectorRequest) String() string { return proto.CompactTextString(m) } func (*CreateOIDCConnectorRequest) ProtoMessage() {} func (*CreateOIDCConnectorRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{177} + return fileDescriptor_0ffcffcda38ae159, []int{178} } func (m *CreateOIDCConnectorRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12118,7 +12204,7 @@ func (m *UpdateOIDCConnectorRequest) Reset() { *m = UpdateOIDCConnectorR func (m *UpdateOIDCConnectorRequest) String() string { return proto.CompactTextString(m) } func (*UpdateOIDCConnectorRequest) ProtoMessage() {} func (*UpdateOIDCConnectorRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{178} + return fileDescriptor_0ffcffcda38ae159, []int{179} } func (m *UpdateOIDCConnectorRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12167,7 +12253,7 @@ func (m *UpsertOIDCConnectorRequest) Reset() { *m = UpsertOIDCConnectorR func (m *UpsertOIDCConnectorRequest) String() string { return proto.CompactTextString(m) } func (*UpsertOIDCConnectorRequest) ProtoMessage() {} func (*UpsertOIDCConnectorRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{179} + return fileDescriptor_0ffcffcda38ae159, []int{180} } func (m *UpsertOIDCConnectorRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12216,7 +12302,7 @@ func (m *CreateSAMLConnectorRequest) Reset() { *m = CreateSAMLConnectorR func (m *CreateSAMLConnectorRequest) String() string { return proto.CompactTextString(m) } func (*CreateSAMLConnectorRequest) ProtoMessage() {} func (*CreateSAMLConnectorRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{180} + return fileDescriptor_0ffcffcda38ae159, []int{181} } func (m *CreateSAMLConnectorRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12265,7 +12351,7 @@ func (m *UpdateSAMLConnectorRequest) Reset() { *m = UpdateSAMLConnectorR func (m *UpdateSAMLConnectorRequest) String() string { return proto.CompactTextString(m) } func (*UpdateSAMLConnectorRequest) ProtoMessage() {} func (*UpdateSAMLConnectorRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{181} + return fileDescriptor_0ffcffcda38ae159, []int{182} } func (m *UpdateSAMLConnectorRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12314,7 +12400,7 @@ func (m *UpsertSAMLConnectorRequest) Reset() { *m = UpsertSAMLConnectorR func (m *UpsertSAMLConnectorRequest) String() string { return proto.CompactTextString(m) } func (*UpsertSAMLConnectorRequest) ProtoMessage() {} func (*UpsertSAMLConnectorRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{182} + return fileDescriptor_0ffcffcda38ae159, []int{183} } func (m *UpsertSAMLConnectorRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12363,7 +12449,7 @@ func (m *CreateGithubConnectorRequest) Reset() { *m = CreateGithubConnec func (m *CreateGithubConnectorRequest) String() string { return proto.CompactTextString(m) } func (*CreateGithubConnectorRequest) ProtoMessage() {} func (*CreateGithubConnectorRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{183} + return fileDescriptor_0ffcffcda38ae159, []int{184} } func (m *CreateGithubConnectorRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12412,7 +12498,7 @@ func (m *UpdateGithubConnectorRequest) Reset() { *m = UpdateGithubConnec func (m *UpdateGithubConnectorRequest) String() string { return proto.CompactTextString(m) } func (*UpdateGithubConnectorRequest) ProtoMessage() {} func (*UpdateGithubConnectorRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{184} + return fileDescriptor_0ffcffcda38ae159, []int{185} } func (m *UpdateGithubConnectorRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12461,7 +12547,7 @@ func (m *UpsertGithubConnectorRequest) Reset() { *m = UpsertGithubConnec func (m *UpsertGithubConnectorRequest) String() string { return proto.CompactTextString(m) } func (*UpsertGithubConnectorRequest) ProtoMessage() {} func (*UpsertGithubConnectorRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{185} + return fileDescriptor_0ffcffcda38ae159, []int{186} } func (m *UpsertGithubConnectorRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12512,7 +12598,7 @@ func (m *GetSSODiagnosticInfoRequest) Reset() { *m = GetSSODiagnosticInf func (m *GetSSODiagnosticInfoRequest) String() string { return proto.CompactTextString(m) } func (*GetSSODiagnosticInfoRequest) ProtoMessage() {} func (*GetSSODiagnosticInfoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{186} + return fileDescriptor_0ffcffcda38ae159, []int{187} } func (m *GetSSODiagnosticInfoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12578,7 +12664,7 @@ func (m *SystemRoleAssertion) Reset() { *m = SystemRoleAssertion{} } func (m *SystemRoleAssertion) String() string { return proto.CompactTextString(m) } func (*SystemRoleAssertion) ProtoMessage() {} func (*SystemRoleAssertion) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{187} + return fileDescriptor_0ffcffcda38ae159, []int{188} } func (m *SystemRoleAssertion) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12648,7 +12734,7 @@ func (m *SystemRoleAssertionSet) Reset() { *m = SystemRoleAssertionSet{} func (m *SystemRoleAssertionSet) String() string { return proto.CompactTextString(m) } func (*SystemRoleAssertionSet) ProtoMessage() {} func (*SystemRoleAssertionSet) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{188} + return fileDescriptor_0ffcffcda38ae159, []int{189} } func (m *SystemRoleAssertionSet) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12717,7 +12803,7 @@ func (m *UpstreamInventoryOneOf) Reset() { *m = UpstreamInventoryOneOf{} func (m *UpstreamInventoryOneOf) String() string { return proto.CompactTextString(m) } func (*UpstreamInventoryOneOf) ProtoMessage() {} func (*UpstreamInventoryOneOf) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{189} + return fileDescriptor_0ffcffcda38ae159, []int{190} } func (m *UpstreamInventoryOneOf) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12844,7 +12930,7 @@ func (m *DownstreamInventoryOneOf) Reset() { *m = DownstreamInventoryOne func (m *DownstreamInventoryOneOf) String() string { return proto.CompactTextString(m) } func (*DownstreamInventoryOneOf) ProtoMessage() {} func (*DownstreamInventoryOneOf) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{190} + return fileDescriptor_0ffcffcda38ae159, []int{191} } func (m *DownstreamInventoryOneOf) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12943,7 +13029,7 @@ func (m *DownstreamInventoryPing) Reset() { *m = DownstreamInventoryPing func (m *DownstreamInventoryPing) String() string { return proto.CompactTextString(m) } func (*DownstreamInventoryPing) ProtoMessage() {} func (*DownstreamInventoryPing) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{191} + return fileDescriptor_0ffcffcda38ae159, []int{192} } func (m *DownstreamInventoryPing) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12992,7 +13078,7 @@ func (m *UpstreamInventoryPong) Reset() { *m = UpstreamInventoryPong{} } func (m *UpstreamInventoryPong) String() string { return proto.CompactTextString(m) } func (*UpstreamInventoryPong) ProtoMessage() {} func (*UpstreamInventoryPong) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{192} + return fileDescriptor_0ffcffcda38ae159, []int{193} } func (m *UpstreamInventoryPong) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13059,7 +13145,7 @@ func (m *UpstreamInventoryHello) Reset() { *m = UpstreamInventoryHello{} func (m *UpstreamInventoryHello) String() string { return proto.CompactTextString(m) } func (*UpstreamInventoryHello) ProtoMessage() {} func (*UpstreamInventoryHello) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{193} + return fileDescriptor_0ffcffcda38ae159, []int{194} } func (m *UpstreamInventoryHello) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13159,7 +13245,7 @@ func (m *UpstreamInventoryAgentMetadata) Reset() { *m = UpstreamInventor func (m *UpstreamInventoryAgentMetadata) String() string { return proto.CompactTextString(m) } func (*UpstreamInventoryAgentMetadata) ProtoMessage() {} func (*UpstreamInventoryAgentMetadata) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{194} + return fileDescriptor_0ffcffcda38ae159, []int{195} } func (m *UpstreamInventoryAgentMetadata) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13261,7 +13347,7 @@ func (m *DownstreamInventoryHello) Reset() { *m = DownstreamInventoryHel func (m *DownstreamInventoryHello) String() string { return proto.CompactTextString(m) } func (*DownstreamInventoryHello) ProtoMessage() {} func (*DownstreamInventoryHello) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{195} + return fileDescriptor_0ffcffcda38ae159, []int{196} } func (m *DownstreamInventoryHello) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13364,7 +13450,7 @@ func (m *DownstreamInventoryHello_SupportedCapabilities) String() string { } func (*DownstreamInventoryHello_SupportedCapabilities) ProtoMessage() {} func (*DownstreamInventoryHello_SupportedCapabilities) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{195, 0} + return fileDescriptor_0ffcffcda38ae159, []int{196, 0} } func (m *DownstreamInventoryHello_SupportedCapabilities) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13537,7 +13623,7 @@ func (m *InventoryUpdateLabelsRequest) Reset() { *m = InventoryUpdateLab func (m *InventoryUpdateLabelsRequest) String() string { return proto.CompactTextString(m) } func (*InventoryUpdateLabelsRequest) ProtoMessage() {} func (*InventoryUpdateLabelsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{196} + return fileDescriptor_0ffcffcda38ae159, []int{197} } func (m *InventoryUpdateLabelsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13603,7 +13689,7 @@ func (m *DownstreamInventoryUpdateLabels) Reset() { *m = DownstreamInven func (m *DownstreamInventoryUpdateLabels) String() string { return proto.CompactTextString(m) } func (*DownstreamInventoryUpdateLabels) ProtoMessage() {} func (*DownstreamInventoryUpdateLabels) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{197} + return fileDescriptor_0ffcffcda38ae159, []int{198} } func (m *DownstreamInventoryUpdateLabels) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13664,7 +13750,7 @@ func (m *InventoryHeartbeat) Reset() { *m = InventoryHeartbeat{} } func (m *InventoryHeartbeat) String() string { return proto.CompactTextString(m) } func (*InventoryHeartbeat) ProtoMessage() {} func (*InventoryHeartbeat) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{198} + return fileDescriptor_0ffcffcda38ae159, []int{199} } func (m *InventoryHeartbeat) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13722,7 +13808,7 @@ func (m *UpstreamInventoryGoodbye) Reset() { *m = UpstreamInventoryGoodb func (m *UpstreamInventoryGoodbye) String() string { return proto.CompactTextString(m) } func (*UpstreamInventoryGoodbye) ProtoMessage() {} func (*UpstreamInventoryGoodbye) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{199} + return fileDescriptor_0ffcffcda38ae159, []int{200} } func (m *UpstreamInventoryGoodbye) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13772,7 +13858,7 @@ func (m *InventoryStatusRequest) Reset() { *m = InventoryStatusRequest{} func (m *InventoryStatusRequest) String() string { return proto.CompactTextString(m) } func (*InventoryStatusRequest) ProtoMessage() {} func (*InventoryStatusRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{200} + return fileDescriptor_0ffcffcda38ae159, []int{201} } func (m *InventoryStatusRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13830,7 +13916,7 @@ func (m *InventoryStatusSummary) Reset() { *m = InventoryStatusSummary{} func (m *InventoryStatusSummary) String() string { return proto.CompactTextString(m) } func (*InventoryStatusSummary) ProtoMessage() {} func (*InventoryStatusSummary) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{201} + return fileDescriptor_0ffcffcda38ae159, []int{202} } func (m *InventoryStatusSummary) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13907,7 +13993,7 @@ func (m *InventoryConnectedServiceCountsRequest) Reset() { func (m *InventoryConnectedServiceCountsRequest) String() string { return proto.CompactTextString(m) } func (*InventoryConnectedServiceCountsRequest) ProtoMessage() {} func (*InventoryConnectedServiceCountsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{202} + return fileDescriptor_0ffcffcda38ae159, []int{203} } func (m *InventoryConnectedServiceCountsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13949,7 +14035,7 @@ func (m *InventoryConnectedServiceCounts) Reset() { *m = InventoryConnec func (m *InventoryConnectedServiceCounts) String() string { return proto.CompactTextString(m) } func (*InventoryConnectedServiceCounts) ProtoMessage() {} func (*InventoryConnectedServiceCounts) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{203} + return fileDescriptor_0ffcffcda38ae159, []int{204} } func (m *InventoryConnectedServiceCounts) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14003,7 +14089,7 @@ func (m *InventoryPingRequest) Reset() { *m = InventoryPingRequest{} } func (m *InventoryPingRequest) String() string { return proto.CompactTextString(m) } func (*InventoryPingRequest) ProtoMessage() {} func (*InventoryPingRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{204} + return fileDescriptor_0ffcffcda38ae159, []int{205} } func (m *InventoryPingRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14059,7 +14145,7 @@ func (m *InventoryPingResponse) Reset() { *m = InventoryPingResponse{} } func (m *InventoryPingResponse) String() string { return proto.CompactTextString(m) } func (*InventoryPingResponse) ProtoMessage() {} func (*InventoryPingResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{205} + return fileDescriptor_0ffcffcda38ae159, []int{206} } func (m *InventoryPingResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14108,7 +14194,7 @@ func (m *GetClusterAlertsResponse) Reset() { *m = GetClusterAlertsRespon func (m *GetClusterAlertsResponse) String() string { return proto.CompactTextString(m) } func (*GetClusterAlertsResponse) ProtoMessage() {} func (*GetClusterAlertsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{206} + return fileDescriptor_0ffcffcda38ae159, []int{207} } func (m *GetClusterAlertsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14155,7 +14241,7 @@ func (m *GetAlertAcksRequest) Reset() { *m = GetAlertAcksRequest{} } func (m *GetAlertAcksRequest) String() string { return proto.CompactTextString(m) } func (*GetAlertAcksRequest) ProtoMessage() {} func (*GetAlertAcksRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{207} + return fileDescriptor_0ffcffcda38ae159, []int{208} } func (m *GetAlertAcksRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14197,7 +14283,7 @@ func (m *GetAlertAcksResponse) Reset() { *m = GetAlertAcksResponse{} } func (m *GetAlertAcksResponse) String() string { return proto.CompactTextString(m) } func (*GetAlertAcksResponse) ProtoMessage() {} func (*GetAlertAcksResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{208} + return fileDescriptor_0ffcffcda38ae159, []int{209} } func (m *GetAlertAcksResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14247,7 +14333,7 @@ func (m *ClearAlertAcksRequest) Reset() { *m = ClearAlertAcksRequest{} } func (m *ClearAlertAcksRequest) String() string { return proto.CompactTextString(m) } func (*ClearAlertAcksRequest) ProtoMessage() {} func (*ClearAlertAcksRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{209} + return fileDescriptor_0ffcffcda38ae159, []int{210} } func (m *ClearAlertAcksRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14296,7 +14382,7 @@ func (m *UpsertClusterAlertRequest) Reset() { *m = UpsertClusterAlertReq func (m *UpsertClusterAlertRequest) String() string { return proto.CompactTextString(m) } func (*UpsertClusterAlertRequest) ProtoMessage() {} func (*UpsertClusterAlertRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{210} + return fileDescriptor_0ffcffcda38ae159, []int{211} } func (m *UpsertClusterAlertRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14345,7 +14431,7 @@ func (m *GetConnectionDiagnosticRequest) Reset() { *m = GetConnectionDia func (m *GetConnectionDiagnosticRequest) String() string { return proto.CompactTextString(m) } func (*GetConnectionDiagnosticRequest) ProtoMessage() {} func (*GetConnectionDiagnosticRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{211} + return fileDescriptor_0ffcffcda38ae159, []int{212} } func (m *GetConnectionDiagnosticRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14396,7 +14482,7 @@ func (m *AppendDiagnosticTraceRequest) Reset() { *m = AppendDiagnosticTr func (m *AppendDiagnosticTraceRequest) String() string { return proto.CompactTextString(m) } func (*AppendDiagnosticTraceRequest) ProtoMessage() {} func (*AppendDiagnosticTraceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{212} + return fileDescriptor_0ffcffcda38ae159, []int{213} } func (m *AppendDiagnosticTraceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14451,7 +14537,7 @@ func (m *SubmitUsageEventRequest) Reset() { *m = SubmitUsageEventRequest func (m *SubmitUsageEventRequest) String() string { return proto.CompactTextString(m) } func (*SubmitUsageEventRequest) ProtoMessage() {} func (*SubmitUsageEventRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{213} + return fileDescriptor_0ffcffcda38ae159, []int{214} } func (m *SubmitUsageEventRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14498,7 +14584,7 @@ func (m *GetLicenseRequest) Reset() { *m = GetLicenseRequest{} } func (m *GetLicenseRequest) String() string { return proto.CompactTextString(m) } func (*GetLicenseRequest) ProtoMessage() {} func (*GetLicenseRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{214} + return fileDescriptor_0ffcffcda38ae159, []int{215} } func (m *GetLicenseRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14538,7 +14624,7 @@ func (m *ListReleasesRequest) Reset() { *m = ListReleasesRequest{} } func (m *ListReleasesRequest) String() string { return proto.CompactTextString(m) } func (*ListReleasesRequest) ProtoMessage() {} func (*ListReleasesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{215} + return fileDescriptor_0ffcffcda38ae159, []int{216} } func (m *ListReleasesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14582,7 +14668,7 @@ func (m *CreateTokenV2Request) Reset() { *m = CreateTokenV2Request{} } func (m *CreateTokenV2Request) String() string { return proto.CompactTextString(m) } func (*CreateTokenV2Request) ProtoMessage() {} func (*CreateTokenV2Request) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{216} + return fileDescriptor_0ffcffcda38ae159, []int{217} } func (m *CreateTokenV2Request) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14659,7 +14745,7 @@ func (m *UpsertTokenV2Request) Reset() { *m = UpsertTokenV2Request{} } func (m *UpsertTokenV2Request) String() string { return proto.CompactTextString(m) } func (*UpsertTokenV2Request) ProtoMessage() {} func (*UpsertTokenV2Request) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{217} + return fileDescriptor_0ffcffcda38ae159, []int{218} } func (m *UpsertTokenV2Request) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14734,7 +14820,7 @@ func (m *GetHeadlessAuthenticationRequest) Reset() { *m = GetHeadlessAut func (m *GetHeadlessAuthenticationRequest) String() string { return proto.CompactTextString(m) } func (*GetHeadlessAuthenticationRequest) ProtoMessage() {} func (*GetHeadlessAuthenticationRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{218} + return fileDescriptor_0ffcffcda38ae159, []int{219} } func (m *GetHeadlessAuthenticationRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14792,7 +14878,7 @@ func (m *UpdateHeadlessAuthenticationStateRequest) Reset() { func (m *UpdateHeadlessAuthenticationStateRequest) String() string { return proto.CompactTextString(m) } func (*UpdateHeadlessAuthenticationStateRequest) ProtoMessage() {} func (*UpdateHeadlessAuthenticationStateRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{219} + return fileDescriptor_0ffcffcda38ae159, []int{220} } func (m *UpdateHeadlessAuthenticationStateRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14858,7 +14944,7 @@ func (m *ExportUpgradeWindowsRequest) Reset() { *m = ExportUpgradeWindow func (m *ExportUpgradeWindowsRequest) String() string { return proto.CompactTextString(m) } func (*ExportUpgradeWindowsRequest) ProtoMessage() {} func (*ExportUpgradeWindowsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{220} + return fileDescriptor_0ffcffcda38ae159, []int{221} } func (m *ExportUpgradeWindowsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14924,7 +15010,7 @@ func (m *ExportUpgradeWindowsResponse) Reset() { *m = ExportUpgradeWindo func (m *ExportUpgradeWindowsResponse) String() string { return proto.CompactTextString(m) } func (*ExportUpgradeWindowsResponse) ProtoMessage() {} func (*ExportUpgradeWindowsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{221} + return fileDescriptor_0ffcffcda38ae159, []int{222} } func (m *ExportUpgradeWindowsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14999,7 +15085,7 @@ func (m *ListAccessRequestsRequest) Reset() { *m = ListAccessRequestsReq func (m *ListAccessRequestsRequest) String() string { return proto.CompactTextString(m) } func (*ListAccessRequestsRequest) ProtoMessage() {} func (*ListAccessRequestsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{222} + return fileDescriptor_0ffcffcda38ae159, []int{223} } func (m *ListAccessRequestsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15078,7 +15164,7 @@ func (m *ListAccessRequestsResponse) Reset() { *m = ListAccessRequestsRe func (m *ListAccessRequestsResponse) String() string { return proto.CompactTextString(m) } func (*ListAccessRequestsResponse) ProtoMessage() {} func (*ListAccessRequestsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{223} + return fileDescriptor_0ffcffcda38ae159, []int{224} } func (m *ListAccessRequestsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15134,7 +15220,7 @@ func (m *AccessRequestAllowedPromotionRequest) Reset() { *m = AccessRequ func (m *AccessRequestAllowedPromotionRequest) String() string { return proto.CompactTextString(m) } func (*AccessRequestAllowedPromotionRequest) ProtoMessage() {} func (*AccessRequestAllowedPromotionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{224} + return fileDescriptor_0ffcffcda38ae159, []int{225} } func (m *AccessRequestAllowedPromotionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15183,7 +15269,7 @@ func (m *AccessRequestAllowedPromotionResponse) Reset() { *m = AccessReq func (m *AccessRequestAllowedPromotionResponse) String() string { return proto.CompactTextString(m) } func (*AccessRequestAllowedPromotionResponse) ProtoMessage() {} func (*AccessRequestAllowedPromotionResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{225} + return fileDescriptor_0ffcffcda38ae159, []int{226} } func (m *AccessRequestAllowedPromotionResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15253,6 +15339,8 @@ func init() { proto.RegisterType((*PingRequest)(nil), "proto.PingRequest") proto.RegisterType((*PingResponse)(nil), "proto.PingResponse") proto.RegisterType((*Features)(nil), "proto.Features") + proto.RegisterMapType((map[string]*EntitlementInfo)(nil), "proto.Features.EntitlementsEntry") + proto.RegisterType((*EntitlementInfo)(nil), "proto.EntitlementInfo") proto.RegisterType((*DeviceTrustFeature)(nil), "proto.DeviceTrustFeature") proto.RegisterType((*AccessRequestsFeature)(nil), "proto.AccessRequestsFeature") proto.RegisterType((*AccessListFeature)(nil), "proto.AccessListFeature") @@ -15476,924 +15564,929 @@ func init() { } var fileDescriptor_0ffcffcda38ae159 = []byte{ - // 14667 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0xbd, 0x5b, 0x6c, 0x5c, 0x49, - 0x76, 0x20, 0xc8, 0xe4, 0x9b, 0x87, 0xaf, 0x54, 0x90, 0x14, 0x29, 0xea, 0x91, 0xd2, 0xad, 0x97, - 0x4a, 0x5d, 0xad, 0x07, 0x55, 0x55, 0x5d, 0xaf, 0xae, 0xea, 0xe4, 0x43, 0x22, 0x25, 0xbe, 0xea, - 0x26, 0x49, 0x55, 0x55, 0x97, 0x3b, 0xfb, 0x32, 0x33, 0x44, 0x5e, 0x2b, 0x79, 0x6f, 0xf6, 0xbd, - 0x37, 0xa5, 0x52, 0x7b, 0xed, 0x85, 0xdb, 0xbb, 0x58, 0xff, 0xec, 0xae, 0x0d, 0xac, 0x17, 0x5e, - 0xf8, 0xc3, 0x58, 0x60, 0x0d, 0x2c, 0xe6, 0xcb, 0x3f, 0x1e, 0xff, 0xcc, 0x7c, 0xcc, 0xd7, 0xf4, - 0x18, 0xf0, 0x3c, 0x60, 0xfb, 0x67, 0x3e, 0xe8, 0x99, 0x06, 0xe6, 0x87, 0x98, 0xf9, 0x30, 0x06, - 0x33, 0xc0, 0x34, 0x60, 0x60, 0x10, 0x27, 0x1e, 0x37, 0xe2, 0xbe, 0x92, 0x94, 0x54, 0xed, 0xf9, - 0x91, 0x98, 0x27, 0xce, 0x39, 0x11, 0x71, 0x22, 0x6e, 0xc4, 0x89, 0x13, 0x27, 0xce, 0x81, 0x9b, - 0x11, 0x6d, 0xd1, 0xb6, 0x1f, 0x44, 0xb7, 0x5a, 0xf4, 0xc0, 0x69, 0x3c, 0xbf, 0xd5, 0x68, 0xb9, - 0xd4, 0x8b, 0x6e, 0xb5, 0x03, 0x3f, 0xf2, 0x6f, 0x39, 0x9d, 0xe8, 0x30, 0xa4, 0xc1, 0x53, 0xb7, - 0x41, 0x6f, 0x22, 0x84, 0x0c, 0xe0, 0x7f, 0xf3, 0xd3, 0x07, 0xfe, 0x81, 0xcf, 0x71, 0xd8, 0x5f, - 0xbc, 0x70, 0xfe, 0xe2, 0x81, 0xef, 0x1f, 0xb4, 0x28, 0x27, 0xde, 0xef, 0x3c, 0xbe, 0x45, 0x8f, - 0xda, 0xd1, 0x73, 0x51, 0x58, 0x49, 0x16, 0x46, 0xee, 0x11, 0x0d, 0x23, 0xe7, 0xa8, 0x2d, 0x10, - 0xde, 0x56, 0x4d, 0x71, 0xa2, 0x88, 0x95, 0x44, 0xae, 0xef, 0xdd, 0x7a, 0x7a, 0x47, 0xff, 0x29, - 0x50, 0xaf, 0x17, 0xb6, 0xba, 0x41, 0x83, 0x28, 0x3c, 0x15, 0x26, 0x7d, 0x4a, 0xbd, 0x28, 0x55, - 0xbd, 0xc0, 0x8c, 0x9e, 0xb7, 0x69, 0xc8, 0x51, 0xe4, 0x7f, 0x02, 0xf5, 0x5a, 0x36, 0x2a, 0xfe, - 0x2b, 0x50, 0xbe, 0x9b, 0x8d, 0xf2, 0x8c, 0xee, 0x33, 0x99, 0x7a, 0xea, 0x8f, 0x2e, 0xe8, 0x81, - 0xd3, 0x6e, 0xd3, 0x20, 0xfe, 0x43, 0xa0, 0x5f, 0x50, 0xe8, 0x47, 0x8f, 0x1d, 0x26, 0xa2, 0xa3, - 0xc7, 0x4e, 0xaa, 0x1b, 0x9d, 0xd0, 0x39, 0xa0, 0xa2, 0xf9, 0x4f, 0xef, 0xe8, 0x3f, 0x39, 0xaa, - 0xf5, 0xc7, 0x25, 0x18, 0x78, 0xe4, 0x44, 0x8d, 0x43, 0xf2, 0x19, 0x0c, 0x3c, 0x74, 0xbd, 0x66, - 0x38, 0x57, 0xba, 0xda, 0x77, 0x7d, 0x74, 0xa1, 0x7c, 0x93, 0x77, 0x05, 0x0b, 0x59, 0xc1, 0xe2, - 0xec, 0xcf, 0x8f, 0x2b, 0x3d, 0x27, 0xc7, 0x95, 0xc9, 0x27, 0x0c, 0xed, 0x1d, 0xff, 0xc8, 0x8d, - 0x70, 0x6c, 0x6d, 0x4e, 0x47, 0x76, 0x61, 0xaa, 0xda, 0x6a, 0xf9, 0xcf, 0xb6, 0x9d, 0x20, 0x72, - 0x9d, 0x56, 0xad, 0xd3, 0x68, 0xd0, 0x30, 0x9c, 0xeb, 0xbd, 0x5a, 0xba, 0x3e, 0xbc, 0xf8, 0xda, - 0xc9, 0x71, 0xa5, 0xe2, 0xb0, 0xe2, 0x7a, 0x9b, 0x97, 0xd7, 0x43, 0x8e, 0xa0, 0x31, 0xca, 0xa2, - 0xb7, 0xfe, 0x62, 0x10, 0xca, 0xab, 0x7e, 0x18, 0x2d, 0xb1, 0x11, 0xb5, 0xe9, 0x4f, 0x3a, 0x34, - 0x8c, 0xc8, 0x6b, 0x30, 0xc8, 0x60, 0x6b, 0xcb, 0x73, 0xa5, 0xab, 0xa5, 0xeb, 0x23, 0x8b, 0xa3, - 0x27, 0xc7, 0x95, 0xa1, 0x43, 0x3f, 0x8c, 0xea, 0x6e, 0xd3, 0x16, 0x45, 0xe4, 0x6d, 0x18, 0xde, - 0xf4, 0x9b, 0x74, 0xd3, 0x39, 0xa2, 0xd8, 0x8a, 0x91, 0xc5, 0xf1, 0x93, 0xe3, 0xca, 0x88, 0xe7, - 0x37, 0x69, 0xdd, 0x73, 0x8e, 0xa8, 0xad, 0x8a, 0xc9, 0x1e, 0xf4, 0xdb, 0x7e, 0x8b, 0xce, 0xf5, - 0x21, 0xda, 0xe2, 0xc9, 0x71, 0xa5, 0x3f, 0xf0, 0x5b, 0xf4, 0x97, 0xc7, 0x95, 0xf7, 0x0f, 0xdc, - 0xe8, 0xb0, 0xb3, 0x7f, 0xb3, 0xe1, 0x1f, 0xdd, 0x3a, 0x08, 0x9c, 0xa7, 0x2e, 0x9f, 0x84, 0x4e, - 0xeb, 0x56, 0x3c, 0x55, 0xdb, 0xae, 0x18, 0xf7, 0xda, 0xf3, 0x30, 0xa2, 0x47, 0x8c, 0x93, 0x8d, - 0xfc, 0xc8, 0x23, 0x98, 0xae, 0x36, 0x9b, 0x2e, 0xa7, 0xd8, 0x0e, 0x5c, 0xaf, 0xe1, 0xb6, 0x9d, - 0x56, 0x38, 0xd7, 0x7f, 0xb5, 0xef, 0xfa, 0x88, 0x10, 0x8a, 0x2a, 0xaf, 0xb7, 0x15, 0x82, 0x26, - 0x94, 0x4c, 0x06, 0xe4, 0x2e, 0x0c, 0x2f, 0x6f, 0xd6, 0x58, 0xdb, 0xc3, 0xb9, 0x01, 0x64, 0x36, - 0x7b, 0x72, 0x5c, 0x99, 0x6a, 0x7a, 0x21, 0x76, 0x4d, 0x67, 0xa0, 0x10, 0xc9, 0xfb, 0x30, 0xb6, - 0xdd, 0xd9, 0x6f, 0xb9, 0x8d, 0x9d, 0xf5, 0xda, 0x43, 0xfa, 0x7c, 0x6e, 0xf0, 0x6a, 0xe9, 0xfa, - 0xd8, 0x22, 0x39, 0x39, 0xae, 0x4c, 0xb4, 0x11, 0x5e, 0x8f, 0x5a, 0x61, 0xfd, 0x09, 0x7d, 0x6e, - 0x1b, 0x78, 0x31, 0x5d, 0xad, 0xb6, 0xca, 0xe8, 0x86, 0x52, 0x74, 0x61, 0x78, 0xa8, 0xd3, 0x71, - 0x3c, 0x72, 0x0b, 0xc0, 0xa6, 0x47, 0x7e, 0x44, 0xab, 0xcd, 0x66, 0x30, 0x37, 0x8c, 0xb2, 0x9d, - 0x3c, 0x39, 0xae, 0x8c, 0x06, 0x08, 0xad, 0x3b, 0xcd, 0x66, 0x60, 0x6b, 0x28, 0x64, 0x09, 0x86, - 0x6d, 0x9f, 0x0b, 0x78, 0x6e, 0xe4, 0x6a, 0xe9, 0xfa, 0xe8, 0xc2, 0xa4, 0x98, 0x86, 0x12, 0xbc, - 0x78, 0xfe, 0xe4, 0xb8, 0x42, 0x02, 0xf1, 0x4b, 0xef, 0xa5, 0xc4, 0x20, 0x15, 0x18, 0xda, 0xf4, - 0x97, 0x9c, 0xc6, 0x21, 0x9d, 0x03, 0x9c, 0x7b, 0x03, 0x27, 0xc7, 0x95, 0xd2, 0x77, 0x6d, 0x09, - 0x25, 0x4f, 0x61, 0x34, 0x1e, 0xa8, 0x70, 0x6e, 0x14, 0xc5, 0xb7, 0x73, 0x72, 0x5c, 0x39, 0x1f, - 0x22, 0xb8, 0xce, 0x86, 0x5e, 0x93, 0xe0, 0x4b, 0xcc, 0x02, 0xbd, 0x22, 0xf2, 0x35, 0xcc, 0xc4, - 0x3f, 0xab, 0x61, 0x48, 0x03, 0xc6, 0x63, 0x6d, 0x79, 0x6e, 0x1c, 0x25, 0xf3, 0xe6, 0xc9, 0x71, - 0xc5, 0xd2, 0x5a, 0x50, 0x77, 0x24, 0x4a, 0xdd, 0x6d, 0x6a, 0x3d, 0xcd, 0x66, 0xf2, 0xa0, 0x7f, - 0x78, 0xac, 0x3c, 0x6e, 0x5f, 0xde, 0xf5, 0xc2, 0xc8, 0xd9, 0x6f, 0xd1, 0x4c, 0x24, 0xeb, 0xef, - 0x4b, 0x40, 0xb6, 0xda, 0xd4, 0xab, 0xd5, 0x56, 0xd9, 0xf7, 0x24, 0x3f, 0xa7, 0x77, 0x60, 0x84, - 0x0f, 0x1c, 0x1b, 0xdd, 0x5e, 0x1c, 0xdd, 0x89, 0x93, 0xe3, 0x0a, 0x88, 0xd1, 0x65, 0x23, 0x1b, - 0x23, 0x90, 0x37, 0xa0, 0x6f, 0x67, 0x67, 0x1d, 0xbf, 0x95, 0xbe, 0xc5, 0xa9, 0x93, 0xe3, 0x4a, - 0x5f, 0x14, 0xb5, 0x7e, 0x79, 0x5c, 0x19, 0x5e, 0xee, 0x04, 0x28, 0x16, 0x9b, 0x95, 0x93, 0x37, - 0x60, 0x68, 0xa9, 0xd5, 0x09, 0x23, 0x1a, 0xcc, 0xf5, 0xc7, 0x1f, 0x69, 0x83, 0x83, 0x6c, 0x59, - 0x46, 0xbe, 0x03, 0xfd, 0xbb, 0x21, 0x0d, 0xe6, 0x06, 0x70, 0xbc, 0xc7, 0xc5, 0x78, 0x33, 0xd0, - 0xde, 0xc2, 0xe2, 0x30, 0xfb, 0x12, 0x3b, 0x21, 0x0d, 0x6c, 0x44, 0x22, 0x37, 0x61, 0x80, 0x0f, - 0xda, 0x20, 0x2e, 0x52, 0xe3, 0x6a, 0x76, 0xb4, 0xe8, 0xde, 0xfb, 0x8b, 0x23, 0x27, 0xc7, 0x95, - 0x01, 0x1c, 0x3c, 0x9b, 0xa3, 0x3d, 0xe8, 0x1f, 0x2e, 0x95, 0x7b, 0xed, 0x61, 0x46, 0xcb, 0x3e, - 0x0b, 0xeb, 0x3b, 0x30, 0xaa, 0x75, 0x9f, 0x5c, 0x82, 0x7e, 0xf6, 0x3f, 0x2e, 0x22, 0x63, 0xbc, - 0x32, 0xb6, 0x71, 0xd8, 0x08, 0xb5, 0xfe, 0xf1, 0x24, 0x94, 0x19, 0xa5, 0xb1, 0xf2, 0x18, 0xa2, - 0x2a, 0x75, 0x13, 0xd5, 0x75, 0x50, 0x75, 0x8b, 0x25, 0x68, 0xec, 0xe4, 0xb8, 0x32, 0xdc, 0x11, - 0xb0, 0xb8, 0x65, 0xa4, 0x06, 0x43, 0x2b, 0xdf, 0xb4, 0xdd, 0x80, 0x86, 0x28, 0xd8, 0xd1, 0x85, - 0xf9, 0x9b, 0x7c, 0xb3, 0xbc, 0x29, 0x37, 0xcb, 0x9b, 0x3b, 0x72, 0xb3, 0x5c, 0xbc, 0x2c, 0x96, - 0xe2, 0x73, 0x94, 0x93, 0xc4, 0xb3, 0xe3, 0xf7, 0xfe, 0xb6, 0x52, 0xb2, 0x25, 0x27, 0xf2, 0x0e, - 0x0c, 0xde, 0xf3, 0x83, 0x23, 0x27, 0x12, 0x23, 0x30, 0x7d, 0x72, 0x5c, 0x29, 0x3f, 0x46, 0x88, - 0x36, 0xa1, 0x04, 0x0e, 0xb9, 0x07, 0x13, 0xb6, 0xdf, 0x89, 0xe8, 0x8e, 0x2f, 0xc7, 0x6d, 0x00, - 0xa9, 0xae, 0x9c, 0x1c, 0x57, 0xe6, 0x03, 0x56, 0x52, 0x8f, 0xfc, 0xba, 0x18, 0x40, 0x8d, 0x3e, - 0x41, 0x45, 0x56, 0x60, 0xa2, 0x8a, 0x6b, 0xb7, 0x90, 0x19, 0x1f, 0xad, 0x91, 0xc5, 0xcb, 0x27, - 0xc7, 0x95, 0x0b, 0x0e, 0x96, 0xd4, 0x03, 0x51, 0xa4, 0xb3, 0x31, 0x89, 0xc8, 0x26, 0x9c, 0x7b, - 0xd8, 0xd9, 0xa7, 0x81, 0x47, 0x23, 0x1a, 0xca, 0x16, 0x0d, 0x61, 0x8b, 0xae, 0x9e, 0x1c, 0x57, - 0x2e, 0x3d, 0x51, 0x85, 0x19, 0x6d, 0x4a, 0x93, 0x12, 0x0a, 0x93, 0xa2, 0xa1, 0xcb, 0x4e, 0xe4, - 0xec, 0x3b, 0x21, 0xc5, 0x25, 0x69, 0x74, 0xe1, 0x3c, 0x17, 0xf1, 0xcd, 0x44, 0xe9, 0xe2, 0x6b, - 0x42, 0xca, 0x17, 0x55, 0xdf, 0x9b, 0xa2, 0x48, 0xab, 0x28, 0xc9, 0x93, 0xad, 0xcc, 0x6a, 0xd7, - 0x19, 0xc1, 0xd6, 0xe2, 0xca, 0xac, 0x76, 0x1d, 0x7d, 0xcd, 0x52, 0xfb, 0xcf, 0x3a, 0x0c, 0xec, - 0xb2, 0xbd, 0x19, 0x57, 0xac, 0x89, 0x85, 0x6b, 0xa2, 0x45, 0xc9, 0xd9, 0x77, 0x93, 0xfd, 0x40, - 0x44, 0xfc, 0xee, 0x26, 0x71, 0x3f, 0xd7, 0x77, 0x62, 0x2c, 0x23, 0x9f, 0x03, 0x88, 0x56, 0x55, - 0xdb, 0xed, 0xb9, 0x51, 0xec, 0xe4, 0x39, 0xb3, 0x93, 0xd5, 0x76, 0x7b, 0xf1, 0x8a, 0xe8, 0xdf, - 0x79, 0xd5, 0x3f, 0xa7, 0xdd, 0xd6, 0xb8, 0x69, 0x4c, 0xc8, 0x67, 0x30, 0x86, 0x0b, 0x9a, 0x1c, - 0xd1, 0x31, 0x1c, 0xd1, 0x8b, 0x27, 0xc7, 0x95, 0x59, 0x5c, 0xab, 0x32, 0xc6, 0xd3, 0x20, 0x20, - 0xbf, 0x05, 0x33, 0x82, 0xdd, 0x23, 0xd7, 0x6b, 0xfa, 0xcf, 0xc2, 0x65, 0x1a, 0x3e, 0x89, 0xfc, - 0x36, 0x2e, 0x7e, 0xa3, 0x0b, 0x97, 0xcc, 0xe6, 0x99, 0x38, 0x8b, 0x37, 0x44, 0x4b, 0x2d, 0xd5, - 0xd2, 0x67, 0x1c, 0xa1, 0xde, 0xe4, 0x18, 0xfa, 0xf2, 0x98, 0xc9, 0x82, 0xac, 0xc1, 0xe4, 0x6e, - 0x48, 0x8d, 0x3e, 0x4c, 0xe0, 0xee, 0x50, 0x61, 0x23, 0xdc, 0x09, 0x69, 0x3d, 0xaf, 0x1f, 0x49, - 0x3a, 0x62, 0x03, 0x59, 0x0e, 0xfc, 0x76, 0x62, 0x8e, 0x4f, 0xa2, 0x44, 0xac, 0x93, 0xe3, 0xca, - 0x95, 0x66, 0xe0, 0xb7, 0xeb, 0xf9, 0x13, 0x3d, 0x83, 0x9a, 0xfc, 0x08, 0xce, 0x2f, 0xf9, 0x9e, - 0x47, 0x1b, 0x6c, 0xfd, 0x5c, 0x76, 0x9d, 0x03, 0xcf, 0x0f, 0x23, 0xb7, 0xb1, 0xb6, 0x3c, 0x57, - 0x8e, 0x37, 0x87, 0x86, 0xc2, 0xa8, 0x37, 0x15, 0x8a, 0xb9, 0x39, 0xe4, 0x70, 0x21, 0x3f, 0x84, - 0x71, 0x51, 0x17, 0x0d, 0x70, 0x6a, 0x9e, 0x2b, 0x9e, 0x68, 0x0a, 0x99, 0x6f, 0xf3, 0x81, 0xfc, - 0xc9, 0x15, 0x27, 0x93, 0x17, 0xf9, 0x1a, 0x46, 0x37, 0xee, 0x55, 0x6d, 0x1a, 0xb6, 0x7d, 0x2f, - 0xa4, 0x73, 0x04, 0x47, 0xf4, 0x8a, 0x60, 0xbd, 0x71, 0xaf, 0x5a, 0xed, 0x44, 0x87, 0xd4, 0x8b, - 0xdc, 0x86, 0x13, 0x51, 0x89, 0xb5, 0x38, 0xcf, 0x66, 0xde, 0xd1, 0x63, 0xa7, 0x1e, 0x08, 0x88, - 0xd6, 0x0b, 0x9d, 0x1d, 0x99, 0x87, 0xe1, 0x5a, 0x6d, 0x75, 0xdd, 0x3f, 0x70, 0xbd, 0xb9, 0x29, - 0x26, 0x0c, 0x5b, 0xfd, 0x26, 0xfb, 0x30, 0xa3, 0x9d, 0x0c, 0xea, 0xec, 0x7f, 0x7a, 0x44, 0xbd, - 0x68, 0x6e, 0x1a, 0xdb, 0xf0, 0x5d, 0x75, 0xb4, 0xb9, 0xa9, 0x1f, 0x20, 0x9e, 0xde, 0xb9, 0x59, - 0x8d, 0x7f, 0xd6, 0x24, 0x91, 0x3d, 0xed, 0x64, 0x40, 0xc9, 0x0e, 0x0c, 0x6d, 0x77, 0x82, 0xb6, - 0x1f, 0xd2, 0xb9, 0x19, 0x14, 0xda, 0x6b, 0x45, 0x5f, 0xa7, 0x40, 0x5d, 0x9c, 0x61, 0xcb, 0x73, - 0x9b, 0xff, 0xd0, 0x7a, 0x26, 0x59, 0x59, 0x5f, 0xc0, 0x88, 0xfa, 0x98, 0xc9, 0x10, 0xf4, 0x55, - 0x5b, 0xad, 0x72, 0x0f, 0xfb, 0xa3, 0x56, 0x5b, 0x2d, 0x97, 0xc8, 0x04, 0x40, 0xbc, 0x82, 0x95, - 0x7b, 0xc9, 0x18, 0x0c, 0xcb, 0x15, 0xa6, 0xdc, 0x87, 0xf8, 0xed, 0x76, 0xb9, 0x9f, 0x10, 0x98, - 0x30, 0xe7, 0x79, 0x79, 0xc0, 0xfa, 0xfd, 0x12, 0x8c, 0xa8, 0xf1, 0x21, 0x93, 0x30, 0xba, 0xbb, - 0x59, 0xdb, 0x5e, 0x59, 0x5a, 0xbb, 0xb7, 0xb6, 0xb2, 0x5c, 0xee, 0x21, 0x97, 0xe1, 0xc2, 0x4e, - 0x6d, 0xb5, 0xbe, 0xbc, 0x58, 0x5f, 0xdf, 0x5a, 0xaa, 0xae, 0xd7, 0xb7, 0xed, 0xad, 0x2f, 0xbe, - 0xac, 0xef, 0xec, 0x6e, 0x6e, 0xae, 0xac, 0x97, 0x4b, 0x64, 0x0e, 0xa6, 0x59, 0xf1, 0xc3, 0xdd, - 0xc5, 0x15, 0x1d, 0xa1, 0xdc, 0x4b, 0xae, 0xc1, 0xe5, 0xac, 0x92, 0xfa, 0xea, 0x4a, 0x75, 0x79, - 0x7d, 0xa5, 0x56, 0x2b, 0xf7, 0x91, 0x59, 0x98, 0x62, 0x28, 0xd5, 0xed, 0x6d, 0x83, 0xb6, 0xdf, - 0x6a, 0xc1, 0xa8, 0x26, 0x1c, 0x72, 0x09, 0xe6, 0x96, 0x56, 0xec, 0x9d, 0xfa, 0xf6, 0xae, 0xbd, - 0xbd, 0x55, 0x5b, 0xa9, 0x9b, 0x2d, 0x4c, 0x96, 0xae, 0x6f, 0xdd, 0x5f, 0xdb, 0xac, 0x33, 0x50, - 0xad, 0x5c, 0x62, 0xcd, 0x30, 0x4a, 0x6b, 0x6b, 0x9b, 0xf7, 0xd7, 0x57, 0xea, 0xbb, 0xb5, 0x15, - 0x81, 0xd2, 0x6b, 0xfd, 0xac, 0x37, 0xb5, 0xd4, 0x93, 0x05, 0x18, 0xad, 0xf1, 0x53, 0x2c, 0x4e, - 0x7f, 0x7e, 0x6c, 0x28, 0x9f, 0x1c, 0x57, 0xc6, 0xc4, 0xe1, 0x96, 0xcf, 0x6c, 0x1d, 0x89, 0xed, - 0xde, 0xdb, 0x6c, 0xa4, 0x1b, 0x7e, 0x4b, 0xdf, 0xbd, 0xdb, 0x02, 0x66, 0xab, 0x52, 0xb2, 0xa0, - 0xed, 0xf3, 0xfc, 0x0c, 0x81, 0x7a, 0xaa, 0xdc, 0xe7, 0xf5, 0x35, 0x5f, 0xed, 0xf8, 0x0b, 0xf1, - 0x90, 0x8a, 0xed, 0x19, 0x69, 0x32, 0xf6, 0x18, 0x85, 0x47, 0xde, 0x96, 0xfa, 0x0f, 0xd7, 0xf9, - 0x71, 0x13, 0x48, 0x68, 0xab, 0x42, 0xf5, 0xb1, 0x3a, 0x39, 0x0b, 0x2e, 0xf9, 0x38, 0x39, 0x67, - 0x84, 0x30, 0x90, 0x59, 0x62, 0x5d, 0xb5, 0x13, 0xa8, 0xa4, 0x02, 0x03, 0xfc, 0x4b, 0xe4, 0xf2, - 0x40, 0x8d, 0xab, 0xc5, 0x00, 0x36, 0x87, 0x5b, 0x7f, 0xd6, 0xa7, 0x6f, 0x3e, 0x4c, 0xc3, 0xd2, - 0xe4, 0x8d, 0x1a, 0x16, 0xca, 0x19, 0xa1, 0xe4, 0x26, 0x8c, 0xd4, 0x68, 0x18, 0x72, 0x2d, 0xb8, - 0x57, 0x0d, 0x09, 0x84, 0x1c, 0x58, 0x77, 0x9b, 0x73, 0x25, 0x3b, 0x46, 0x61, 0x07, 0x0a, 0xae, - 0x5b, 0xe1, 0x81, 0xa2, 0x2f, 0x3e, 0x50, 0x08, 0xed, 0x8b, 0x1f, 0x28, 0x62, 0x14, 0x36, 0xea, - 0x62, 0xfb, 0xc7, 0x56, 0xf4, 0xc7, 0xa3, 0x2e, 0x54, 0x06, 0x31, 0xea, 0x1a, 0x12, 0xf9, 0x08, - 0xa0, 0xfa, 0xa8, 0x86, 0x9a, 0xb3, 0xbd, 0x29, 0x54, 0x20, 0x5c, 0xac, 0x9c, 0x67, 0xa1, 0x50, - 0xcc, 0x03, 0xfd, 0xe4, 0xa1, 0x61, 0x93, 0x45, 0x18, 0xaf, 0xfe, 0xb4, 0x13, 0xd0, 0xb5, 0x26, - 0x5b, 0xef, 0x22, 0x7e, 0xc4, 0x1a, 0x59, 0xbc, 0x74, 0x72, 0x5c, 0x99, 0x73, 0x58, 0x41, 0xdd, - 0x15, 0x25, 0x1a, 0x03, 0x93, 0x84, 0x6c, 0xc1, 0xb9, 0xfb, 0x4b, 0xdb, 0x62, 0x1e, 0x56, 0x1b, - 0x0d, 0xbf, 0xe3, 0x45, 0x42, 0xef, 0xb9, 0x76, 0x72, 0x5c, 0xb9, 0x7c, 0xd0, 0x68, 0xd7, 0xe5, - 0x9c, 0x75, 0x78, 0xb1, 0xae, 0xf8, 0xa4, 0x68, 0xc9, 0x6b, 0xd0, 0xb7, 0x6b, 0xaf, 0x89, 0xf3, - 0xd7, 0xb9, 0x93, 0xe3, 0xca, 0x78, 0x27, 0x70, 0x35, 0x12, 0x56, 0x6a, 0xb5, 0x60, 0xe2, 0x3e, - 0x8d, 0xd8, 0xe4, 0x94, 0x9a, 0x6e, 0xf1, 0xd0, 0x7d, 0x02, 0xa3, 0x8f, 0xdc, 0xe8, 0xb0, 0x46, - 0x1b, 0x01, 0x8d, 0xe4, 0x29, 0x1f, 0xc5, 0xf4, 0xcc, 0x8d, 0x0e, 0xeb, 0x21, 0x87, 0xeb, 0x6b, - 0xba, 0x86, 0x6e, 0xad, 0xc0, 0xa4, 0xa8, 0x4d, 0x29, 0xd6, 0x0b, 0x26, 0xc3, 0x12, 0x32, 0xc4, - 0xa1, 0xd2, 0x19, 0x9a, 0x6c, 0xfe, 0xac, 0x17, 0x66, 0x96, 0x0e, 0x1d, 0xef, 0x80, 0x6e, 0x3b, - 0x61, 0xf8, 0xcc, 0x0f, 0x9a, 0x5a, 0xe3, 0xf1, 0x54, 0x91, 0x6a, 0x3c, 0x1e, 0x23, 0x16, 0x60, - 0x74, 0xab, 0xd5, 0x94, 0x34, 0xe2, 0xc4, 0x83, 0x75, 0xf9, 0xad, 0x66, 0xbd, 0x2d, 0x79, 0xe9, - 0x48, 0x8c, 0x66, 0x93, 0x3e, 0x53, 0x34, 0x7d, 0x31, 0x8d, 0x47, 0x9f, 0x69, 0x34, 0x1a, 0x12, - 0x59, 0x81, 0x73, 0x35, 0xda, 0xf0, 0xbd, 0xe6, 0x3d, 0xa7, 0x11, 0xf9, 0xc1, 0x8e, 0xff, 0x84, - 0x7a, 0x62, 0x12, 0xa2, 0x52, 0x18, 0x62, 0x61, 0xfd, 0x31, 0x96, 0xd6, 0x23, 0x56, 0x6c, 0xa7, - 0x29, 0xc8, 0x16, 0x0c, 0x3f, 0x12, 0xb6, 0x22, 0x71, 0x4c, 0x7a, 0xe3, 0xa6, 0x32, 0x1e, 0x2d, - 0x05, 0x14, 0x67, 0x8e, 0xd3, 0x52, 0x07, 0x3d, 0xb5, 0xc7, 0xe2, 0x72, 0x25, 0x31, 0x6d, 0xc5, - 0xc4, 0xda, 0x85, 0xf1, 0xed, 0x56, 0xe7, 0xc0, 0xf5, 0xd8, 0xc2, 0x52, 0xa3, 0x3f, 0x21, 0xcb, - 0x00, 0x31, 0x40, 0x58, 0x80, 0xa6, 0xc4, 0xe1, 0x2a, 0x2e, 0xd8, 0xbb, 0x2b, 0xbe, 0x36, 0x84, - 0xa0, 0x36, 0x6c, 0x6b, 0x74, 0xd6, 0x7f, 0xeb, 0x03, 0x22, 0x06, 0x00, 0xb7, 0xcf, 0x1a, 0x8d, - 0xd8, 0x16, 0x74, 0x1e, 0x7a, 0x95, 0xa1, 0x66, 0xf0, 0xe4, 0xb8, 0xd2, 0xeb, 0x36, 0xed, 0xde, - 0xb5, 0x65, 0xf2, 0x2e, 0x0c, 0x20, 0x1a, 0xca, 0x7f, 0x42, 0xd5, 0xa7, 0x73, 0xe0, 0x0b, 0x0c, - 0x6e, 0xeb, 0x36, 0x47, 0x26, 0xef, 0xc1, 0xc8, 0x32, 0x6d, 0xd1, 0x03, 0x27, 0xf2, 0xe5, 0x12, - 0xc0, 0x4d, 0x1f, 0x12, 0xa8, 0xcd, 0xb9, 0x18, 0x93, 0x1d, 0x85, 0x6c, 0xea, 0x84, 0xbe, 0xa7, - 0x1f, 0x85, 0x02, 0x84, 0xe8, 0x47, 0x21, 0x8e, 0x43, 0xfe, 0xa0, 0x04, 0xa3, 0x55, 0xcf, 0x13, - 0x26, 0x85, 0x50, 0x48, 0x7d, 0xe6, 0xa6, 0xb2, 0xc1, 0xad, 0x3b, 0xfb, 0xb4, 0xb5, 0xe7, 0xb4, - 0x3a, 0x34, 0x5c, 0xfc, 0x9a, 0x69, 0xa7, 0xff, 0xf6, 0xb8, 0xf2, 0xf1, 0x19, 0x8c, 0x04, 0xb1, - 0x35, 0x6f, 0x27, 0x70, 0xdc, 0x28, 0x3c, 0x39, 0xae, 0xcc, 0x38, 0x71, 0x85, 0xfa, 0x77, 0xa3, - 0xb5, 0x23, 0x5e, 0xff, 0x07, 0xbb, 0xad, 0xff, 0xe4, 0x08, 0x26, 0xab, 0x61, 0xd8, 0x39, 0xa2, - 0xb5, 0xc8, 0x09, 0x22, 0x76, 0x76, 0xc4, 0x45, 0xa4, 0xf8, 0x60, 0xf9, 0xd6, 0xcf, 0x8f, 0x2b, - 0x25, 0xa6, 0x10, 0x3b, 0x48, 0xca, 0x14, 0xaa, 0x20, 0xaa, 0x47, 0xae, 0xbe, 0x85, 0xe1, 0x11, - 0x33, 0xc9, 0xdb, 0x7a, 0x4d, 0x29, 0x1d, 0x6b, 0xcb, 0x79, 0x23, 0x6e, 0x2d, 0xc1, 0xa5, 0xfb, - 0x34, 0xb2, 0x69, 0x48, 0x23, 0xf9, 0x8d, 0xe0, 0x0c, 0x8f, 0xcd, 0x7a, 0x43, 0xf8, 0x5b, 0x11, - 0xe3, 0xf0, 0xf3, 0xef, 0x42, 0x96, 0x58, 0xff, 0x4b, 0x09, 0x2a, 0x4b, 0x01, 0xe5, 0xba, 0x64, - 0x0e, 0xa3, 0xe2, 0xb5, 0xeb, 0x12, 0xf4, 0xef, 0x3c, 0x6f, 0xcb, 0x13, 0x39, 0x96, 0xb2, 0x41, - 0xb1, 0x11, 0x7a, 0x4a, 0xf3, 0x86, 0xf5, 0x18, 0x66, 0x6c, 0xea, 0xd1, 0x67, 0xce, 0x7e, 0x8b, - 0x1a, 0x16, 0x82, 0x0a, 0x0c, 0xf0, 0x0f, 0x3d, 0xd5, 0x05, 0x0e, 0x3f, 0x9b, 0xb5, 0xc5, 0x1a, - 0x87, 0xd1, 0x6d, 0xd7, 0x3b, 0x10, 0xdc, 0xad, 0x3f, 0xed, 0x83, 0x31, 0xfe, 0x5b, 0xa8, 0xc7, - 0x89, 0x2d, 0xae, 0x74, 0x9a, 0x2d, 0xee, 0x03, 0x18, 0x67, 0x7b, 0x04, 0x0d, 0xf6, 0x68, 0xc0, - 0xb6, 0x56, 0x21, 0x09, 0x54, 0xf5, 0x43, 0x2c, 0xa8, 0x3f, 0xe5, 0x25, 0xb6, 0x89, 0x48, 0xd6, - 0x61, 0x82, 0x03, 0xee, 0x51, 0x27, 0xea, 0xc4, 0xd6, 0x8a, 0x49, 0xa1, 0x13, 0x4b, 0x30, 0x9f, - 0x9a, 0x82, 0xd7, 0x63, 0x01, 0xb4, 0x13, 0xb4, 0xe4, 0x33, 0x98, 0xdc, 0x0e, 0xfc, 0x6f, 0x9e, - 0x6b, 0x9b, 0x3a, 0xff, 0x3a, 0xb9, 0xf6, 0xcc, 0x8a, 0xea, 0xfa, 0xd6, 0x9e, 0xc4, 0x26, 0x6f, - 0xc3, 0xf0, 0x5a, 0xb8, 0xe8, 0x07, 0xae, 0x77, 0x80, 0xdf, 0xe8, 0x30, 0x37, 0xf1, 0xba, 0x61, - 0x7d, 0x1f, 0x81, 0xb6, 0x2a, 0x4e, 0x18, 0x23, 0x87, 0xba, 0x1b, 0x23, 0x6f, 0x03, 0xac, 0xfb, - 0x4e, 0xb3, 0xda, 0x6a, 0x2d, 0x55, 0x43, 0xdc, 0x3d, 0xc5, 0x7e, 0xd4, 0xf2, 0x9d, 0x66, 0xdd, - 0x69, 0xb5, 0xea, 0x0d, 0x27, 0xb4, 0x35, 0x9c, 0x07, 0xfd, 0xc3, 0x83, 0xe5, 0x21, 0x7b, 0x72, - 0xdd, 0x6d, 0x50, 0x2f, 0xa4, 0x8f, 0x9c, 0xc0, 0x73, 0xbd, 0x83, 0xd0, 0xfa, 0x97, 0x93, 0x30, - 0xac, 0xba, 0x7c, 0x53, 0x57, 0xec, 0xc5, 0x2e, 0x87, 0xa3, 0x1f, 0x9b, 0x33, 0x6c, 0x0d, 0x83, - 0x5c, 0x40, 0x55, 0x5f, 0xec, 0xaf, 0x43, 0x6c, 0x36, 0x3a, 0xed, 0xb6, 0xcd, 0x60, 0xec, 0x2b, - 0x5b, 0x5e, 0x44, 0xf9, 0x0f, 0xf3, 0xaf, 0xac, 0xb9, 0x6f, 0xf7, 0x2e, 0x2f, 0xb2, 0xe9, 0xbd, - 0xb5, 0xb6, 0xbc, 0x84, 0xa2, 0x1c, 0xe6, 0xd3, 0xdb, 0x77, 0x9b, 0x0d, 0x1b, 0xa1, 0xac, 0xb4, - 0x56, 0xdd, 0x58, 0x17, 0xe2, 0xc2, 0xd2, 0xd0, 0x39, 0x6a, 0xd9, 0x08, 0x65, 0xca, 0x21, 0x3f, - 0x99, 0x2e, 0xf9, 0x5e, 0x14, 0xf8, 0xad, 0x10, 0x35, 0x98, 0x61, 0x3e, 0x9c, 0xe2, 0x48, 0xdb, - 0x10, 0x45, 0x76, 0x02, 0x95, 0x3c, 0x82, 0xd9, 0x6a, 0xf3, 0xa9, 0xe3, 0x35, 0x68, 0x93, 0x97, - 0x3c, 0xf2, 0x83, 0x27, 0x8f, 0x5b, 0xfe, 0xb3, 0x10, 0xe5, 0x3d, 0x2c, 0x2c, 0x40, 0x02, 0x45, - 0x9e, 0x90, 0x9f, 0x49, 0x24, 0x3b, 0x8f, 0x9a, 0x7d, 0x52, 0x4b, 0x2d, 0xbf, 0xd3, 0x14, 0xa3, - 0x80, 0x9f, 0x54, 0x83, 0x01, 0x6c, 0x0e, 0x67, 0x52, 0x5a, 0xad, 0x6d, 0xa0, 0xbd, 0x45, 0x48, - 0xe9, 0x30, 0x3c, 0xb2, 0x19, 0x8c, 0xbc, 0x01, 0x43, 0x52, 0xcf, 0xe5, 0xe6, 0x60, 0x34, 0x43, - 0x4a, 0xfd, 0x56, 0x96, 0xb1, 0x4f, 0xc2, 0xa6, 0x0d, 0xff, 0x29, 0x0d, 0x9e, 0x2f, 0xf9, 0x4d, - 0x2a, 0xad, 0x03, 0xe2, 0xf4, 0xcb, 0x0b, 0xea, 0x0d, 0x56, 0x62, 0x9b, 0x88, 0xac, 0x02, 0xbe, - 0x07, 0x86, 0x73, 0x93, 0x71, 0x05, 0x7c, 0x8f, 0x0c, 0x6d, 0x59, 0x46, 0x96, 0xe1, 0x5c, 0xb5, - 0x13, 0xf9, 0x47, 0x4e, 0xe4, 0x36, 0x76, 0xdb, 0x07, 0x81, 0xc3, 0x2a, 0x29, 0x23, 0x01, 0xea, - 0xfd, 0x8e, 0x2c, 0xac, 0x77, 0x44, 0xa9, 0x9d, 0x26, 0x20, 0xef, 0xc3, 0xd8, 0x5a, 0xc8, 0x2d, - 0x40, 0x4e, 0x48, 0x9b, 0x78, 0x8c, 0x17, 0xad, 0x74, 0xc3, 0x3a, 0xda, 0x83, 0xea, 0xec, 0xa4, - 0xd0, 0xb4, 0x0d, 0x3c, 0x62, 0xc1, 0x60, 0x35, 0x0c, 0xdd, 0x30, 0xc2, 0xd3, 0xf9, 0xf0, 0x22, - 0x9c, 0x1c, 0x57, 0x06, 0x1d, 0x84, 0xd8, 0xa2, 0x84, 0x3c, 0x82, 0xd1, 0x65, 0xca, 0x14, 0xc7, - 0x9d, 0xa0, 0x13, 0x46, 0x78, 0xd6, 0x1e, 0x5d, 0xb8, 0x20, 0x3e, 0x6c, 0xad, 0x44, 0xcc, 0x65, - 0xae, 0xed, 0x35, 0x11, 0x5e, 0x8f, 0x58, 0x81, 0xbe, 0x6b, 0x69, 0xf8, 0x4c, 0x2b, 0x16, 0x34, - 0xab, 0x6e, 0x93, 0x7d, 0xaa, 0xd3, 0xd8, 0x06, 0xd4, 0x8a, 0xc5, 0xda, 0x50, 0x3f, 0xc4, 0x12, - 0x5d, 0x2b, 0x36, 0x48, 0x48, 0x23, 0x65, 0x54, 0x9c, 0x31, 0x0c, 0x47, 0x66, 0xa1, 0x6c, 0xe2, - 0x19, 0x4d, 0x8e, 0x9f, 0xc0, 0xe8, 0x52, 0x27, 0x8c, 0xfc, 0xa3, 0x9d, 0x43, 0x7a, 0x44, 0xe7, - 0xce, 0xc7, 0xba, 0x7f, 0x03, 0xc1, 0xf5, 0x88, 0xc1, 0xf5, 0x6e, 0x6a, 0xe8, 0xe4, 0x73, 0x20, - 0x52, 0x89, 0xbf, 0xcf, 0xe6, 0x87, 0xc7, 0xe6, 0xf2, 0xdc, 0x2c, 0xf6, 0x15, 0x35, 0x77, 0xa9, - 0xfb, 0xd7, 0x0f, 0x54, 0xb1, 0x6e, 0x16, 0x4a, 0x13, 0xb3, 0x06, 0xf1, 0x26, 0xde, 0x0f, 0x9c, - 0xf6, 0xe1, 0xdc, 0x5c, 0xac, 0x65, 0x8b, 0x4e, 0x1d, 0x30, 0xb8, 0xa1, 0x2d, 0xc4, 0xe8, 0xa4, - 0x06, 0xc0, 0x7f, 0xae, 0xb3, 0x81, 0xbf, 0x80, 0xf2, 0x9a, 0x33, 0xe4, 0xc5, 0x0a, 0xa4, 0xac, - 0x2e, 0xa0, 0x0e, 0xc2, 0xd9, 0xb6, 0x5c, 0x63, 0x34, 0x35, 0x36, 0xe4, 0x09, 0x94, 0xf9, 0xaf, - 0x0d, 0xdf, 0x73, 0x23, 0xbe, 0xf4, 0xce, 0x1b, 0x16, 0x9f, 0x64, 0xb1, 0xac, 0x00, 0x2d, 0x6d, - 0xa2, 0x82, 0x23, 0x55, 0xaa, 0x55, 0x93, 0x62, 0x4c, 0xb6, 0x61, 0x74, 0x3b, 0xf0, 0x9b, 0x9d, - 0x46, 0x84, 0x1b, 0xf6, 0x45, 0x54, 0x14, 0x89, 0xa8, 0x47, 0x2b, 0xe1, 0x32, 0x69, 0x73, 0x40, - 0x9d, 0x6d, 0xe6, 0xba, 0x4c, 0x34, 0x44, 0xb2, 0x08, 0x83, 0xdb, 0x7e, 0xcb, 0x6d, 0x3c, 0x9f, - 0xbb, 0x84, 0x8d, 0x9e, 0x96, 0xcc, 0x10, 0x28, 0x9b, 0x8a, 0xda, 0x61, 0x1b, 0x41, 0xba, 0x76, - 0xc8, 0x91, 0x48, 0x15, 0xc6, 0x3f, 0x67, 0x13, 0xc6, 0xf5, 0x3d, 0xcf, 0x71, 0x03, 0x3a, 0x77, - 0x19, 0xc7, 0x05, 0xad, 0xa1, 0x3f, 0xd1, 0x0b, 0xf4, 0xe9, 0x6c, 0x50, 0x90, 0x35, 0x98, 0x5c, - 0x0b, 0x6b, 0x51, 0xe0, 0xb6, 0xe9, 0x86, 0xe3, 0x39, 0x07, 0xb4, 0x39, 0x77, 0x25, 0x36, 0x47, - 0xba, 0x61, 0x3d, 0xc4, 0xb2, 0xfa, 0x11, 0x2f, 0xd4, 0xcd, 0x91, 0x09, 0x3a, 0xf2, 0x05, 0x4c, - 0xaf, 0x7c, 0x13, 0xb1, 0x19, 0xd3, 0xaa, 0x76, 0x9a, 0x6e, 0x54, 0x8b, 0xfc, 0xc0, 0x39, 0xa0, - 0x73, 0x15, 0xe4, 0xf7, 0xfa, 0xc9, 0x71, 0xe5, 0x2a, 0x15, 0xe5, 0x75, 0x87, 0x21, 0xd4, 0x43, - 0x8e, 0xa1, 0x5f, 0x32, 0x66, 0x71, 0x60, 0xd2, 0xaf, 0x75, 0xda, 0x4c, 0x71, 0x45, 0xe9, 0x5f, - 0x35, 0xa4, 0xaf, 0x95, 0x70, 0xe9, 0x87, 0x1c, 0x90, 0x92, 0xbe, 0x86, 0x48, 0x6c, 0x20, 0x0f, - 0x7c, 0xd7, 0xab, 0x36, 0x22, 0xf7, 0x29, 0x15, 0xe7, 0xfa, 0x70, 0xee, 0x1a, 0xb6, 0x14, 0x4d, - 0xa7, 0xbf, 0xee, 0xbb, 0x5e, 0xdd, 0xc1, 0xe2, 0xba, 0xb0, 0x02, 0x18, 0xa6, 0xd3, 0x34, 0x35, - 0xf9, 0x11, 0x9c, 0xdf, 0xf0, 0xf7, 0xdd, 0x16, 0xe5, 0x4b, 0x0e, 0x17, 0x0b, 0x1a, 0x01, 0x2d, - 0xe4, 0x8b, 0xa6, 0xd3, 0x23, 0xc4, 0xa8, 0x8b, 0xd5, 0xea, 0x48, 0xe1, 0xe8, 0xa6, 0xd3, 0x6c, - 0x2e, 0x0f, 0xfa, 0x87, 0x47, 0xcb, 0x63, 0xfc, 0x7a, 0xed, 0x41, 0xff, 0xf0, 0x78, 0x79, 0xc2, - 0xfa, 0xc3, 0x12, 0x90, 0xf4, 0x7a, 0x48, 0x6e, 0xc1, 0x10, 0xf5, 0x98, 0x3a, 0xd8, 0x14, 0xfb, - 0x3a, 0x6a, 0x31, 0x02, 0xa4, 0xdb, 0x00, 0x05, 0x88, 0x7c, 0x0e, 0x53, 0xbc, 0x41, 0x72, 0xe5, - 0x6e, 0xb9, 0x47, 0x6e, 0x84, 0x7b, 0xfd, 0x00, 0x5f, 0x31, 0x32, 0x8a, 0xf5, 0xb3, 0xbe, 0x28, - 0xc6, 0x75, 0x7e, 0x9d, 0x15, 0x5a, 0x1d, 0x98, 0xc9, 0x5c, 0x09, 0xc9, 0x06, 0xcc, 0x1c, 0xf9, - 0x5e, 0x74, 0xd8, 0x7a, 0x2e, 0x17, 0x42, 0x51, 0x5b, 0x09, 0x6b, 0xc3, 0x8f, 0x3f, 0x13, 0xc1, - 0x9e, 0x12, 0x60, 0xc1, 0x11, 0xeb, 0x79, 0xd0, 0x3f, 0xdc, 0x5b, 0xee, 0x53, 0x3d, 0xb1, 0x6c, - 0x38, 0x97, 0x5a, 0x50, 0xc8, 0xf7, 0x61, 0xac, 0x81, 0x7a, 0xba, 0x51, 0x13, 0x5f, 0x4e, 0x35, - 0xb8, 0x3e, 0x57, 0x38, 0x9c, 0x77, 0xe5, 0x4f, 0x4a, 0x30, 0x9b, 0xb3, 0x94, 0x9c, 0x5d, 0xd4, - 0x5f, 0xc2, 0xf9, 0x23, 0xe7, 0x9b, 0x7a, 0x80, 0xc7, 0xb0, 0x7a, 0xe0, 0x78, 0x09, 0x69, 0xe3, - 0x67, 0x92, 0x8d, 0xa1, 0x3b, 0x28, 0x1c, 0x39, 0xdf, 0xd8, 0x88, 0x60, 0xb3, 0x72, 0xde, 0xce, - 0x1f, 0xc0, 0xb8, 0xb1, 0x78, 0x9c, 0xb9, 0x71, 0xd6, 0x1d, 0x38, 0xc7, 0x0e, 0xaa, 0x11, 0x3d, - 0xb5, 0xf9, 0xc5, 0xda, 0x06, 0xa8, 0xd1, 0x23, 0xa7, 0x7d, 0xe8, 0x33, 0xa5, 0x72, 0x51, 0xff, - 0x25, 0x8e, 0xef, 0x44, 0x1c, 0xa7, 0x55, 0xc1, 0xde, 0x5d, 0xae, 0x68, 0x86, 0x0a, 0xd3, 0xd6, - 0xa8, 0xac, 0xbf, 0xec, 0x05, 0x22, 0xbe, 0xfe, 0x80, 0x3a, 0x47, 0xb2, 0x19, 0x1f, 0xc2, 0x18, - 0x3f, 0x6c, 0x71, 0x30, 0x36, 0x67, 0x74, 0x61, 0x4a, 0x2c, 0x02, 0x7a, 0xd1, 0x6a, 0x8f, 0x6d, - 0xa0, 0x32, 0x52, 0x9b, 0xf2, 0x53, 0x22, 0x92, 0xf6, 0x1a, 0xa4, 0x7a, 0x11, 0x23, 0xd5, 0x7f, - 0x93, 0xcf, 0x60, 0x62, 0xc9, 0x3f, 0x6a, 0x33, 0x99, 0x08, 0xe2, 0x3e, 0x71, 0x02, 0x17, 0xf5, - 0x1a, 0x85, 0xab, 0x3d, 0x76, 0x02, 0x9d, 0x6c, 0xc2, 0xd4, 0xbd, 0x56, 0x27, 0x3c, 0xac, 0x7a, - 0xcd, 0xa5, 0x96, 0x1f, 0x4a, 0x2e, 0xfd, 0xe2, 0x04, 0x2c, 0x0e, 0x2b, 0x69, 0x8c, 0xd5, 0x1e, - 0x3b, 0x8b, 0x90, 0xbc, 0x01, 0x03, 0x2b, 0x4f, 0xd9, 0x9a, 0x22, 0xaf, 0xa9, 0x85, 0x17, 0xcd, - 0x96, 0x47, 0xb7, 0x1e, 0xaf, 0xf6, 0xd8, 0xbc, 0x74, 0x71, 0x04, 0x86, 0xe4, 0x41, 0xed, 0x16, - 0xd3, 0xf7, 0x94, 0x38, 0x6b, 0x91, 0x13, 0x75, 0x42, 0x32, 0x0f, 0xc3, 0xbb, 0x6d, 0x76, 0x7e, - 0x90, 0x27, 0x5c, 0x5b, 0xfd, 0xb6, 0xde, 0x31, 0x25, 0x4d, 0x2e, 0xe9, 0xc6, 0x51, 0x8e, 0x1c, - 0x03, 0xac, 0x55, 0x53, 0xb8, 0xc5, 0xd8, 0x46, 0xbd, 0xbd, 0x89, 0x7a, 0xcb, 0x49, 0x59, 0x5b, - 0x33, 0x99, 0xc2, 0xb3, 0xbe, 0x80, 0x2b, 0xbb, 0xed, 0x90, 0x06, 0x51, 0xb5, 0xdd, 0x6e, 0xb9, - 0x0d, 0x7e, 0x4d, 0x82, 0x07, 0x3a, 0x39, 0x59, 0xde, 0x87, 0x41, 0x0e, 0x10, 0xd3, 0x44, 0xce, - 0xc1, 0x6a, 0xbb, 0x2d, 0x8e, 0x91, 0x77, 0xb9, 0xe6, 0xc9, 0x0f, 0x86, 0xb6, 0xc0, 0xb6, 0x7e, - 0xaf, 0x04, 0x57, 0xf8, 0x17, 0x90, 0xcb, 0xfa, 0x3b, 0x30, 0x82, 0x4e, 0x2c, 0x6d, 0xa7, 0x21, - 0xbf, 0x09, 0xee, 0xcd, 0x23, 0x81, 0x76, 0x5c, 0xae, 0xb9, 0x07, 0xf5, 0xe6, 0xbb, 0x07, 0xc9, - 0x0f, 0xac, 0x2f, 0xf3, 0x03, 0xfb, 0x1c, 0x2c, 0xd1, 0xa2, 0x56, 0x2b, 0xd5, 0xa8, 0xf0, 0x45, - 0x5a, 0x65, 0xfd, 0xa7, 0x5e, 0x98, 0xbd, 0x4f, 0x3d, 0x1a, 0x38, 0xd8, 0x4f, 0xc3, 0x60, 0xa1, - 0x3b, 0x0a, 0x94, 0x0a, 0x1d, 0x05, 0x2a, 0xd2, 0x04, 0xd4, 0x8b, 0x26, 0xa0, 0x94, 0xcf, 0x03, - 0x3b, 0x0b, 0xed, 0xda, 0x6b, 0xa2, 0x5b, 0x78, 0x16, 0xea, 0x04, 0x2e, 0x1a, 0x79, 0xc9, 0x5a, - 0xec, 0x64, 0xd0, 0xdf, 0xd5, 0x16, 0x34, 0x25, 0x2e, 0x5d, 0x87, 0x84, 0x93, 0x81, 0xe9, 0x5a, - 0xb0, 0x09, 0x83, 0xdc, 0x72, 0x85, 0x57, 0x11, 0xa3, 0x0b, 0x37, 0xc4, 0x37, 0x95, 0xd3, 0x41, - 0x61, 0xe6, 0x5a, 0xf1, 0xa2, 0xe0, 0x39, 0x9f, 0x02, 0x11, 0x02, 0x6c, 0xc1, 0x65, 0xfe, 0x73, - 0x18, 0xd5, 0x50, 0x48, 0x19, 0xfa, 0x9e, 0x08, 0x07, 0x8b, 0x11, 0x9b, 0xfd, 0x49, 0xde, 0x81, - 0x81, 0xa7, 0x4e, 0xab, 0x43, 0xc5, 0x32, 0x72, 0x3e, 0xb6, 0xc5, 0x31, 0x75, 0xc8, 0x3b, 0xe0, - 0xc6, 0x38, 0x9b, 0x23, 0x7d, 0xd4, 0xfb, 0x41, 0xc9, 0xfa, 0x18, 0xe6, 0xd2, 0xad, 0x11, 0x56, - 0x93, 0x6e, 0x46, 0x1a, 0x6b, 0x19, 0xa6, 0xef, 0xd3, 0x08, 0x27, 0x2e, 0x7e, 0x44, 0x9a, 0xff, - 0x47, 0xe2, 0x3b, 0x93, 0xab, 0xaa, 0xbc, 0xb2, 0xd0, 0xbf, 0xd2, 0x1a, 0xcc, 0x24, 0xb8, 0x88, - 0xfa, 0x3f, 0x82, 0x21, 0x01, 0x52, 0x2b, 0xaa, 0xf0, 0xb7, 0xa3, 0xfb, 0xa2, 0x60, 0x6f, 0x81, - 0xcf, 0x5b, 0xc1, 0xd9, 0x96, 0x04, 0xd6, 0x21, 0x9c, 0x67, 0xdb, 0x6c, 0xcc, 0x55, 0x4d, 0xc7, - 0x8b, 0x30, 0xd2, 0x66, 0x8a, 0x42, 0xe8, 0xfe, 0x94, 0x4f, 0xa3, 0x01, 0x7b, 0x98, 0x01, 0x6a, - 0xee, 0x4f, 0x29, 0xb9, 0x0c, 0x80, 0x85, 0xd8, 0x4d, 0xb1, 0x0a, 0x20, 0x3a, 0xb7, 0x4a, 0x11, - 0x40, 0x47, 0x1b, 0x3e, 0x6f, 0x6c, 0xfc, 0xdb, 0x0a, 0x60, 0x36, 0x55, 0x93, 0xe8, 0xc0, 0x2d, - 0x18, 0x96, 0xfa, 0x59, 0xc2, 0x5e, 0xac, 0xf7, 0xc0, 0x56, 0x48, 0xe4, 0x4d, 0x98, 0xf4, 0xe8, - 0x37, 0x51, 0x3d, 0xd5, 0x86, 0x71, 0x06, 0xde, 0x96, 0xed, 0xb0, 0x7e, 0x0d, 0x6d, 0x84, 0x35, - 0xcf, 0x7f, 0xf6, 0xb8, 0xe5, 0x3c, 0xa1, 0xa9, 0x8a, 0xbf, 0x0f, 0xc3, 0xb5, 0xee, 0x15, 0xf3, - 0xcf, 0x47, 0x56, 0x6e, 0x2b, 0x12, 0xab, 0x05, 0xf3, 0xac, 0x4b, 0xb5, 0xea, 0xc6, 0xfa, 0x5a, - 0x73, 0xfb, 0xdb, 0x16, 0xe0, 0x53, 0xb8, 0x98, 0x59, 0xdb, 0xb7, 0x2d, 0xc4, 0x7f, 0xda, 0x0f, - 0xb3, 0x7c, 0x33, 0x49, 0xcf, 0xe0, 0xd3, 0x2f, 0x35, 0xbf, 0x92, 0xeb, 0xb6, 0xdb, 0x19, 0xd7, - 0x6d, 0x48, 0xa2, 0x5f, 0xb7, 0x19, 0x97, 0x6c, 0x1f, 0x64, 0x5f, 0xb2, 0xa1, 0x11, 0xc4, 0xbc, - 0x64, 0x4b, 0x5e, 0xad, 0xad, 0xe4, 0x5f, 0xad, 0xe1, 0x1d, 0x42, 0xc6, 0xd5, 0x5a, 0xd6, 0x85, - 0x5a, 0xc2, 0xdf, 0x61, 0xf8, 0xd5, 0xfa, 0x3b, 0xbc, 0x09, 0x43, 0xd5, 0x76, 0x5b, 0xf3, 0x1f, - 0xc2, 0xe1, 0x71, 0xda, 0x6d, 0x2e, 0x3c, 0x59, 0x28, 0xd7, 0x79, 0xc8, 0x58, 0xe7, 0x3f, 0x04, - 0x58, 0x42, 0x1f, 0x67, 0x1c, 0xb8, 0x51, 0xc4, 0x40, 0x0d, 0x9f, 0x7b, 0x3e, 0xe3, 0xc0, 0xe9, - 0xc7, 0xfb, 0x18, 0x99, 0x2b, 0xf6, 0xd6, 0x1e, 0xcc, 0xa5, 0xa7, 0xcf, 0x2b, 0x58, 0xba, 0xfe, - 0xbc, 0x04, 0x97, 0x85, 0x92, 0x93, 0xf8, 0xc0, 0xcf, 0x3e, 0x3b, 0xdf, 0x83, 0x31, 0x41, 0xbb, - 0x13, 0x7f, 0x08, 0xfc, 0x7e, 0x53, 0x2e, 0xc6, 0x7c, 0x45, 0x37, 0xd0, 0xc8, 0x7b, 0x30, 0x8c, - 0x7f, 0xc4, 0x36, 0x7e, 0x26, 0x99, 0x11, 0x44, 0xad, 0x27, 0x2d, 0xfd, 0x0a, 0xd5, 0xfa, 0x1a, - 0xae, 0xe4, 0x35, 0xfc, 0x15, 0xc8, 0xe5, 0x9f, 0x95, 0xe0, 0xa2, 0x60, 0x6f, 0x2c, 0x15, 0x2f, - 0xb4, 0xeb, 0x9c, 0xc1, 0xeb, 0xf0, 0x01, 0x8c, 0xb2, 0x0a, 0x65, 0xbb, 0xfb, 0xc4, 0xd6, 0x2a, - 0x4e, 0x0e, 0x71, 0xc9, 0xb2, 0x13, 0x39, 0xc2, 0x5b, 0xc2, 0x39, 0x6a, 0xc9, 0x93, 0xb9, 0xad, - 0x13, 0x5b, 0x5f, 0xc1, 0xa5, 0xec, 0x2e, 0xbc, 0x02, 0xf9, 0x3c, 0x80, 0xf9, 0x8c, 0x4d, 0xe1, - 0xc5, 0xf6, 0xe4, 0x2f, 0xe1, 0x62, 0x26, 0xaf, 0x57, 0xd0, 0xcc, 0x55, 0xa6, 0x71, 0x44, 0xaf, - 0x60, 0x08, 0xad, 0x47, 0x70, 0x21, 0x83, 0xd3, 0x2b, 0x68, 0xe2, 0x7d, 0x98, 0x55, 0x9a, 0xf6, - 0x4b, 0xb5, 0x70, 0x03, 0x2e, 0x73, 0x46, 0xaf, 0x66, 0x54, 0x1e, 0xc2, 0x45, 0xc1, 0xee, 0x15, - 0x48, 0x6f, 0x15, 0x2e, 0xc5, 0x07, 0xea, 0x0c, 0x3d, 0xe9, 0xd4, 0x8b, 0x8c, 0xb5, 0x0e, 0x57, - 0x63, 0x4e, 0x39, 0x4a, 0xc3, 0xe9, 0xb9, 0x71, 0x75, 0x30, 0x1e, 0xa5, 0x57, 0x32, 0xa2, 0x8f, - 0xe0, 0xbc, 0xc1, 0xf4, 0x95, 0xa9, 0x4a, 0x6b, 0x30, 0xc5, 0x19, 0x9b, 0xaa, 0xf3, 0x82, 0xae, - 0x3a, 0x8f, 0x2e, 0x9c, 0x8b, 0x59, 0x22, 0x78, 0xef, 0x6e, 0x86, 0x36, 0xbd, 0x81, 0xda, 0xb4, - 0x44, 0x89, 0x5b, 0xf8, 0x1e, 0x0c, 0x72, 0x88, 0x68, 0x5f, 0x06, 0x33, 0x7e, 0x58, 0xe0, 0x64, - 0x02, 0xd9, 0xfa, 0x11, 0x5c, 0xe6, 0x27, 0xd1, 0xf8, 0xa2, 0xcc, 0x3c, 0x2d, 0x7e, 0x3f, 0x71, - 0x10, 0xbd, 0x20, 0xf8, 0x26, 0xf1, 0x73, 0xce, 0xa3, 0xfb, 0x72, 0x6e, 0xe7, 0xf1, 0x3f, 0xd5, - 0xfb, 0x13, 0x79, 0xc0, 0xec, 0xcd, 0x3c, 0x60, 0xbe, 0x06, 0xd7, 0xd4, 0x01, 0x33, 0x59, 0x8d, - 0x9c, 0x5a, 0xd6, 0x57, 0x70, 0x91, 0x77, 0x54, 0x7a, 0x80, 0x99, 0xcd, 0xf8, 0x38, 0xd1, 0xcd, - 0x59, 0xd1, 0x4d, 0x13, 0x3b, 0xa7, 0x93, 0xff, 0x7b, 0x49, 0x7e, 0x72, 0xd9, 0xcc, 0x7f, 0xd5, - 0x27, 0xee, 0x4d, 0xa8, 0x28, 0x81, 0x98, 0x2d, 0x7a, 0xb1, 0xe3, 0xf6, 0x06, 0xcc, 0xe8, 0x6c, - 0xdc, 0x06, 0xdd, 0xbb, 0x83, 0x37, 0x18, 0xef, 0xb2, 0xcf, 0x02, 0x01, 0x72, 0xda, 0xcd, 0x65, - 0xc8, 0x0d, 0xf1, 0x6d, 0x85, 0x69, 0xd5, 0xe1, 0x52, 0x7a, 0x28, 0xdc, 0x86, 0x74, 0x0b, 0x26, - 0x9f, 0xb1, 0x4f, 0x18, 0x21, 0x62, 0x30, 0x72, 0x99, 0xca, 0xef, 0x98, 0x93, 0x4b, 0x2a, 0xcb, - 0x92, 0x4b, 0x4d, 0xa2, 0xff, 0xac, 0x76, 0x39, 0x1f, 0x7e, 0x13, 0x88, 0x2c, 0x5a, 0xaa, 0xd9, - 0xb2, 0xea, 0x0b, 0xd0, 0xb7, 0x54, 0xb3, 0xc5, 0x6b, 0x04, 0xd4, 0x04, 0x1b, 0x61, 0x60, 0x33, - 0x58, 0x52, 0x23, 0xef, 0x3d, 0x85, 0x46, 0xfe, 0xa0, 0x7f, 0xb8, 0xaf, 0xdc, 0x6f, 0x93, 0x9a, - 0x7b, 0xe0, 0x3d, 0x72, 0xa3, 0x43, 0x55, 0x61, 0xd5, 0xfa, 0x21, 0x4c, 0x19, 0xd5, 0x8b, 0xaf, - 0xb8, 0xf0, 0x19, 0x05, 0xd3, 0x67, 0x97, 0xaa, 0xe8, 0x21, 0x81, 0x26, 0x8b, 0x31, 0xbe, 0xde, - 0x34, 0x9c, 0x3a, 0xbe, 0xd1, 0xb3, 0x65, 0xa1, 0xf5, 0xff, 0xf5, 0x6b, 0xdc, 0xb5, 0xc7, 0x29, - 0x05, 0xbd, 0xbb, 0x03, 0xc0, 0x67, 0x88, 0xd6, 0x39, 0xa6, 0x00, 0x8e, 0x0a, 0xc7, 0x03, 0xbe, - 0x24, 0xdb, 0x1a, 0xd2, 0x69, 0x1f, 0xaf, 0x08, 0x77, 0x51, 0x4e, 0x24, 0xdf, 0x6b, 0x29, 0x77, - 0x51, 0xc1, 0x3a, 0xb4, 0x75, 0x24, 0xf2, 0xa3, 0xa4, 0x8f, 0xf5, 0x00, 0x5e, 0x98, 0xbc, 0x2e, - 0x6f, 0x50, 0xd3, 0x7d, 0x3b, 0x9b, 0x9b, 0xf5, 0x33, 0x98, 0x61, 0xb4, 0xee, 0x63, 0x3c, 0x58, - 0xac, 0x7c, 0x13, 0x51, 0x8f, 0xaf, 0xed, 0x83, 0x58, 0xcf, 0x1b, 0x05, 0xf5, 0xc4, 0xc8, 0xc2, - 0xfe, 0x1e, 0xf3, 0xa9, 0x53, 0x55, 0x66, 0x67, 0xf3, 0xc7, 0x49, 0x64, 0xaf, 0xaf, 0x78, 0xcd, - 0xb6, 0xef, 0xaa, 0x03, 0x13, 0x9f, 0x44, 0x41, 0xab, 0x4e, 0x05, 0xdc, 0xd6, 0x91, 0xac, 0x37, - 0x0b, 0x9d, 0x90, 0x87, 0xa1, 0x7f, 0x67, 0x69, 0x67, 0xbd, 0x5c, 0xb2, 0x6e, 0x01, 0x68, 0x35, - 0x01, 0x0c, 0x6e, 0x6e, 0xd9, 0x1b, 0xd5, 0xf5, 0x72, 0x0f, 0x99, 0x81, 0x73, 0x8f, 0xd6, 0x36, - 0x97, 0xb7, 0x1e, 0xd5, 0xea, 0xb5, 0x8d, 0xaa, 0xbd, 0xb3, 0x54, 0xb5, 0x97, 0xcb, 0x25, 0xeb, - 0x6b, 0x98, 0x36, 0x7b, 0xf8, 0x4a, 0x27, 0x61, 0x04, 0x53, 0x4a, 0x9f, 0x79, 0xf0, 0x68, 0x47, - 0x73, 0x4e, 0x14, 0x87, 0xbf, 0xa4, 0x93, 0x8d, 0x38, 0x26, 0x8a, 0xcf, 0x48, 0x43, 0x22, 0x6f, - 0x73, 0xb5, 0x20, 0xf9, 0xfc, 0x90, 0xa9, 0x05, 0xf5, 0x58, 0x2f, 0xc0, 0xa5, 0xef, 0x7b, 0x30, - 0x6d, 0xd6, 0x7a, 0x5a, 0x2b, 0xd5, 0xeb, 0xe8, 0xb5, 0xa9, 0xbd, 0x4e, 0x20, 0x44, 0xbf, 0x36, - 0x10, 0x2b, 0xeb, 0xf7, 0xa0, 0x2c, 0xb0, 0xe2, 0x9d, 0xf7, 0x35, 0x69, 0x46, 0x2c, 0x65, 0xbc, - 0xa4, 0x92, 0x3e, 0xc4, 0x3e, 0x94, 0xd9, 0x8a, 0x29, 0x28, 0x79, 0x05, 0xd3, 0x30, 0xb0, 0x1e, - 0x5f, 0xe7, 0xd8, 0xfc, 0x07, 0x3a, 0xe9, 0x47, 0x4e, 0x10, 0x49, 0x97, 0xa6, 0x11, 0x5b, 0xfd, - 0x26, 0x6f, 0xc3, 0xe0, 0x3d, 0xb7, 0x15, 0x09, 0xd3, 0x48, 0xbc, 0xc9, 0x33, 0xb6, 0xbc, 0xc0, - 0x16, 0x08, 0x96, 0x0d, 0xe7, 0xb4, 0x0a, 0xcf, 0xd0, 0x54, 0x32, 0x07, 0x43, 0x9b, 0xf4, 0x1b, - 0xad, 0x7e, 0xf9, 0xd3, 0x7a, 0x1f, 0xce, 0x09, 0x77, 0x31, 0x4d, 0x4c, 0xd7, 0xc4, 0x83, 0xcf, - 0x92, 0xf1, 0xea, 0x4c, 0xb0, 0xc4, 0x22, 0x46, 0xb7, 0xdb, 0x6e, 0xbe, 0x20, 0x1d, 0xdb, 0x28, - 0xce, 0x48, 0xf7, 0x96, 0xbc, 0x05, 0xea, 0x36, 0x9c, 0x7f, 0x59, 0x82, 0xb9, 0x84, 0x95, 0x61, - 0xe9, 0xd0, 0x69, 0xb5, 0xa8, 0x77, 0x40, 0xc9, 0x75, 0xe8, 0xdf, 0xd9, 0xda, 0xd9, 0x16, 0x56, - 0x52, 0x79, 0xbb, 0xcd, 0x40, 0x0a, 0xc7, 0x46, 0x0c, 0xf2, 0x10, 0xce, 0x49, 0x87, 0x50, 0x55, - 0x24, 0x46, 0xe8, 0x72, 0xb1, 0x7b, 0x69, 0x9a, 0x8e, 0xbc, 0x2b, 0x4c, 0x22, 0x3f, 0xe9, 0xb8, - 0x01, 0x6d, 0xa2, 0xe5, 0x27, 0xbe, 0x2a, 0xd6, 0x4a, 0x6c, 0x1d, 0x8d, 0x3f, 0xcf, 0xb3, 0xfe, - 0xa0, 0x04, 0xb3, 0x39, 0x56, 0x13, 0xf2, 0xb6, 0xd1, 0x9d, 0x29, 0xad, 0x3b, 0x12, 0x65, 0xb5, - 0x47, 0xf4, 0x67, 0x49, 0xf3, 0x92, 0xed, 0x3b, 0x83, 0x97, 0xec, 0x6a, 0x4f, 0xec, 0x19, 0xbb, - 0x08, 0x30, 0x2c, 0xe1, 0xd6, 0x24, 0x8c, 0x1b, 0x72, 0xb3, 0x2c, 0x18, 0xd3, 0x6b, 0x66, 0x83, - 0xb3, 0xe4, 0x37, 0xd5, 0xe0, 0xb0, 0xbf, 0xad, 0xdf, 0x2f, 0xc1, 0x34, 0x76, 0xf1, 0xc0, 0x65, - 0x4b, 0x5f, 0x2c, 0xa1, 0x05, 0xa3, 0x27, 0x97, 0x8c, 0x9e, 0x24, 0x70, 0x55, 0x97, 0x3e, 0x4a, - 0x75, 0xe9, 0x52, 0x56, 0x97, 0x70, 0x7a, 0xbb, 0xbe, 0x67, 0xf4, 0x44, 0xbb, 0x8a, 0xfa, 0xc3, - 0x12, 0x4c, 0x69, 0x6d, 0x52, 0xed, 0xbf, 0x63, 0x34, 0xe9, 0x62, 0x46, 0x93, 0x52, 0x42, 0x5e, - 0x4c, 0xb5, 0xe8, 0xf5, 0xa2, 0x16, 0x75, 0x95, 0xf1, 0x7f, 0x28, 0xc1, 0x4c, 0xa6, 0x0c, 0xc8, - 0x79, 0xa6, 0xdb, 0x36, 0x02, 0x1a, 0x09, 0xf1, 0x8a, 0x5f, 0x0c, 0xbe, 0x16, 0x86, 0x1d, 0x1a, - 0x88, 0xef, 0x5c, 0xfc, 0x22, 0xaf, 0xc3, 0xf8, 0x36, 0x0d, 0x5c, 0xbf, 0xc9, 0xfd, 0xa7, 0xb9, - 0x63, 0xe2, 0xb8, 0x6d, 0x02, 0xc9, 0x25, 0x18, 0xa9, 0xb6, 0x0e, 0xfc, 0xc0, 0x8d, 0x0e, 0xf9, - 0x6d, 0xe0, 0x88, 0x1d, 0x03, 0x18, 0xef, 0x65, 0xf7, 0x80, 0x5f, 0x6a, 0x30, 0x62, 0xf1, 0x8b, - 0x2d, 0x2e, 0xd2, 0x5a, 0x38, 0xc8, 0x17, 0x17, 0x69, 0x0a, 0x3c, 0x0f, 0x83, 0x9f, 0xdb, 0x38, - 0x09, 0xf0, 0x51, 0xb4, 0x2d, 0x7e, 0x91, 0x09, 0xf4, 0x80, 0x45, 0x97, 0x7b, 0xf4, 0x7c, 0xfd, - 0x08, 0xa6, 0xb3, 0xe4, 0x9a, 0x35, 0x85, 0x04, 0x6d, 0xaf, 0xa2, 0xfd, 0x0a, 0xa6, 0xaa, 0xcd, - 0xe6, 0xc6, 0xbd, 0x2a, 0xf7, 0x39, 0x10, 0xa3, 0xca, 0x3f, 0x1e, 0x6e, 0xaf, 0x13, 0x2a, 0x5b, - 0xff, 0x9a, 0xe7, 0x46, 0xf6, 0xd4, 0xca, 0x37, 0x6e, 0x18, 0xb9, 0xde, 0x81, 0x66, 0x54, 0xb4, - 0xcf, 0x6f, 0xd2, 0x67, 0x19, 0x53, 0x80, 0xed, 0xa6, 0x26, 0x6f, 0x0e, 0xcf, 0x60, 0x3e, 0xad, - 0xb1, 0x8d, 0x97, 0x92, 0x59, 0x93, 0x6f, 0x5c, 0xd0, 0x57, 0x6d, 0x3c, 0xb1, 0xbe, 0x07, 0xe7, - 0xf9, 0x92, 0x56, 0xd4, 0x78, 0xd1, 0x6c, 0xdd, 0x06, 0x6a, 0x7d, 0x20, 0xad, 0x14, 0x85, 0x2d, - 0xb3, 0xc7, 0x8c, 0xb6, 0x60, 0x95, 0xff, 0xb1, 0x04, 0xf3, 0x09, 0xd2, 0xda, 0x73, 0xaf, 0x21, - 0xd7, 0xd3, 0x37, 0x93, 0x1e, 0xc6, 0xa8, 0x07, 0x70, 0xe3, 0x9f, 0xdb, 0x54, 0x4e, 0xc6, 0xe4, - 0x16, 0x00, 0x27, 0xd6, 0xb6, 0x6f, 0x34, 0x7d, 0x0b, 0x0f, 0x12, 0xdc, 0xc0, 0x35, 0x14, 0xd2, - 0x81, 0x2c, 0xb9, 0x8b, 0x6f, 0xa4, 0x9b, 0x6d, 0x18, 0x03, 0x01, 0x50, 0x41, 0x5e, 0xcf, 0x31, - 0x12, 0x67, 0xf1, 0xb7, 0xfe, 0x8f, 0x3e, 0x98, 0xd5, 0x07, 0xf0, 0x45, 0xfa, 0xba, 0x0d, 0xa3, - 0x4b, 0xbe, 0x17, 0xd1, 0x6f, 0x22, 0xed, 0x21, 0x36, 0x51, 0x37, 0xed, 0xaa, 0x44, 0xa8, 0x8e, - 0x1c, 0x50, 0x67, 0x7a, 0x8c, 0xe1, 0x09, 0x17, 0x23, 0x92, 0x25, 0x18, 0xdf, 0xa4, 0xcf, 0x52, - 0x02, 0x44, 0x6f, 0x3c, 0x8f, 0x3e, 0xab, 0x6b, 0x42, 0xd4, 0x5d, 0xa4, 0x0c, 0x1a, 0xb2, 0x0f, - 0x13, 0x72, 0x72, 0x19, 0xc2, 0x9c, 0xd7, 0x77, 0x15, 0x73, 0x3a, 0xf3, 0xa7, 0xca, 0xac, 0x86, - 0x1c, 0x19, 0x26, 0x38, 0xb2, 0xae, 0xf3, 0x1a, 0xf9, 0xeb, 0x5b, 0x73, 0xdb, 0xd2, 0x4a, 0x0c, - 0x5f, 0xc7, 0xe4, 0xab, 0x5b, 0x9d, 0x85, 0xb5, 0x0d, 0x73, 0xe9, 0xf1, 0x10, 0xb5, 0xbd, 0x0b, - 0x83, 0x1c, 0x2a, 0xd4, 0x00, 0x19, 0x63, 0x43, 0x61, 0xf3, 0x73, 0x3a, 0xaf, 0xc6, 0x16, 0xb8, - 0xd6, 0x2a, 0xda, 0x4e, 0x14, 0x8e, 0x52, 0xc4, 0x6e, 0x27, 0x87, 0x17, 0xdd, 0x48, 0xe5, 0xf0, - 0xea, 0x7e, 0x26, 0xd2, 0x73, 0x7e, 0x09, 0xcd, 0x4f, 0x3a, 0x27, 0xd1, 0xb0, 0x1b, 0x30, 0x24, - 0x40, 0x89, 0xe8, 0x1f, 0xf1, 0xe7, 0x27, 0x11, 0xac, 0x8f, 0xe0, 0x02, 0xda, 0xc2, 0x5c, 0xef, - 0xa0, 0x45, 0x77, 0x43, 0xc3, 0xf7, 0xbd, 0xdb, 0x67, 0xfd, 0x09, 0xcc, 0x67, 0xd1, 0x76, 0xfd, - 0xb2, 0xf9, 0x7b, 0xfc, 0xbf, 0xe9, 0x85, 0xe9, 0xb5, 0x50, 0x57, 0x26, 0x84, 0x24, 0x6e, 0x66, - 0xbd, 0x14, 0x47, 0x99, 0xac, 0xf6, 0x64, 0xbd, 0x04, 0x7f, 0x57, 0x7b, 0x79, 0xd7, 0x5b, 0xf4, - 0x04, 0x9c, 0x6d, 0x5b, 0xea, 0xed, 0xdd, 0x9b, 0xd0, 0xbf, 0xc9, 0x96, 0xea, 0x3e, 0x31, 0x76, - 0x9c, 0x82, 0x81, 0xf0, 0xe5, 0x1b, 0xdb, 0x22, 0xd9, 0x0f, 0x72, 0x2f, 0xf5, 0xbe, 0xae, 0xbf, - 0xfb, 0x13, 0xe7, 0xd5, 0x9e, 0xd4, 0x53, 0xbb, 0xf7, 0x61, 0xb4, 0xda, 0x3c, 0xe2, 0xee, 0x6e, - 0xbe, 0x97, 0xf8, 0x2c, 0xb5, 0x92, 0xd5, 0x1e, 0x5b, 0x47, 0x64, 0x27, 0xdc, 0x6a, 0xbb, 0x8d, - 0x1b, 0x55, 0xd6, 0xb3, 0xef, 0xd5, 0x1e, 0xf4, 0x1e, 0x5f, 0x1c, 0x86, 0xc1, 0x1d, 0x27, 0x38, - 0xa0, 0x91, 0xf5, 0x15, 0xcc, 0x0b, 0x27, 0x15, 0x6e, 0xf9, 0x43, 0x57, 0x96, 0x30, 0xf6, 0x43, - 0x2a, 0x72, 0x2c, 0xb9, 0x02, 0x80, 0x7a, 0xfe, 0x9a, 0xd7, 0xa4, 0xdf, 0x70, 0x5f, 0x2a, 0x5b, - 0x83, 0x58, 0xef, 0xc1, 0x88, 0x92, 0x10, 0x2a, 0xb3, 0xda, 0x66, 0x87, 0xd2, 0x9a, 0x36, 0x1e, - 0x14, 0xca, 0x57, 0x84, 0x17, 0x8c, 0xbe, 0x8b, 0x30, 0x0e, 0x5c, 0xfb, 0x75, 0x61, 0x26, 0x31, - 0x09, 0xe2, 0x77, 0xc2, 0x4a, 0xff, 0x44, 0xbf, 0x2b, 0x5b, 0xfd, 0x4e, 0xaa, 0xa7, 0xbd, 0xa7, - 0x52, 0x4f, 0xad, 0x7f, 0xd4, 0x8b, 0x07, 0xa7, 0x94, 0x3c, 0x12, 0x36, 0x28, 0xdd, 0x0e, 0xb6, - 0x08, 0x23, 0xd8, 0xfb, 0x65, 0xf9, 0xae, 0xa9, 0xd8, 0xc7, 0x62, 0xf8, 0xe7, 0xc7, 0x95, 0x1e, - 0x74, 0xac, 0x88, 0xc9, 0xc8, 0xa7, 0x30, 0xb4, 0xe2, 0x35, 0x91, 0x43, 0xdf, 0x19, 0x38, 0x48, - 0x22, 0x36, 0x26, 0xd8, 0xe4, 0x1d, 0xf6, 0x09, 0x73, 0xd3, 0x85, 0xad, 0x41, 0xe2, 0x13, 0xdc, - 0x40, 0xde, 0x09, 0x6e, 0x30, 0x71, 0x82, 0xb3, 0x60, 0x60, 0x2b, 0x68, 0x8a, 0xf0, 0x0b, 0x13, - 0x0b, 0x63, 0x42, 0x70, 0x08, 0xb3, 0x79, 0x91, 0xf5, 0x9f, 0x4b, 0x30, 0x7b, 0x9f, 0x46, 0x99, - 0x73, 0xc8, 0x90, 0x4a, 0xe9, 0xa5, 0xa5, 0xd2, 0xfb, 0x22, 0x52, 0x51, 0xbd, 0xee, 0xcb, 0xeb, - 0x75, 0x7f, 0x5e, 0xaf, 0x07, 0xf2, 0x7b, 0x7d, 0x1f, 0x06, 0x79, 0x57, 0xd9, 0x29, 0x75, 0x2d, - 0xa2, 0x47, 0xf1, 0x29, 0x55, 0xf7, 0x10, 0xb3, 0x79, 0x19, 0x53, 0x24, 0xd7, 0x9d, 0x50, 0x3f, - 0xa5, 0x8a, 0x9f, 0xd6, 0x8f, 0xf1, 0x45, 0xe4, 0xba, 0xdf, 0x78, 0xa2, 0x59, 0x3b, 0x87, 0xf8, - 0x17, 0x9a, 0xb4, 0x8e, 0x33, 0x2c, 0x5e, 0x62, 0x4b, 0x0c, 0x72, 0x15, 0x46, 0xd7, 0xbc, 0x7b, - 0x7e, 0xd0, 0xa0, 0x5b, 0x5e, 0x8b, 0x73, 0x1f, 0xb6, 0x75, 0x90, 0xb0, 0x02, 0x88, 0x1a, 0xe2, - 0xa3, 0x35, 0x02, 0x12, 0x47, 0x6b, 0x06, 0xdb, 0x5b, 0xb0, 0x79, 0x99, 0x30, 0x32, 0xb0, 0xbf, - 0x8b, 0x4e, 0xa5, 0xea, 0xf8, 0xda, 0x0d, 0x71, 0x1f, 0x2e, 0xd8, 0xb4, 0xdd, 0x72, 0x98, 0x4e, - 0x77, 0xe4, 0x73, 0x7c, 0xd5, 0xe7, 0xab, 0x19, 0xaf, 0x99, 0x4c, 0x7f, 0x01, 0xd5, 0xe4, 0xde, - 0x82, 0x26, 0x1f, 0xc1, 0xb5, 0xfb, 0x34, 0x32, 0x17, 0xd4, 0xd8, 0x96, 0x2a, 0x3a, 0xbf, 0x0a, - 0xc3, 0xa1, 0x69, 0x07, 0xbe, 0x22, 0xaf, 0x1f, 0xb2, 0x08, 0xf7, 0xee, 0xca, 0x9b, 0x12, 0xc1, - 0x47, 0xfd, 0x65, 0x7d, 0x06, 0x95, 0xbc, 0xea, 0x4e, 0xe7, 0xce, 0xe9, 0xc2, 0xd5, 0x7c, 0x06, - 0xa2, 0xb9, 0x2b, 0x20, 0x6d, 0xc6, 0xe2, 0x13, 0xea, 0xd6, 0x5a, 0xd3, 0xcc, 0x2c, 0xfe, 0xb0, - 0x16, 0xa5, 0x63, 0xdb, 0x4b, 0x34, 0xb7, 0x8e, 0xd7, 0xb1, 0x26, 0x83, 0x58, 0xae, 0x55, 0x18, - 0x96, 0x30, 0x21, 0xd7, 0xd9, 0xcc, 0x96, 0x4a, 0x81, 0x36, 0x25, 0x03, 0x45, 0x66, 0xfd, 0x58, - 0x5e, 0x4d, 0x98, 0x14, 0xa7, 0x7b, 0xde, 0x77, 0x9a, 0xbb, 0x08, 0xcb, 0x87, 0x0b, 0x26, 0x6f, - 0xdd, 0xe4, 0x5c, 0xd6, 0x4c, 0xce, 0xdc, 0xd2, 0x7c, 0xd5, 0x34, 0x81, 0xf6, 0x8a, 0x79, 0x19, - 0x83, 0xc8, 0x15, 0xdd, 0xb0, 0x3c, 0x96, 0x7e, 0x2f, 0x78, 0x1b, 0xe6, 0xb3, 0x2a, 0xd4, 0xce, - 0x81, 0xca, 0x7a, 0x29, 0xf4, 0x9d, 0x65, 0xb8, 0x22, 0x03, 0xa0, 0xf8, 0x7e, 0x14, 0x46, 0x81, - 0xd3, 0xae, 0x35, 0x02, 0xb7, 0x1d, 0x53, 0x59, 0x30, 0xc8, 0x21, 0x42, 0x12, 0xfc, 0x9a, 0x87, - 0xe3, 0x88, 0x12, 0xeb, 0xb7, 0x4b, 0x60, 0x19, 0x3e, 0x48, 0x38, 0xce, 0xdb, 0x81, 0xff, 0xd4, - 0x6d, 0x6a, 0x57, 0x2b, 0x6f, 0x1b, 0x66, 0x3d, 0xfe, 0xde, 0x2b, 0xe9, 0xfe, 0x2c, 0xd6, 0xcc, - 0xdb, 0x09, 0x53, 0x1b, 0x57, 0x3c, 0xd1, 0x2f, 0xe9, 0x09, 0xd5, 0xdf, 0x4b, 0x28, 0x13, 0xdc, - 0x7f, 0x2d, 0xc1, 0x6b, 0x85, 0x6d, 0x10, 0xfd, 0xd9, 0x87, 0x72, 0xb2, 0x4c, 0xcc, 0xa0, 0x8a, - 0xe6, 0x93, 0x90, 0xe6, 0xb0, 0x77, 0x87, 0xfb, 0x58, 0x4b, 0xdf, 0x9d, 0xb6, 0xe2, 0x9c, 0xe2, - 0x77, 0xf6, 0xd6, 0x93, 0x0f, 0x01, 0x76, 0xfc, 0xc8, 0x69, 0x2d, 0xa1, 0x01, 0xa0, 0x2f, 0xf6, - 0x97, 0x8f, 0x18, 0xb4, 0x9e, 0x7c, 0x81, 0xaf, 0x21, 0x5b, 0x3f, 0xc0, 0xef, 0x3a, 0xbb, 0xd1, - 0xa7, 0xfb, 0xd4, 0x96, 0xe0, 0xb5, 0xc4, 0xbd, 0xf8, 0x0b, 0x30, 0x89, 0x60, 0x86, 0x89, 0x9f, - 0xe9, 0xde, 0xf7, 0x03, 0xbf, 0xd3, 0xfe, 0xd5, 0x8c, 0xfa, 0x5f, 0x94, 0xb8, 0xa3, 0xa2, 0x5e, - 0xad, 0x18, 0xe8, 0x25, 0x80, 0x18, 0x9a, 0x70, 0x58, 0x57, 0x05, 0x7b, 0x77, 0xf8, 0x91, 0x1b, - 0x2d, 0xe6, 0x07, 0x9c, 0x81, 0x46, 0xf6, 0xab, 0x1d, 0xc9, 0xbb, 0x78, 0x19, 0xae, 0x6a, 0x3f, - 0x9d, 0xdc, 0xdf, 0x97, 0xf6, 0x8f, 0x33, 0xd2, 0x1d, 0xc2, 0x34, 0x5b, 0x01, 0xaa, 0x9d, 0xe8, - 0xd0, 0x0f, 0xdc, 0x48, 0x3e, 0xbd, 0x20, 0xdb, 0xe2, 0xe1, 0x32, 0xa7, 0xfa, 0xe4, 0x97, 0xc7, - 0x95, 0x0f, 0xce, 0x12, 0x98, 0x4e, 0xf2, 0xdc, 0x51, 0x8f, 0x9d, 0xad, 0x59, 0xe8, 0x5b, 0xb2, - 0xd7, 0x71, 0xc1, 0xb3, 0xd7, 0xd5, 0x82, 0x67, 0xaf, 0x5b, 0x7f, 0xd7, 0x0b, 0x15, 0x1e, 0x5a, - 0x01, 0x7d, 0x28, 0x62, 0xab, 0x85, 0xe6, 0x94, 0x71, 0x5a, 0x03, 0x43, 0x22, 0x74, 0x42, 0xef, - 0x69, 0x42, 0x27, 0xfc, 0x06, 0xe4, 0x98, 0xac, 0x4e, 0x61, 0x05, 0x78, 0xeb, 0xe4, 0xb8, 0xf2, - 0x5a, 0x6c, 0x05, 0xe0, 0xa5, 0x59, 0xe6, 0x80, 0x9c, 0x2a, 0xd2, 0xf6, 0x8b, 0xfe, 0x17, 0xb0, - 0x5f, 0xdc, 0x86, 0x21, 0x3c, 0xcc, 0xac, 0x6d, 0x0b, 0xaf, 0x46, 0x9c, 0x9e, 0x18, 0x2c, 0xa5, - 0xee, 0xea, 0x11, 0xab, 0x24, 0x9a, 0xf5, 0x7f, 0xf7, 0xc2, 0xd5, 0x7c, 0x99, 0x8b, 0xb6, 0x2d, - 0x03, 0xc4, 0xde, 0x1b, 0x45, 0xde, 0x22, 0xf8, 0xed, 0x3c, 0xa3, 0xfb, 0xca, 0x5b, 0x4b, 0xa3, - 0x63, 0xba, 0x8f, 0x7c, 0xc5, 0x9a, 0xb8, 0x2a, 0x30, 0x1e, 0xb7, 0x8a, 0x70, 0x8b, 0x02, 0x64, - 0x84, 0x5b, 0x14, 0x30, 0xb2, 0x0f, 0xb3, 0xdb, 0x81, 0xfb, 0xd4, 0x89, 0xe8, 0x43, 0xfa, 0x9c, - 0x3f, 0x84, 0x59, 0x11, 0xaf, 0x5f, 0xf8, 0xd3, 0xe4, 0xeb, 0x27, 0xc7, 0x95, 0xd7, 0xdb, 0x1c, - 0x85, 0x7d, 0x98, 0x75, 0xfe, 0xae, 0xae, 0x9e, 0x7e, 0x10, 0x93, 0xc7, 0xc8, 0xfa, 0x17, 0x25, - 0xb8, 0x88, 0x6a, 0xb9, 0x30, 0xbb, 0xca, 0xca, 0x5f, 0xc8, 0x69, 0x50, 0xef, 0xa0, 0x98, 0x8b, - 0xe8, 0x34, 0x68, 0xbc, 0xf2, 0xb5, 0x0d, 0x34, 0xb2, 0x06, 0xa3, 0xe2, 0x37, 0x7e, 0x7f, 0x7d, - 0x78, 0x20, 0x98, 0xd1, 0x16, 0x2c, 0x9c, 0xea, 0xdc, 0x54, 0x84, 0x13, 0x5b, 0x30, 0xc3, 0xc7, - 0x70, 0xb6, 0x4e, 0x6b, 0xfd, 0xa2, 0x17, 0x2e, 0xed, 0xd1, 0xc0, 0x7d, 0xfc, 0x3c, 0xa7, 0x33, - 0x5b, 0x30, 0x2d, 0x41, 0x3c, 0xbc, 0x82, 0xf1, 0x89, 0xf1, 0x90, 0x6b, 0xb2, 0xa9, 0x22, 0x3e, - 0x83, 0xfc, 0xe2, 0x32, 0x09, 0xcf, 0xe0, 0x0e, 0xf8, 0x2e, 0x0c, 0x27, 0x02, 0x9c, 0xe0, 0xf8, - 0xcb, 0x2f, 0x34, 0x1e, 0xaa, 0xd5, 0x1e, 0x5b, 0x61, 0x92, 0xdf, 0xc9, 0xbf, 0xbf, 0x11, 0xa6, - 0x8f, 0x6e, 0xf6, 0x4f, 0xfc, 0x60, 0xd9, 0xc7, 0xea, 0x68, 0xa5, 0x19, 0x1f, 0xec, 0x6a, 0x8f, - 0x9d, 0x57, 0xd3, 0xe2, 0x28, 0x8c, 0x54, 0xf1, 0x4e, 0x8a, 0x9d, 0xdc, 0xff, 0x4b, 0x2f, 0x5c, - 0x91, 0x8f, 0x5a, 0x72, 0xc4, 0xfc, 0x05, 0xcc, 0x4a, 0x50, 0xb5, 0xcd, 0x14, 0x06, 0xda, 0x34, - 0x25, 0xcd, 0xc3, 0x1e, 0x4a, 0x49, 0x3b, 0x02, 0x27, 0x16, 0x76, 0x1e, 0xf9, 0xab, 0xb1, 0x7e, - 0x7e, 0x9a, 0x15, 0x6e, 0x06, 0xad, 0x90, 0xfa, 0x9a, 0x69, 0x88, 0xc6, 0x58, 0x3f, 0x9b, 0x29, - 0xeb, 0x69, 0xff, 0xcb, 0x5a, 0x4f, 0x57, 0x7b, 0x92, 0xf6, 0xd3, 0xc5, 0x09, 0x18, 0xdb, 0xa4, - 0xcf, 0x62, 0xb9, 0xff, 0xaf, 0xa5, 0xc4, 0x33, 0x7a, 0xa6, 0x61, 0xf0, 0xf7, 0xf4, 0xa5, 0x38, - 0x62, 0x09, 0x3e, 0xa3, 0xd7, 0x35, 0x0c, 0x8e, 0xba, 0x06, 0x43, 0xfc, 0xa2, 0xb6, 0x79, 0x8a, - 0x13, 0xbe, 0x7a, 0x9d, 0xc2, 0x9f, 0x0c, 0x36, 0xf9, 0x61, 0x5f, 0xd0, 0x5b, 0x0f, 0xe1, 0x9a, - 0xf0, 0x5f, 0x36, 0x07, 0x1f, 0x2b, 0x3a, 0xe3, 0xf6, 0x65, 0x39, 0x70, 0xe5, 0x3e, 0x4d, 0x2e, - 0x3d, 0xc6, 0xeb, 0x9d, 0xcf, 0x60, 0xd2, 0x80, 0x2b, 0x8e, 0xa8, 0x95, 0xaa, 0x39, 0xa4, 0x58, - 0x27, 0xb1, 0xad, 0xab, 0x59, 0x55, 0xe8, 0x8d, 0xb5, 0x28, 0xc6, 0x2f, 0x0c, 0xe2, 0x2b, 0xb6, - 0xf0, 0x0c, 0xab, 0xde, 0x75, 0xed, 0xbb, 0xe6, 0x2b, 0x1e, 0x0f, 0x64, 0x26, 0x77, 0x5e, 0x55, - 0x6a, 0x8d, 0x1b, 0x77, 0x01, 0xd6, 0x04, 0x8c, 0xc9, 0xa2, 0x16, 0x0d, 0x43, 0xeb, 0x67, 0x03, - 0x60, 0x09, 0xc1, 0x66, 0xdd, 0x3e, 0x4b, 0x79, 0xec, 0xa7, 0x1a, 0x2b, 0x36, 0xaa, 0xf3, 0x7a, - 0xe8, 0xbc, 0xb8, 0x94, 0xcf, 0x3c, 0xd4, 0xf3, 0x1a, 0x31, 0xd4, 0x98, 0x79, 0xa9, 0xde, 0xff, - 0x30, 0x67, 0x99, 0xe4, 0x1f, 0xdb, 0x1b, 0x27, 0xc7, 0x95, 0x6b, 0x39, 0xcb, 0xa4, 0xc1, 0x37, - 0x7b, 0xc9, 0xb4, 0xcd, 0x2b, 0x91, 0xbe, 0x17, 0xb9, 0x12, 0x61, 0x5f, 0xa4, 0x7e, 0x29, 0xb2, - 0x6b, 0xca, 0x52, 0x7c, 0x8f, 0xf2, 0x4a, 0x5b, 0x2f, 0x12, 0xaf, 0xd9, 0x35, 0x88, 0xc1, 0xd5, - 0x60, 0x43, 0x5c, 0x28, 0x6b, 0x36, 0xcb, 0xa5, 0x43, 0xda, 0x78, 0x22, 0x6c, 0xc5, 0xf2, 0x42, - 0x37, 0xcb, 0x66, 0xce, 0x43, 0xa8, 0xf2, 0xef, 0x9c, 0x17, 0xd4, 0x1b, 0x8c, 0x54, 0x7f, 0x8d, - 0x9f, 0x64, 0x4b, 0x7e, 0x0a, 0x53, 0x6a, 0xa8, 0x13, 0xee, 0x47, 0xa3, 0x0b, 0xaf, 0xc7, 0xb1, - 0x16, 0x8f, 0x1e, 0x3b, 0x37, 0x9f, 0xde, 0xb9, 0x99, 0x81, 0xcb, 0x1f, 0x79, 0x37, 0x64, 0x81, - 0xe6, 0x7b, 0xa4, 0x5f, 0x74, 0x65, 0x11, 0x6a, 0xd7, 0xd9, 0xff, 0x97, 0x72, 0x96, 0x67, 0xfa, - 0x82, 0xdb, 0xa2, 0xe2, 0xd5, 0x8b, 0x9c, 0x7d, 0x39, 0x57, 0x71, 0xa5, 0x6f, 0xf9, 0x2a, 0xee, - 0x4f, 0x7b, 0xe5, 0x13, 0x81, 0xf4, 0x6d, 0xe8, 0x99, 0x6f, 0xe4, 0x32, 0x7b, 0x70, 0xaa, 0xcd, - 0x34, 0xb3, 0x71, 0x64, 0x51, 0xde, 0x67, 0xaa, 0xc0, 0x47, 0x13, 0xea, 0x6e, 0x20, 0x2e, 0x30, - 0xae, 0x38, 0x51, 0x75, 0xd1, 0xa8, 0x92, 0x97, 0x65, 0x7d, 0x2f, 0x7f, 0x59, 0xf6, 0x4f, 0x46, - 0xe0, 0xdc, 0xb6, 0x73, 0xe0, 0x7a, 0x6c, 0xd1, 0xb6, 0x69, 0xe8, 0x77, 0x82, 0x06, 0x25, 0x55, - 0x98, 0x30, 0xfd, 0x3f, 0xbb, 0x78, 0xb7, 0xb2, 0x7d, 0xc9, 0x84, 0x91, 0x05, 0x18, 0x51, 0x6f, - 0x4e, 0xc5, 0x66, 0x92, 0xf1, 0x16, 0x75, 0xb5, 0xc7, 0x8e, 0xd1, 0xc8, 0x87, 0xc6, 0xfd, 0xce, - 0xa4, 0x7a, 0x3e, 0x8d, 0xb8, 0x0b, 0xdc, 0x41, 0xcf, 0xf3, 0x9b, 0xe6, 0x86, 0xc8, 0x2f, 0x31, - 0x7e, 0x9c, 0xba, 0xf2, 0x19, 0x30, 0x5a, 0x9c, 0xb2, 0x7b, 0xa1, 0x2e, 0x90, 0x1b, 0xc3, 0x36, - 0xe3, 0x32, 0xe8, 0x2b, 0x18, 0x7d, 0xd8, 0xd9, 0xa7, 0xf2, 0x72, 0x6b, 0x50, 0xec, 0x8f, 0x49, - 0xaf, 0x66, 0x51, 0xbe, 0x77, 0x97, 0x8f, 0xc1, 0x93, 0xce, 0x3e, 0x4d, 0x07, 0x47, 0x66, 0x0b, - 0x93, 0xc6, 0x8c, 0x1c, 0x42, 0x39, 0xe9, 0x80, 0x2c, 0x42, 0x85, 0x15, 0xb8, 0x4d, 0x63, 0x9c, - 0x0a, 0x2d, 0x04, 0x33, 0x77, 0x8b, 0x34, 0x2a, 0x49, 0x71, 0x25, 0xbf, 0x09, 0x33, 0x99, 0x56, - 0x47, 0xf5, 0x84, 0xaa, 0xd8, 0xa0, 0x89, 0x8b, 0x7a, 0x42, 0x6a, 0xf2, 0xbd, 0x96, 0x51, 0x73, - 0x76, 0x2d, 0xa4, 0x09, 0x93, 0x09, 0xc7, 0x5a, 0x11, 0x65, 0x3e, 0xdf, 0x55, 0x17, 0x37, 0x26, - 0x19, 0x92, 0x33, 0xb3, 0xae, 0x24, 0x4b, 0xb2, 0x0e, 0x23, 0xea, 0xb8, 0x8f, 0xaf, 0xb3, 0xb2, - 0x4d, 0x1b, 0x73, 0x27, 0xc7, 0x95, 0xe9, 0xd8, 0xb4, 0x61, 0xf0, 0x8c, 0x19, 0x90, 0xdf, 0x82, - 0x6b, 0x6a, 0x8a, 0x6e, 0x05, 0xd9, 0x46, 0x20, 0x11, 0xe2, 0xf9, 0x46, 0x72, 0x86, 0xe7, 0xe1, - 0xef, 0xdd, 0x59, 0xec, 0x9d, 0x2b, 0xad, 0xf6, 0xd8, 0xdd, 0x59, 0x93, 0x9f, 0x95, 0xe0, 0x7c, - 0x4e, 0xad, 0x63, 0x58, 0x6b, 0x57, 0xcb, 0x1c, 0x2a, 0xf7, 0xf8, 0x6c, 0xc8, 0x6d, 0xc6, 0xcf, - 0xeb, 0xa4, 0x89, 0xce, 0xe8, 0x77, 0x4e, 0x4d, 0xe4, 0x1d, 0x18, 0xc4, 0x33, 0x72, 0x38, 0x37, - 0x8e, 0x5a, 0x24, 0x86, 0x67, 0xc1, 0x93, 0xb4, 0xbe, 0x6f, 0x08, 0x1c, 0xb2, 0xca, 0xb4, 0x31, - 0xdc, 0xb7, 0xa4, 0xf6, 0x24, 0x82, 0x39, 0x09, 0x8d, 0x9e, 0x17, 0xc9, 0x28, 0x17, 0x46, 0x2c, - 0x6f, 0x93, 0x6c, 0x11, 0x60, 0x38, 0x10, 0xab, 0xd2, 0x83, 0xfe, 0xe1, 0xfe, 0xf2, 0x00, 0xff, - 0x70, 0xa4, 0xc7, 0xf6, 0xef, 0x0e, 0xf3, 0xe7, 0x9d, 0xbb, 0x9e, 0xfb, 0xd8, 0x8d, 0x17, 0x30, - 0xdd, 0xba, 0x16, 0xa7, 0xd4, 0x10, 0xba, 0x6f, 0x4e, 0xf2, 0x0c, 0x65, 0x88, 0xeb, 0xed, 0x6a, - 0x88, 0xbb, 0xab, 0x5d, 0x59, 0x69, 0xf1, 0x0f, 0xb9, 0x8e, 0x63, 0x1a, 0xbe, 0xe2, 0xbb, 0xac, - 0xaf, 0x61, 0x10, 0x43, 0x16, 0xf2, 0xfb, 0xc0, 0xd1, 0x85, 0x9b, 0x62, 0xd9, 0x2e, 0x68, 0x3e, - 0x8f, 0x71, 0x28, 0x9e, 0x6c, 0x73, 0x89, 0x23, 0xc0, 0x90, 0x38, 0x42, 0xc8, 0x0e, 0x4c, 0x6d, - 0x07, 0xb4, 0x29, 0xfc, 0x86, 0xdb, 0x81, 0x30, 0x4e, 0x70, 0xb3, 0x07, 0x6e, 0xf9, 0x6d, 0x59, - 0x5c, 0xa7, 0xaa, 0x5c, 0xdf, 0x50, 0x33, 0xc8, 0xc9, 0x0a, 0x4c, 0xd4, 0xa8, 0x13, 0x34, 0x0e, - 0x1f, 0xd2, 0xe7, 0x4c, 0xdd, 0x31, 0xe2, 0xc8, 0x87, 0x58, 0xc2, 0xfa, 0x8b, 0x45, 0xba, 0x8f, - 0x87, 0x49, 0x44, 0x7e, 0x00, 0x83, 0x35, 0x3f, 0x88, 0x16, 0x9f, 0x8b, 0x45, 0x4d, 0xde, 0x18, - 0x71, 0xe0, 0xe2, 0x05, 0x19, 0x4b, 0x3f, 0xf4, 0x83, 0xa8, 0xbe, 0x6f, 0xc4, 0xfb, 0xe1, 0x28, - 0xe4, 0x39, 0x4c, 0x9b, 0x0b, 0x8a, 0x70, 0x67, 0x1d, 0x16, 0x6a, 0x56, 0xd6, 0xaa, 0xc5, 0x51, - 0x16, 0xaf, 0x0b, 0xee, 0x57, 0x93, 0xcb, 0xd6, 0x63, 0x2c, 0xd7, 0x43, 0xf0, 0x64, 0xd1, 0x93, - 0x0d, 0x4c, 0x41, 0xc0, 0x7b, 0x54, 0x0d, 0xb9, 0x1b, 0xec, 0x48, 0x1c, 0x51, 0xaa, 0x83, 0x8b, - 0x12, 0x4a, 0xc2, 0x09, 0x93, 0x79, 0x2b, 0xec, 0x14, 0x29, 0xd9, 0x86, 0x73, 0xbb, 0x21, 0xdd, - 0x0e, 0xe8, 0x53, 0x97, 0x3e, 0x93, 0xfc, 0x20, 0x0e, 0xbf, 0xc3, 0xf8, 0xb5, 0x79, 0x69, 0x16, - 0xc3, 0x34, 0x31, 0xf9, 0x10, 0x60, 0xdb, 0xf5, 0x3c, 0xda, 0xc4, 0x6b, 0xc7, 0x51, 0x64, 0x85, - 0x26, 0xd5, 0x36, 0x42, 0xeb, 0xbe, 0xd7, 0xd2, 0x45, 0xaa, 0x21, 0x93, 0x45, 0x18, 0x5f, 0xf3, - 0x1a, 0xad, 0x8e, 0x70, 0x0f, 0x08, 0x71, 0x41, 0x11, 0x61, 0xc1, 0x5c, 0x5e, 0x50, 0x4f, 0x7d, - 0xe4, 0x26, 0x09, 0x79, 0x08, 0x44, 0x00, 0xc4, 0xac, 0x75, 0xf6, 0x5b, 0x54, 0x7c, 0xee, 0x68, - 0x2a, 0x91, 0x8c, 0x70, 0xba, 0x1b, 0xd1, 0xb6, 0x52, 0x64, 0xf3, 0x1f, 0xc2, 0xa8, 0x36, 0xe7, - 0x33, 0x62, 0x10, 0x4c, 0xeb, 0x31, 0x08, 0x46, 0xf4, 0x58, 0x03, 0xff, 0x6f, 0x09, 0x2e, 0x65, - 0x7f, 0x4b, 0x42, 0x01, 0xdb, 0x82, 0x11, 0x05, 0x54, 0xaf, 0x4e, 0xa4, 0xea, 0x9f, 0xd0, 0x80, - 0xf8, 0x07, 0x2d, 0x57, 0x1e, 0xbd, 0xf7, 0x31, 0x8f, 0x17, 0xb0, 0xc7, 0xff, 0x6f, 0xc3, 0x30, - 0x8d, 0xde, 0xd5, 0xc9, 0x75, 0xea, 0x33, 0x8c, 0x25, 0x82, 0x30, 0xcd, 0xbc, 0x2c, 0x2c, 0x4d, - 0x1c, 0x9e, 0x8c, 0xea, 0x64, 0x10, 0x90, 0xf7, 0x74, 0x9f, 0x88, 0x5e, 0x2d, 0xe9, 0x81, 0x04, - 0xea, 0x5d, 0x88, 0x9d, 0x25, 0xde, 0x36, 0xae, 0xe4, 0x4f, 0xbd, 0xe8, 0xf5, 0x9f, 0x76, 0xd1, - 0xdb, 0x55, 0x8b, 0x1e, 0x8f, 0x51, 0xf1, 0x96, 0xb6, 0xe8, 0xbd, 0xfa, 0xd5, 0x6e, 0xf0, 0x55, - 0xaf, 0x76, 0x43, 0x2f, 0xb7, 0xda, 0x0d, 0xbf, 0xe0, 0x6a, 0x77, 0x0f, 0x26, 0x36, 0x29, 0x6d, - 0x6a, 0x17, 0x25, 0x23, 0xf1, 0xee, 0xe9, 0x51, 0x34, 0x81, 0x65, 0xdd, 0x96, 0x24, 0xa8, 0x72, - 0x57, 0x4d, 0xf8, 0x87, 0x59, 0x35, 0x47, 0x5f, 0xf1, 0xaa, 0x39, 0xf6, 0x32, 0xab, 0x66, 0x6a, - 0xe9, 0x1b, 0x3f, 0xf3, 0xd2, 0xf7, 0x32, 0xab, 0xd5, 0xa7, 0xe8, 0x52, 0x58, 0xab, 0xad, 0x0a, - 0xef, 0x11, 0xcd, 0x5d, 0x63, 0xd5, 0x0f, 0xa5, 0xc7, 0x35, 0xfe, 0xcd, 0x60, 0xdb, 0x7e, 0x20, - 0xaf, 0xbc, 0xf1, 0x6f, 0x6b, 0x11, 0x1d, 0x09, 0x75, 0x7a, 0xe5, 0xae, 0x3f, 0x24, 0x9e, 0xec, - 0x89, 0x35, 0x2e, 0x79, 0x8c, 0xb2, 0x65, 0xb9, 0xf5, 0x37, 0x25, 0x7e, 0x29, 0xf9, 0x3f, 0xe2, - 0x52, 0xf9, 0x32, 0x17, 0x85, 0xbf, 0x13, 0x3f, 0xe5, 0x17, 0x61, 0x07, 0x02, 0xa7, 0xf1, 0x24, - 0xbe, 0xa9, 0xfd, 0x11, 0xfb, 0xce, 0xf5, 0x02, 0x8c, 0x1a, 0x1a, 0x9f, 0x15, 0xcd, 0xc2, 0xbd, - 0x3b, 0x72, 0x01, 0x10, 0x11, 0x0d, 0x38, 0xd8, 0x5c, 0x00, 0x74, 0x02, 0xf4, 0x95, 0x9b, 0xb4, - 0x6c, 0xfe, 0x12, 0x3d, 0xb3, 0x05, 0xef, 0xa7, 0xdf, 0x52, 0xe3, 0x61, 0x24, 0x7e, 0x4b, 0xad, - 0x8b, 0x31, 0x7e, 0x55, 0xbd, 0x0b, 0x17, 0x6d, 0x7a, 0xe4, 0x3f, 0xa5, 0xaf, 0x96, 0xed, 0x0f, - 0xe1, 0x82, 0xc9, 0x90, 0xbf, 0xba, 0xe1, 0xd1, 0xbe, 0x3f, 0xcd, 0x8e, 0x11, 0x2e, 0x08, 0x78, - 0x8c, 0x70, 0x1e, 0x6a, 0x98, 0xfd, 0xa9, 0xef, 0x1b, 0x58, 0x66, 0xf9, 0x70, 0xc9, 0x64, 0x5e, - 0x6d, 0x36, 0x31, 0xc1, 0x5c, 0xc3, 0x6d, 0x3b, 0x5e, 0x44, 0xb6, 0x60, 0x54, 0xfb, 0x99, 0x30, - 0x15, 0x68, 0x25, 0x42, 0xa7, 0x89, 0x01, 0x46, 0x7c, 0xc9, 0x18, 0x6c, 0x51, 0xa8, 0x24, 0xc5, - 0xc3, 0x44, 0xa6, 0xd7, 0xb9, 0x08, 0xe3, 0xda, 0x4f, 0x65, 0xb2, 0xc4, 0x8f, 0x5f, 0xab, 0xc1, - 0x14, 0x98, 0x49, 0x62, 0x35, 0x60, 0x3e, 0x4b, 0x68, 0x18, 0x9d, 0xe9, 0x39, 0x59, 0x89, 0xe3, - 0x3c, 0x75, 0xf7, 0xb6, 0x9b, 0xcc, 0x8b, 0xf1, 0x64, 0xfd, 0x9f, 0xfd, 0x70, 0x51, 0x0c, 0xc6, - 0xab, 0x1c, 0x71, 0xf2, 0x63, 0x18, 0xd5, 0xc6, 0x58, 0x08, 0xfd, 0xaa, 0x8c, 0x2b, 0x99, 0x37, - 0x17, 0xb8, 0x49, 0xa3, 0x83, 0x80, 0x7a, 0x62, 0xb8, 0x57, 0x7b, 0x6c, 0x9d, 0x25, 0x69, 0xc1, - 0x84, 0x39, 0xd0, 0xc2, 0xaa, 0xf3, 0x5a, 0x66, 0x25, 0x26, 0xaa, 0x8c, 0x52, 0xdc, 0xac, 0x67, - 0x0e, 0xf7, 0x6a, 0x8f, 0x9d, 0xe0, 0x4d, 0xbe, 0x81, 0x73, 0xa9, 0x51, 0x16, 0xc6, 0xba, 0x37, - 0x33, 0x2b, 0x4c, 0x61, 0x73, 0x73, 0x6c, 0x80, 0xe0, 0xdc, 0x6a, 0xd3, 0x95, 0x90, 0x26, 0x8c, - 0xe9, 0x03, 0x2f, 0xcc, 0x4e, 0xd7, 0x0a, 0x44, 0xc9, 0x11, 0xb9, 0x72, 0x27, 0x64, 0x89, 0x63, - 0xff, 0xdc, 0x34, 0x31, 0x1b, 0xc8, 0xc3, 0x30, 0xc8, 0x7f, 0xb3, 0x25, 0x60, 0x3b, 0xa0, 0x21, - 0xf5, 0x1a, 0xd4, 0x70, 0xd0, 0x7e, 0xc9, 0x25, 0xe0, 0x9f, 0x97, 0x60, 0x2e, 0x8b, 0x6f, 0x8d, - 0x7a, 0x4d, 0xb2, 0x0d, 0xe5, 0x64, 0x45, 0x62, 0x56, 0x5b, 0x2a, 0x10, 0x6c, 0x6e, 0x93, 0x56, - 0x7b, 0xec, 0x14, 0x35, 0xd9, 0x84, 0x73, 0x1a, 0x4c, 0x18, 0x57, 0x7b, 0x4f, 0x63, 0x5c, 0x65, - 0xa3, 0x90, 0x22, 0xd5, 0x6d, 0xd3, 0xab, 0xb8, 0x33, 0x2e, 0xfb, 0x47, 0x8e, 0xeb, 0x31, 0x45, - 0x57, 0x0b, 0xf5, 0x04, 0x31, 0x54, 0xc8, 0x86, 0x5b, 0x5b, 0x11, 0x2a, 0x1f, 0x94, 0x28, 0x14, - 0xeb, 0x13, 0x5c, 0xc1, 0x85, 0x8d, 0x8e, 0x3f, 0x4f, 0x55, 0xcc, 0xae, 0xc2, 0xc0, 0xce, 0x7a, - 0x6d, 0xa9, 0x2a, 0x1e, 0xbb, 0xf2, 0x10, 0x09, 0xad, 0xb0, 0xde, 0x70, 0x6c, 0x5e, 0x60, 0x7d, - 0x0c, 0xe4, 0x3e, 0x8d, 0x44, 0x24, 0x72, 0x45, 0xf7, 0x06, 0x0c, 0x09, 0x90, 0xa0, 0x44, 0xd7, - 0xb8, 0x96, 0xc0, 0x92, 0x65, 0xd6, 0xb6, 0x3c, 0x27, 0xb4, 0xa8, 0x13, 0x6a, 0x1b, 0xf3, 0x07, - 0x30, 0x1c, 0x08, 0x98, 0xd8, 0x97, 0x27, 0x54, 0xce, 0x06, 0x04, 0x73, 0x7b, 0xb6, 0xc4, 0xb1, - 0xd5, 0x5f, 0xd6, 0x3a, 0x86, 0x33, 0xd9, 0x5a, 0x5b, 0x5e, 0x62, 0x52, 0x15, 0xc2, 0x92, 0xc3, - 0x71, 0x0b, 0x7d, 0xc8, 0x23, 0xaa, 0x3f, 0x75, 0x45, 0xd1, 0xe0, 0x47, 0x2e, 0x82, 0xf8, 0x68, - 0x28, 0xd6, 0x5d, 0x15, 0x1c, 0x25, 0x83, 0x5b, 0x5e, 0xee, 0x81, 0x4d, 0x0c, 0xfb, 0x72, 0x1f, - 0xdd, 0x65, 0x5e, 0x45, 0x23, 0x1c, 0x98, 0xe7, 0xdb, 0x3c, 0xeb, 0x95, 0xc8, 0xba, 0xe5, 0xab, - 0xa5, 0x71, 0x09, 0x46, 0x14, 0x4c, 0xdd, 0x7d, 0x71, 0x59, 0x19, 0xf8, 0x7b, 0x77, 0xf9, 0xab, - 0xe0, 0x86, 0x62, 0x10, 0xd3, 0xb1, 0x2a, 0xf8, 0x77, 0xf7, 0x2d, 0x57, 0x11, 0xd2, 0x20, 0xfa, - 0x56, 0xab, 0x88, 0xe3, 0x02, 0x9d, 0xa5, 0x0a, 0x03, 0x7f, 0x6f, 0xe1, 0x34, 0x82, 0xfa, 0x96, - 0xab, 0x60, 0x82, 0xfa, 0xf6, 0xaa, 0xa0, 0x32, 0x80, 0x12, 0x9f, 0xa4, 0xa9, 0x4a, 0x56, 0xd2, - 0x95, 0x48, 0xc3, 0x75, 0x82, 0xa2, 0x70, 0x3c, 0x28, 0x5c, 0xe2, 0xc2, 0xfa, 0x15, 0x54, 0xc3, - 0x04, 0xf6, 0xed, 0x56, 0xf3, 0xff, 0x94, 0x78, 0x38, 0xa7, 0xda, 0x96, 0x96, 0xef, 0xce, 0x7b, - 0xec, 0x6b, 0x57, 0xf3, 0xda, 0xd7, 0xfe, 0xd0, 0xf5, 0x9a, 0xfa, 0xd5, 0xbc, 0xd3, 0x89, 0x0e, - 0x55, 0xb8, 0xe3, 0x27, 0xae, 0xd7, 0xb4, 0x93, 0xd8, 0xe4, 0x43, 0x18, 0xd7, 0x40, 0x4a, 0x5b, - 0xe3, 0x09, 0x11, 0x74, 0x72, 0xb7, 0x69, 0x9b, 0x98, 0xd6, 0xdf, 0x97, 0x60, 0x2a, 0x23, 0x0f, - 0x2b, 0x1a, 0x33, 0xf0, 0x14, 0xa4, 0x16, 0x2a, 0x91, 0x0d, 0x08, 0x23, 0x4b, 0x18, 0x9b, 0xa4, - 0x42, 0xc4, 0x50, 0xf0, 0x5a, 0xce, 0xd8, 0x5e, 0x2d, 0x2f, 0x55, 0x76, 0x9e, 0x58, 0x1d, 0x9d, - 0x84, 0x00, 0x71, 0x4b, 0x84, 0xd9, 0xb8, 0xc6, 0x54, 0x5a, 0x2d, 0xe1, 0xec, 0x2b, 0xc9, 0x78, - 0xab, 0x55, 0x63, 0xfd, 0x4e, 0x2f, 0x9c, 0xcf, 0xe8, 0x7f, 0x8d, 0x46, 0xff, 0x10, 0x22, 0x48, - 0xa4, 0xfd, 0xed, 0xfb, 0x15, 0xa5, 0xfd, 0xb5, 0xfe, 0x4d, 0x2f, 0x9c, 0xdf, 0x6d, 0x87, 0xf8, - 0xc2, 0x6a, 0xcd, 0x7b, 0x4a, 0xbd, 0xc8, 0x0f, 0x9e, 0xe3, 0xab, 0x10, 0xf2, 0x1e, 0x0c, 0xac, - 0xd2, 0x56, 0xcb, 0x17, 0xf3, 0xff, 0xb2, 0xf4, 0x8e, 0x48, 0x62, 0x23, 0xd2, 0x6a, 0x8f, 0xcd, - 0xb1, 0xc9, 0x87, 0x30, 0xb2, 0x4a, 0x9d, 0x20, 0xda, 0xa7, 0x8e, 0x3c, 0xb2, 0xc8, 0x34, 0x0d, - 0x1a, 0x89, 0x40, 0x58, 0xed, 0xb1, 0x63, 0x6c, 0xb2, 0xc0, 0x4e, 0xf3, 0xde, 0x81, 0x7a, 0x4d, - 0x9e, 0x53, 0x21, 0xc3, 0x59, 0xed, 0xb1, 0x11, 0x97, 0x6c, 0xc0, 0x78, 0xf5, 0x80, 0x7a, 0xd1, - 0x06, 0x8d, 0x9c, 0xa6, 0x13, 0x39, 0x42, 0xb5, 0x7d, 0x23, 0x8f, 0xd8, 0x40, 0x5e, 0xed, 0xb1, - 0x4d, 0x6a, 0xf2, 0x31, 0x0c, 0xdd, 0xf7, 0xfd, 0xe6, 0xfe, 0x73, 0x2a, 0xd4, 0xd5, 0x4a, 0x1e, - 0x23, 0x81, 0xb6, 0xda, 0x63, 0x4b, 0x8a, 0xc5, 0x01, 0xe8, 0xdb, 0x08, 0x0f, 0xac, 0xe3, 0x12, - 0xcc, 0x2d, 0xfb, 0xcf, 0xbc, 0x4c, 0xa9, 0x7e, 0xcf, 0x94, 0xaa, 0x64, 0x9f, 0x81, 0x9f, 0x90, - 0xeb, 0xbb, 0xd0, 0xbf, 0xed, 0x7a, 0x07, 0x09, 0x55, 0x30, 0x83, 0x8e, 0x61, 0xa1, 0x78, 0x5c, - 0xef, 0x80, 0xac, 0x4b, 0x1d, 0x5c, 0xd8, 0x1a, 0xfb, 0x0c, 0xc5, 0x3f, 0x83, 0x5a, 0xc7, 0x8e, - 0x75, 0x6d, 0xfe, 0x5b, 0x76, 0xf0, 0x6d, 0x98, 0xcd, 0xa9, 0x57, 0x3c, 0x0f, 0x67, 0x7d, 0xeb, - 0x47, 0xc5, 0xe6, 0x2d, 0x98, 0xc9, 0x1c, 0xbf, 0x14, 0xe2, 0xff, 0x9f, 0x35, 0x11, 0x79, 0xcf, - 0xe7, 0x60, 0x48, 0xa6, 0x02, 0xe2, 0xb6, 0x1f, 0xf9, 0x13, 0x1f, 0x48, 0xc9, 0x0f, 0x55, 0x06, - 0xf6, 0x90, 0xdf, 0xe3, 0x9e, 0x16, 0x48, 0x89, 0x7f, 0x4e, 0x1f, 0xbd, 0xc4, 0x47, 0xa3, 0x78, - 0xb1, 0x3a, 0x57, 0xfd, 0x30, 0xf2, 0x94, 0xe7, 0xad, 0xad, 0x7e, 0x93, 0x1b, 0x50, 0x96, 0xb9, - 0x0a, 0x44, 0x52, 0x14, 0x91, 0xa6, 0xd8, 0x4e, 0xc1, 0xc9, 0x07, 0x30, 0x9b, 0x84, 0xc9, 0x5e, - 0xf2, 0x17, 0x6e, 0x79, 0xc5, 0xd6, 0x5f, 0xf7, 0x62, 0xac, 0xeb, 0x82, 0x79, 0xcd, 0xa4, 0xbb, - 0x55, 0x13, 0xd2, 0xea, 0xdd, 0xaa, 0x91, 0x4b, 0x30, 0xb2, 0x55, 0x33, 0xf2, 0x29, 0xd9, 0x31, - 0x80, 0x35, 0x9b, 0x75, 0xa1, 0x1a, 0x34, 0x0e, 0xdd, 0x88, 0x36, 0xa2, 0x4e, 0x20, 0x56, 0x61, - 0x3b, 0x05, 0x27, 0x16, 0x8c, 0xdd, 0x6f, 0xb9, 0xfb, 0x0d, 0xc9, 0x8c, 0x8b, 0xc0, 0x80, 0x91, - 0x37, 0x61, 0x62, 0xcd, 0x0b, 0x23, 0xa7, 0xd5, 0xda, 0xa0, 0xd1, 0xa1, 0xdf, 0x14, 0x19, 0x21, - 0xed, 0x04, 0x94, 0xd5, 0xbb, 0xe4, 0x7b, 0x91, 0xe3, 0x7a, 0x34, 0xb0, 0x3b, 0x5e, 0xe4, 0x1e, - 0x51, 0xd1, 0xf7, 0x14, 0x9c, 0xbc, 0x0b, 0x33, 0x0a, 0xb6, 0x15, 0x34, 0x0e, 0x69, 0x18, 0x05, - 0x98, 0x65, 0x0d, 0x03, 0xfe, 0xd8, 0xd9, 0x85, 0x58, 0x43, 0xcb, 0xef, 0x34, 0x57, 0xbc, 0xa7, - 0x6e, 0xe0, 0x7b, 0x98, 0x78, 0x61, 0x58, 0xd4, 0x90, 0x80, 0x5b, 0x7f, 0x3c, 0x9c, 0xf9, 0xd9, - 0xbe, 0xcc, 0x1c, 0xfc, 0x12, 0xc6, 0x96, 0x9c, 0xb6, 0xb3, 0xef, 0xb6, 0xdc, 0xc8, 0x55, 0xe9, - 0xa8, 0xde, 0xeb, 0xf2, 0xcd, 0xcb, 0xec, 0x15, 0xb4, 0xa9, 0x13, 0xdb, 0x06, 0xab, 0xf9, 0xbf, - 0x1b, 0x84, 0x99, 0x4c, 0x3c, 0x72, 0x5d, 0xe4, 0xad, 0x52, 0xeb, 0xaa, 0xc8, 0xe4, 0x64, 0x27, - 0xc1, 0x6c, 0x2c, 0x11, 0xb4, 0xd4, 0xa2, 0x8e, 0xd7, 0x11, 0x79, 0x9c, 0x6c, 0x03, 0xc6, 0xc6, - 0x92, 0xe9, 0x0d, 0x1a, 0x33, 0x74, 0x9c, 0xb6, 0x13, 0x50, 0x72, 0x15, 0x46, 0x19, 0x44, 0xb2, - 0xea, 0xe7, 0x4f, 0xfc, 0x34, 0x10, 0xe3, 0xb4, 0xe9, 0x37, 0xa9, 0xc6, 0x69, 0x80, 0x73, 0x32, - 0xa1, 0x8c, 0x13, 0x83, 0x48, 0x4e, 0x83, 0x9c, 0x93, 0x06, 0x22, 0xaf, 0xc3, 0x78, 0xb5, 0xdd, - 0xd6, 0x18, 0x61, 0x02, 0x27, 0xdb, 0x04, 0x92, 0x2b, 0x00, 0xd5, 0x76, 0x5b, 0xb2, 0xc1, 0xe4, - 0x4c, 0xb6, 0x06, 0x21, 0x37, 0xe3, 0x70, 0x65, 0x1a, 0x2b, 0xbc, 0x4e, 0xb0, 0x33, 0x4a, 0x98, - 0x5c, 0x55, 0x6c, 0x27, 0xc1, 0x14, 0xb8, 0x5c, 0x13, 0x60, 0xf2, 0x09, 0x5c, 0x48, 0xf8, 0x5d, - 0x68, 0x15, 0xa0, 0xa9, 0xdf, 0xce, 0x47, 0x20, 0xef, 0xc3, 0xf9, 0x44, 0xa1, 0xac, 0x0e, 0xad, - 0xfa, 0x76, 0x4e, 0x29, 0xf9, 0x08, 0xe6, 0x12, 0xcf, 0xb6, 0xe3, 0x4a, 0xd1, 0x82, 0x6f, 0xe7, - 0x96, 0xb3, 0xaf, 0x2b, 0xf1, 0xfe, 0x4b, 0x54, 0x89, 0x97, 0x95, 0x76, 0x76, 0x21, 0x59, 0x85, - 0x4a, 0xa6, 0x2f, 0x8b, 0x56, 0x31, 0x26, 0x9d, 0xb2, 0xbb, 0xa1, 0x91, 0x45, 0xb8, 0x94, 0x89, - 0x22, 0x9b, 0x81, 0xa9, 0xa8, 0xec, 0x42, 0x1c, 0xb2, 0x00, 0xd3, 0xb1, 0x4f, 0x8f, 0xd6, 0x04, - 0xcc, 0x42, 0x65, 0x67, 0x96, 0x91, 0x77, 0xcc, 0xc7, 0xf9, 0xbc, 0x32, 0x4c, 0x42, 0x65, 0xa7, - 0x0b, 0xac, 0x93, 0x12, 0x5c, 0xca, 0xdc, 0x28, 0xa5, 0x3e, 0x3f, 0x9f, 0x54, 0x1c, 0xb5, 0xb5, - 0xe0, 0x06, 0xf4, 0xa3, 0x82, 0xcf, 0x6d, 0xc5, 0xd2, 0xd7, 0x14, 0xe9, 0x39, 0x2b, 0x56, 0x6a, - 0x23, 0x0e, 0xb9, 0xaf, 0xee, 0x06, 0xfb, 0xd0, 0x92, 0x71, 0x2b, 0xa9, 0x40, 0x65, 0x54, 0xae, - 0xdf, 0x11, 0xca, 0xdb, 0xc0, 0x97, 0xb9, 0x86, 0xf9, 0xeb, 0x12, 0x54, 0xba, 0xe8, 0x07, 0xaa, - 0x4f, 0xa5, 0x53, 0xf4, 0xe9, 0x81, 0xea, 0x13, 0x7f, 0x1b, 0xbb, 0x70, 0x3a, 0x1d, 0xe4, 0x55, - 0x77, 0xab, 0x03, 0x24, 0xad, 0x86, 0x92, 0xef, 0xc2, 0x48, 0xad, 0xb6, 0x6a, 0x38, 0xf4, 0xa5, - 0x2e, 0x87, 0x62, 0x0c, 0x72, 0xfb, 0x54, 0x1e, 0x7c, 0x9a, 0xff, 0x9e, 0xb5, 0x0c, 0x73, 0x79, - 0x1a, 0x24, 0x2e, 0x2c, 0x3c, 0xb6, 0x96, 0x76, 0xb1, 0xc4, 0x17, 0x16, 0x13, 0x6c, 0xbd, 0x0f, - 0xe7, 0x15, 0x35, 0x4f, 0xda, 0xa1, 0x3d, 0xfc, 0x17, 0xc7, 0x4e, 0x15, 0x60, 0x20, 0x06, 0x58, - 0x7f, 0xd5, 0x9f, 0x22, 0xac, 0x75, 0x8e, 0x8e, 0x9c, 0xe0, 0x39, 0xa9, 0x9a, 0x84, 0x7d, 0x5d, - 0x35, 0xfd, 0xc5, 0xfe, 0x9f, 0x1f, 0x57, 0x7a, 0x34, 0xee, 0x6c, 0x39, 0xc6, 0x8d, 0xdd, 0x6b, - 0x50, 0x7e, 0x25, 0xd5, 0xcb, 0x83, 0x1b, 0x19, 0x40, 0xb2, 0x07, 0xe3, 0x62, 0xcb, 0xc4, 0xdf, - 0x72, 0x6a, 0xdf, 0x4e, 0x4e, 0x6d, 0xa3, 0x79, 0x37, 0x0d, 0x12, 0x3e, 0x09, 0x4c, 0x36, 0xe4, - 0x4b, 0x98, 0x90, 0x0a, 0x92, 0x60, 0xcc, 0x9d, 0x88, 0xee, 0x14, 0x33, 0x36, 0x69, 0x38, 0xe7, - 0x04, 0x23, 0xd6, 0x64, 0xb9, 0xc6, 0x70, 0xce, 0x03, 0xa7, 0x69, 0xb2, 0x41, 0x22, 0x9a, 0x6c, - 0xc0, 0xe6, 0x7f, 0x00, 0x24, 0xdd, 0xaf, 0x6e, 0xb3, 0x78, 0x5c, 0x9b, 0xc5, 0xf3, 0x55, 0x98, - 0xca, 0xe8, 0xc0, 0x99, 0x58, 0xfc, 0x00, 0x48, 0xba, 0xa5, 0x67, 0xe1, 0x60, 0x5d, 0x87, 0x37, - 0x95, 0x08, 0xd4, 0x6c, 0x30, 0x78, 0x4a, 0xc3, 0xf3, 0x6f, 0xf7, 0x42, 0xa5, 0x0b, 0x2a, 0xf9, - 0xa3, 0x52, 0x52, 0xda, 0x7c, 0x36, 0x7e, 0x98, 0x94, 0x76, 0x36, 0x7d, 0x86, 0xd8, 0x17, 0x3f, - 0xfa, 0xd9, 0xdf, 0xbe, 0xb0, 0xc2, 0x9f, 0x1e, 0xb2, 0xb3, 0x4b, 0xab, 0x5f, 0x97, 0x96, 0x0d, - 0xd3, 0xc6, 0x51, 0xe9, 0x34, 0x7b, 0xc6, 0x15, 0x00, 0x91, 0xbf, 0x72, 0xdd, 0x3f, 0x10, 0xea, - 0x99, 0x06, 0xb1, 0xee, 0xc1, 0x4c, 0x82, 0xa7, 0x30, 0x86, 0x7f, 0x17, 0xd4, 0x03, 0x6f, 0x64, - 0xda, 0xb7, 0x78, 0xee, 0x97, 0xc7, 0x95, 0x71, 0xa6, 0x49, 0xdf, 0x8c, 0xe3, 0xc7, 0xcb, 0xbf, - 0xac, 0x0d, 0xdd, 0x9c, 0x5f, 0x6d, 0xe9, 0x81, 0x6f, 0xc8, 0x1d, 0x18, 0xe4, 0x90, 0x44, 0x94, - 0x66, 0x1d, 0x5b, 0xac, 0x09, 0x02, 0xd1, 0x9a, 0xc1, 0xe7, 0xa8, 0xf8, 0xa3, 0x1a, 0x87, 0x4f, - 0xb0, 0x76, 0x79, 0xd6, 0x92, 0x18, 0xac, 0x22, 0x41, 0xf7, 0x57, 0xe3, 0x30, 0x0f, 0xd2, 0xf7, - 0x42, 0xe2, 0x79, 0xfe, 0xb3, 0x16, 0x6d, 0xf2, 0x74, 0x67, 0x8b, 0x63, 0xc2, 0xf7, 0xa2, 0xdf, - 0x61, 0x0c, 0x90, 0xcc, 0xfa, 0x0c, 0x66, 0xd8, 0x06, 0x1d, 0x24, 0xeb, 0xc3, 0x5c, 0x05, 0x0c, - 0x66, 0x3a, 0xb4, 0x3b, 0x0c, 0x84, 0x0e, 0xed, 0xa2, 0xd0, 0x5a, 0x87, 0x0b, 0xdc, 0x18, 0xa8, - 0x77, 0x29, 0x36, 0xbd, 0x0f, 0xe0, 0xef, 0xc4, 0x63, 0xc6, 0x8c, 0xde, 0x73, 0x3c, 0xeb, 0x53, - 0x7c, 0x2d, 0x23, 0x26, 0xa9, 0xeb, 0x7b, 0xb1, 0xe5, 0xef, 0x74, 0xcf, 0x6b, 0xff, 0x67, 0xb8, - 0x54, 0x6d, 0xb7, 0xa9, 0xd7, 0x8c, 0x09, 0x77, 0x02, 0xe7, 0x94, 0xc1, 0x0f, 0x48, 0x15, 0x06, - 0x10, 0x5b, 0xdd, 0x5b, 0x8a, 0xe6, 0x66, 0x34, 0x07, 0xf1, 0x44, 0xd8, 0x4e, 0xac, 0x80, 0x53, - 0x5a, 0x4d, 0x98, 0xad, 0x75, 0xf6, 0x8f, 0xdc, 0x08, 0xdd, 0xe0, 0x31, 0x80, 0x88, 0xac, 0x7b, - 0x4d, 0x26, 0x9a, 0xe2, 0xc2, 0xb8, 0x1e, 0xbf, 0xaa, 0x40, 0x4f, 0x7a, 0x11, 0x54, 0xe4, 0xe9, - 0x9d, 0x9b, 0x31, 0x29, 0x5a, 0x3d, 0x78, 0x2d, 0x58, 0x2c, 0x92, 0x51, 0x59, 0x53, 0x70, 0x4e, - 0xbf, 0x03, 0xe2, 0x33, 0x64, 0x06, 0xa6, 0xcc, 0xbb, 0x1d, 0x0e, 0xfe, 0x1a, 0xa6, 0xb9, 0xed, - 0x99, 0x87, 0xdd, 0x5e, 0x88, 0x23, 0x4c, 0xf7, 0xee, 0x2d, 0x24, 0xfc, 0xef, 0xd1, 0x2d, 0x57, - 0x25, 0x54, 0xd8, 0x5b, 0xe0, 0x2f, 0x1e, 0x9f, 0x2e, 0x18, 0x37, 0x88, 0xbd, 0x7b, 0x0b, 0x8b, - 0x43, 0x22, 0x7c, 0x29, 0xe3, 0xce, 0x87, 0xff, 0x5b, 0xe1, 0xbe, 0x80, 0x8f, 0xec, 0x57, 0xa9, - 0x83, 0x0f, 0x62, 0xb2, 0x9f, 0x2a, 0x4f, 0x40, 0xaf, 0xdb, 0x94, 0xa7, 0x75, 0xb7, 0x69, 0xfd, - 0x79, 0x09, 0xae, 0x73, 0x1d, 0x28, 0x9b, 0x0e, 0x2f, 0x7a, 0x72, 0x88, 0xc9, 0x07, 0xc0, 0x53, - 0x92, 0x0b, 0x45, 0xd3, 0x12, 0x2d, 0x2f, 0xe2, 0xc4, 0x09, 0x48, 0x15, 0xc6, 0xf4, 0x27, 0x25, - 0xa7, 0x0b, 0x0f, 0x67, 0x8f, 0x1e, 0x3d, 0x76, 0xd4, 0x33, 0x93, 0x27, 0x70, 0x71, 0xe5, 0x1b, - 0x36, 0x21, 0xc4, 0xee, 0x24, 0x14, 0xf6, 0xf8, 0x29, 0xec, 0xe4, 0x8e, 0x98, 0x31, 0xe6, 0x69, - 0x3a, 0x09, 0x66, 0x47, 0x53, 0xb9, 0xc1, 0x29, 0xad, 0x79, 0xc4, 0x36, 0x60, 0xd6, 0x5f, 0x95, - 0xe0, 0x52, 0x76, 0x6d, 0x62, 0x61, 0x59, 0x83, 0x73, 0x4b, 0x8e, 0xe7, 0x7b, 0x6e, 0xc3, 0x69, - 0xd5, 0x1a, 0x87, 0xb4, 0xd9, 0x51, 0x41, 0x4e, 0xd5, 0x2a, 0x73, 0x40, 0x3d, 0x49, 0x2e, 0x51, - 0xec, 0x34, 0x15, 0x3b, 0x94, 0xe1, 0xab, 0x04, 0xbe, 0xf6, 0xb6, 0x68, 0xa0, 0xf8, 0xf1, 0x96, - 0xe5, 0x94, 0x92, 0xdb, 0xd2, 0xc8, 0xde, 0xdc, 0xf5, 0xdc, 0x48, 0x11, 0x71, 0xeb, 0x4a, 0x56, - 0x91, 0xf5, 0xaf, 0x4a, 0x70, 0x01, 0xf3, 0x1a, 0x19, 0x99, 0x12, 0xe3, 0x58, 0xbf, 0x32, 0x5c, - 0x6d, 0xc9, 0x78, 0x65, 0x61, 0x60, 0x9b, 0x71, 0x6b, 0xc9, 0x3b, 0xd0, 0x5f, 0x93, 0x4e, 0x52, - 0x13, 0x89, 0x1c, 0xab, 0x32, 0x9f, 0xbd, 0x1f, 0x44, 0x36, 0x62, 0xb1, 0x3d, 0x67, 0x99, 0x86, - 0x0d, 0xea, 0x61, 0x32, 0x5c, 0x7e, 0xd8, 0xd7, 0x20, 0x71, 0xa8, 0xa2, 0xfe, 0xbc, 0x50, 0x45, - 0x03, 0x66, 0xa8, 0x22, 0xeb, 0x29, 0xcf, 0x6a, 0x94, 0xec, 0x90, 0x18, 0xa4, 0x4f, 0x53, 0xb9, - 0x73, 0xf9, 0x3e, 0x70, 0x3e, 0xab, 0x67, 0x7b, 0x77, 0x53, 0x69, 0x71, 0xf3, 0x63, 0xeb, 0x6e, - 0xc3, 0xeb, 0x06, 0x6e, 0xb5, 0xd5, 0xf2, 0x9f, 0xd1, 0xe6, 0x76, 0xe0, 0x1f, 0xf9, 0x91, 0x91, - 0xd5, 0x45, 0x24, 0x8f, 0x8e, 0xaf, 0x51, 0xc4, 0xac, 0x4c, 0x80, 0xad, 0xff, 0x09, 0xde, 0xe8, - 0xc2, 0x51, 0x74, 0xaa, 0x06, 0xe7, 0x9c, 0x44, 0x99, 0xf4, 0x76, 0x79, 0x23, 0xab, 0x5f, 0x49, - 0x46, 0xa1, 0x9d, 0xa6, 0xbf, 0xb1, 0x63, 0xe4, 0x9b, 0x25, 0x73, 0x30, 0xbd, 0x6d, 0x6f, 0x2d, - 0xef, 0x2e, 0xed, 0xd4, 0x77, 0xbe, 0xdc, 0x5e, 0xa9, 0xef, 0x6e, 0x3e, 0xdc, 0xdc, 0x7a, 0xb4, - 0xc9, 0x83, 0x53, 0x1b, 0x25, 0x3b, 0x2b, 0xd5, 0x8d, 0x72, 0x89, 0x4c, 0x43, 0xd9, 0x00, 0xaf, - 0xec, 0x2e, 0x96, 0x7b, 0x6f, 0x7c, 0x6d, 0xe4, 0x51, 0x25, 0x97, 0x60, 0xae, 0xb6, 0xbb, 0xbd, - 0xbd, 0x65, 0x2b, 0xae, 0x7a, 0x68, 0xec, 0x19, 0x38, 0x67, 0x94, 0xde, 0xb3, 0x57, 0x56, 0xca, - 0x25, 0xd6, 0x14, 0x03, 0xbc, 0x6d, 0xaf, 0x6c, 0xac, 0xed, 0x6e, 0x94, 0x7b, 0x6f, 0xd4, 0xf5, - 0xa7, 0x5d, 0xe4, 0x22, 0xcc, 0x2e, 0xaf, 0xec, 0xad, 0x2d, 0xad, 0x64, 0xf1, 0x9e, 0x86, 0xb2, - 0x5e, 0xb8, 0xb3, 0xb5, 0xb3, 0xcd, 0x59, 0xeb, 0xd0, 0x47, 0x2b, 0x8b, 0xd5, 0xdd, 0x9d, 0xd5, - 0xcd, 0x72, 0x9f, 0xd5, 0x3f, 0xdc, 0x5b, 0xee, 0xbd, 0xf1, 0x63, 0xe3, 0xdd, 0x17, 0x6b, 0xbe, - 0x40, 0xdf, 0xad, 0x55, 0xef, 0xe7, 0x57, 0xc1, 0x4b, 0x37, 0xee, 0x55, 0xcb, 0x25, 0x72, 0x19, - 0x2e, 0x18, 0xd0, 0xed, 0x6a, 0xad, 0xf6, 0x68, 0xcb, 0x5e, 0x5e, 0x5f, 0xa9, 0xd5, 0xca, 0xbd, - 0x37, 0xf6, 0x8c, 0xf0, 0x6c, 0xac, 0x86, 0x8d, 0x7b, 0xd5, 0xba, 0xbd, 0xf2, 0xf9, 0xee, 0x9a, - 0xbd, 0xb2, 0x9c, 0xae, 0xc1, 0x28, 0xfd, 0x72, 0xa5, 0x56, 0x2e, 0x91, 0x29, 0x98, 0x34, 0xa0, - 0x9b, 0x5b, 0xe5, 0xde, 0x1b, 0x6f, 0x8a, 0x08, 0x5e, 0x64, 0x02, 0x60, 0x79, 0xa5, 0xb6, 0xb4, - 0xb2, 0xb9, 0xbc, 0xb6, 0x79, 0xbf, 0xdc, 0x43, 0xc6, 0x61, 0xa4, 0xaa, 0x7e, 0x96, 0x6e, 0x7c, - 0x04, 0x93, 0x89, 0x13, 0x35, 0xc3, 0x50, 0x87, 0xd1, 0x72, 0x0f, 0x8a, 0x5f, 0xfe, 0x44, 0xb3, - 0x26, 0x3f, 0x1c, 0x97, 0x4b, 0x37, 0x16, 0x65, 0xea, 0x53, 0xed, 0x3b, 0x27, 0xa3, 0x30, 0xb4, - 0xbc, 0x72, 0xaf, 0xba, 0xbb, 0xbe, 0x53, 0xee, 0x61, 0x3f, 0x96, 0xec, 0x95, 0xea, 0xce, 0xca, - 0x72, 0xb9, 0x44, 0x46, 0x60, 0xa0, 0xb6, 0x53, 0xdd, 0x59, 0x29, 0xf7, 0x92, 0x61, 0xe8, 0xdf, - 0xad, 0xad, 0xd8, 0xe5, 0xbe, 0x85, 0x3f, 0xf9, 0xa3, 0x12, 0xb7, 0xed, 0xc9, 0x37, 0x44, 0x5f, - 0x6b, 0x87, 0x49, 0xb1, 0xe4, 0x89, 0x3c, 0x8f, 0xb9, 0x27, 0x47, 0xd4, 0x02, 0xe6, 0x0b, 0x2e, - 0x3b, 0x10, 0xe1, 0x7a, 0xe9, 0x76, 0x89, 0xd8, 0xe8, 0x1c, 0x92, 0x38, 0x5b, 0x29, 0xce, 0xd9, - 0xc7, 0xdf, 0xf9, 0xcb, 0x85, 0x47, 0x32, 0xf2, 0x1b, 0x60, 0xe9, 0x3c, 0x73, 0x4e, 0x20, 0xdf, - 0x3d, 0xdd, 0x49, 0x43, 0xd6, 0xf9, 0xe6, 0xe9, 0xd0, 0xc9, 0x03, 0x18, 0x67, 0xba, 0xb9, 0x42, - 0x23, 0x17, 0x93, 0x84, 0xda, 0x71, 0x60, 0xfe, 0x52, 0x76, 0xa1, 0x4a, 0xc5, 0x32, 0x86, 0x1d, - 0xe1, 0x07, 0xeb, 0x90, 0xc8, 0x28, 0x0f, 0x12, 0xc2, 0x57, 0xfc, 0xf9, 0x73, 0x09, 0xf0, 0xde, - 0x9d, 0xdb, 0x25, 0x52, 0xc3, 0x10, 0x6b, 0x86, 0x92, 0x4f, 0xe4, 0xa3, 0xb6, 0xb4, 0xf6, 0xcf, - 0x5b, 0x53, 0x51, 0x89, 0x13, 0x73, 0x4e, 0x07, 0x9b, 0x40, 0xd2, 0xba, 0x33, 0xb9, 0x1a, 0xcf, - 0x83, 0x6c, 0xb5, 0x7a, 0xfe, 0x7c, 0xca, 0xe7, 0x6f, 0x85, 0x69, 0x4f, 0x64, 0x05, 0x26, 0xc4, - 0x13, 0x6e, 0xa1, 0xcd, 0x93, 0xa2, 0xf3, 0x40, 0x2e, 0x9b, 0xfb, 0x28, 0x27, 0x75, 0x22, 0x20, - 0xf3, 0x71, 0x3f, 0x92, 0xc7, 0x84, 0xf9, 0x8b, 0x99, 0x65, 0xa2, 0x7f, 0xf7, 0x60, 0xc2, 0x3c, - 0x5c, 0x10, 0x39, 0x40, 0x99, 0x67, 0x8e, 0xdc, 0x06, 0xd5, 0x61, 0x76, 0xc3, 0x71, 0xf1, 0x8a, - 0x42, 0x78, 0x96, 0x49, 0xbf, 0x30, 0x52, 0x29, 0x70, 0x14, 0xab, 0x51, 0xaf, 0xa9, 0x06, 0x21, - 0x2f, 0xac, 0x3a, 0x7e, 0x36, 0x35, 0xa9, 0x23, 0x9b, 0x7e, 0x75, 0xc4, 0x32, 0x93, 0xe1, 0x66, - 0xb9, 0x4a, 0xce, 0xe7, 0x79, 0xf7, 0x92, 0x0d, 0x54, 0xd2, 0x13, 0x1c, 0xb5, 0x39, 0x71, 0x66, - 0x76, 0x73, 0x18, 0x48, 0x40, 0xcb, 0x90, 0x2d, 0x0a, 0x43, 0x92, 0x23, 0xb8, 0x5c, 0x66, 0xb7, - 0x4b, 0xe4, 0x6b, 0xfc, 0xaa, 0x33, 0xd9, 0x3d, 0x72, 0xa3, 0x43, 0xa1, 0xfd, 0x5c, 0xcc, 0x64, - 0x20, 0x3e, 0x94, 0x02, 0xee, 0x36, 0x4c, 0x67, 0x39, 0x14, 0x2b, 0x81, 0x16, 0x78, 0x1b, 0xe7, - 0xce, 0x02, 0x9b, 0x1d, 0x35, 0x9a, 0xf9, 0x83, 0x54, 0xe0, 0xcf, 0x9a, 0xcb, 0xf3, 0x13, 0x98, - 0x60, 0xb3, 0xe4, 0x21, 0xa5, 0xed, 0x6a, 0xcb, 0x7d, 0x4a, 0x43, 0x22, 0xe3, 0xe3, 0x2a, 0x50, - 0x1e, 0xed, 0xf5, 0x12, 0xf9, 0x0e, 0x8c, 0x3e, 0x72, 0xa2, 0xc6, 0xa1, 0x88, 0x13, 0x29, 0xc3, - 0x48, 0x22, 0x6c, 0x5e, 0xfe, 0xc2, 0xc2, 0xdb, 0x25, 0xf2, 0x7d, 0x18, 0xba, 0x4f, 0x23, 0x7c, - 0x54, 0x7c, 0x4d, 0xf9, 0xd6, 0x71, 0xdb, 0xe4, 0x9a, 0xa7, 0x5e, 0xce, 0xc8, 0x06, 0x27, 0x0d, - 0xa8, 0xe4, 0x16, 0x00, 0x5f, 0x10, 0x90, 0x43, 0xb2, 0x78, 0x3e, 0xd5, 0x6c, 0x72, 0x9f, 0x29, - 0x0f, 0x2d, 0x1a, 0xd1, 0xd3, 0x56, 0x99, 0x27, 0xa3, 0x75, 0x98, 0x50, 0xd9, 0x6b, 0x36, 0x31, - 0x9c, 0x87, 0x95, 0x60, 0x16, 0x9e, 0x81, 0xdb, 0x47, 0xec, 0xab, 0xe0, 0xa9, 0x5b, 0x31, 0xee, - 0x03, 0xae, 0xa4, 0xb3, 0x7a, 0xf0, 0x08, 0x7d, 0x09, 0x95, 0x42, 0xe4, 0x68, 0x1a, 0xed, 0xaa, - 0x1f, 0x46, 0x26, 0xad, 0x82, 0x64, 0xd3, 0xfe, 0x3a, 0xcc, 0xeb, 0xf5, 0x9a, 0x81, 0x8a, 0xe3, - 0x35, 0x37, 0x2f, 0xfe, 0xf1, 0xfc, 0xb5, 0x02, 0x0c, 0x71, 0x7e, 0xeb, 0xfb, 0xdd, 0xde, 0x12, - 0x2e, 0x27, 0xcb, 0x30, 0x25, 0xeb, 0xda, 0x6a, 0x53, 0xaf, 0x56, 0x5b, 0xc5, 0x4c, 0x25, 0xd2, - 0x93, 0x43, 0x83, 0x49, 0xee, 0x24, 0x5d, 0xc4, 0xb6, 0x3e, 0x23, 0xbe, 0x03, 0x29, 0x8a, 0xfa, - 0x10, 0x6f, 0x7d, 0x99, 0x11, 0x74, 0x1f, 0x72, 0xa3, 0x92, 0xa1, 0xfc, 0xef, 0x2d, 0x90, 0x82, - 0x03, 0xd0, 0x7c, 0xce, 0x11, 0xe2, 0x76, 0x89, 0x7c, 0x09, 0x24, 0x7d, 0x24, 0x51, 0x22, 0xcc, - 0x3d, 0x7e, 0x29, 0x11, 0x16, 0x9c, 0x67, 0x56, 0x60, 0x4a, 0x45, 0x77, 0x89, 0xcb, 0x49, 0x4e, - 0x5b, 0x0a, 0x76, 0xb0, 0x99, 0x0c, 0x36, 0x7b, 0x0b, 0x05, 0x8c, 0x32, 0xe1, 0xe4, 0x33, 0x98, - 0x12, 0x73, 0xdf, 0x68, 0x4f, 0x59, 0x2d, 0x63, 0xe2, 0x70, 0x93, 0xdb, 0x92, 0x07, 0x30, 0x53, - 0x4b, 0x08, 0x9e, 0xfb, 0xb1, 0x5f, 0x30, 0x59, 0x20, 0xb0, 0x46, 0x23, 0x2e, 0xf9, 0x6c, 0x5e, - 0x0f, 0x81, 0x70, 0xdb, 0x92, 0x64, 0xf7, 0xd4, 0xa5, 0xcf, 0xc8, 0xe5, 0x44, 0xd3, 0x19, 0x10, - 0xd1, 0x70, 0x1d, 0xcc, 0xed, 0xd9, 0x0e, 0xcf, 0x5f, 0x8c, 0x50, 0xe3, 0x06, 0xfc, 0xaa, 0x41, - 0x60, 0x5c, 0xa2, 0x8b, 0x71, 0xbc, 0x90, 0x8b, 0x41, 0x7e, 0x0b, 0xa3, 0xb3, 0x16, 0x9f, 0xce, - 0xc8, 0x77, 0xb2, 0x0e, 0xd1, 0x39, 0xe7, 0xcb, 0xf9, 0x77, 0x4e, 0x87, 0xac, 0xce, 0xc3, 0xe3, - 0xf7, 0x69, 0xb4, 0xdd, 0xea, 0x1c, 0xb8, 0x98, 0xd9, 0x92, 0x28, 0xdb, 0x93, 0x02, 0x89, 0xe9, - 0x2d, 0x83, 0xa2, 0xc5, 0x05, 0x35, 0xfa, 0x13, 0xb2, 0x06, 0x65, 0xbe, 0x8d, 0x68, 0x2c, 0x2e, - 0xa7, 0x58, 0x08, 0x14, 0x27, 0x70, 0x8e, 0xc2, 0xdc, 0xd1, 0xba, 0xc5, 0x5d, 0x8e, 0x88, 0xfc, - 0xb4, 0x75, 0x3d, 0x75, 0xca, 0x80, 0xa9, 0x88, 0xf5, 0x6c, 0x44, 0x6c, 0x1a, 0xd2, 0x48, 0x86, - 0x81, 0xe1, 0x79, 0x4d, 0x5f, 0x8b, 0x75, 0x86, 0x74, 0x69, 0xbc, 0x82, 0x24, 0x42, 0x96, 0xed, - 0xdd, 0x25, 0x2a, 0xd7, 0x6b, 0x06, 0xd3, 0x37, 0x0d, 0xd5, 0xe6, 0x6c, 0x7c, 0xdf, 0xc5, 0xad, - 0x0c, 0x43, 0xdf, 0xcc, 0xc4, 0x6d, 0x63, 0xbf, 0x25, 0xd5, 0xb8, 0x46, 0xb5, 0xb7, 0x80, 0x2b, - 0x23, 0xdb, 0x6b, 0x99, 0x26, 0xdc, 0x09, 0x02, 0xea, 0x71, 0xe2, 0x3c, 0xb5, 0x25, 0x8b, 0xfa, - 0x53, 0x5c, 0xc1, 0x34, 0x6a, 0xfe, 0xdc, 0xae, 0x1b, 0x0b, 0x9e, 0x87, 0xe7, 0x76, 0x89, 0x7c, - 0x00, 0xc3, 0xa2, 0x8d, 0x8c, 0xc8, 0x68, 0x74, 0x58, 0xd0, 0x6a, 0xa4, 0x04, 0x2e, 0x24, 0x6c, - 0xb3, 0x89, 0x93, 0x37, 0xfa, 0xbc, 0xcd, 0x1f, 0xb0, 0x3d, 0xbb, 0xf9, 0x22, 0x94, 0x4b, 0x72, - 0xf3, 0x46, 0xca, 0x39, 0x15, 0x89, 0x45, 0x82, 0xba, 0xec, 0xb2, 0x9c, 0x09, 0x53, 0xbf, 0x31, - 0xe6, 0xa0, 0x0a, 0x1d, 0xa6, 0xd4, 0x6f, 0x03, 0xdc, 0x6d, 0xcb, 0x5e, 0x83, 0x72, 0xb5, 0x81, - 0x1b, 0x4a, 0x8d, 0x1e, 0x39, 0xed, 0x43, 0x3f, 0xa0, 0xea, 0xec, 0x93, 0x2c, 0x90, 0xbc, 0x66, - 0x94, 0x82, 0x22, 0x0a, 0xd6, 0xa9, 0x83, 0x81, 0x99, 0x67, 0x95, 0x86, 0x92, 0x28, 0xca, 0xa6, - 0x28, 0x38, 0xeb, 0x4c, 0x2f, 0xb1, 0xd3, 0x59, 0xeb, 0xe5, 0xd8, 0x7c, 0x84, 0x0b, 0x86, 0x42, - 0x0e, 0xd5, 0x0e, 0xa1, 0x40, 0xea, 0x54, 0x28, 0x5f, 0xde, 0x28, 0xd4, 0xaa, 0xbc, 0x7a, 0x8e, - 0xc5, 0x92, 0x47, 0x9d, 0x57, 0xfd, 0xf7, 0x60, 0x62, 0x85, 0x2d, 0xe8, 0x9d, 0xa6, 0xcb, 0x83, - 0xd1, 0x13, 0x33, 0xba, 0x78, 0x2e, 0xe1, 0xaa, 0x4c, 0x7d, 0x85, 0xa4, 0xc2, 0x82, 0x20, 0xf7, - 0x14, 0x0d, 0x26, 0xc7, 0x63, 0x5a, 0xb2, 0x15, 0xf9, 0x00, 0xf0, 0x84, 0x2f, 0x4c, 0x06, 0xb3, - 0x5c, 0xb1, 0xac, 0xb6, 0xdb, 0x2d, 0x69, 0xd9, 0xe6, 0x37, 0xf5, 0x6f, 0x18, 0x27, 0xd1, 0x54, - 0xb9, 0xe4, 0x9d, 0xd6, 0x3d, 0xbf, 0xd0, 0x52, 0xd1, 0xe6, 0xf0, 0xcc, 0x29, 0xef, 0x36, 0x17, - 0x55, 0xf8, 0xe8, 0x6a, 0xab, 0x95, 0x22, 0x0e, 0xc9, 0xdb, 0x26, 0xf7, 0x2c, 0x9c, 0x6e, 0x35, - 0xe0, 0x49, 0x9f, 0x2b, 0x6f, 0xd5, 0x76, 0x9b, 0x2f, 0x96, 0x57, 0xd4, 0x82, 0x61, 0x16, 0xa4, - 0x4f, 0xfa, 0xc9, 0x72, 0xb1, 0xb6, 0x3f, 0xc0, 0x69, 0x16, 0xe7, 0xab, 0x25, 0xfa, 0xb9, 0x39, - 0x99, 0xae, 0x57, 0xe9, 0x72, 0x89, 0x42, 0xb5, 0x4f, 0x4c, 0x26, 0x52, 0xf7, 0x2b, 0x03, 0x4f, - 0x2a, 0xa5, 0x3f, 0xe7, 0x77, 0x25, 0xaf, 0x58, 0x19, 0x5c, 0xcb, 0xc9, 0x9c, 0xe0, 0xaa, 0xcb, - 0x39, 0xb9, 0xe6, 0x55, 0x97, 0x73, 0x93, 0x89, 0x3f, 0x80, 0x72, 0x32, 0x1d, 0xb1, 0x62, 0x9a, - 0x93, 0xa7, 0x38, 0x77, 0x4c, 0xee, 0xc1, 0xb4, 0x3e, 0xa2, 0xaa, 0xdf, 0x79, 0xab, 0x7f, 0x1e, - 0x9f, 0x1d, 0x98, 0xc9, 0xcc, 0x1e, 0xac, 0xb6, 0xd8, 0xa2, 0xdc, 0xc2, 0xb9, 0x5c, 0x29, 0x9c, - 0xcf, 0x4e, 0x20, 0x4e, 0x5e, 0x37, 0xed, 0x07, 0xd9, 0xe9, 0x94, 0xe7, 0xdf, 0xe8, 0x82, 0x25, - 0x04, 0xfa, 0x35, 0xee, 0x80, 0xa9, 0x3a, 0xae, 0x69, 0x16, 0x85, 0x9c, 0x0a, 0xac, 0x22, 0x14, - 0x35, 0x07, 0xa6, 0x33, 0x8a, 0xf3, 0x45, 0xfc, 0x5a, 0x3e, 0xcf, 0x78, 0x62, 0xed, 0xc9, 0x28, - 0xc9, 0xb9, 0x92, 0x29, 0x4c, 0x34, 0x5d, 0x70, 0x24, 0x9d, 0x57, 0xf3, 0xe1, 0xf4, 0x4d, 0xce, - 0x37, 0x2f, 0x4d, 0x67, 0xa5, 0x37, 0x4f, 0x5a, 0x7f, 0xb2, 0xb2, 0x57, 0x2b, 0x31, 0x14, 0xe6, - 0x47, 0xdf, 0xe3, 0x96, 0x20, 0x93, 0xbb, 0x6e, 0x09, 0xca, 0x64, 0x7d, 0x35, 0x1f, 0x21, 0x9e, - 0x11, 0x46, 0xec, 0x75, 0xd1, 0x7f, 0xfd, 0x9c, 0x95, 0x9d, 0xd8, 0x5a, 0xcd, 0x88, 0x4c, 0x14, - 0xc1, 0xdd, 0x96, 0x1f, 0x5d, 0x8e, 0x58, 0x0a, 0x92, 0x7a, 0x17, 0x1c, 0x87, 0xe6, 0xe2, 0x81, - 0x4b, 0x34, 0xfb, 0xac, 0xc3, 0xf6, 0x35, 0x5c, 0xc8, 0x4d, 0xe0, 0x4d, 0xde, 0x4a, 0x7d, 0xd0, - 0x39, 0x92, 0xc8, 0x6f, 0xe9, 0xb8, 0x91, 0x7b, 0x5b, 0x99, 0xc2, 0x12, 0x69, 0xbe, 0x53, 0x2b, - 0x76, 0x46, 0x0e, 0xf0, 0xfb, 0xa8, 0xf9, 0x6a, 0x79, 0xbc, 0x73, 0xfb, 0x7a, 0x39, 0x8b, 0x4f, - 0x98, 0x5e, 0x53, 0xb5, 0x76, 0x49, 0x4d, 0x2c, 0x59, 0x70, 0x96, 0x35, 0xf5, 0x34, 0x4d, 0xcb, - 0xe3, 0xb3, 0x0c, 0xa3, 0x5a, 0x02, 0x70, 0x72, 0xc1, 0x10, 0x93, 0xb1, 0x4b, 0xce, 0x1b, 0x9d, - 0x33, 0x37, 0xc8, 0x25, 0xb4, 0x39, 0xab, 0x34, 0xe2, 0xb9, 0xad, 0xb8, 0x98, 0xe6, 0x61, 0xd8, - 0x9b, 0x95, 0x14, 0x78, 0x6b, 0x2e, 0x25, 0x85, 0x63, 0x34, 0x28, 0xbf, 0x4b, 0x44, 0x17, 0x4d, - 0x97, 0x26, 0xe5, 0x6b, 0xa8, 0x53, 0x22, 0xcb, 0x28, 0x26, 0x43, 0x91, 0x31, 0xf9, 0xce, 0x2b, - 0xe3, 0x99, 0x06, 0x2d, 0xb0, 0x65, 0x6c, 0xe3, 0xd3, 0x8e, 0x8c, 0x8c, 0xe8, 0x6a, 0x0d, 0x2d, - 0x4c, 0x98, 0x9e, 0xa1, 0x9d, 0xa9, 0x55, 0x39, 0x97, 0x63, 0x61, 0x8a, 0xf4, 0xdc, 0x96, 0xfe, - 0x48, 0x5b, 0x95, 0x53, 0x79, 0xcf, 0xc9, 0xf5, 0xa4, 0x6a, 0x96, 0x97, 0x1a, 0xbd, 0x60, 0xd5, - 0x9f, 0xce, 0x4a, 0x99, 0xae, 0x19, 0x80, 0x73, 0xf3, 0xa9, 0x67, 0x48, 0x41, 0x2d, 0x6f, 0x39, - 0xdc, 0x0a, 0x12, 0xa8, 0xe7, 0xb6, 0xf0, 0x2b, 0x6d, 0x79, 0x4b, 0x24, 0x3a, 0x57, 0x07, 0xee, - 0x2e, 0x99, 0xd0, 0x73, 0x79, 0x6f, 0xe2, 0x63, 0xa0, 0x74, 0x96, 0x72, 0xa5, 0xbb, 0x14, 0xe5, - 0x30, 0xcf, 0xb4, 0x0f, 0xcf, 0xa4, 0xbb, 0xc8, 0xf8, 0x9d, 0x4f, 0x58, 0x77, 0xbb, 0x35, 0x4c, - 0xad, 0xc3, 0x19, 0xd9, 0xcd, 0x13, 0xeb, 0x70, 0x7e, 0xfe, 0xf3, 0x82, 0x83, 0xce, 0x64, 0xcd, - 0x3d, 0xf0, 0xb4, 0xe4, 0xe4, 0xea, 0x98, 0x93, 0xce, 0x97, 0xae, 0x96, 0x98, 0xac, 0x5c, 0xe6, - 0x5b, 0x4c, 0xc3, 0xe1, 0xfa, 0xb9, 0x9e, 0x66, 0x9a, 0xcc, 0xe7, 0x67, 0xd7, 0x56, 0xcb, 0x4d, - 0x66, 0x5e, 0x6a, 0x8d, 0xa1, 0x9e, 0xe3, 0x59, 0x31, 0xcc, 0x48, 0x37, 0xad, 0x18, 0x66, 0x26, - 0x85, 0xbe, 0x85, 0x76, 0x15, 0xdb, 0x6f, 0x51, 0xdd, 0xae, 0xa2, 0x25, 0x0d, 0x4e, 0x98, 0x35, - 0xc8, 0xc7, 0x68, 0xd4, 0x28, 0xb6, 0x84, 0xcc, 0x9a, 0x9c, 0x74, 0xdf, 0x91, 0x11, 0x95, 0x91, - 0x59, 0x59, 0xd1, 0x93, 0x49, 0xa1, 0xe7, 0xe7, 0xd2, 0x05, 0x82, 0xfe, 0x3d, 0x69, 0x17, 0xc1, - 0x06, 0xcf, 0x99, 0xf6, 0xa4, 0xfc, 0x36, 0xbf, 0x27, 0x8d, 0x22, 0x06, 0x59, 0x2a, 0x1f, 0x73, - 0x92, 0xec, 0x7b, 0x30, 0x16, 0xe7, 0x5e, 0xde, 0x5b, 0xd0, 0x08, 0x13, 0x09, 0x99, 0x93, 0x84, - 0x1f, 0xc8, 0x8b, 0x13, 0xac, 0xcf, 0x2c, 0x2c, 0xb6, 0x9f, 0x7c, 0x2a, 0x8d, 0x30, 0x46, 0x4b, - 0x53, 0x99, 0x9c, 0x0b, 0x56, 0xee, 0x31, 0x3d, 0x61, 0xa4, 0x9a, 0x17, 0x19, 0x29, 0x5f, 0xd5, - 0xbc, 0xc8, 0x4a, 0xd9, 0x1a, 0x5f, 0x2c, 0x7c, 0x29, 0x2d, 0x0e, 0x31, 0xd3, 0xcb, 0x46, 0xb3, - 0x52, 0x7c, 0xaf, 0xe4, 0x15, 0x27, 0x59, 0xd7, 0xa0, 0x9c, 0xcc, 0x6e, 0xa9, 0x8e, 0x6b, 0x39, - 0x69, 0x48, 0xd5, 0x19, 0x30, 0x37, 0x2d, 0xe6, 0xb6, 0x34, 0x9f, 0x9b, 0x7c, 0xaf, 0x65, 0x37, - 0x4a, 0x67, 0x5d, 0xac, 0x96, 0xc5, 0x89, 0x2e, 0xf5, 0x83, 0x74, 0x2a, 0x91, 0xa6, 0xae, 0x96, - 0x65, 0xe4, 0xc6, 0x74, 0x65, 0x38, 0xa7, 0xec, 0x7c, 0xdb, 0x6f, 0x9b, 0x27, 0xdc, 0x82, 0xa8, - 0xe8, 0x5d, 0x2f, 0x99, 0xc9, 0xaf, 0xc1, 0x6c, 0x4e, 0x00, 0x69, 0xf2, 0x46, 0xc2, 0x10, 0x9b, - 0x1d, 0x60, 0x5a, 0x4d, 0x90, 0xcc, 0x0c, 0xd4, 0x1b, 0xe8, 0x9d, 0x60, 0x04, 0x6e, 0x48, 0xdd, - 0xf8, 0x3d, 0x72, 0xa3, 0x43, 0x9e, 0x68, 0x59, 0x5b, 0x73, 0x33, 0x23, 0x3e, 0x90, 0x1a, 0x9e, - 0x57, 0x0c, 0x68, 0xc6, 0xa5, 0x5f, 0x06, 0xc3, 0xf9, 0x6c, 0x86, 0x6c, 0xed, 0x60, 0x73, 0x21, - 0x23, 0xaa, 0x86, 0x9a, 0x0b, 0xf9, 0x11, 0x37, 0x72, 0x9b, 0xb9, 0x2d, 0x15, 0xac, 0x6c, 0x8e, - 0xf9, 0x01, 0x36, 0x72, 0x39, 0x3e, 0x60, 0x1c, 0x53, 0x31, 0x33, 0x48, 0x0e, 0x7a, 0xf1, 0xea, - 0x61, 0xcb, 0xfd, 0xda, 0xa4, 0x5a, 0xd0, 0xda, 0x97, 0x17, 0x9d, 0x23, 0xb7, 0x7d, 0x2b, 0xf2, - 0x7b, 0xca, 0x6e, 0xdf, 0x69, 0x77, 0x6c, 0x75, 0x3d, 0x96, 0x08, 0xdb, 0x62, 0x74, 0x54, 0x83, - 0xcf, 0xe7, 0xc0, 0xc9, 0x26, 0xba, 0x1b, 0x25, 0xa1, 0xda, 0xc1, 0x35, 0x3b, 0x2e, 0x4c, 0x2e, - 0x3f, 0x3e, 0x8f, 0x8d, 0xb8, 0x1a, 0x67, 0x99, 0xc7, 0x89, 0x80, 0x1c, 0x62, 0x1e, 0x1b, 0xd0, - 0xb3, 0xcd, 0xe3, 0x04, 0x43, 0x73, 0x1e, 0x27, 0x9b, 0x99, 0x34, 0x04, 0xe4, 0x8e, 0x6a, 0xb2, - 0x99, 0x6a, 0x1e, 0x67, 0x73, 0xcc, 0x8f, 0x7f, 0x92, 0xcb, 0x51, 0xcd, 0x63, 0x93, 0x63, 0x0e, - 0xfa, 0x29, 0xe7, 0x71, 0xb2, 0x12, 0x73, 0x1e, 0x9f, 0xa9, 0x7d, 0x6a, 0x1e, 0x67, 0xb7, 0xef, - 0xcc, 0xf3, 0x38, 0x11, 0x30, 0xc8, 0xe8, 0x68, 0xd6, 0x3c, 0x4e, 0xe2, 0xf3, 0x79, 0x9c, 0x84, - 0x26, 0x0c, 0x30, 0x05, 0xf3, 0x38, 0x49, 0xf9, 0x39, 0xf2, 0x4b, 0x04, 0x3b, 0x39, 0xcd, 0x4c, - 0xce, 0x8d, 0x93, 0x42, 0x1e, 0xa1, 0xf5, 0x2f, 0x01, 0x3f, 0xdd, 0x6c, 0xbe, 0x94, 0xc7, 0x14, - 0xe7, 0xf3, 0x9e, 0x14, 0x62, 0xb2, 0xb9, 0xa6, 0x69, 0x2b, 0x3b, 0xd6, 0x4b, 0x41, 0x83, 0xf7, - 0xd8, 0xbc, 0x69, 0x16, 0xf0, 0x2d, 0x0a, 0x55, 0x53, 0xc0, 0x57, 0x9d, 0x83, 0x92, 0x7c, 0x73, - 0x49, 0x8a, 0xe7, 0xf7, 0x17, 0xf2, 0xfe, 0x23, 0x49, 0xb7, 0x90, 0x38, 0x59, 0x9d, 0xb9, 0xa5, - 0xea, 0x84, 0x95, 0x6c, 0xe9, 0x59, 0xe7, 0xf9, 0x86, 0xd4, 0x1e, 0x52, 0x31, 0xae, 0x12, 0x9d, - 0xd6, 0xe7, 0x7a, 0x6e, 0x09, 0xd9, 0x41, 0x53, 0x6f, 0x1a, 0xae, 0x99, 0x89, 0xf3, 0x82, 0x69, - 0x75, 0xe5, 0x9a, 0x8a, 0xd6, 0xa3, 0x73, 0xcd, 0x0b, 0xe5, 0xa3, 0xb8, 0xa6, 0xa9, 0x3f, 0x43, - 0xd3, 0x99, 0x78, 0xd3, 0xe5, 0x3d, 0xf6, 0xf3, 0xcf, 0x39, 0x53, 0x86, 0x4b, 0x14, 0xc3, 0x45, - 0x4f, 0xb4, 0x4f, 0xc4, 0x05, 0x9f, 0x04, 0xe6, 0x0a, 0x3f, 0x8b, 0x9e, 0x7c, 0x06, 0x65, 0xb1, - 0xbc, 0xc5, 0x0c, 0xb2, 0x10, 0x73, 0x87, 0x6e, 0x51, 0x5a, 0xec, 0x4e, 0xd1, 0x82, 0xd3, 0x58, - 0xea, 0x4e, 0x23, 0x89, 0x7c, 0xb3, 0x16, 0xdb, 0x0e, 0x77, 0x82, 0x4e, 0x18, 0xd1, 0x66, 0xda, - 0x1c, 0x65, 0x36, 0x46, 0x3a, 0x4e, 0x98, 0xe8, 0x7b, 0x0b, 0x64, 0x0d, 0xd7, 0x36, 0x13, 0x5c, - 0x64, 0xaf, 0xcb, 0x66, 0x83, 0x4b, 0xcf, 0xaa, 0x7a, 0x3c, 0x64, 0xb6, 0x29, 0xaf, 0xee, 0xfc, - 0x46, 0x29, 0x11, 0x9d, 0xb2, 0x77, 0x79, 0x22, 0xe2, 0x07, 0x6a, 0x6e, 0x3b, 0xec, 0x26, 0x99, - 0xe4, 0x73, 0x26, 0xf2, 0x03, 0x18, 0x91, 0xc4, 0xdd, 0x05, 0x92, 0xa4, 0x46, 0x81, 0x2c, 0xc3, - 0xb8, 0xf1, 0x56, 0x4b, 0x9d, 0x6e, 0xb2, 0x5e, 0x70, 0x15, 0x8c, 0xf3, 0xb8, 0xf1, 0x26, 0x4b, - 0x71, 0xc9, 0x7a, 0xa9, 0x95, 0xcb, 0xe5, 0xfb, 0x30, 0x2a, 0x44, 0x5a, 0x28, 0x8d, 0x7c, 0x63, - 0xdd, 0x8c, 0xe6, 0xf7, 0xdc, 0x69, 0xba, 0xd1, 0x92, 0xef, 0x3d, 0x76, 0x0f, 0xba, 0x0a, 0x26, - 0x4d, 0xb2, 0xb7, 0x40, 0x7e, 0x88, 0x69, 0x89, 0x65, 0xb2, 0x68, 0x1a, 0x3d, 0xf3, 0x83, 0x27, - 0xae, 0x77, 0xd0, 0x85, 0xe5, 0x55, 0x93, 0x65, 0x92, 0x4e, 0xba, 0x96, 0xfc, 0x10, 0xe6, 0x6b, - 0xf9, 0xcc, 0xbb, 0x32, 0x29, 0xde, 0x5e, 0x6a, 0x70, 0x09, 0x9d, 0x6b, 0xce, 0xda, 0xf6, 0x42, - 0xa6, 0x5f, 0xf2, 0x30, 0x89, 0xd2, 0xd0, 0xdf, 0xf0, 0x83, 0x66, 0x77, 0x8e, 0x15, 0xd3, 0x5d, - 0x37, 0x41, 0x26, 0x85, 0xf1, 0x25, 0x5c, 0xa8, 0xe5, 0xb2, 0xee, 0xc6, 0xa2, 0x9b, 0x26, 0x79, - 0x11, 0x45, 0x71, 0xc6, 0x76, 0x17, 0xf2, 0x5c, 0xc3, 0x35, 0x8d, 0xed, 0x43, 0xdb, 0x01, 0x7d, - 0x4c, 0x03, 0x74, 0x0a, 0xef, 0xe6, 0x0e, 0x6d, 0xa2, 0xcb, 0x9e, 0xaf, 0xc1, 0xb9, 0x5a, 0x8a, - 0x55, 0x1e, 0x49, 0x71, 0xab, 0x1e, 0xc0, 0x14, 0xf6, 0xf4, 0x94, 0xed, 0xea, 0xe2, 0x44, 0x34, - 0x7a, 0x9f, 0x46, 0xbb, 0x6b, 0x5d, 0xa4, 0x24, 0x5f, 0x2d, 0x48, 0xc4, 0xbd, 0x3b, 0x8c, 0xb2, - 0xa6, 0x51, 0xa6, 0x31, 0x72, 0x3f, 0xde, 0x1f, 0xc8, 0x8b, 0x94, 0xae, 0xd5, 0xe6, 0x71, 0xb8, - 0x8b, 0x6b, 0xa1, 0x70, 0x8c, 0xd6, 0x4c, 0x90, 0x1c, 0x12, 0x9b, 0xea, 0x34, 0x1f, 0xe9, 0x90, - 0x54, 0xf9, 0xf1, 0x8f, 0x4f, 0x0f, 0x01, 0xbb, 0x92, 0x72, 0x98, 0x2f, 0x64, 0xc1, 0x4d, 0xa8, - 0xeb, 0x7e, 0xe3, 0x89, 0x6e, 0x42, 0xd5, 0x12, 0xd7, 0xcf, 0x9b, 0x69, 0xe5, 0xc5, 0x8a, 0x8f, - 0xb9, 0xe5, 0x75, 0xbf, 0x30, 0x3d, 0x75, 0xbd, 0x6e, 0x42, 0x35, 0x93, 0xec, 0xdf, 0x95, 0xb6, - 0x45, 0xac, 0xd0, 0xe4, 0x9c, 0x2b, 0x1a, 0x65, 0x56, 0x44, 0x22, 0xd3, 0xac, 0xa8, 0x37, 0x34, - 0xff, 0x22, 0x80, 0xa4, 0xb3, 0xec, 0xab, 0xc3, 0x4a, 0x6e, 0x02, 0xfe, 0x02, 0xf7, 0xae, 0x29, - 0xe1, 0x14, 0x64, 0x08, 0x5e, 0x85, 0x1a, 0x4e, 0x97, 0xc5, 0xa2, 0xd4, 0x7d, 0x95, 0x6e, 0x97, - 0xc8, 0x26, 0x9c, 0xbf, 0x4f, 0x23, 0xb1, 0xc6, 0xd9, 0x34, 0x8c, 0x02, 0xb7, 0x11, 0x15, 0xde, - 0x2a, 0xca, 0xb3, 0x49, 0x06, 0xcd, 0xde, 0xbb, 0x8c, 0x5f, 0x2d, 0x9b, 0x5f, 0x21, 0x5d, 0x81, - 0x07, 0xad, 0xb8, 0xaa, 0x38, 0x4b, 0x13, 0xf3, 0xa7, 0xf8, 0x10, 0x77, 0xd0, 0xc9, 0x27, 0x2d, - 0xc7, 0x71, 0x4d, 0xc4, 0x69, 0xeb, 0x26, 0x0c, 0x72, 0xa2, 0xdc, 0x0d, 0x75, 0x4c, 0xa7, 0x21, - 0x77, 0x60, 0x44, 0x79, 0xd8, 0x10, 0xa3, 0x28, 0xb7, 0x5d, 0x77, 0x60, 0x84, 0x1f, 0xad, 0x4e, - 0x4f, 0xf2, 0x31, 0x8c, 0x28, 0x97, 0x9c, 0x33, 0xef, 0xf4, 0x9f, 0xc1, 0xb8, 0xee, 0x9c, 0x73, - 0x76, 0x41, 0x7e, 0x1f, 0xef, 0x7e, 0xe5, 0x15, 0x4b, 0x3e, 0xfd, 0x4c, 0x22, 0x97, 0x97, 0x10, - 0x29, 0x5f, 0x20, 0x25, 0x30, 0xb7, 0xf9, 0xe7, 0x52, 0xd4, 0xe4, 0x63, 0xf9, 0x5e, 0x4a, 0x11, - 0xa7, 0x91, 0x0a, 0x64, 0x36, 0xc1, 0xc5, 0xfc, 0x22, 0xc4, 0x6a, 0x81, 0xed, 0xda, 0xec, 0xd3, - 0xdc, 0x51, 0x77, 0x17, 0x5d, 0x1e, 0x97, 0x2d, 0xd4, 0xd2, 0x52, 0x59, 0xe6, 0xf2, 0x19, 0x5d, - 0xc9, 0x4f, 0x4c, 0x87, 0x83, 0xf1, 0x00, 0x4f, 0x81, 0xa9, 0xd2, 0xdc, 0xee, 0x15, 0x24, 0xba, - 0x8b, 0x8f, 0xbd, 0x69, 0x76, 0x05, 0x64, 0x45, 0xa7, 0x68, 0xf1, 0x0a, 0xf4, 0x95, 0xb0, 0x5b, - 0x93, 0x3e, 0x8e, 0xa7, 0xef, 0x6c, 0x7e, 0xcb, 0x2e, 0x66, 0xdc, 0x8a, 0x77, 0x1d, 0x8b, 0x3c, - 0x76, 0xbf, 0x86, 0xda, 0x61, 0x66, 0xb8, 0xaf, 0x7c, 0x66, 0xd7, 0x35, 0xc7, 0x8a, 0x4c, 0x4a, - 0xb5, 0xe9, 0x3d, 0xc1, 0x87, 0x68, 0xd9, 0x79, 0xf8, 0xde, 0xec, 0xc2, 0x45, 0x4a, 0xe2, 0xad, - 0xae, 0x78, 0xea, 0x8e, 0xf5, 0x22, 0xdf, 0x61, 0xb3, 0xeb, 0xeb, 0x92, 0x57, 0x30, 0xe3, 0xda, - 0x5b, 0x39, 0x90, 0x66, 0x33, 0x34, 0x1d, 0x48, 0x0b, 0xfb, 0x90, 0x27, 0xfe, 0xcf, 0xa1, 0x12, - 0x7b, 0x8f, 0x9c, 0x6d, 0x10, 0xf2, 0xfd, 0x16, 0x49, 0x4a, 0x52, 0x21, 0x29, 0x4a, 0xb4, 0x33, - 0x7f, 0x2d, 0x4f, 0xc2, 0xa1, 0xe6, 0x96, 0x24, 0xfc, 0xde, 0x12, 0x19, 0x29, 0xf3, 0x72, 0x5b, - 0x16, 0xd8, 0x61, 0xc5, 0xcb, 0xbc, 0x57, 0xc2, 0x28, 0x3d, 0xda, 0x67, 0x67, 0xa4, 0x9c, 0x3b, - 0x12, 0x8c, 0xac, 0x82, 0xe1, 0x3d, 0x8b, 0xef, 0x5a, 0x72, 0x28, 0xce, 0x3a, 0xa0, 0x4e, 0xfc, - 0x1a, 0x2d, 0x11, 0x1d, 0x50, 0x7f, 0x01, 0x9c, 0x2e, 0x4a, 0x3e, 0xa5, 0xca, 0xc2, 0x50, 0x1e, - 0x55, 0x73, 0xb2, 0x0a, 0x06, 0x67, 0x47, 0x11, 0x3f, 0x70, 0xa3, 0xe7, 0x4b, 0xf6, 0x7a, 0x6c, - 0x56, 0xd0, 0x0b, 0x24, 0x6f, 0x90, 0x85, 0xf6, 0x3a, 0xf9, 0x0a, 0x97, 0x12, 0xc1, 0x7e, 0xd1, - 0xf7, 0xa3, 0x30, 0x0a, 0x9c, 0x76, 0xad, 0x11, 0xb8, 0xed, 0x28, 0xb7, 0xd3, 0xb1, 0x8b, 0x77, - 0x16, 0x99, 0xe6, 0x71, 0x2a, 0xa2, 0xc7, 0x67, 0xc5, 0xd7, 0x51, 0xaf, 0x6e, 0xb2, 0x0a, 0x0b, - 0x4e, 0x2e, 0x35, 0x19, 0x2f, 0xfe, 0x55, 0x32, 0xad, 0xc3, 0x6c, 0x4e, 0x54, 0x22, 0x75, 0x7b, - 0x5b, 0x1c, 0xb5, 0x68, 0xbe, 0xb8, 0x62, 0xf2, 0x43, 0x98, 0xc9, 0x0c, 0x5b, 0xa4, 0x2c, 0xd0, - 0x45, 0x41, 0x8d, 0xba, 0x31, 0x7f, 0x02, 0x73, 0xfc, 0xbd, 0x07, 0xba, 0x35, 0x1b, 0x11, 0x6c, - 0xe2, 0x57, 0x40, 0x39, 0x08, 0xc9, 0xf5, 0x3a, 0x1f, 0x4f, 0x3d, 0x69, 0x9f, 0xc6, 0xd0, 0x25, - 0x89, 0x84, 0xe7, 0xea, 0xc3, 0xcb, 0x2a, 0x2c, 0x7a, 0x6a, 0xb4, 0x0d, 0x33, 0x7b, 0x34, 0x70, - 0x1f, 0x3f, 0x4f, 0x32, 0x94, 0x92, 0xc9, 0x2c, 0x2d, 0xe2, 0xf8, 0x05, 0xcc, 0x2e, 0xf9, 0x47, - 0x6d, 0xf1, 0xa8, 0xcf, 0xe0, 0xa9, 0xae, 0xe2, 0xb3, 0xcb, 0xbb, 0x3b, 0x42, 0xcd, 0xe7, 0xa7, - 0xa6, 0x57, 0xfe, 0x6f, 0x5d, 0xb3, 0xd7, 0xab, 0xa7, 0x69, 0x26, 0xfd, 0x0e, 0x4e, 0xc2, 0xac, - 0x5c, 0xf5, 0xfa, 0x24, 0x2c, 0xc8, 0x65, 0x9f, 0xf3, 0x44, 0x6c, 0x36, 0x27, 0x3d, 0x7d, 0x01, - 0xd7, 0x53, 0xb4, 0x76, 0x53, 0xee, 0x2d, 0x66, 0x22, 0xef, 0x84, 0x4f, 0x75, 0x66, 0x96, 0xef, - 0xcc, 0x76, 0x6a, 0xb1, 0x1b, 0x5a, 0xad, 0x02, 0x15, 0x8b, 0xe8, 0xc1, 0x1b, 0x18, 0x26, 0x1a, - 0xf1, 0xc7, 0x75, 0xda, 0xa2, 0xd5, 0x3a, 0x45, 0x8c, 0x4a, 0xed, 0x47, 0x30, 0x56, 0xd3, 0x2b, - 0xcf, 0xa8, 0x24, 0x77, 0x52, 0xa8, 0x47, 0x42, 0xdd, 0xdb, 0x5e, 0xe0, 0x48, 0xaa, 0x36, 0x9e, - 0x53, 0xf5, 0x22, 0xd7, 0x75, 0xc6, 0xc8, 0xca, 0xa6, 0x76, 0x81, 0xac, 0xa4, 0x89, 0xca, 0x75, - 0x26, 0x3b, 0x91, 0x5b, 0x9d, 0xe7, 0x91, 0x49, 0xe6, 0xc4, 0x24, 0x56, 0xf7, 0xe4, 0xb3, 0xca, - 0x65, 0xbe, 0x30, 0xa9, 0x26, 0xf7, 0xf3, 0x89, 0xf3, 0xd0, 0xe9, 0x7e, 0x3e, 0xa9, 0xec, 0x76, - 0xba, 0x9f, 0x4f, 0x46, 0xea, 0xba, 0x15, 0xe4, 0x15, 0x27, 0xe0, 0x29, 0x30, 0x46, 0x28, 0x36, - 0x19, 0x79, 0x7e, 0x1e, 0xea, 0x21, 0x40, 0x78, 0xda, 0x9e, 0x02, 0x5b, 0x6b, 0x32, 0xf4, 0x47, - 0x22, 0xcf, 0xcf, 0x3d, 0x28, 0xf3, 0x0c, 0x06, 0x71, 0xd4, 0xc4, 0xd8, 0x6f, 0x30, 0x9d, 0x58, - 0xa1, 0x60, 0x50, 0xcb, 0xc9, 0x78, 0x73, 0xca, 0x64, 0x96, 0x13, 0x88, 0xae, 0x60, 0xaa, 0x42, - 0x1c, 0x55, 0x4e, 0x19, 0xa6, 0x52, 0x81, 0xe6, 0xe6, 0x2f, 0x64, 0x94, 0x28, 0x95, 0x72, 0x4c, - 0x8f, 0x41, 0xa7, 0xba, 0x94, 0x11, 0x98, 0x6e, 0xfe, 0x62, 0x66, 0x99, 0x60, 0x14, 0xf1, 0xfc, - 0xcb, 0xd9, 0x59, 0xa3, 0xe3, 0x77, 0x5e, 0x05, 0x38, 0xb2, 0x9a, 0x1b, 0xa7, 0x41, 0x15, 0xb5, - 0x52, 0x95, 0x7e, 0x28, 0x23, 0x55, 0xf5, 0x5b, 0x19, 0xef, 0x31, 0x0c, 0x8c, 0xd8, 0x1b, 0xac, - 0x38, 0x6f, 0x36, 0x79, 0x24, 0xd3, 0xc1, 0xe4, 0xd4, 0xd4, 0x8d, 0x41, 0xee, 0x08, 0x3e, 0x92, - 0x09, 0x60, 0x5e, 0x35, 0xe3, 0x7d, 0xb8, 0x94, 0x78, 0xee, 0x61, 0x32, 0xbe, 0x91, 0xfd, 0x26, - 0x24, 0x53, 0x3c, 0xf9, 0x3a, 0xfb, 0xd5, 0xf4, 0xdb, 0x90, 0xc4, 0xb8, 0x9f, 0x75, 0xcd, 0xdb, - 0x80, 0x09, 0x5c, 0x66, 0x64, 0xd2, 0xf5, 0x38, 0x02, 0x8d, 0x09, 0x4e, 0x86, 0x42, 0x4a, 0x96, - 0x2a, 0x97, 0xd9, 0x31, 0xf1, 0x66, 0x98, 0xa7, 0x70, 0x9f, 0x37, 0x1f, 0x12, 0x23, 0x30, 0x6b, - 0x17, 0x13, 0x99, 0xe1, 0xc9, 0xf7, 0x61, 0x32, 0x7e, 0x4a, 0xcc, 0x59, 0x64, 0xa0, 0x15, 0x18, - 0xca, 0x26, 0xe3, 0xf7, 0xc4, 0x67, 0x27, 0x5f, 0x95, 0x5b, 0x51, 0x4c, 0x7e, 0x39, 0xf5, 0x4c, - 0xc6, 0xe8, 0xc3, 0x69, 0x76, 0x24, 0x4d, 0xb6, 0x67, 0x1d, 0x9d, 0x06, 0x7e, 0x6e, 0xd9, 0xc1, - 0x15, 0xf5, 0xcf, 0xad, 0x30, 0x00, 0xa4, 0x52, 0x7f, 0x73, 0xf8, 0x6c, 0xc0, 0x6b, 0x18, 0x90, - 0x65, 0x9b, 0x87, 0xe0, 0xcb, 0xc6, 0xca, 0x6f, 0x7b, 0x32, 0x8c, 0x4b, 0x0b, 0xae, 0x75, 0x8d, - 0x2e, 0x49, 0x6e, 0x19, 0x2e, 0x2e, 0xdd, 0xe3, 0x50, 0x16, 0x3d, 0x4d, 0xcb, 0x0a, 0xd2, 0xa8, - 0xf6, 0xd9, 0x82, 0x78, 0x91, 0x6a, 0x9f, 0x2d, 0x8c, 0xf2, 0xf8, 0x05, 0xe6, 0x58, 0x12, 0x7b, - 0x14, 0x06, 0x59, 0xa2, 0x1e, 0x0f, 0x3b, 0x5d, 0x78, 0xed, 0x73, 0xcd, 0xbc, 0x14, 0x4d, 0x11, - 0xe2, 0x99, 0xe6, 0x8a, 0x38, 0x89, 0xe5, 0x31, 0xef, 0xce, 0xa4, 0xc0, 0xb5, 0xfa, 0x0a, 0x9f, - 0x80, 0x67, 0x6e, 0x79, 0x0e, 0x7c, 0x71, 0xf9, 0xe7, 0xff, 0xfe, 0x4a, 0xe9, 0xe7, 0xbf, 0xb8, - 0x52, 0xfa, 0xd7, 0xbf, 0xb8, 0x52, 0xfa, 0x77, 0xbf, 0xb8, 0x52, 0xfa, 0x6a, 0xe1, 0x74, 0xc1, - 0x8f, 0x1b, 0x2d, 0x97, 0x7a, 0xd1, 0x2d, 0xce, 0x6e, 0x10, 0xff, 0xbb, 0xfb, 0xdf, 0x03, 0x00, - 0x00, 0xff, 0xff, 0xd9, 0x2d, 0x39, 0x25, 0x79, 0xe5, 0x00, 0x00, + // 14749 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0xbd, 0x5b, 0x6c, 0x5c, 0x4b, + 0x76, 0x18, 0xca, 0xe6, 0x9b, 0x8b, 0xaf, 0x56, 0x91, 0x14, 0x5b, 0x14, 0xa5, 0x96, 0xb6, 0xce, + 0x43, 0x47, 0x73, 0x46, 0x0f, 0xea, 0x9c, 0x33, 0xe7, 0x35, 0xe7, 0x4c, 0xf3, 0x21, 0x91, 0x12, + 0x5f, 0x67, 0x37, 0x49, 0x9d, 0x97, 0xa7, 0x67, 0xb3, 0xbb, 0x44, 0x6e, 0xab, 0xb9, 0x77, 0xcf, + 0xde, 0xbb, 0xa5, 0xa3, 0xf1, 0xb5, 0x2f, 0x3c, 0xbe, 0x17, 0xd7, 0x3f, 0x37, 0xb1, 0x81, 0x38, + 0x70, 0xe0, 0x0f, 0x23, 0x40, 0x0c, 0x04, 0xf9, 0x08, 0xfc, 0xe3, 0xf8, 0x27, 0xf9, 0xc8, 0x57, + 0x26, 0x06, 0x8c, 0x24, 0xb0, 0xfd, 0x93, 0x0f, 0x3a, 0x19, 0x20, 0x3f, 0x44, 0xf2, 0x61, 0x04, + 0x09, 0x90, 0x01, 0x0c, 0x04, 0xb5, 0xea, 0xb1, 0xab, 0xf6, 0xa3, 0x9b, 0x94, 0x74, 0xc6, 0xf9, + 0x91, 0xd8, 0xab, 0xd6, 0x5a, 0x55, 0xb5, 0xaa, 0x76, 0xd5, 0xaa, 0x55, 0xab, 0xd6, 0x82, 0x9b, + 0x11, 0x6d, 0xd2, 0x96, 0x1f, 0x44, 0xb7, 0x9a, 0xf4, 0xc0, 0xa9, 0x3f, 0xbf, 0x55, 0x6f, 0xba, + 0xd4, 0x8b, 0x6e, 0xb5, 0x02, 0x3f, 0xf2, 0x6f, 0x39, 0xed, 0xe8, 0x30, 0xa4, 0xc1, 0x53, 0xb7, + 0x4e, 0x6f, 0x22, 0x84, 0x0c, 0xe0, 0x7f, 0x73, 0xd3, 0x07, 0xfe, 0x81, 0xcf, 0x71, 0xd8, 0x5f, + 0xbc, 0x70, 0xee, 0xe2, 0x81, 0xef, 0x1f, 0x34, 0x29, 0x27, 0xde, 0x6f, 0x3f, 0xbe, 0x45, 0x8f, + 0x5a, 0xd1, 0x73, 0x51, 0x58, 0x4e, 0x16, 0x46, 0xee, 0x11, 0x0d, 0x23, 0xe7, 0xa8, 0x25, 0x10, + 0xde, 0x52, 0x4d, 0x71, 0xa2, 0x88, 0x95, 0x44, 0xae, 0xef, 0xdd, 0x7a, 0x7a, 0x47, 0xff, 0x29, + 0x50, 0xaf, 0x77, 0x6c, 0x75, 0x9d, 0x06, 0x51, 0x78, 0x2a, 0x4c, 0xfa, 0x94, 0x7a, 0x51, 0xaa, + 0x7a, 0x81, 0x19, 0x3d, 0x6f, 0xd1, 0x90, 0xa3, 0xc8, 0xff, 0x04, 0xea, 0xd5, 0x6c, 0x54, 0xfc, + 0x57, 0xa0, 0x7c, 0x37, 0x1b, 0xe5, 0x19, 0xdd, 0x67, 0x32, 0xf5, 0xd4, 0x1f, 0x5d, 0xd0, 0x03, + 0xa7, 0xd5, 0xa2, 0x41, 0xfc, 0x87, 0x40, 0xbf, 0xa0, 0xd0, 0x8f, 0x1e, 0x3b, 0x4c, 0x44, 0x47, + 0x8f, 0x9d, 0x54, 0x37, 0xda, 0xa1, 0x73, 0x40, 0x45, 0xf3, 0x9f, 0xde, 0xd1, 0x7f, 0x72, 0x54, + 0xeb, 0x0f, 0x0b, 0x30, 0xf0, 0xc8, 0x89, 0xea, 0x87, 0xe4, 0x53, 0x18, 0x78, 0xe8, 0x7a, 0x8d, + 0xb0, 0x54, 0xb8, 0xd2, 0x77, 0x7d, 0x74, 0xa1, 0x78, 0x93, 0x77, 0x05, 0x0b, 0x59, 0xc1, 0xe2, + 0xec, 0xcf, 0x8e, 0xcb, 0x3d, 0x27, 0xc7, 0xe5, 0xc9, 0x27, 0x0c, 0xed, 0x6d, 0xff, 0xc8, 0x8d, + 0x70, 0x6c, 0x6d, 0x4e, 0x47, 0x76, 0x61, 0xaa, 0xd2, 0x6c, 0xfa, 0xcf, 0xb6, 0x9d, 0x20, 0x72, + 0x9d, 0x66, 0xb5, 0x5d, 0xaf, 0xd3, 0x30, 0x2c, 0xf5, 0x5e, 0x29, 0x5c, 0x1f, 0x5e, 0xbc, 0x76, + 0x72, 0x5c, 0x2e, 0x3b, 0xac, 0xb8, 0xd6, 0xe2, 0xe5, 0xb5, 0x90, 0x23, 0x68, 0x8c, 0xb2, 0xe8, + 0xad, 0x3f, 0x1b, 0x84, 0xe2, 0xaa, 0x1f, 0x46, 0x4b, 0x6c, 0x44, 0x6d, 0xfa, 0xe3, 0x36, 0x0d, + 0x23, 0x72, 0x0d, 0x06, 0x19, 0x6c, 0x6d, 0xb9, 0x54, 0xb8, 0x52, 0xb8, 0x3e, 0xb2, 0x38, 0x7a, + 0x72, 0x5c, 0x1e, 0x3a, 0xf4, 0xc3, 0xa8, 0xe6, 0x36, 0x6c, 0x51, 0x44, 0xde, 0x82, 0xe1, 0x4d, + 0xbf, 0x41, 0x37, 0x9d, 0x23, 0x8a, 0xad, 0x18, 0x59, 0x1c, 0x3f, 0x39, 0x2e, 0x8f, 0x78, 0x7e, + 0x83, 0xd6, 0x3c, 0xe7, 0x88, 0xda, 0xaa, 0x98, 0xec, 0x41, 0xbf, 0xed, 0x37, 0x69, 0xa9, 0x0f, + 0xd1, 0x16, 0x4f, 0x8e, 0xcb, 0xfd, 0x81, 0xdf, 0xa4, 0xbf, 0x38, 0x2e, 0xbf, 0x77, 0xe0, 0x46, + 0x87, 0xed, 0xfd, 0x9b, 0x75, 0xff, 0xe8, 0xd6, 0x41, 0xe0, 0x3c, 0x75, 0xf9, 0x24, 0x74, 0x9a, + 0xb7, 0xe2, 0xa9, 0xda, 0x72, 0xc5, 0xb8, 0x57, 0x9f, 0x87, 0x11, 0x3d, 0x62, 0x9c, 0x6c, 0xe4, + 0x47, 0x1e, 0xc1, 0x74, 0xa5, 0xd1, 0x70, 0x39, 0xc5, 0x76, 0xe0, 0x7a, 0x75, 0xb7, 0xe5, 0x34, + 0xc3, 0x52, 0xff, 0x95, 0xbe, 0xeb, 0x23, 0x42, 0x28, 0xaa, 0xbc, 0xd6, 0x52, 0x08, 0x9a, 0x50, + 0x32, 0x19, 0x90, 0xbb, 0x30, 0xbc, 0xbc, 0x59, 0x65, 0x6d, 0x0f, 0x4b, 0x03, 0xc8, 0x6c, 0xf6, + 0xe4, 0xb8, 0x3c, 0xd5, 0xf0, 0x42, 0xec, 0x9a, 0xce, 0x40, 0x21, 0x92, 0xf7, 0x60, 0x6c, 0xbb, + 0xbd, 0xdf, 0x74, 0xeb, 0x3b, 0xeb, 0xd5, 0x87, 0xf4, 0x79, 0x69, 0xf0, 0x4a, 0xe1, 0xfa, 0xd8, + 0x22, 0x39, 0x39, 0x2e, 0x4f, 0xb4, 0x10, 0x5e, 0x8b, 0x9a, 0x61, 0xed, 0x09, 0x7d, 0x6e, 0x1b, + 0x78, 0x31, 0x5d, 0xb5, 0xba, 0xca, 0xe8, 0x86, 0x52, 0x74, 0x61, 0x78, 0xa8, 0xd3, 0x71, 0x3c, + 0x72, 0x0b, 0xc0, 0xa6, 0x47, 0x7e, 0x44, 0x2b, 0x8d, 0x46, 0x50, 0x1a, 0x46, 0xd9, 0x4e, 0x9e, + 0x1c, 0x97, 0x47, 0x03, 0x84, 0xd6, 0x9c, 0x46, 0x23, 0xb0, 0x35, 0x14, 0xb2, 0x04, 0xc3, 0xb6, + 0xcf, 0x05, 0x5c, 0x1a, 0xb9, 0x52, 0xb8, 0x3e, 0xba, 0x30, 0x29, 0xa6, 0xa1, 0x04, 0x2f, 0x9e, + 0x3f, 0x39, 0x2e, 0x93, 0x40, 0xfc, 0xd2, 0x7b, 0x29, 0x31, 0x48, 0x19, 0x86, 0x36, 0xfd, 0x25, + 0xa7, 0x7e, 0x48, 0x4b, 0x80, 0x73, 0x6f, 0xe0, 0xe4, 0xb8, 0x5c, 0xf8, 0xae, 0x2d, 0xa1, 0xe4, + 0x29, 0x8c, 0xc6, 0x03, 0x15, 0x96, 0x46, 0x51, 0x7c, 0x3b, 0x27, 0xc7, 0xe5, 0xf3, 0x21, 0x82, + 0x6b, 0x6c, 0xe8, 0x35, 0x09, 0xbe, 0xc4, 0x2c, 0xd0, 0x2b, 0x22, 0x5f, 0xc3, 0x4c, 0xfc, 0xb3, + 0x12, 0x86, 0x34, 0x60, 0x3c, 0xd6, 0x96, 0x4b, 0xe3, 0x28, 0x99, 0x37, 0x4e, 0x8e, 0xcb, 0x96, + 0xd6, 0x82, 0x9a, 0x23, 0x51, 0x6a, 0x6e, 0x43, 0xeb, 0x69, 0x36, 0x93, 0x07, 0xfd, 0xc3, 0x63, + 0xc5, 0x71, 0xfb, 0xd2, 0xae, 0x17, 0x46, 0xce, 0x7e, 0x93, 0x66, 0x22, 0x59, 0x7f, 0x5b, 0x00, + 0xb2, 0xd5, 0xa2, 0x5e, 0xb5, 0xba, 0xca, 0xbe, 0x27, 0xf9, 0x39, 0xbd, 0x0d, 0x23, 0x7c, 0xe0, + 0xd8, 0xe8, 0xf6, 0xe2, 0xe8, 0x4e, 0x9c, 0x1c, 0x97, 0x41, 0x8c, 0x2e, 0x1b, 0xd9, 0x18, 0x81, + 0xbc, 0x0e, 0x7d, 0x3b, 0x3b, 0xeb, 0xf8, 0xad, 0xf4, 0x2d, 0x4e, 0x9d, 0x1c, 0x97, 0xfb, 0xa2, + 0xa8, 0xf9, 0x8b, 0xe3, 0xf2, 0xf0, 0x72, 0x3b, 0x40, 0xb1, 0xd8, 0xac, 0x9c, 0xbc, 0x0e, 0x43, + 0x4b, 0xcd, 0x76, 0x18, 0xd1, 0xa0, 0xd4, 0x1f, 0x7f, 0xa4, 0x75, 0x0e, 0xb2, 0x65, 0x19, 0xf9, + 0x0e, 0xf4, 0xef, 0x86, 0x34, 0x28, 0x0d, 0xe0, 0x78, 0x8f, 0x8b, 0xf1, 0x66, 0xa0, 0xbd, 0x85, + 0xc5, 0x61, 0xf6, 0x25, 0xb6, 0x43, 0x1a, 0xd8, 0x88, 0x44, 0x6e, 0xc2, 0x00, 0x1f, 0xb4, 0x41, + 0x5c, 0xa4, 0xc6, 0xd5, 0xec, 0x68, 0xd2, 0xbd, 0xf7, 0x16, 0x47, 0x4e, 0x8e, 0xcb, 0x03, 0x38, + 0x78, 0x36, 0x47, 0x7b, 0xd0, 0x3f, 0x5c, 0x28, 0xf6, 0xda, 0xc3, 0x8c, 0x96, 0x7d, 0x16, 0xd6, + 0x77, 0x60, 0x54, 0xeb, 0x3e, 0x99, 0x87, 0x7e, 0xf6, 0x3f, 0x2e, 0x22, 0x63, 0xbc, 0x32, 0xb6, + 0x71, 0xd8, 0x08, 0xb5, 0xfe, 0xc5, 0x24, 0x14, 0x19, 0xa5, 0xb1, 0xf2, 0x18, 0xa2, 0x2a, 0x74, + 0x13, 0xd5, 0x75, 0x50, 0x75, 0x8b, 0x25, 0x68, 0xec, 0xe4, 0xb8, 0x3c, 0xdc, 0x16, 0xb0, 0xb8, + 0x65, 0xa4, 0x0a, 0x43, 0x2b, 0xdf, 0xb4, 0xdc, 0x80, 0x86, 0x28, 0xd8, 0xd1, 0x85, 0xb9, 0x9b, + 0x7c, 0xb3, 0xbc, 0x29, 0x37, 0xcb, 0x9b, 0x3b, 0x72, 0xb3, 0x5c, 0xbc, 0x24, 0x96, 0xe2, 0x73, + 0x94, 0x93, 0xc4, 0xb3, 0xe3, 0x77, 0xfe, 0xba, 0x5c, 0xb0, 0x25, 0x27, 0xf2, 0x36, 0x0c, 0xde, + 0xf3, 0x83, 0x23, 0x27, 0x12, 0x23, 0x30, 0x7d, 0x72, 0x5c, 0x2e, 0x3e, 0x46, 0x88, 0x36, 0xa1, + 0x04, 0x0e, 0xb9, 0x07, 0x13, 0xb6, 0xdf, 0x8e, 0xe8, 0x8e, 0x2f, 0xc7, 0x6d, 0x00, 0xa9, 0x2e, + 0x9f, 0x1c, 0x97, 0xe7, 0x02, 0x56, 0x52, 0x8b, 0xfc, 0x9a, 0x18, 0x40, 0x8d, 0x3e, 0x41, 0x45, + 0x56, 0x60, 0xa2, 0x82, 0x6b, 0xb7, 0x90, 0x19, 0x1f, 0xad, 0x91, 0xc5, 0x4b, 0x27, 0xc7, 0xe5, + 0x0b, 0x0e, 0x96, 0xd4, 0x02, 0x51, 0xa4, 0xb3, 0x31, 0x89, 0xc8, 0x26, 0x9c, 0x7b, 0xd8, 0xde, + 0xa7, 0x81, 0x47, 0x23, 0x1a, 0xca, 0x16, 0x0d, 0x61, 0x8b, 0xae, 0x9c, 0x1c, 0x97, 0xe7, 0x9f, + 0xa8, 0xc2, 0x8c, 0x36, 0xa5, 0x49, 0x09, 0x85, 0x49, 0xd1, 0xd0, 0x65, 0x27, 0x72, 0xf6, 0x9d, + 0x90, 0xe2, 0x92, 0x34, 0xba, 0x70, 0x9e, 0x8b, 0xf8, 0x66, 0xa2, 0x74, 0xf1, 0x9a, 0x90, 0xf2, + 0x45, 0xd5, 0xf7, 0x86, 0x28, 0xd2, 0x2a, 0x4a, 0xf2, 0x64, 0x2b, 0xb3, 0xda, 0x75, 0x46, 0xb0, + 0xb5, 0xb8, 0x32, 0xab, 0x5d, 0x47, 0x5f, 0xb3, 0xd4, 0xfe, 0xb3, 0x0e, 0x03, 0xbb, 0x6c, 0x6f, + 0xc6, 0x15, 0x6b, 0x62, 0xe1, 0xaa, 0x68, 0x51, 0x72, 0xf6, 0xdd, 0x64, 0x3f, 0x10, 0x11, 0xbf, + 0xbb, 0x49, 0xdc, 0xcf, 0xf5, 0x9d, 0x18, 0xcb, 0xc8, 0x67, 0x00, 0xa2, 0x55, 0x95, 0x56, 0xab, + 0x34, 0x8a, 0x9d, 0x3c, 0x67, 0x76, 0xb2, 0xd2, 0x6a, 0x2d, 0x5e, 0x16, 0xfd, 0x3b, 0xaf, 0xfa, + 0xe7, 0xb4, 0x5a, 0x1a, 0x37, 0x8d, 0x09, 0xf9, 0x14, 0xc6, 0x70, 0x41, 0x93, 0x23, 0x3a, 0x86, + 0x23, 0x7a, 0xf1, 0xe4, 0xb8, 0x3c, 0x8b, 0x6b, 0x55, 0xc6, 0x78, 0x1a, 0x04, 0xe4, 0x37, 0x60, + 0x46, 0xb0, 0x7b, 0xe4, 0x7a, 0x0d, 0xff, 0x59, 0xb8, 0x4c, 0xc3, 0x27, 0x91, 0xdf, 0xc2, 0xc5, + 0x6f, 0x74, 0x61, 0xde, 0x6c, 0x9e, 0x89, 0xb3, 0x78, 0x43, 0xb4, 0xd4, 0x52, 0x2d, 0x7d, 0xc6, + 0x11, 0x6a, 0x0d, 0x8e, 0xa1, 0x2f, 0x8f, 0x99, 0x2c, 0xc8, 0x1a, 0x4c, 0xee, 0x86, 0xd4, 0xe8, + 0xc3, 0x04, 0xee, 0x0e, 0x65, 0x36, 0xc2, 0xed, 0x90, 0xd6, 0xf2, 0xfa, 0x91, 0xa4, 0x23, 0x36, + 0x90, 0xe5, 0xc0, 0x6f, 0x25, 0xe6, 0xf8, 0x24, 0x4a, 0xc4, 0x3a, 0x39, 0x2e, 0x5f, 0x6e, 0x04, + 0x7e, 0xab, 0x96, 0x3f, 0xd1, 0x33, 0xa8, 0xc9, 0x0f, 0xe1, 0xfc, 0x92, 0xef, 0x79, 0xb4, 0xce, + 0xd6, 0xcf, 0x65, 0xd7, 0x39, 0xf0, 0xfc, 0x30, 0x72, 0xeb, 0x6b, 0xcb, 0xa5, 0x62, 0xbc, 0x39, + 0xd4, 0x15, 0x46, 0xad, 0xa1, 0x50, 0xcc, 0xcd, 0x21, 0x87, 0x0b, 0xf9, 0x0a, 0xc6, 0x45, 0x5d, + 0x34, 0xc0, 0xa9, 0x79, 0xae, 0xf3, 0x44, 0x53, 0xc8, 0x7c, 0x9b, 0x0f, 0xe4, 0x4f, 0xae, 0x38, + 0x99, 0xbc, 0xc8, 0xd7, 0x30, 0xba, 0x71, 0xaf, 0x62, 0xd3, 0xb0, 0xe5, 0x7b, 0x21, 0x2d, 0x11, + 0x1c, 0xd1, 0xcb, 0x82, 0xf5, 0xc6, 0xbd, 0x4a, 0xa5, 0x1d, 0x1d, 0x52, 0x2f, 0x72, 0xeb, 0x4e, + 0x44, 0x25, 0xd6, 0xe2, 0x1c, 0x9b, 0x79, 0x47, 0x8f, 0x9d, 0x5a, 0x20, 0x20, 0x5a, 0x2f, 0x74, + 0x76, 0x64, 0x0e, 0x86, 0xab, 0xd5, 0xd5, 0x75, 0xff, 0xc0, 0xf5, 0x4a, 0x53, 0x4c, 0x18, 0xb6, + 0xfa, 0x4d, 0xf6, 0x61, 0x46, 0x3b, 0x19, 0xd4, 0xd8, 0xff, 0xf4, 0x88, 0x7a, 0x51, 0x69, 0x1a, + 0xdb, 0xf0, 0x5d, 0x75, 0xb4, 0xb9, 0xa9, 0x1f, 0x20, 0x9e, 0xde, 0xb9, 0x59, 0x89, 0x7f, 0x56, + 0x25, 0x91, 0x3d, 0xed, 0x64, 0x40, 0xc9, 0x0e, 0x0c, 0x6d, 0xb7, 0x83, 0x96, 0x1f, 0xd2, 0xd2, + 0x0c, 0x0a, 0xed, 0x5a, 0xa7, 0xaf, 0x53, 0xa0, 0x2e, 0xce, 0xb0, 0xe5, 0xb9, 0xc5, 0x7f, 0x68, + 0x3d, 0x93, 0xac, 0xac, 0xcf, 0x61, 0x44, 0x7d, 0xcc, 0x64, 0x08, 0xfa, 0x2a, 0xcd, 0x66, 0xb1, + 0x87, 0xfd, 0x51, 0xad, 0xae, 0x16, 0x0b, 0x64, 0x02, 0x20, 0x5e, 0xc1, 0x8a, 0xbd, 0x64, 0x0c, + 0x86, 0xe5, 0x0a, 0x53, 0xec, 0x43, 0xfc, 0x56, 0xab, 0xd8, 0x4f, 0x08, 0x4c, 0x98, 0xf3, 0xbc, + 0x38, 0x60, 0xfd, 0x6e, 0x01, 0x46, 0xd4, 0xf8, 0x90, 0x49, 0x18, 0xdd, 0xdd, 0xac, 0x6e, 0xaf, + 0x2c, 0xad, 0xdd, 0x5b, 0x5b, 0x59, 0x2e, 0xf6, 0x90, 0x4b, 0x70, 0x61, 0xa7, 0xba, 0x5a, 0x5b, + 0x5e, 0xac, 0xad, 0x6f, 0x2d, 0x55, 0xd6, 0x6b, 0xdb, 0xf6, 0xd6, 0xe7, 0x5f, 0xd4, 0x76, 0x76, + 0x37, 0x37, 0x57, 0xd6, 0x8b, 0x05, 0x52, 0x82, 0x69, 0x56, 0xfc, 0x70, 0x77, 0x71, 0x45, 0x47, + 0x28, 0xf6, 0x92, 0xab, 0x70, 0x29, 0xab, 0xa4, 0xb6, 0xba, 0x52, 0x59, 0x5e, 0x5f, 0xa9, 0x56, + 0x8b, 0x7d, 0x64, 0x16, 0xa6, 0x18, 0x4a, 0x65, 0x7b, 0xdb, 0xa0, 0xed, 0xb7, 0x9a, 0x30, 0xaa, + 0x09, 0x87, 0xcc, 0x43, 0x69, 0x69, 0xc5, 0xde, 0xa9, 0x6d, 0xef, 0xda, 0xdb, 0x5b, 0xd5, 0x95, + 0x9a, 0xd9, 0xc2, 0x64, 0xe9, 0xfa, 0xd6, 0xfd, 0xb5, 0xcd, 0x1a, 0x03, 0x55, 0x8b, 0x05, 0xd6, + 0x0c, 0xa3, 0xb4, 0xba, 0xb6, 0x79, 0x7f, 0x7d, 0xa5, 0xb6, 0x5b, 0x5d, 0x11, 0x28, 0xbd, 0xd6, + 0x4f, 0x7b, 0x53, 0x4b, 0x3d, 0x59, 0x80, 0xd1, 0x2a, 0x3f, 0xc5, 0xe2, 0xf4, 0xe7, 0xc7, 0x86, + 0xe2, 0xc9, 0x71, 0x79, 0x4c, 0x1c, 0x6e, 0xf9, 0xcc, 0xd6, 0x91, 0xd8, 0xee, 0xbd, 0xcd, 0x46, + 0xba, 0xee, 0x37, 0xf5, 0xdd, 0xbb, 0x25, 0x60, 0xb6, 0x2a, 0x25, 0x0b, 0xda, 0x3e, 0xcf, 0xcf, + 0x10, 0xa8, 0xa7, 0xca, 0x7d, 0x5e, 0x5f, 0xf3, 0xd5, 0x8e, 0xbf, 0x10, 0x0f, 0xa9, 0xd8, 0x9e, + 0x91, 0x26, 0x63, 0x8f, 0x51, 0x78, 0xe4, 0x2d, 0xa9, 0xff, 0x70, 0x9d, 0x1f, 0x37, 0x81, 0x84, + 0xb6, 0x2a, 0x54, 0x1f, 0xab, 0x9d, 0xb3, 0xe0, 0x92, 0x8f, 0x92, 0x73, 0x46, 0x08, 0x03, 0x99, + 0x25, 0xd6, 0x55, 0x3b, 0x81, 0x4a, 0xca, 0x30, 0xc0, 0xbf, 0x44, 0x2e, 0x0f, 0xd4, 0xb8, 0x9a, + 0x0c, 0x60, 0x73, 0xb8, 0xf5, 0x27, 0x7d, 0xfa, 0xe6, 0xc3, 0x34, 0x2c, 0x4d, 0xde, 0xa8, 0x61, + 0xa1, 0x9c, 0x11, 0x4a, 0x6e, 0xc2, 0x48, 0x95, 0x86, 0x21, 0xd7, 0x82, 0x7b, 0xd5, 0x90, 0x40, + 0xc8, 0x81, 0x35, 0xb7, 0x51, 0x2a, 0xd8, 0x31, 0x0a, 0x3b, 0x50, 0x70, 0xdd, 0x0a, 0x0f, 0x14, + 0x7d, 0xf1, 0x81, 0x42, 0x68, 0x5f, 0xfc, 0x40, 0x11, 0xa3, 0xb0, 0x51, 0x17, 0xdb, 0x3f, 0xb6, + 0xa2, 0x3f, 0x1e, 0x75, 0xa1, 0x32, 0x88, 0x51, 0xd7, 0x90, 0xc8, 0x87, 0x00, 0x95, 0x47, 0x55, + 0xd4, 0x9c, 0xed, 0x4d, 0xa1, 0x02, 0xe1, 0x62, 0xe5, 0x3c, 0x0b, 0x85, 0x62, 0x1e, 0xe8, 0x27, + 0x0f, 0x0d, 0x9b, 0x2c, 0xc2, 0x78, 0xe5, 0x27, 0xed, 0x80, 0xae, 0x35, 0xd8, 0x7a, 0x17, 0xf1, + 0x23, 0xd6, 0xc8, 0xe2, 0xfc, 0xc9, 0x71, 0xb9, 0xe4, 0xb0, 0x82, 0x9a, 0x2b, 0x4a, 0x34, 0x06, + 0x26, 0x09, 0xd9, 0x82, 0x73, 0xf7, 0x97, 0xb6, 0xc5, 0x3c, 0xac, 0xd4, 0xeb, 0x7e, 0xdb, 0x8b, + 0x84, 0xde, 0x73, 0xf5, 0xe4, 0xb8, 0x7c, 0xe9, 0xa0, 0xde, 0xaa, 0xc9, 0x39, 0xeb, 0xf0, 0x62, + 0x5d, 0xf1, 0x49, 0xd1, 0x92, 0x6b, 0xd0, 0xb7, 0x6b, 0xaf, 0x89, 0xf3, 0xd7, 0xb9, 0x93, 0xe3, + 0xf2, 0x78, 0x3b, 0x70, 0x35, 0x12, 0x56, 0x6a, 0x35, 0x61, 0xe2, 0x3e, 0x8d, 0xd8, 0xe4, 0x94, + 0x9a, 0x6e, 0xe7, 0xa1, 0xfb, 0x18, 0x46, 0x1f, 0xb9, 0xd1, 0x61, 0x95, 0xd6, 0x03, 0x1a, 0xc9, + 0x53, 0x3e, 0x8a, 0xe9, 0x99, 0x1b, 0x1d, 0xd6, 0x42, 0x0e, 0xd7, 0xd7, 0x74, 0x0d, 0xdd, 0x5a, + 0x81, 0x49, 0x51, 0x9b, 0x52, 0xac, 0x17, 0x4c, 0x86, 0x05, 0x64, 0x88, 0x43, 0xa5, 0x33, 0x34, + 0xd9, 0xfc, 0x49, 0x2f, 0xcc, 0x2c, 0x1d, 0x3a, 0xde, 0x01, 0xdd, 0x76, 0xc2, 0xf0, 0x99, 0x1f, + 0x34, 0xb4, 0xc6, 0xe3, 0xa9, 0x22, 0xd5, 0x78, 0x3c, 0x46, 0x2c, 0xc0, 0xe8, 0x56, 0xb3, 0x21, + 0x69, 0xc4, 0x89, 0x07, 0xeb, 0xf2, 0x9b, 0x8d, 0x5a, 0x4b, 0xf2, 0xd2, 0x91, 0x18, 0xcd, 0x26, + 0x7d, 0xa6, 0x68, 0xfa, 0x62, 0x1a, 0x8f, 0x3e, 0xd3, 0x68, 0x34, 0x24, 0xb2, 0x02, 0xe7, 0xaa, + 0xb4, 0xee, 0x7b, 0x8d, 0x7b, 0x4e, 0x3d, 0xf2, 0x83, 0x1d, 0xff, 0x09, 0xf5, 0xc4, 0x24, 0x44, + 0xa5, 0x30, 0xc4, 0xc2, 0xda, 0x63, 0x2c, 0xad, 0x45, 0xac, 0xd8, 0x4e, 0x53, 0x90, 0x2d, 0x18, + 0x7e, 0x24, 0x6c, 0x45, 0xe2, 0x98, 0xf4, 0xfa, 0x4d, 0x65, 0x3c, 0x5a, 0x0a, 0x28, 0xce, 0x1c, + 0xa7, 0xa9, 0x0e, 0x7a, 0x6a, 0x8f, 0xc5, 0xe5, 0x4a, 0x62, 0xda, 0x8a, 0x89, 0xb5, 0x0b, 0xe3, + 0xdb, 0xcd, 0xf6, 0x81, 0xeb, 0xb1, 0x85, 0xa5, 0x4a, 0x7f, 0x4c, 0x96, 0x01, 0x62, 0x80, 0xb0, + 0x00, 0x4d, 0x89, 0xc3, 0x55, 0x5c, 0xb0, 0x77, 0x57, 0x7c, 0x6d, 0x08, 0x41, 0x6d, 0xd8, 0xd6, + 0xe8, 0xac, 0xff, 0xd5, 0x07, 0x44, 0x0c, 0x00, 0x6e, 0x9f, 0x55, 0x1a, 0xb1, 0x2d, 0xe8, 0x3c, + 0xf4, 0x2a, 0x43, 0xcd, 0xe0, 0xc9, 0x71, 0xb9, 0xd7, 0x6d, 0xd8, 0xbd, 0x6b, 0xcb, 0xe4, 0x1d, + 0x18, 0x40, 0x34, 0x94, 0xff, 0x84, 0xaa, 0x4f, 0xe7, 0xc0, 0x17, 0x18, 0xdc, 0xd6, 0x6d, 0x8e, + 0x4c, 0xde, 0x85, 0x91, 0x65, 0xda, 0xa4, 0x07, 0x4e, 0xe4, 0xcb, 0x25, 0x80, 0x9b, 0x3e, 0x24, + 0x50, 0x9b, 0x73, 0x31, 0x26, 0x3b, 0x0a, 0xd9, 0xd4, 0x09, 0x7d, 0x4f, 0x3f, 0x0a, 0x05, 0x08, + 0xd1, 0x8f, 0x42, 0x1c, 0x87, 0xfc, 0x5e, 0x01, 0x46, 0x2b, 0x9e, 0x27, 0x4c, 0x0a, 0xa1, 0x90, + 0xfa, 0xcc, 0x4d, 0x65, 0x83, 0x5b, 0x77, 0xf6, 0x69, 0x73, 0xcf, 0x69, 0xb6, 0x69, 0xb8, 0xf8, + 0x35, 0xd3, 0x4e, 0xff, 0xe3, 0x71, 0xf9, 0xa3, 0x33, 0x18, 0x09, 0x62, 0x6b, 0xde, 0x4e, 0xe0, + 0xb8, 0x51, 0x78, 0x72, 0x5c, 0x9e, 0x71, 0xe2, 0x0a, 0xf5, 0xef, 0x46, 0x6b, 0x47, 0xbc, 0xfe, + 0x0f, 0x76, 0x5b, 0xff, 0xc9, 0x11, 0x4c, 0x56, 0xc2, 0xb0, 0x7d, 0x44, 0xab, 0x91, 0x13, 0x44, + 0xec, 0xec, 0x88, 0x8b, 0x48, 0xe7, 0x83, 0xe5, 0x9b, 0x3f, 0x3b, 0x2e, 0x17, 0x98, 0x42, 0xec, + 0x20, 0x29, 0x53, 0xa8, 0x82, 0xa8, 0x16, 0xb9, 0xfa, 0x16, 0x86, 0x47, 0xcc, 0x24, 0x6f, 0xeb, + 0x9a, 0x52, 0x3a, 0xd6, 0x96, 0xf3, 0x46, 0xdc, 0x5a, 0x82, 0xf9, 0xfb, 0x34, 0xb2, 0x69, 0x48, + 0x23, 0xf9, 0x8d, 0xe0, 0x0c, 0x8f, 0xcd, 0x7a, 0x43, 0xf8, 0x5b, 0x11, 0xe3, 0xf0, 0xf3, 0xef, + 0x42, 0x96, 0x58, 0xff, 0x4f, 0x01, 0xca, 0x4b, 0x01, 0xe5, 0xba, 0x64, 0x0e, 0xa3, 0xce, 0x6b, + 0xd7, 0x3c, 0xf4, 0xef, 0x3c, 0x6f, 0xc9, 0x13, 0x39, 0x96, 0xb2, 0x41, 0xb1, 0x11, 0x7a, 0x4a, + 0xf3, 0x86, 0xf5, 0x18, 0x66, 0x6c, 0xea, 0xd1, 0x67, 0xce, 0x7e, 0x93, 0x1a, 0x16, 0x82, 0x32, + 0x0c, 0xf0, 0x0f, 0x3d, 0xd5, 0x05, 0x0e, 0x3f, 0x9b, 0xb5, 0xc5, 0x1a, 0x87, 0xd1, 0x6d, 0xd7, + 0x3b, 0x10, 0xdc, 0xad, 0x3f, 0xee, 0x83, 0x31, 0xfe, 0x5b, 0xa8, 0xc7, 0x89, 0x2d, 0xae, 0x70, + 0x9a, 0x2d, 0xee, 0x7d, 0x18, 0x67, 0x7b, 0x04, 0x0d, 0xf6, 0x68, 0xc0, 0xb6, 0x56, 0x21, 0x09, + 0x54, 0xf5, 0x43, 0x2c, 0xa8, 0x3d, 0xe5, 0x25, 0xb6, 0x89, 0x48, 0xd6, 0x61, 0x82, 0x03, 0xee, + 0x51, 0x27, 0x6a, 0xc7, 0xd6, 0x8a, 0x49, 0xa1, 0x13, 0x4b, 0x30, 0x9f, 0x9a, 0x82, 0xd7, 0x63, + 0x01, 0xb4, 0x13, 0xb4, 0xe4, 0x53, 0x98, 0xdc, 0x0e, 0xfc, 0x6f, 0x9e, 0x6b, 0x9b, 0x3a, 0xff, + 0x3a, 0xb9, 0xf6, 0xcc, 0x8a, 0x6a, 0xfa, 0xd6, 0x9e, 0xc4, 0x26, 0x6f, 0xc1, 0xf0, 0x5a, 0xb8, + 0xe8, 0x07, 0xae, 0x77, 0x80, 0xdf, 0xe8, 0x30, 0x37, 0xf1, 0xba, 0x61, 0x6d, 0x1f, 0x81, 0xb6, + 0x2a, 0x4e, 0x18, 0x23, 0x87, 0xba, 0x1b, 0x23, 0x6f, 0x03, 0xac, 0xfb, 0x4e, 0xa3, 0xd2, 0x6c, + 0x2e, 0x55, 0x42, 0xdc, 0x3d, 0xc5, 0x7e, 0xd4, 0xf4, 0x9d, 0x46, 0xcd, 0x69, 0x36, 0x6b, 0x75, + 0x27, 0xb4, 0x35, 0x9c, 0x07, 0xfd, 0xc3, 0x83, 0xc5, 0x21, 0x7b, 0x72, 0xdd, 0xad, 0x53, 0x2f, + 0xa4, 0x8f, 0x9c, 0xc0, 0x73, 0xbd, 0x83, 0xd0, 0xfa, 0xe7, 0xe7, 0x60, 0x58, 0x75, 0xf9, 0xa6, + 0xae, 0xd8, 0x8b, 0x5d, 0x0e, 0x47, 0x3f, 0x36, 0x67, 0xd8, 0x1a, 0x06, 0xb9, 0x80, 0xaa, 0xbe, + 0xd8, 0x5f, 0x87, 0xd8, 0x6c, 0x74, 0x5a, 0x2d, 0x9b, 0xc1, 0xd8, 0x57, 0xb6, 0xbc, 0x88, 0xf2, + 0x1f, 0xe6, 0x5f, 0x59, 0x63, 0xdf, 0xee, 0x5d, 0x5e, 0x64, 0xd3, 0x7b, 0x6b, 0x6d, 0x79, 0x09, + 0x45, 0x39, 0xcc, 0xa7, 0xb7, 0xef, 0x36, 0xea, 0x36, 0x42, 0x59, 0x69, 0xb5, 0xb2, 0xb1, 0x2e, + 0xc4, 0x85, 0xa5, 0xa1, 0x73, 0xd4, 0xb4, 0x11, 0xca, 0x94, 0x43, 0x7e, 0x32, 0x5d, 0xf2, 0xbd, + 0x28, 0xf0, 0x9b, 0x21, 0x6a, 0x30, 0xc3, 0x7c, 0x38, 0xc5, 0x91, 0xb6, 0x2e, 0x8a, 0xec, 0x04, + 0x2a, 0x79, 0x04, 0xb3, 0x95, 0xc6, 0x53, 0xc7, 0xab, 0xd3, 0x06, 0x2f, 0x79, 0xe4, 0x07, 0x4f, + 0x1e, 0x37, 0xfd, 0x67, 0x21, 0xca, 0x7b, 0x58, 0x58, 0x80, 0x04, 0x8a, 0x3c, 0x21, 0x3f, 0x93, + 0x48, 0x76, 0x1e, 0x35, 0xfb, 0xa4, 0x96, 0x9a, 0x7e, 0xbb, 0x21, 0x46, 0x01, 0x3f, 0xa9, 0x3a, + 0x03, 0xd8, 0x1c, 0xce, 0xa4, 0xb4, 0x5a, 0xdd, 0x40, 0x7b, 0x8b, 0x90, 0xd2, 0x61, 0x78, 0x64, + 0x33, 0x18, 0x79, 0x1d, 0x86, 0xa4, 0x9e, 0xcb, 0xcd, 0xc1, 0x68, 0x86, 0x94, 0xfa, 0xad, 0x2c, + 0x63, 0x9f, 0x84, 0x4d, 0xeb, 0xfe, 0x53, 0x1a, 0x3c, 0x5f, 0xf2, 0x1b, 0x54, 0x5a, 0x07, 0xc4, + 0xe9, 0x97, 0x17, 0xd4, 0xea, 0xac, 0xc4, 0x36, 0x11, 0x59, 0x05, 0x7c, 0x0f, 0x0c, 0x4b, 0x93, + 0x71, 0x05, 0x7c, 0x8f, 0x0c, 0x6d, 0x59, 0x46, 0x96, 0xe1, 0x5c, 0xa5, 0x1d, 0xf9, 0x47, 0x4e, + 0xe4, 0xd6, 0x77, 0x5b, 0x07, 0x81, 0xc3, 0x2a, 0x29, 0x22, 0x01, 0xea, 0xfd, 0x8e, 0x2c, 0xac, + 0xb5, 0x45, 0xa9, 0x9d, 0x26, 0x20, 0xef, 0xc1, 0xd8, 0x5a, 0xc8, 0x2d, 0x40, 0x4e, 0x48, 0x1b, + 0x78, 0x8c, 0x17, 0xad, 0x74, 0xc3, 0x1a, 0xda, 0x83, 0x6a, 0xec, 0xa4, 0xd0, 0xb0, 0x0d, 0x3c, + 0x62, 0xc1, 0x60, 0x25, 0x0c, 0xdd, 0x30, 0xc2, 0xd3, 0xf9, 0xf0, 0x22, 0x9c, 0x1c, 0x97, 0x07, + 0x1d, 0x84, 0xd8, 0xa2, 0x84, 0x3c, 0x82, 0xd1, 0x65, 0xca, 0x14, 0xc7, 0x9d, 0xa0, 0x1d, 0x46, + 0x78, 0xd6, 0x1e, 0x5d, 0xb8, 0x20, 0x3e, 0x6c, 0xad, 0x44, 0xcc, 0x65, 0xae, 0xed, 0x35, 0x10, + 0x5e, 0x8b, 0x58, 0x81, 0xbe, 0x6b, 0x69, 0xf8, 0x4c, 0x2b, 0x16, 0x34, 0xab, 0x6e, 0x83, 0x7d, + 0xaa, 0xd3, 0xd8, 0x06, 0xd4, 0x8a, 0xc5, 0xda, 0x50, 0x3b, 0xc4, 0x12, 0x5d, 0x2b, 0x36, 0x48, + 0x48, 0x3d, 0x65, 0x54, 0x9c, 0x31, 0x0c, 0x47, 0x66, 0xa1, 0x6c, 0xe2, 0x19, 0x4d, 0x8e, 0x1f, + 0xc3, 0xe8, 0x52, 0x3b, 0x8c, 0xfc, 0xa3, 0x9d, 0x43, 0x7a, 0x44, 0x4b, 0xe7, 0x63, 0xdd, 0xbf, + 0x8e, 0xe0, 0x5a, 0xc4, 0xe0, 0x7a, 0x37, 0x35, 0x74, 0xf2, 0x19, 0x10, 0xa9, 0xc4, 0xdf, 0x67, + 0xf3, 0xc3, 0x63, 0x73, 0xb9, 0x34, 0x8b, 0x7d, 0x45, 0xcd, 0x5d, 0xea, 0xfe, 0xb5, 0x03, 0x55, + 0xac, 0x9b, 0x85, 0xd2, 0xc4, 0xac, 0x41, 0xbc, 0x89, 0xf7, 0x03, 0xa7, 0x75, 0x58, 0x2a, 0xc5, + 0x5a, 0xb6, 0xe8, 0xd4, 0x01, 0x83, 0x1b, 0xda, 0x42, 0x8c, 0x4e, 0xaa, 0x00, 0xfc, 0xe7, 0x3a, + 0x1b, 0xf8, 0x0b, 0x28, 0xaf, 0x92, 0x21, 0x2f, 0x56, 0x20, 0x65, 0x75, 0x01, 0x75, 0x10, 0xce, + 0xb6, 0xe9, 0x1a, 0xa3, 0xa9, 0xb1, 0x21, 0x4f, 0xa0, 0xc8, 0x7f, 0x6d, 0xf8, 0x9e, 0x1b, 0xf1, + 0xa5, 0x77, 0xce, 0xb0, 0xf8, 0x24, 0x8b, 0x65, 0x05, 0x68, 0x69, 0x13, 0x15, 0x1c, 0xa9, 0x52, + 0xad, 0x9a, 0x14, 0x63, 0xb2, 0x0d, 0xa3, 0xdb, 0x81, 0xdf, 0x68, 0xd7, 0x23, 0xdc, 0xb0, 0x2f, + 0xa2, 0xa2, 0x48, 0x44, 0x3d, 0x5a, 0x09, 0x97, 0x49, 0x8b, 0x03, 0x6a, 0x6c, 0x33, 0xd7, 0x65, + 0xa2, 0x21, 0x92, 0x45, 0x18, 0xdc, 0xf6, 0x9b, 0x6e, 0xfd, 0x79, 0x69, 0x1e, 0x1b, 0x3d, 0x2d, + 0x99, 0x21, 0x50, 0x36, 0x15, 0xb5, 0xc3, 0x16, 0x82, 0x74, 0xed, 0x90, 0x23, 0x91, 0x0a, 0x8c, + 0x7f, 0xc6, 0x26, 0x8c, 0xeb, 0x7b, 0x9e, 0xe3, 0x06, 0xb4, 0x74, 0x09, 0xc7, 0x05, 0xad, 0xa1, + 0x3f, 0xd6, 0x0b, 0xf4, 0xe9, 0x6c, 0x50, 0x90, 0x35, 0x98, 0x5c, 0x0b, 0xab, 0x51, 0xe0, 0xb6, + 0xe8, 0x86, 0xe3, 0x39, 0x07, 0xb4, 0x51, 0xba, 0x1c, 0x9b, 0x23, 0xdd, 0xb0, 0x16, 0x62, 0x59, + 0xed, 0x88, 0x17, 0xea, 0xe6, 0xc8, 0x04, 0x1d, 0xf9, 0x1c, 0xa6, 0x57, 0xbe, 0x89, 0xd8, 0x8c, + 0x69, 0x56, 0xda, 0x0d, 0x37, 0xaa, 0x46, 0x7e, 0xe0, 0x1c, 0xd0, 0x52, 0x19, 0xf9, 0xbd, 0x76, + 0x72, 0x5c, 0xbe, 0x42, 0x45, 0x79, 0xcd, 0x61, 0x08, 0xb5, 0x90, 0x63, 0xe8, 0x97, 0x8c, 0x59, + 0x1c, 0x98, 0xf4, 0xab, 0xed, 0x16, 0x53, 0x5c, 0x51, 0xfa, 0x57, 0x0c, 0xe9, 0x6b, 0x25, 0x5c, + 0xfa, 0x21, 0x07, 0xa4, 0xa4, 0xaf, 0x21, 0x12, 0x1b, 0xc8, 0x03, 0xdf, 0xf5, 0x2a, 0xf5, 0xc8, + 0x7d, 0x4a, 0xc5, 0xb9, 0x3e, 0x2c, 0x5d, 0xc5, 0x96, 0xa2, 0xe9, 0xf4, 0x57, 0x7d, 0xd7, 0xab, + 0x39, 0x58, 0x5c, 0x13, 0x56, 0x00, 0xc3, 0x74, 0x9a, 0xa6, 0x26, 0x3f, 0x84, 0xf3, 0x1b, 0xfe, + 0xbe, 0xdb, 0xa4, 0x7c, 0xc9, 0xe1, 0x62, 0x41, 0x23, 0xa0, 0x85, 0x7c, 0xd1, 0x74, 0x7a, 0x84, + 0x18, 0x35, 0xb1, 0x5a, 0x1d, 0x29, 0x1c, 0xdd, 0x74, 0x9a, 0xcd, 0x85, 0xac, 0xc0, 0x18, 0x7e, + 0x97, 0x4d, 0xfc, 0x19, 0x96, 0xae, 0xe1, 0xe9, 0xe8, 0x6a, 0x42, 0xe1, 0xb9, 0xb9, 0xa2, 0xe1, + 0xac, 0x78, 0x51, 0xf0, 0xdc, 0x36, 0xc8, 0xc8, 0x27, 0x30, 0x97, 0x9c, 0xde, 0x4b, 0xbe, 0xf7, + 0xd8, 0x3d, 0x68, 0x07, 0xb4, 0x51, 0x7a, 0x8d, 0x35, 0xd5, 0xee, 0x80, 0x31, 0xf7, 0x08, 0xce, + 0xa5, 0xaa, 0x20, 0x45, 0xe8, 0x7b, 0x22, 0xee, 0xa1, 0x46, 0x6c, 0xf6, 0x27, 0x79, 0x1b, 0x06, + 0x9e, 0xb2, 0x63, 0x09, 0x6a, 0x0c, 0xf1, 0xdd, 0x86, 0x46, 0xba, 0xe6, 0x3d, 0xf6, 0x6d, 0x8e, + 0xf4, 0x61, 0xef, 0xfb, 0x85, 0x07, 0xfd, 0xc3, 0xa3, 0xc5, 0x31, 0x7e, 0x7d, 0xf8, 0xa0, 0x7f, + 0x78, 0xbc, 0x38, 0x61, 0x55, 0x60, 0x32, 0x81, 0x4f, 0x4a, 0x30, 0x44, 0x3d, 0xa6, 0xea, 0x36, + 0xb8, 0xce, 0x62, 0xcb, 0x9f, 0x64, 0x1a, 0x06, 0x9a, 0xee, 0x91, 0x1b, 0x61, 0x85, 0x03, 0x36, + 0xff, 0x61, 0xfd, 0x7e, 0x01, 0x48, 0x7a, 0xcb, 0x20, 0xb7, 0x12, 0x6c, 0xb8, 0xa2, 0x27, 0x40, + 0xba, 0x99, 0x54, 0x72, 0xff, 0x0c, 0xa6, 0xf8, 0x98, 0xc9, 0xcd, 0x4d, 0xab, 0x8b, 0x2f, 0xaa, + 0x19, 0xc5, 0xba, 0x39, 0x44, 0x14, 0xe3, 0x56, 0xb8, 0x8e, 0x4d, 0x6b, 0xc3, 0x4c, 0xe6, 0x66, + 0x41, 0x36, 0x60, 0xe6, 0xc8, 0xf7, 0xa2, 0xc3, 0xe6, 0x73, 0xb9, 0x57, 0x88, 0xda, 0x0a, 0x58, + 0x1b, 0xae, 0x8f, 0x99, 0x08, 0xf6, 0x94, 0x00, 0x0b, 0x8e, 0x58, 0xcf, 0x83, 0xfe, 0xe1, 0xde, + 0x62, 0x9f, 0xea, 0x89, 0x65, 0xc3, 0xb9, 0xd4, 0x9a, 0x4b, 0xbe, 0x0f, 0x63, 0x75, 0x3c, 0xca, + 0x18, 0x35, 0xf1, 0x1d, 0x47, 0x83, 0xeb, 0x9f, 0x13, 0x87, 0xf3, 0xae, 0xfc, 0x51, 0x01, 0x66, + 0x73, 0x56, 0xdb, 0xb3, 0x8b, 0xfa, 0x0b, 0x38, 0x7f, 0xe4, 0x7c, 0x53, 0x0b, 0xf0, 0xa4, 0x5a, + 0x0b, 0x1c, 0x2f, 0x21, 0x6d, 0x5c, 0x49, 0xb2, 0x31, 0x74, 0x1f, 0x8e, 0x23, 0xe7, 0x1b, 0x1b, + 0x11, 0x6c, 0x56, 0xce, 0xdb, 0xf9, 0x03, 0x18, 0x37, 0xd6, 0xd7, 0x33, 0x37, 0xce, 0xba, 0x03, + 0xe7, 0xd8, 0x59, 0x3e, 0xa2, 0xa7, 0xb6, 0x50, 0x59, 0xdb, 0x00, 0x55, 0x7a, 0xe4, 0xb4, 0x0e, + 0x7d, 0xa6, 0x77, 0x2f, 0xea, 0xbf, 0x84, 0x85, 0x83, 0x08, 0x8b, 0x83, 0x2a, 0xd8, 0xbb, 0xcb, + 0x75, 0xf1, 0x50, 0x61, 0xda, 0x1a, 0x95, 0xf5, 0xe7, 0xbd, 0x40, 0xc4, 0x02, 0x19, 0x50, 0xe7, + 0x48, 0x36, 0xe3, 0x03, 0x18, 0xe3, 0xe7, 0x51, 0x0e, 0xc6, 0xe6, 0x8c, 0x2e, 0x4c, 0x89, 0x2f, + 0x4f, 0x2f, 0x5a, 0xed, 0xb1, 0x0d, 0x54, 0x46, 0x6a, 0x53, 0x7e, 0x90, 0x46, 0xd2, 0x5e, 0x83, + 0x54, 0x2f, 0x62, 0xa4, 0xfa, 0x6f, 0xf2, 0x29, 0x4c, 0x2c, 0xf9, 0x47, 0x2d, 0x26, 0x13, 0x41, + 0xdc, 0x27, 0x8c, 0x14, 0xa2, 0x5e, 0xa3, 0x70, 0xb5, 0xc7, 0x4e, 0xa0, 0x93, 0x4d, 0x98, 0xba, + 0xd7, 0x6c, 0x87, 0x87, 0x15, 0xaf, 0xb1, 0xd4, 0xf4, 0x43, 0xc9, 0xa5, 0x5f, 0x18, 0x09, 0xc4, + 0xf2, 0x96, 0xc6, 0x58, 0xed, 0xb1, 0xb3, 0x08, 0xc9, 0xeb, 0x30, 0xb0, 0xf2, 0x94, 0x2d, 0xbb, + 0xf2, 0x26, 0x5f, 0x38, 0x1a, 0x6d, 0x79, 0x74, 0xeb, 0xf1, 0x6a, 0x8f, 0xcd, 0x4b, 0x17, 0x47, + 0x60, 0x48, 0x9e, 0x65, 0x6f, 0x31, 0x95, 0x58, 0x89, 0xb3, 0x1a, 0x39, 0x51, 0x3b, 0x24, 0x73, + 0x30, 0xbc, 0xdb, 0x62, 0x47, 0x2c, 0x69, 0x04, 0xb0, 0xd5, 0x6f, 0xeb, 0x6d, 0x53, 0xd2, 0x64, + 0x5e, 0xb7, 0x1f, 0x73, 0xe4, 0x18, 0x60, 0xad, 0x9a, 0xc2, 0xed, 0x8c, 0x6d, 0xd4, 0xdb, 0x9b, + 0xa8, 0xb7, 0x98, 0x94, 0xb5, 0x35, 0x93, 0x29, 0x3c, 0xeb, 0x73, 0xb8, 0xbc, 0xdb, 0x0a, 0x69, + 0x10, 0x55, 0x5a, 0xad, 0xa6, 0x5b, 0xe7, 0x37, 0x49, 0x78, 0xe6, 0x95, 0x93, 0xe5, 0x3d, 0x18, + 0xe4, 0x00, 0x31, 0x4d, 0xe4, 0x1c, 0xac, 0xb4, 0x5a, 0xe2, 0xa4, 0x7d, 0x97, 0x2b, 0xe7, 0xfc, + 0xec, 0x6c, 0x0b, 0x6c, 0xeb, 0x77, 0x0a, 0x70, 0x99, 0x7f, 0x01, 0xb9, 0xac, 0xbf, 0x03, 0x23, + 0xe8, 0xe7, 0xd3, 0x72, 0xea, 0xf2, 0x9b, 0xe0, 0x0e, 0x4f, 0x12, 0x68, 0xc7, 0xe5, 0x9a, 0x07, + 0x55, 0x6f, 0xbe, 0x07, 0x95, 0xfc, 0xc0, 0xfa, 0x32, 0x3f, 0xb0, 0xcf, 0xc0, 0x12, 0x2d, 0x6a, + 0x36, 0x53, 0x8d, 0x0a, 0x5f, 0xa4, 0x55, 0xd6, 0x7f, 0xeb, 0x85, 0xd9, 0xfb, 0xd4, 0xa3, 0x81, + 0x83, 0xfd, 0x34, 0x6c, 0x3a, 0xba, 0x2f, 0x45, 0xa1, 0xa3, 0x2f, 0x45, 0x59, 0x5a, 0xc9, 0x7a, + 0xd1, 0x4a, 0x96, 0x72, 0x0b, 0x61, 0xc7, 0xc5, 0x5d, 0x7b, 0x4d, 0x74, 0x0b, 0x8f, 0x8b, 0xed, + 0xc0, 0x45, 0x3b, 0x38, 0x59, 0x8b, 0xfd, 0x30, 0xfa, 0xbb, 0x9a, 0xcb, 0xa6, 0xc4, 0xbd, 0xf4, + 0x90, 0xf0, 0xc3, 0x30, 0xbd, 0x2f, 0x36, 0x61, 0x90, 0x1b, 0xf7, 0xf0, 0xb6, 0x66, 0x74, 0xe1, + 0x86, 0xf8, 0xa6, 0x72, 0x3a, 0x28, 0x2c, 0x81, 0xb8, 0xb1, 0xf3, 0x29, 0x10, 0x21, 0xc0, 0x16, + 0x5c, 0xe6, 0x3e, 0x83, 0x51, 0x0d, 0xe5, 0x34, 0x7b, 0xbf, 0x32, 0x32, 0x32, 0x8d, 0xd1, 0x3b, + 0xe0, 0xf6, 0x4a, 0x6d, 0xef, 0xb7, 0x3e, 0x82, 0x52, 0xba, 0x35, 0xc2, 0xb0, 0xd4, 0xcd, 0x8e, + 0x65, 0x2d, 0xc3, 0xf4, 0x7d, 0x1a, 0xe1, 0xc4, 0xc5, 0x8f, 0x48, 0x73, 0x91, 0x49, 0x7c, 0x67, + 0x72, 0x55, 0x95, 0xb7, 0x3a, 0xfa, 0x57, 0x5a, 0x85, 0x99, 0x04, 0x17, 0x51, 0xff, 0x87, 0x30, + 0x24, 0x40, 0x6a, 0x45, 0x15, 0x2e, 0x89, 0x74, 0x5f, 0x14, 0xec, 0x2d, 0xf0, 0x79, 0x2b, 0x38, + 0xdb, 0x92, 0xc0, 0x3a, 0x84, 0xf3, 0x6c, 0x9b, 0x8d, 0xb9, 0xaa, 0xe9, 0x78, 0x11, 0x46, 0x5a, + 0x4c, 0x51, 0x08, 0xdd, 0x9f, 0xf0, 0x69, 0x34, 0x60, 0x0f, 0x33, 0x40, 0xd5, 0xfd, 0x09, 0x25, + 0x97, 0x00, 0xb0, 0x10, 0xbb, 0x29, 0x56, 0x01, 0x44, 0xe7, 0x86, 0x3b, 0x02, 0xe8, 0x8b, 0xc4, + 0xe7, 0x8d, 0x8d, 0x7f, 0x5b, 0x01, 0xcc, 0xa6, 0x6a, 0x12, 0x1d, 0xb8, 0x05, 0xc3, 0x52, 0x85, + 0x4d, 0x98, 0xd4, 0xf5, 0x1e, 0xd8, 0x0a, 0x89, 0xbc, 0x01, 0x93, 0x1e, 0xfd, 0x26, 0xaa, 0xa5, + 0xda, 0x30, 0xce, 0xc0, 0xdb, 0xb2, 0x1d, 0xd6, 0xaf, 0xa0, 0x19, 0xb5, 0xea, 0xf9, 0xcf, 0x1e, + 0x37, 0x9d, 0x27, 0x34, 0x55, 0xf1, 0xf7, 0x61, 0xb8, 0xda, 0xbd, 0x62, 0xfe, 0xf9, 0xc8, 0xca, + 0x6d, 0x45, 0x62, 0x35, 0x61, 0x8e, 0x75, 0xa9, 0x5a, 0xd9, 0x58, 0x5f, 0x6b, 0x6c, 0x7f, 0xdb, + 0x02, 0x7c, 0x0a, 0x17, 0x33, 0x6b, 0xfb, 0xb6, 0x85, 0xf8, 0xaf, 0xfa, 0x61, 0x96, 0x6f, 0x26, + 0xe9, 0x19, 0x7c, 0xfa, 0xa5, 0xe6, 0x97, 0x72, 0x23, 0x79, 0x3b, 0xe3, 0x46, 0x12, 0x49, 0xf4, + 0x1b, 0x49, 0xe3, 0x1e, 0xf2, 0xfd, 0xec, 0x7b, 0x48, 0xb4, 0x13, 0x99, 0xf7, 0x90, 0xc9, 0xdb, + 0xc7, 0x95, 0xfc, 0xdb, 0x47, 0xbc, 0x66, 0xc9, 0xb8, 0x7d, 0xcc, 0xba, 0x73, 0x4c, 0xb8, 0x84, + 0x0c, 0xbf, 0x5a, 0x97, 0x90, 0x37, 0x60, 0xa8, 0xd2, 0x6a, 0x69, 0x2e, 0x56, 0x38, 0x3c, 0x4e, + 0xab, 0xc5, 0x85, 0x27, 0x0b, 0xe5, 0x3a, 0x0f, 0x19, 0xeb, 0xfc, 0x07, 0x00, 0x4b, 0xe8, 0x06, + 0x8e, 0x03, 0x37, 0x8a, 0x18, 0xa8, 0xe1, 0x73, 0xe7, 0x70, 0x1c, 0x38, 0xdd, 0x02, 0x12, 0x23, + 0x73, 0xc5, 0xde, 0xda, 0x83, 0x52, 0x7a, 0xfa, 0xbc, 0x82, 0xa5, 0xeb, 0x4f, 0x0b, 0x70, 0x49, + 0x28, 0x39, 0x89, 0x0f, 0xfc, 0xec, 0xb3, 0xf3, 0x5d, 0x18, 0x13, 0xb4, 0x3b, 0xf1, 0x87, 0xc0, + 0xaf, 0x80, 0xe5, 0x62, 0xcc, 0x57, 0x74, 0x03, 0x8d, 0xbc, 0x0b, 0xc3, 0xf8, 0x47, 0x7c, 0x0d, + 0xc2, 0x24, 0x33, 0x82, 0xa8, 0xb5, 0xe4, 0x65, 0x88, 0x42, 0xb5, 0xbe, 0x86, 0xcb, 0x79, 0x0d, + 0x7f, 0x05, 0x72, 0xf9, 0xd7, 0x05, 0xb8, 0x28, 0xd8, 0x1b, 0x4b, 0xc5, 0x0b, 0xed, 0x3a, 0x67, + 0x70, 0xcc, 0x7c, 0x00, 0xa3, 0xac, 0x42, 0xd9, 0xee, 0x3e, 0xb1, 0xb5, 0x8a, 0x93, 0x43, 0x5c, + 0xb2, 0xec, 0x44, 0x8e, 0x70, 0x28, 0x71, 0x8e, 0x9a, 0xd2, 0x78, 0x61, 0xeb, 0xc4, 0xd6, 0x97, + 0x30, 0x9f, 0xdd, 0x85, 0x57, 0x20, 0x9f, 0x07, 0x30, 0x97, 0xb1, 0x29, 0xbc, 0xd8, 0x9e, 0xfc, + 0x05, 0x5c, 0xcc, 0xe4, 0xf5, 0x0a, 0x9a, 0xb9, 0xca, 0x34, 0x8e, 0xe8, 0x15, 0x0c, 0xa1, 0xf5, + 0x08, 0x2e, 0x64, 0x70, 0x7a, 0x05, 0x4d, 0xbc, 0x0f, 0xb3, 0x4a, 0xd3, 0x7e, 0xa9, 0x16, 0x6e, + 0xc0, 0x25, 0xce, 0xe8, 0xd5, 0x8c, 0xca, 0x43, 0xb8, 0x28, 0xd8, 0xbd, 0x02, 0xe9, 0xad, 0xc2, + 0x7c, 0x7c, 0xa0, 0xce, 0xd0, 0x93, 0x4e, 0xbd, 0xc8, 0x58, 0xeb, 0x70, 0x25, 0xe6, 0x94, 0xa3, + 0x34, 0x9c, 0x9e, 0x1b, 0x57, 0x07, 0xe3, 0x51, 0x7a, 0x25, 0x23, 0xfa, 0x08, 0xce, 0x1b, 0x4c, + 0x5f, 0x99, 0xaa, 0xb4, 0x06, 0x53, 0x9c, 0xb1, 0xa9, 0x3a, 0x2f, 0xe8, 0xaa, 0xf3, 0xe8, 0xc2, + 0xb9, 0x98, 0x25, 0x82, 0xf7, 0xee, 0x66, 0x68, 0xd3, 0x1b, 0xa8, 0x4d, 0x4b, 0x94, 0xb8, 0x85, + 0xef, 0xc2, 0x20, 0x87, 0x88, 0xf6, 0x65, 0x30, 0xe3, 0x87, 0x05, 0x4e, 0x26, 0x90, 0xad, 0x1f, + 0xc2, 0x25, 0x7e, 0x12, 0x8d, 0xef, 0x12, 0xcd, 0xd3, 0xe2, 0xf7, 0x13, 0x07, 0xd1, 0x0b, 0x82, + 0x6f, 0x12, 0x3f, 0xe7, 0x3c, 0xba, 0x2f, 0xe7, 0x76, 0x1e, 0xff, 0x53, 0x3d, 0xd1, 0x91, 0x07, + 0xcc, 0xde, 0xcc, 0x03, 0xe6, 0x35, 0xb8, 0xaa, 0x0e, 0x98, 0xc9, 0x6a, 0xe4, 0xd4, 0xb2, 0xbe, + 0x84, 0x8b, 0xbc, 0xa3, 0xd2, 0x49, 0xce, 0x6c, 0xc6, 0x47, 0x89, 0x6e, 0xce, 0x8a, 0x6e, 0x9a, + 0xd8, 0x39, 0x9d, 0xfc, 0xff, 0x0b, 0xf2, 0x93, 0xcb, 0x66, 0xfe, 0xcb, 0x3e, 0x71, 0x6f, 0x42, + 0x59, 0x09, 0xc4, 0x6c, 0xd1, 0x8b, 0x1d, 0xb7, 0x37, 0x60, 0x46, 0x67, 0xe3, 0xd6, 0xe9, 0xde, + 0x1d, 0xbc, 0xe4, 0x79, 0x87, 0x7d, 0x16, 0x08, 0x90, 0xd3, 0xae, 0x94, 0x21, 0x37, 0xc4, 0xb7, + 0x15, 0xa6, 0x55, 0x83, 0xf9, 0xf4, 0x50, 0xb8, 0x75, 0xe9, 0x39, 0x4d, 0x3e, 0x65, 0x9f, 0x30, + 0x42, 0xc4, 0x60, 0xe4, 0x32, 0x95, 0xdf, 0x31, 0x27, 0x97, 0x54, 0x96, 0x25, 0x97, 0x9a, 0x44, + 0xff, 0x59, 0xed, 0x72, 0x3e, 0xfc, 0x3a, 0x10, 0x59, 0xb4, 0x54, 0xb5, 0x65, 0xd5, 0x17, 0xa0, + 0x6f, 0xa9, 0x6a, 0x8b, 0x07, 0x1b, 0xa8, 0x09, 0xd6, 0xc3, 0xc0, 0x66, 0xb0, 0xa4, 0x46, 0xde, + 0x7b, 0x0a, 0x8d, 0xfc, 0x41, 0xff, 0x70, 0x5f, 0xb1, 0xdf, 0x26, 0x55, 0xf7, 0xc0, 0x7b, 0xe4, + 0x46, 0x87, 0xaa, 0xc2, 0x8a, 0xf5, 0x15, 0x4c, 0x19, 0xd5, 0x8b, 0xaf, 0xb8, 0xe3, 0x4b, 0x13, + 0xa6, 0xcf, 0x2e, 0x55, 0xd0, 0x89, 0x04, 0x4d, 0x16, 0x63, 0x7c, 0xbd, 0xa9, 0x3b, 0x35, 0x7c, + 0xc6, 0x68, 0xcb, 0x42, 0xeb, 0x9f, 0xf4, 0x6b, 0xdc, 0xb5, 0xf7, 0x3b, 0x1d, 0x7a, 0x77, 0x07, + 0x80, 0xcf, 0x10, 0xad, 0x73, 0x4c, 0x01, 0x1c, 0x15, 0xbe, 0x19, 0x7c, 0x49, 0xb6, 0x35, 0xa4, + 0xd3, 0xbe, 0xef, 0x11, 0x1e, 0xb5, 0x9c, 0x48, 0x3e, 0x69, 0x53, 0x1e, 0xb5, 0x82, 0x75, 0x68, + 0xeb, 0x48, 0xe4, 0x87, 0x49, 0x37, 0xf4, 0x01, 0xbc, 0x53, 0x7a, 0x4d, 0x5e, 0x32, 0xa7, 0xfb, + 0x76, 0x36, 0x4f, 0xf4, 0x67, 0x30, 0xc3, 0x68, 0xdd, 0xc7, 0x78, 0xb0, 0x58, 0xf9, 0x26, 0xa2, + 0x1e, 0x5f, 0xdb, 0x07, 0xb1, 0x9e, 0xd7, 0x3b, 0xd4, 0x13, 0x23, 0x0b, 0xfb, 0x7b, 0xcc, 0xa7, + 0x46, 0x55, 0x99, 0x9d, 0xcd, 0x1f, 0x27, 0x91, 0xbd, 0xbe, 0xe2, 0x35, 0x5a, 0xbe, 0xab, 0x0e, + 0x4c, 0x7c, 0x12, 0x05, 0xcd, 0x1a, 0x15, 0x70, 0x5b, 0x47, 0xb2, 0xde, 0xe8, 0xe8, 0xa7, 0x3d, + 0x0c, 0xfd, 0x3b, 0x4b, 0x3b, 0xeb, 0xc5, 0x82, 0x75, 0x0b, 0x40, 0xab, 0x09, 0x60, 0x70, 0x73, + 0xcb, 0xde, 0xa8, 0xac, 0x17, 0x7b, 0xc8, 0x0c, 0x9c, 0x7b, 0xb4, 0xb6, 0xb9, 0xbc, 0xf5, 0xa8, + 0x5a, 0xab, 0x6e, 0x54, 0xec, 0x9d, 0xa5, 0x8a, 0xbd, 0x5c, 0x2c, 0x58, 0x5f, 0xc3, 0xb4, 0xd9, + 0xc3, 0x57, 0x3a, 0x09, 0x23, 0x98, 0x52, 0xfa, 0xcc, 0x83, 0x47, 0x3b, 0x9a, 0xff, 0xa6, 0x38, + 0xfc, 0x25, 0xfd, 0x90, 0xc4, 0x31, 0x51, 0x7c, 0x46, 0x1a, 0x12, 0x79, 0x8b, 0xab, 0x05, 0xc9, + 0x17, 0x9a, 0x4c, 0x2d, 0xa8, 0xc5, 0x7a, 0x01, 0x2e, 0x7d, 0xdf, 0x83, 0x69, 0xb3, 0xd6, 0xd3, + 0x5a, 0xa9, 0x5e, 0x43, 0xc7, 0x56, 0xed, 0x01, 0x07, 0x21, 0xfa, 0xb5, 0x81, 0x58, 0x59, 0xbf, + 0x07, 0x45, 0x81, 0x15, 0xef, 0xbc, 0xd7, 0xa4, 0x19, 0xb1, 0x90, 0xf1, 0xd8, 0x4c, 0xba, 0x59, + 0xfb, 0x50, 0x64, 0x2b, 0xa6, 0xa0, 0xe4, 0x15, 0x4c, 0xc3, 0xc0, 0x7a, 0x7c, 0x9d, 0x63, 0xf3, + 0x1f, 0xf8, 0x8e, 0x21, 0x72, 0x82, 0x48, 0x7a, 0x7d, 0x8d, 0xd8, 0xea, 0x37, 0x79, 0x0b, 0x06, + 0xef, 0xb9, 0xcd, 0x48, 0x98, 0x46, 0xe2, 0x4d, 0x9e, 0xb1, 0xe5, 0x05, 0xb6, 0x40, 0xb0, 0x6c, + 0x38, 0xa7, 0x55, 0x78, 0x86, 0xa6, 0x92, 0x12, 0x0c, 0x6d, 0xd2, 0x6f, 0xb4, 0xfa, 0xe5, 0x4f, + 0xeb, 0x3d, 0x38, 0x27, 0x3c, 0xea, 0x34, 0x31, 0x5d, 0x15, 0x6f, 0x62, 0x0b, 0xc6, 0xc3, 0x3c, + 0xc1, 0x12, 0x8b, 0x18, 0xdd, 0x6e, 0xab, 0xf1, 0x82, 0x74, 0x6c, 0xa3, 0x38, 0x23, 0xdd, 0x9b, + 0xf2, 0x16, 0xa8, 0xdb, 0x70, 0xfe, 0x79, 0x01, 0x4a, 0x09, 0x2b, 0xc3, 0xd2, 0xa1, 0xd3, 0x6c, + 0x52, 0xef, 0x80, 0x92, 0xeb, 0xd0, 0xbf, 0xb3, 0xb5, 0xb3, 0x2d, 0xac, 0xa4, 0xd2, 0x01, 0x80, + 0x81, 0x14, 0x8e, 0x8d, 0x18, 0xe4, 0x21, 0x9c, 0x93, 0x3e, 0xb3, 0xaa, 0x48, 0x8c, 0xd0, 0xa5, + 0xce, 0x1e, 0xb8, 0x69, 0x3a, 0xf2, 0x8e, 0x30, 0x89, 0xfc, 0xb8, 0xed, 0x06, 0xb4, 0x81, 0x96, + 0x9f, 0xf8, 0x36, 0x5d, 0x2b, 0xb1, 0x75, 0x34, 0xfe, 0x82, 0xd1, 0xfa, 0xbd, 0x02, 0xcc, 0xe6, + 0x58, 0x4d, 0xc8, 0x5b, 0x46, 0x77, 0xa6, 0xb4, 0xee, 0x48, 0x94, 0xd5, 0x1e, 0xd1, 0x9f, 0x25, + 0xcd, 0x91, 0xb8, 0xef, 0x0c, 0x8e, 0xc4, 0xab, 0x3d, 0xb1, 0xf3, 0xf0, 0x22, 0xc0, 0xb0, 0x84, + 0x5b, 0x93, 0x30, 0x6e, 0xc8, 0xcd, 0xb2, 0x60, 0x4c, 0xaf, 0x99, 0x0d, 0xce, 0x92, 0xdf, 0x50, + 0x83, 0xc3, 0xfe, 0xb6, 0x7e, 0xb7, 0x00, 0xd3, 0xd8, 0xc5, 0x03, 0x97, 0x2d, 0x7d, 0xb1, 0x84, + 0x16, 0x8c, 0x9e, 0xcc, 0x1b, 0x3d, 0x49, 0xe0, 0xaa, 0x2e, 0x7d, 0x98, 0xea, 0xd2, 0x7c, 0x56, + 0x97, 0x70, 0x7a, 0xbb, 0xbe, 0x67, 0xf4, 0x44, 0xbb, 0x8a, 0xfa, 0xfd, 0x02, 0x4c, 0x69, 0x6d, + 0x52, 0xed, 0xbf, 0x63, 0x34, 0xe9, 0x62, 0x46, 0x93, 0x52, 0x42, 0x5e, 0x4c, 0xb5, 0xe8, 0xb5, + 0x4e, 0x2d, 0xea, 0x2a, 0xe3, 0xff, 0x52, 0x80, 0x99, 0x4c, 0x19, 0x90, 0xf3, 0x4c, 0xb7, 0xad, + 0x07, 0x34, 0x12, 0xe2, 0x15, 0xbf, 0x18, 0x7c, 0x2d, 0x0c, 0xdb, 0x34, 0x10, 0xdf, 0xb9, 0xf8, + 0x45, 0x5e, 0x83, 0xf1, 0x6d, 0x1a, 0xb8, 0x7e, 0x83, 0xbb, 0x98, 0x73, 0xdf, 0xcd, 0x71, 0xdb, + 0x04, 0x92, 0x79, 0x18, 0xa9, 0x34, 0x0f, 0xfc, 0xc0, 0x8d, 0x0e, 0xf9, 0x6d, 0xe0, 0x88, 0x1d, + 0x03, 0x18, 0xef, 0x65, 0xf7, 0x80, 0x5f, 0x6a, 0x30, 0x62, 0xf1, 0x8b, 0x2d, 0x2e, 0xd2, 0x5a, + 0x38, 0xc8, 0x17, 0x17, 0x69, 0x0a, 0x3c, 0x0f, 0x83, 0x9f, 0xd9, 0x38, 0x09, 0xf0, 0xdd, 0xb8, + 0x2d, 0x7e, 0x91, 0x09, 0x74, 0x12, 0xc6, 0x57, 0x09, 0xe8, 0x1c, 0xfc, 0x21, 0x4c, 0x67, 0xc9, + 0x35, 0x6b, 0x0a, 0x09, 0xda, 0x5e, 0x45, 0xfb, 0x25, 0x4c, 0x55, 0x1a, 0x8d, 0x8d, 0x7b, 0x15, + 0xee, 0x73, 0x20, 0x46, 0x95, 0x7f, 0x3c, 0xdc, 0x5e, 0x27, 0x54, 0xb6, 0xfe, 0x35, 0xcf, 0x8d, + 0xec, 0xa9, 0x95, 0x6f, 0xdc, 0x30, 0x72, 0xbd, 0x03, 0xcd, 0xa8, 0x68, 0x9f, 0xdf, 0xa4, 0xcf, + 0x32, 0xa6, 0x00, 0xdb, 0x4d, 0x4d, 0xde, 0x1c, 0x9e, 0xc1, 0x7c, 0x5a, 0x63, 0x1b, 0x2f, 0x25, + 0xb3, 0x26, 0xdf, 0xb8, 0xa0, 0xaf, 0x52, 0x7f, 0x62, 0x7d, 0x0f, 0xce, 0xf3, 0x25, 0xad, 0x53, + 0xe3, 0x45, 0xb3, 0x75, 0x1b, 0xa8, 0xf5, 0xbe, 0xb4, 0x52, 0x74, 0x6c, 0x99, 0x3d, 0x66, 0xb4, + 0x05, 0xab, 0xfc, 0xaf, 0x05, 0x98, 0x4b, 0x90, 0x56, 0x9f, 0x7b, 0x75, 0xb9, 0x9e, 0xbe, 0x91, + 0x74, 0xc2, 0x46, 0x3d, 0x80, 0x1b, 0xff, 0xdc, 0x86, 0xf2, 0xc3, 0x26, 0xb7, 0x00, 0x38, 0xb1, + 0xb6, 0x7d, 0xa3, 0xe9, 0x5b, 0x38, 0xd9, 0xe0, 0x06, 0xae, 0xa1, 0x90, 0x36, 0x64, 0xc9, 0x5d, + 0x7c, 0x23, 0xdd, 0x6c, 0xc3, 0x18, 0x2b, 0x81, 0x0a, 0xf2, 0x5a, 0x8e, 0x91, 0x38, 0x8b, 0xbf, + 0xf5, 0xf7, 0xfa, 0x60, 0x56, 0x1f, 0xc0, 0x17, 0xe9, 0xeb, 0x36, 0x8c, 0x2e, 0xf9, 0x5e, 0x44, + 0xbf, 0x89, 0xb4, 0xb7, 0xea, 0x44, 0xdd, 0xb4, 0xab, 0x12, 0xa1, 0x3a, 0x72, 0x40, 0x8d, 0xe9, + 0x31, 0x86, 0xb3, 0x60, 0x8c, 0x48, 0x96, 0x60, 0x7c, 0x93, 0x3e, 0x4b, 0x09, 0x10, 0x1d, 0x16, + 0x3d, 0xfa, 0xac, 0xa6, 0x09, 0x51, 0xf7, 0x22, 0x33, 0x68, 0xc8, 0x3e, 0x4c, 0xc8, 0xc9, 0x65, + 0x08, 0x73, 0x4e, 0xdf, 0x55, 0xcc, 0xe9, 0xcc, 0x5f, 0x73, 0xb3, 0x1a, 0x72, 0x64, 0x98, 0xe0, + 0xc8, 0xba, 0xce, 0x6b, 0xe4, 0x0f, 0x94, 0xcd, 0x6d, 0x4b, 0x2b, 0x31, 0xdc, 0x41, 0x93, 0x0f, + 0x93, 0x75, 0x16, 0xd6, 0x36, 0x94, 0xd2, 0xe3, 0x21, 0x6a, 0x7b, 0x07, 0x06, 0x39, 0x54, 0xa8, + 0x01, 0x32, 0x0c, 0x89, 0xc2, 0xe6, 0xe7, 0x74, 0x5e, 0x8d, 0x2d, 0x70, 0xad, 0x55, 0xb4, 0x9d, + 0x28, 0x1c, 0xa5, 0x88, 0xdd, 0x4e, 0x0e, 0x2f, 0x7a, 0xda, 0xca, 0xe1, 0xd5, 0xfd, 0x4c, 0xe4, + 0xe3, 0x82, 0x25, 0x34, 0x3f, 0xe9, 0x9c, 0x44, 0xc3, 0x6e, 0xc0, 0x90, 0x00, 0x25, 0x02, 0xa4, + 0xc4, 0x9f, 0x9f, 0x44, 0xb0, 0x3e, 0x84, 0x0b, 0x68, 0x0b, 0x73, 0xbd, 0x83, 0x26, 0xdd, 0x0d, + 0x8d, 0xe7, 0x01, 0xdd, 0x3e, 0xeb, 0x8f, 0x61, 0x2e, 0x8b, 0xb6, 0xeb, 0x97, 0xcd, 0x43, 0x16, + 0xfc, 0x55, 0x2f, 0x4c, 0xaf, 0x85, 0xba, 0x32, 0x21, 0x24, 0x71, 0x33, 0xeb, 0x31, 0x3d, 0xca, + 0x64, 0xb5, 0x27, 0xeb, 0xb1, 0xfc, 0x3b, 0xda, 0xe3, 0xc4, 0xde, 0x4e, 0xaf, 0xe4, 0xd9, 0xb6, + 0xa5, 0x9e, 0x27, 0xbe, 0x01, 0xfd, 0x9b, 0x6c, 0xa9, 0xee, 0x13, 0x63, 0xc7, 0x29, 0x18, 0x08, + 0x1f, 0x07, 0xb2, 0x2d, 0x92, 0xfd, 0x20, 0xf7, 0x52, 0x4f, 0x10, 0xfb, 0xbb, 0xbf, 0x02, 0x5f, + 0xed, 0x49, 0xbd, 0x46, 0x7c, 0x0f, 0x46, 0x2b, 0x8d, 0x23, 0xee, 0x11, 0xe8, 0x7b, 0x89, 0xcf, + 0x52, 0x2b, 0x59, 0xed, 0xb1, 0x75, 0x44, 0x76, 0xc2, 0xad, 0xb4, 0x5a, 0xb8, 0x51, 0x65, 0xbd, + 0x8c, 0x5f, 0xed, 0x41, 0x07, 0xfb, 0xc5, 0x61, 0x18, 0xdc, 0x71, 0x82, 0x03, 0x1a, 0x59, 0x5f, + 0xc2, 0x9c, 0x70, 0x52, 0xe1, 0x96, 0x3f, 0x74, 0x65, 0x09, 0x63, 0x3f, 0xa4, 0x4e, 0x8e, 0x25, + 0x97, 0x01, 0x50, 0xcf, 0x5f, 0xf3, 0x1a, 0xf4, 0x1b, 0xe1, 0x25, 0xa7, 0x41, 0xac, 0x77, 0x61, + 0x44, 0x49, 0x08, 0x95, 0x59, 0x6d, 0xb3, 0x43, 0x69, 0x4d, 0x1b, 0x6f, 0x2e, 0xe5, 0x43, 0xcb, + 0x0b, 0x46, 0xdf, 0x45, 0xa4, 0x0b, 0xae, 0xfd, 0xba, 0x30, 0x93, 0x98, 0x04, 0xf1, 0x53, 0x6a, + 0xa5, 0x7f, 0x72, 0x37, 0x3e, 0xf5, 0x3b, 0xa9, 0x9e, 0xf6, 0x9e, 0x4a, 0x3d, 0xb5, 0xfe, 0x59, + 0x2f, 0x1e, 0x9c, 0x52, 0xf2, 0x48, 0xd8, 0xa0, 0x74, 0x3b, 0xd8, 0x22, 0x8c, 0x60, 0xef, 0x97, + 0xe5, 0xd3, 0xaf, 0xce, 0x3e, 0x16, 0xc3, 0x3f, 0x3b, 0x2e, 0xf7, 0xa0, 0x63, 0x45, 0x4c, 0x46, + 0x3e, 0x81, 0xa1, 0x15, 0xaf, 0x81, 0x1c, 0xfa, 0xce, 0xc0, 0x41, 0x12, 0xb1, 0x31, 0xc1, 0x26, + 0xef, 0xb0, 0x4f, 0x98, 0x9b, 0x2e, 0x6c, 0x0d, 0x12, 0x9f, 0xe0, 0x06, 0xf2, 0x4e, 0x70, 0x83, + 0x89, 0x13, 0x9c, 0x05, 0x03, 0x5b, 0x41, 0x43, 0x44, 0xa8, 0x98, 0x58, 0x18, 0x13, 0x82, 0x43, + 0x98, 0xcd, 0x8b, 0xac, 0xff, 0x5e, 0x80, 0xd9, 0xfb, 0x34, 0xca, 0x9c, 0x43, 0x86, 0x54, 0x0a, + 0x2f, 0x2d, 0x95, 0xde, 0x17, 0x91, 0x8a, 0xea, 0x75, 0x5f, 0x5e, 0xaf, 0xfb, 0xf3, 0x7a, 0x3d, + 0x90, 0xdf, 0xeb, 0xfb, 0x30, 0xc8, 0xbb, 0xca, 0x4e, 0xa9, 0x6b, 0x11, 0x3d, 0x8a, 0x4f, 0xa9, + 0xba, 0x87, 0x98, 0xcd, 0xcb, 0x98, 0x22, 0xb9, 0xee, 0x84, 0xfa, 0x29, 0x55, 0xfc, 0xb4, 0x7e, + 0x84, 0x8f, 0x46, 0xd7, 0xfd, 0xfa, 0x13, 0xcd, 0xda, 0x39, 0xc4, 0xbf, 0xd0, 0xa4, 0x75, 0x9c, + 0x61, 0xf1, 0x12, 0x5b, 0x62, 0x90, 0x2b, 0x30, 0xba, 0xe6, 0xdd, 0xf3, 0x83, 0x3a, 0xdd, 0xf2, + 0x9a, 0x9c, 0xfb, 0xb0, 0xad, 0x83, 0x84, 0x15, 0x40, 0xd4, 0x10, 0x1f, 0xad, 0x11, 0x90, 0x38, + 0x5a, 0x33, 0xd8, 0xde, 0x82, 0xcd, 0xcb, 0x84, 0x91, 0x81, 0xfd, 0xdd, 0xe9, 0x54, 0xaa, 0x8e, + 0xaf, 0xdd, 0x10, 0xf7, 0xe1, 0x82, 0x4d, 0x5b, 0x4d, 0x87, 0xe9, 0x74, 0x47, 0x3e, 0xc7, 0x57, + 0x7d, 0xbe, 0x92, 0xf1, 0xe0, 0xcb, 0xf4, 0x17, 0x50, 0x4d, 0xee, 0xed, 0xd0, 0xe4, 0x23, 0xb8, + 0x7a, 0x9f, 0x46, 0xe6, 0x82, 0x1a, 0xdb, 0x52, 0x45, 0xe7, 0x57, 0x61, 0x38, 0x34, 0xed, 0xc0, + 0x97, 0xe5, 0xf5, 0x43, 0x16, 0xe1, 0xde, 0x5d, 0x79, 0x53, 0x22, 0xf8, 0xa8, 0xbf, 0xac, 0x4f, + 0xa1, 0x9c, 0x57, 0xdd, 0xe9, 0xdc, 0x39, 0x5d, 0xb8, 0x92, 0xcf, 0x40, 0x34, 0x77, 0x05, 0xa4, + 0xcd, 0x58, 0x7c, 0x42, 0xdd, 0x5a, 0x6b, 0x9a, 0x99, 0xc5, 0x1f, 0xd6, 0xa2, 0x74, 0x6c, 0x7b, + 0x89, 0xe6, 0xd6, 0xf0, 0x3a, 0xd6, 0x64, 0x10, 0xcb, 0xb5, 0x02, 0xc3, 0x12, 0x26, 0xe4, 0x3a, + 0x9b, 0xd9, 0x52, 0x29, 0xd0, 0x86, 0x64, 0xa0, 0xc8, 0xac, 0x1f, 0xc9, 0xab, 0x09, 0x93, 0xe2, + 0x74, 0x2f, 0x20, 0x4f, 0x73, 0x17, 0x61, 0xf9, 0x70, 0xc1, 0xe4, 0xad, 0x9b, 0x9c, 0x8b, 0x9a, + 0xc9, 0x99, 0x5b, 0x9a, 0xaf, 0x98, 0x26, 0xd0, 0x5e, 0x31, 0x2f, 0x63, 0x10, 0xb9, 0xac, 0x1b, + 0x96, 0xc7, 0xd2, 0x4f, 0x2a, 0x6f, 0xc3, 0x5c, 0x56, 0x85, 0xda, 0x39, 0x50, 0x59, 0x2f, 0x85, + 0xbe, 0xb3, 0x0c, 0x97, 0x65, 0x8c, 0x18, 0xdf, 0x8f, 0xc2, 0x28, 0x70, 0x5a, 0xd5, 0x7a, 0xe0, + 0xb6, 0x62, 0x2a, 0x0b, 0x06, 0x39, 0x44, 0x48, 0x82, 0x5f, 0xf3, 0x70, 0x1c, 0x51, 0x62, 0xfd, + 0x66, 0x01, 0x2c, 0xc3, 0x07, 0x09, 0xc7, 0x79, 0x3b, 0xf0, 0x9f, 0xba, 0x0d, 0xed, 0x6a, 0xe5, + 0x2d, 0xc3, 0xac, 0xc7, 0x9f, 0xc4, 0x25, 0xdd, 0x9f, 0xc5, 0x9a, 0x79, 0x3b, 0x61, 0x6a, 0xe3, + 0x8a, 0x27, 0xfa, 0x25, 0x3d, 0xa1, 0xfa, 0x93, 0x12, 0x65, 0x82, 0xfb, 0x9f, 0x05, 0xb8, 0xd6, + 0xb1, 0x0d, 0xa2, 0x3f, 0xfb, 0x50, 0x4c, 0x96, 0x89, 0x19, 0x54, 0xd6, 0x7c, 0x12, 0xd2, 0x1c, + 0xf6, 0xee, 0x70, 0x1f, 0x6b, 0xe9, 0xbb, 0xd3, 0x52, 0x9c, 0x53, 0xfc, 0xce, 0xde, 0x7a, 0xf2, + 0x01, 0xc0, 0x8e, 0x1f, 0x39, 0xcd, 0x25, 0x34, 0x00, 0xf4, 0xc5, 0xfe, 0xf2, 0x11, 0x83, 0xd6, + 0x92, 0x41, 0x0a, 0x34, 0x64, 0xeb, 0x07, 0xf8, 0x5d, 0x67, 0x37, 0xfa, 0x74, 0x9f, 0xda, 0x12, + 0x5c, 0x4b, 0xdc, 0x8b, 0xbf, 0x00, 0x93, 0x08, 0x66, 0x98, 0xf8, 0x99, 0xee, 0x7d, 0x3f, 0xf0, + 0xdb, 0xad, 0x5f, 0xce, 0xa8, 0xff, 0x59, 0x81, 0x3b, 0x2a, 0xea, 0xd5, 0x8a, 0x81, 0x5e, 0x02, + 0x88, 0xa1, 0x09, 0x87, 0x75, 0x55, 0xb0, 0x77, 0x87, 0x1f, 0xb9, 0xd1, 0x62, 0x7e, 0xc0, 0x19, + 0x68, 0x64, 0xbf, 0xdc, 0x91, 0xbc, 0x8b, 0x97, 0xe1, 0xaa, 0xf6, 0xd3, 0xc9, 0xfd, 0x3d, 0x69, + 0xff, 0x38, 0x23, 0xdd, 0x21, 0x4c, 0xb3, 0x15, 0xa0, 0xd2, 0x8e, 0x0e, 0xfd, 0xc0, 0x8d, 0xe4, + 0xd3, 0x0b, 0xb2, 0x2d, 0xde, 0x76, 0x73, 0xaa, 0x8f, 0x7f, 0x71, 0x5c, 0x7e, 0xff, 0x2c, 0xb1, + 0xfb, 0x24, 0xcf, 0x1d, 0xf5, 0x1e, 0xdc, 0x9a, 0x85, 0xbe, 0x25, 0x7b, 0x1d, 0x17, 0x3c, 0x7b, + 0x5d, 0x2d, 0x78, 0xf6, 0xba, 0xf5, 0x37, 0xbd, 0x50, 0xe6, 0xd1, 0x27, 0xd0, 0x87, 0x22, 0xb6, + 0x5a, 0x68, 0x4e, 0x19, 0xa7, 0x35, 0x30, 0x24, 0xa2, 0x4b, 0xf4, 0x9e, 0x26, 0xba, 0xc4, 0xaf, + 0x41, 0x8e, 0xc9, 0xea, 0x14, 0x56, 0x80, 0x37, 0x4f, 0x8e, 0xcb, 0xd7, 0x62, 0x2b, 0x00, 0x2f, + 0xcd, 0x32, 0x07, 0xe4, 0x54, 0x91, 0xb6, 0x5f, 0xf4, 0xbf, 0x80, 0xfd, 0xe2, 0x36, 0x0c, 0xe1, + 0x61, 0x66, 0x6d, 0x5b, 0x78, 0x35, 0xe2, 0xf4, 0xc4, 0x78, 0x32, 0x35, 0x57, 0x0f, 0xea, 0x25, + 0xd1, 0xac, 0x7f, 0xd8, 0x0b, 0x57, 0xf2, 0x65, 0x2e, 0xda, 0xb6, 0x0c, 0x10, 0x7b, 0x6f, 0x74, + 0xf2, 0x16, 0xc1, 0x6f, 0xe7, 0x19, 0xdd, 0x57, 0xde, 0x5a, 0x1a, 0x1d, 0xd3, 0x7d, 0xe4, 0x43, + 0xdf, 0xc4, 0x55, 0x81, 0xf1, 0xfe, 0x57, 0x44, 0xa4, 0x14, 0x20, 0x23, 0x22, 0xa5, 0x80, 0x91, + 0x7d, 0x98, 0xdd, 0x0e, 0xdc, 0xa7, 0x4e, 0x44, 0x1f, 0xd2, 0xe7, 0xfc, 0x21, 0xcc, 0x8a, 0x78, + 0xfd, 0xc2, 0x5f, 0x6f, 0x5f, 0x3f, 0x39, 0x2e, 0xbf, 0xd6, 0xe2, 0x28, 0xec, 0xc3, 0xac, 0xf1, + 0xa7, 0x87, 0xb5, 0xf4, 0x83, 0x98, 0x3c, 0x46, 0xd6, 0xbf, 0x2d, 0xc0, 0x45, 0x54, 0xcb, 0x85, + 0xd9, 0x55, 0x56, 0xfe, 0x42, 0x4e, 0x83, 0x7a, 0x07, 0xc5, 0x5c, 0x44, 0xa7, 0x41, 0xe3, 0x21, + 0xb4, 0x6d, 0xa0, 0x91, 0x35, 0x18, 0x15, 0xbf, 0xf1, 0xfb, 0xeb, 0xc3, 0x03, 0xc1, 0x8c, 0xb6, + 0x60, 0xe1, 0x54, 0xe7, 0xa6, 0x22, 0x9c, 0xd8, 0x82, 0x19, 0xbe, 0x17, 0xb4, 0x75, 0x5a, 0xeb, + 0xe7, 0xbd, 0x30, 0xbf, 0x47, 0x03, 0xf7, 0xf1, 0xf3, 0x9c, 0xce, 0x6c, 0xc1, 0xb4, 0x04, 0xf1, + 0x08, 0x14, 0xc6, 0x27, 0xc6, 0xa3, 0xd2, 0xc9, 0xa6, 0x8a, 0x10, 0x16, 0xf2, 0x8b, 0xcb, 0x24, + 0x3c, 0x83, 0x3b, 0xe0, 0x3b, 0x30, 0x9c, 0x88, 0x01, 0x83, 0xe3, 0x2f, 0xbf, 0xd0, 0x78, 0xa8, + 0x56, 0x7b, 0x6c, 0x85, 0x49, 0x7e, 0x2b, 0xff, 0xfe, 0x46, 0x98, 0x3e, 0xba, 0xd9, 0x3f, 0xf1, + 0x83, 0x65, 0x1f, 0xab, 0xa3, 0x95, 0x66, 0x7c, 0xb0, 0xab, 0x3d, 0x76, 0x5e, 0x4d, 0x8b, 0xa3, + 0x30, 0x52, 0xc1, 0x3b, 0x29, 0x76, 0x72, 0xff, 0x1f, 0xbd, 0x70, 0x59, 0x3e, 0x6a, 0xc9, 0x11, + 0xf3, 0xe7, 0x30, 0x2b, 0x41, 0x95, 0x16, 0x53, 0x18, 0x68, 0xc3, 0x94, 0x34, 0x8f, 0x0c, 0x29, + 0x25, 0xed, 0x08, 0x9c, 0x58, 0xd8, 0x79, 0xe4, 0xaf, 0xc6, 0xfa, 0xf9, 0x49, 0x56, 0x44, 0x1e, + 0xb4, 0x42, 0xea, 0x6b, 0xa6, 0x21, 0x1a, 0x63, 0xfd, 0x6c, 0xa4, 0xac, 0xa7, 0xfd, 0x2f, 0x6b, + 0x3d, 0x5d, 0xed, 0x49, 0xda, 0x4f, 0x17, 0x27, 0x60, 0x6c, 0x93, 0x3e, 0x8b, 0xe5, 0xfe, 0xff, + 0x16, 0x12, 0x91, 0x06, 0x98, 0x86, 0xc1, 0x43, 0x0e, 0x14, 0xe2, 0xa0, 0x2e, 0x18, 0x69, 0x40, + 0xd7, 0x30, 0x38, 0xea, 0x1a, 0x0c, 0xf1, 0x8b, 0xda, 0xc6, 0x29, 0x4e, 0xf8, 0xea, 0x75, 0x0a, + 0x7f, 0x32, 0xd8, 0xe0, 0x87, 0x7d, 0x41, 0x6f, 0x3d, 0x84, 0xab, 0xc2, 0x7f, 0xd9, 0x1c, 0x7c, + 0xac, 0xe8, 0x8c, 0xdb, 0x97, 0xe5, 0xc0, 0xe5, 0xfb, 0x34, 0xb9, 0xf4, 0x18, 0xaf, 0x77, 0x3e, + 0x85, 0x49, 0x03, 0xae, 0x38, 0xa2, 0x56, 0xaa, 0xe6, 0x90, 0x62, 0x9d, 0xc4, 0xb6, 0xae, 0x64, + 0x55, 0xa1, 0x37, 0xd6, 0xa2, 0x18, 0xe2, 0x31, 0x88, 0xaf, 0xd8, 0xc2, 0x33, 0xac, 0x7a, 0xd7, + 0xb5, 0xef, 0x9a, 0xaf, 0x78, 0x3c, 0xd6, 0x9b, 0xdc, 0x79, 0x55, 0xa9, 0x35, 0x6e, 0xdc, 0x05, + 0x58, 0x13, 0x30, 0x26, 0x8b, 0x9a, 0x34, 0x0c, 0xad, 0x9f, 0x0e, 0x80, 0x25, 0x04, 0x9b, 0x75, + 0xfb, 0x2c, 0xe5, 0xb1, 0x9f, 0x6a, 0xac, 0xd8, 0xa8, 0xce, 0xeb, 0xd1, 0x05, 0xe3, 0x52, 0x3e, + 0xf3, 0x50, 0xcf, 0xab, 0xc7, 0x50, 0x63, 0xe6, 0xa5, 0x7a, 0xff, 0x55, 0xce, 0x32, 0xc9, 0x3f, + 0xb6, 0xd7, 0x4f, 0x8e, 0xcb, 0x57, 0x73, 0x96, 0x49, 0x83, 0x6f, 0xf6, 0x92, 0x69, 0x9b, 0x57, + 0x22, 0x7d, 0x2f, 0x72, 0x25, 0xc2, 0xbe, 0x48, 0xfd, 0x52, 0x64, 0xd7, 0x94, 0xa5, 0xf8, 0x1e, + 0xe5, 0x95, 0xb6, 0x5e, 0x24, 0x1e, 0xfc, 0x6b, 0x10, 0x83, 0xab, 0xc1, 0x86, 0xb8, 0x50, 0xd4, + 0x6c, 0x96, 0x4b, 0x87, 0xb4, 0xfe, 0x44, 0xd8, 0x8a, 0xe5, 0x85, 0x6e, 0x96, 0xcd, 0x9c, 0x47, + 0x99, 0xe5, 0xdf, 0x39, 0x2f, 0xa8, 0xd5, 0x19, 0xa9, 0x1e, 0xb0, 0x20, 0xc9, 0x96, 0xfc, 0x04, + 0xa6, 0xd4, 0x50, 0x27, 0xdc, 0x8f, 0x46, 0x17, 0x5e, 0x8b, 0xc3, 0x51, 0x1e, 0x3d, 0x76, 0x6e, + 0x3e, 0xbd, 0x73, 0x33, 0x03, 0x97, 0xbf, 0x83, 0xaf, 0xcb, 0x02, 0xcd, 0xf7, 0x48, 0xbf, 0xe8, + 0xca, 0x22, 0xd4, 0xae, 0xb3, 0xff, 0x81, 0x72, 0x96, 0x67, 0xfa, 0x82, 0xdb, 0xa4, 0xe2, 0xd5, + 0x8b, 0x9c, 0x7d, 0x39, 0x57, 0x71, 0x85, 0x6f, 0xf9, 0x2a, 0xee, 0x8f, 0x7b, 0xe5, 0x13, 0x81, + 0xf4, 0x6d, 0xe8, 0x99, 0x6f, 0xe4, 0x32, 0x7b, 0x70, 0xaa, 0xcd, 0x34, 0xb3, 0x71, 0x64, 0x51, + 0xde, 0x67, 0xaa, 0xd8, 0x50, 0x13, 0xea, 0x6e, 0x20, 0x2e, 0x30, 0xae, 0x38, 0x51, 0x75, 0xd1, + 0xa8, 0x92, 0x97, 0x65, 0x7d, 0x2f, 0x7f, 0x59, 0xf6, 0x2f, 0x47, 0xe0, 0xdc, 0xb6, 0x73, 0xe0, + 0x7a, 0x6c, 0xd1, 0xb6, 0x69, 0xe8, 0xb7, 0x83, 0x3a, 0x25, 0x15, 0x98, 0x30, 0xfd, 0x3f, 0xbb, + 0x78, 0xb7, 0xb2, 0x7d, 0xc9, 0x84, 0x91, 0x05, 0x18, 0x51, 0x6f, 0x4e, 0xc5, 0x66, 0x92, 0xf1, + 0x16, 0x75, 0xb5, 0xc7, 0x8e, 0xd1, 0xc8, 0x07, 0xc6, 0xfd, 0xce, 0xa4, 0x7a, 0x3e, 0x8d, 0xb8, + 0x0b, 0xdc, 0x41, 0xcf, 0xf3, 0x1b, 0xe6, 0x86, 0xc8, 0x2f, 0x31, 0x7e, 0x94, 0xba, 0xf2, 0x19, + 0x30, 0x5a, 0x9c, 0xb2, 0x7b, 0xa1, 0x2e, 0x90, 0x1b, 0xe6, 0x37, 0xe3, 0x32, 0xe8, 0x4b, 0x18, + 0x7d, 0xd8, 0xde, 0xa7, 0xf2, 0x72, 0x6b, 0x50, 0xec, 0x8f, 0x49, 0xaf, 0x66, 0x51, 0xbe, 0x77, + 0x97, 0x8f, 0xc1, 0x93, 0xf6, 0x3e, 0x4d, 0xc7, 0x8f, 0x66, 0x0b, 0x93, 0xc6, 0x8c, 0x1c, 0x42, + 0x31, 0xe9, 0x80, 0x2c, 0xa2, 0xa9, 0x75, 0x70, 0x9b, 0xc6, 0x50, 0x1e, 0x5a, 0x94, 0x6a, 0xee, + 0x16, 0x69, 0x54, 0x92, 0xe2, 0x4a, 0x7e, 0x1d, 0x66, 0x32, 0xad, 0x8e, 0xea, 0x09, 0x55, 0x67, + 0x83, 0x26, 0x2e, 0xea, 0x09, 0xa9, 0xc9, 0xf7, 0x5a, 0x46, 0xcd, 0xd9, 0xb5, 0x90, 0x06, 0x4c, + 0x26, 0x1c, 0x6b, 0x45, 0x20, 0xfe, 0x7c, 0x57, 0x5d, 0xdc, 0x98, 0x64, 0xd4, 0xd2, 0xcc, 0xba, + 0x92, 0x2c, 0xc9, 0x3a, 0x8c, 0xa8, 0xe3, 0x3e, 0xbe, 0xce, 0xca, 0x36, 0x6d, 0x94, 0x4e, 0x8e, + 0xcb, 0xd3, 0xb1, 0x69, 0xc3, 0xe0, 0x19, 0x33, 0x20, 0xbf, 0x01, 0x57, 0xd5, 0x14, 0xdd, 0x0a, + 0xb2, 0x8d, 0x40, 0x22, 0x0a, 0xf6, 0x8d, 0xe4, 0x0c, 0xcf, 0xc3, 0xdf, 0xbb, 0xb3, 0xd8, 0x5b, + 0x2a, 0xac, 0xf6, 0xd8, 0xdd, 0x59, 0x93, 0x9f, 0x16, 0xe0, 0x7c, 0x4e, 0xad, 0x63, 0x58, 0x6b, + 0x57, 0xcb, 0x1c, 0x2a, 0xf7, 0xf8, 0x6c, 0xc8, 0x6d, 0xc4, 0xcf, 0xeb, 0xa4, 0x89, 0xce, 0xe8, + 0x77, 0x4e, 0x4d, 0xe4, 0x6d, 0x18, 0xc4, 0x33, 0x72, 0x58, 0x1a, 0x47, 0x2d, 0x12, 0x23, 0xd8, + 0xe0, 0x49, 0x5a, 0xdf, 0x37, 0x04, 0x0e, 0x59, 0x65, 0xda, 0x18, 0xee, 0x5b, 0x52, 0x7b, 0x12, + 0xf1, 0xae, 0x84, 0x46, 0xcf, 0x8b, 0x64, 0x94, 0x0b, 0x23, 0xdc, 0xb9, 0x49, 0xb6, 0x08, 0x30, + 0x1c, 0x88, 0x55, 0xe9, 0x41, 0xff, 0x70, 0x7f, 0x71, 0x80, 0x7f, 0x38, 0xd2, 0x63, 0xfb, 0xb7, + 0x87, 0xf9, 0xf3, 0xce, 0x5d, 0xcf, 0x7d, 0xec, 0xc6, 0x0b, 0x98, 0x6e, 0x5d, 0x8b, 0xb3, 0x8e, + 0x08, 0xdd, 0x37, 0x27, 0xbf, 0x88, 0x32, 0xc4, 0xf5, 0x76, 0x35, 0xc4, 0xdd, 0xd5, 0xae, 0xac, + 0xb4, 0x10, 0x91, 0x5c, 0xc7, 0x31, 0x0d, 0x5f, 0xf1, 0x5d, 0xd6, 0xd7, 0x30, 0x88, 0x51, 0x1d, + 0xf9, 0x7d, 0xe0, 0xe8, 0xc2, 0x4d, 0xb1, 0x6c, 0x77, 0x68, 0x3e, 0x0f, 0x03, 0x29, 0x9e, 0x6c, + 0x73, 0x89, 0x23, 0xc0, 0x90, 0x38, 0x42, 0xc8, 0x0e, 0x4c, 0x6d, 0x07, 0xb4, 0x21, 0xfc, 0x86, + 0x5b, 0x81, 0x30, 0x4e, 0x70, 0xb3, 0x07, 0x6e, 0xf9, 0x2d, 0x59, 0x5c, 0xa3, 0xaa, 0x5c, 0xdf, + 0x50, 0x33, 0xc8, 0xc9, 0x0a, 0x4c, 0x54, 0xa9, 0x13, 0xd4, 0x0f, 0x1f, 0xd2, 0xe7, 0x4c, 0xdd, + 0x31, 0x42, 0xed, 0x87, 0x58, 0xc2, 0xfa, 0x8b, 0x45, 0xba, 0x8f, 0x87, 0x49, 0x44, 0x7e, 0x00, + 0x83, 0x55, 0x3f, 0x88, 0x16, 0x9f, 0x8b, 0x45, 0x4d, 0xde, 0x18, 0x71, 0xe0, 0xe2, 0x05, 0x99, + 0x6e, 0x20, 0xf4, 0x83, 0xa8, 0xb6, 0x6f, 0x84, 0x44, 0xe2, 0x28, 0xe4, 0x39, 0x4c, 0x9b, 0x0b, + 0x8a, 0x70, 0x67, 0x1d, 0x16, 0x6a, 0x56, 0xd6, 0xaa, 0xc5, 0x51, 0x16, 0xaf, 0x0b, 0xee, 0x57, + 0x92, 0xcb, 0xd6, 0x63, 0x2c, 0xd7, 0xa3, 0x14, 0x65, 0xd1, 0x93, 0x0d, 0xcc, 0xd2, 0xc0, 0x7b, + 0x54, 0x09, 0xb9, 0x1b, 0xec, 0x48, 0x1c, 0x74, 0xab, 0x8d, 0x8b, 0x12, 0x4a, 0xc2, 0x09, 0x93, + 0xa9, 0x3d, 0xec, 0x14, 0x29, 0xd9, 0x86, 0x73, 0xbb, 0x21, 0xdd, 0x0e, 0xe8, 0x53, 0x97, 0x3e, + 0x93, 0xfc, 0x20, 0x8e, 0x50, 0xc4, 0xf8, 0xb5, 0x78, 0x69, 0x16, 0xc3, 0x34, 0x31, 0xf9, 0x00, + 0x60, 0xdb, 0xf5, 0x3c, 0xda, 0xc0, 0x6b, 0xc7, 0x51, 0x64, 0x85, 0x26, 0xd5, 0x16, 0x42, 0x6b, + 0xbe, 0xd7, 0xd4, 0x45, 0xaa, 0x21, 0x93, 0x45, 0x18, 0x5f, 0xf3, 0xea, 0xcd, 0xb6, 0x70, 0x0f, + 0x08, 0x71, 0x41, 0x11, 0x91, 0xd3, 0x5c, 0x5e, 0x50, 0x4b, 0x7d, 0xe4, 0x26, 0x09, 0x79, 0x08, + 0x44, 0x00, 0xc4, 0xac, 0x75, 0xf6, 0x9b, 0x54, 0x7c, 0xee, 0x68, 0x2a, 0x91, 0x8c, 0x70, 0xba, + 0x1b, 0x01, 0xc9, 0x52, 0x64, 0x73, 0x1f, 0xc0, 0xa8, 0x36, 0xe7, 0x33, 0x62, 0x10, 0x4c, 0xeb, + 0x31, 0x08, 0x46, 0xf4, 0x58, 0x03, 0xff, 0xb8, 0x00, 0xf3, 0xd9, 0xdf, 0x92, 0x50, 0xc0, 0xb6, + 0x60, 0x44, 0x01, 0xd5, 0xab, 0x13, 0xa9, 0xfa, 0x27, 0x34, 0x20, 0xfe, 0x41, 0xcb, 0x95, 0x47, + 0xef, 0x7d, 0xcc, 0xe3, 0x05, 0xec, 0xf1, 0xff, 0xdf, 0x30, 0x4c, 0xa3, 0x77, 0x75, 0x72, 0x9d, + 0xfa, 0x14, 0x63, 0x89, 0x20, 0x4c, 0x33, 0x2f, 0x0b, 0x4b, 0x13, 0x87, 0x27, 0x03, 0x5f, 0x19, + 0x04, 0xe4, 0x5d, 0xdd, 0x27, 0xa2, 0x57, 0xcb, 0x0b, 0x21, 0x81, 0x7a, 0x17, 0x62, 0x67, 0x89, + 0xb7, 0x8c, 0x2b, 0xf9, 0x53, 0x2f, 0x7a, 0xfd, 0xa7, 0x5d, 0xf4, 0x76, 0xd5, 0xa2, 0xc7, 0x63, + 0x54, 0xbc, 0xa9, 0x2d, 0x7a, 0xaf, 0x7e, 0xb5, 0x1b, 0x7c, 0xd5, 0xab, 0xdd, 0xd0, 0xcb, 0xad, + 0x76, 0xc3, 0x2f, 0xb8, 0xda, 0xdd, 0x83, 0x89, 0x4d, 0x4a, 0x1b, 0xda, 0x45, 0xc9, 0x48, 0xbc, + 0x7b, 0x7a, 0x14, 0x4d, 0x60, 0x59, 0xb7, 0x25, 0x09, 0xaa, 0xdc, 0x55, 0x13, 0xfe, 0x6e, 0x56, + 0xcd, 0xd1, 0x57, 0xbc, 0x6a, 0x8e, 0xbd, 0xcc, 0xaa, 0x99, 0x5a, 0xfa, 0xc6, 0xcf, 0xbc, 0xf4, + 0xbd, 0xcc, 0x6a, 0xf5, 0x09, 0xba, 0x14, 0x56, 0xab, 0xab, 0xc2, 0x7b, 0x44, 0x73, 0xd7, 0x58, + 0xf5, 0x43, 0xe9, 0x71, 0x8d, 0x7f, 0x33, 0xd8, 0xb6, 0x1f, 0xc8, 0x2b, 0x6f, 0xfc, 0xdb, 0x5a, + 0x44, 0x47, 0x42, 0x9d, 0x5e, 0xb9, 0xeb, 0x0f, 0x89, 0x27, 0x7b, 0x62, 0x8d, 0x4b, 0x1e, 0xa3, + 0x6c, 0x59, 0x6e, 0xfd, 0x55, 0x81, 0x5f, 0x4a, 0xfe, 0x9f, 0xb8, 0x54, 0xbe, 0xcc, 0x45, 0xe1, + 0x6f, 0xc5, 0x4f, 0xf9, 0x45, 0xd8, 0x81, 0xc0, 0xa9, 0x3f, 0x89, 0x6f, 0x6a, 0x7f, 0xc8, 0xbe, + 0x73, 0xbd, 0x00, 0x03, 0xab, 0xc6, 0x67, 0x45, 0xb3, 0x70, 0xef, 0x8e, 0x5c, 0x00, 0x44, 0x44, + 0x03, 0x0e, 0x36, 0x17, 0x00, 0x9d, 0x00, 0x7d, 0xe5, 0x26, 0x2d, 0x9b, 0xbf, 0x44, 0xcf, 0x6c, + 0xc1, 0x7b, 0xe9, 0xb7, 0xd4, 0x78, 0x18, 0x89, 0xdf, 0x52, 0xeb, 0x62, 0x8c, 0x5f, 0x55, 0xef, + 0xc2, 0x45, 0x9b, 0x1e, 0xf9, 0x4f, 0xe9, 0xab, 0x65, 0xfb, 0x15, 0x5c, 0x30, 0x19, 0xf2, 0x57, + 0x37, 0x3c, 0x20, 0xfa, 0x27, 0xd9, 0x61, 0xd4, 0x05, 0x01, 0x0f, 0xa3, 0xce, 0xa3, 0x31, 0xb3, + 0x3f, 0xf5, 0x7d, 0x03, 0xcb, 0x2c, 0x1f, 0xe6, 0x4d, 0xe6, 0x95, 0x46, 0x03, 0x73, 0xf0, 0xd5, + 0xdd, 0x96, 0xe3, 0x45, 0x64, 0x0b, 0x46, 0xb5, 0x9f, 0x09, 0x53, 0x81, 0x56, 0x22, 0x74, 0x9a, + 0x18, 0x60, 0x84, 0xe0, 0x8c, 0xc1, 0x16, 0x85, 0x72, 0x52, 0x3c, 0x4c, 0x64, 0x7a, 0x9d, 0x8b, + 0x30, 0xae, 0xfd, 0x54, 0x26, 0x4b, 0xfc, 0xf8, 0xb5, 0x1a, 0x4c, 0x81, 0x99, 0x24, 0x56, 0x1d, + 0xe6, 0xb2, 0x84, 0x86, 0xd1, 0x99, 0x9e, 0x93, 0x95, 0x38, 0xce, 0x53, 0x77, 0x6f, 0xbb, 0xc9, + 0xbc, 0x18, 0x4f, 0xd6, 0xdf, 0xef, 0x87, 0x8b, 0x62, 0x30, 0x5e, 0xe5, 0x88, 0x93, 0x1f, 0xc1, + 0xa8, 0x36, 0xc6, 0x42, 0xe8, 0x57, 0x64, 0xe8, 0xcd, 0xbc, 0xb9, 0xc0, 0x4d, 0x1a, 0x6d, 0x04, + 0xd4, 0x12, 0xc3, 0xbd, 0xda, 0x63, 0xeb, 0x2c, 0x49, 0x13, 0x26, 0xcc, 0x81, 0x16, 0x56, 0x9d, + 0x6b, 0x99, 0x95, 0x98, 0xa8, 0x32, 0x90, 0x73, 0xa3, 0x96, 0x39, 0xdc, 0xab, 0x3d, 0x76, 0x82, + 0x37, 0xf9, 0x06, 0xce, 0xa5, 0x46, 0x59, 0x18, 0xeb, 0xde, 0xc8, 0xac, 0x30, 0x85, 0xcd, 0xcd, + 0xb1, 0x01, 0x82, 0x73, 0xab, 0x4d, 0x57, 0x42, 0x1a, 0x30, 0xa6, 0x0f, 0xbc, 0x30, 0x3b, 0x5d, + 0xed, 0x20, 0x4a, 0x8e, 0xc8, 0x95, 0x3b, 0x21, 0x4b, 0x1c, 0xfb, 0xe7, 0xa6, 0x89, 0xd9, 0x40, + 0x1e, 0x86, 0x41, 0xfe, 0x9b, 0x2d, 0x01, 0xdb, 0x01, 0x0d, 0xa9, 0x57, 0xa7, 0x86, 0x83, 0xf6, + 0x4b, 0x2e, 0x01, 0xff, 0xa6, 0x00, 0xa5, 0x2c, 0xbe, 0x55, 0xea, 0x35, 0xc8, 0x36, 0x14, 0x93, + 0x15, 0x89, 0x59, 0x6d, 0xa9, 0x58, 0xb9, 0xb9, 0x4d, 0x5a, 0xed, 0xb1, 0x53, 0xd4, 0x64, 0x13, + 0xce, 0x69, 0x30, 0x61, 0x5c, 0xed, 0x3d, 0x8d, 0x71, 0x95, 0x8d, 0x42, 0x8a, 0x54, 0xb7, 0x4d, + 0xaf, 0xe2, 0xce, 0xb8, 0xec, 0x1f, 0x39, 0xae, 0xc7, 0x14, 0x5d, 0x2d, 0xd4, 0x13, 0xc4, 0x50, + 0x21, 0x1b, 0x6e, 0x6d, 0x45, 0xa8, 0x7c, 0x50, 0xa2, 0x50, 0xac, 0x8f, 0x71, 0x05, 0x17, 0x36, + 0x3a, 0xfe, 0x3c, 0x55, 0x31, 0xbb, 0x02, 0x03, 0x3b, 0xeb, 0xd5, 0xa5, 0x8a, 0x78, 0xec, 0xca, + 0x43, 0x24, 0x34, 0xc3, 0x5a, 0xdd, 0xb1, 0x79, 0x81, 0xf5, 0x11, 0x90, 0xfb, 0x34, 0x12, 0xc1, + 0xda, 0x15, 0xdd, 0xeb, 0x30, 0x24, 0x40, 0x82, 0x12, 0x5d, 0xe3, 0x9a, 0x02, 0x4b, 0x96, 0x59, + 0xdb, 0xf2, 0x9c, 0xd0, 0xa4, 0x4e, 0xa8, 0x6d, 0xcc, 0xef, 0xc3, 0x70, 0x20, 0x60, 0x62, 0x5f, + 0x9e, 0x50, 0x69, 0x2d, 0x10, 0xcc, 0xed, 0xd9, 0x12, 0xc7, 0x56, 0x7f, 0x59, 0xeb, 0x18, 0xce, + 0x64, 0x6b, 0x6d, 0x79, 0x89, 0x49, 0x55, 0x08, 0x4b, 0x0e, 0xc7, 0x2d, 0xf4, 0x21, 0x8f, 0xa8, + 0xfe, 0xd4, 0x15, 0x45, 0x83, 0x1f, 0xb9, 0x08, 0xe2, 0xa3, 0xa1, 0x58, 0x77, 0x55, 0x70, 0x94, + 0x0c, 0x6e, 0x79, 0xe9, 0x19, 0x36, 0x31, 0xec, 0xcb, 0x7d, 0x74, 0x97, 0x79, 0x15, 0x8d, 0x70, + 0x60, 0x8e, 0x6f, 0xf3, 0xac, 0x57, 0x22, 0x31, 0x99, 0xaf, 0x96, 0xc6, 0x25, 0x18, 0x51, 0x30, + 0x75, 0xf7, 0xc5, 0x65, 0x65, 0xe0, 0xef, 0xdd, 0xe5, 0xaf, 0x82, 0xeb, 0x8a, 0x41, 0x4c, 0xc7, + 0xaa, 0xe0, 0xdf, 0xdd, 0xb7, 0x5c, 0x45, 0x48, 0x83, 0xe8, 0x5b, 0xad, 0x22, 0x8e, 0x0b, 0x74, + 0x96, 0x2a, 0x0c, 0xfc, 0xbd, 0x85, 0xd3, 0x08, 0xea, 0x5b, 0xae, 0x82, 0x09, 0xea, 0xdb, 0xab, + 0x82, 0xca, 0x00, 0x4a, 0x7c, 0x92, 0xa6, 0x2a, 0x59, 0x49, 0x57, 0x22, 0x0d, 0xd7, 0x09, 0x8a, + 0x8e, 0xe3, 0x41, 0x61, 0x9e, 0x0b, 0xeb, 0x97, 0x50, 0x0d, 0x13, 0xd8, 0xb7, 0x5b, 0xcd, 0x3f, + 0x2a, 0xf0, 0x70, 0x4e, 0xd5, 0x2d, 0x2d, 0x25, 0xa0, 0xf7, 0xd8, 0xd7, 0xae, 0xe6, 0xb5, 0xaf, + 0xfd, 0xa1, 0xeb, 0x35, 0xf4, 0xab, 0x79, 0xa7, 0x1d, 0x1d, 0xaa, 0x70, 0xc7, 0x4f, 0x5c, 0xaf, + 0x61, 0x27, 0xb1, 0xc9, 0x07, 0x30, 0xae, 0x81, 0x94, 0xb6, 0xc6, 0x73, 0x46, 0xe8, 0xe4, 0x6e, + 0xc3, 0x36, 0x31, 0xad, 0xbf, 0x2d, 0xc0, 0x54, 0x46, 0xaa, 0x5a, 0x34, 0x66, 0xe0, 0x29, 0x48, + 0x2d, 0x54, 0x22, 0x61, 0x12, 0x46, 0x96, 0x30, 0x36, 0x49, 0x85, 0x88, 0xd1, 0xf2, 0xb5, 0xb4, + 0xba, 0xbd, 0x5a, 0xea, 0xae, 0xec, 0x54, 0xba, 0x3a, 0x3a, 0x09, 0x01, 0xe2, 0x96, 0x08, 0xb3, + 0x71, 0x95, 0xa9, 0xb4, 0x5a, 0x4e, 0xde, 0x57, 0x92, 0x14, 0x58, 0xab, 0xc6, 0xfa, 0xad, 0x5e, + 0x38, 0x9f, 0xd1, 0xff, 0x2a, 0x8d, 0xfe, 0x2e, 0x44, 0x90, 0xc8, 0x8c, 0xdc, 0xf7, 0x4b, 0xca, + 0x8c, 0x6c, 0xfd, 0x87, 0x5e, 0x38, 0xbf, 0xdb, 0x0a, 0xf1, 0x85, 0xd5, 0x9a, 0xf7, 0x94, 0x7a, + 0x91, 0x1f, 0x3c, 0xc7, 0x57, 0x21, 0xe4, 0x5d, 0x18, 0x58, 0xa5, 0xcd, 0xa6, 0x2f, 0xe6, 0xff, + 0x25, 0xe9, 0x1d, 0x91, 0xc4, 0x46, 0xa4, 0xd5, 0x1e, 0x9b, 0x63, 0x93, 0x0f, 0x60, 0x64, 0x95, + 0x3a, 0x41, 0xb4, 0x4f, 0x1d, 0x79, 0x64, 0x91, 0x99, 0x2c, 0x34, 0x12, 0x81, 0xb0, 0xda, 0x63, + 0xc7, 0xd8, 0x64, 0x81, 0x9d, 0xe6, 0xbd, 0x03, 0xf5, 0x9a, 0x3c, 0xa7, 0x42, 0x86, 0xb3, 0xda, + 0x63, 0x23, 0x2e, 0xd9, 0x80, 0xf1, 0xca, 0x01, 0xf5, 0xa2, 0x0d, 0x1a, 0x39, 0x0d, 0x27, 0x72, + 0x84, 0x6a, 0xfb, 0x7a, 0x1e, 0xb1, 0x81, 0xbc, 0xda, 0x63, 0x9b, 0xd4, 0xe4, 0x23, 0x18, 0xba, + 0xef, 0xfb, 0x8d, 0xfd, 0xe7, 0x54, 0xa8, 0xab, 0xe5, 0x3c, 0x46, 0x02, 0x6d, 0xb5, 0xc7, 0x96, + 0x14, 0x8b, 0x03, 0xd0, 0xb7, 0x11, 0x1e, 0x58, 0xc7, 0x05, 0x28, 0x2d, 0xfb, 0xcf, 0xbc, 0x4c, + 0xa9, 0x7e, 0xcf, 0x94, 0xaa, 0x64, 0x9f, 0x81, 0x9f, 0x90, 0xeb, 0x3b, 0xd0, 0xbf, 0xed, 0x7a, + 0x07, 0x09, 0x55, 0x30, 0x83, 0x8e, 0x61, 0xa1, 0x78, 0x5c, 0xef, 0x80, 0xac, 0x4b, 0x1d, 0x5c, + 0xd8, 0x1a, 0xfb, 0x0c, 0xc5, 0x3f, 0x83, 0x5a, 0xc7, 0x8e, 0x75, 0x6d, 0xfe, 0x5b, 0x76, 0xf0, + 0x2d, 0x98, 0xcd, 0xa9, 0x57, 0x3c, 0x0f, 0x67, 0x7d, 0xeb, 0x47, 0xc5, 0xe6, 0x4d, 0x98, 0xc9, + 0x1c, 0xbf, 0x14, 0xe2, 0x3f, 0xcd, 0x9a, 0x88, 0xbc, 0xe7, 0x25, 0x18, 0x92, 0xd9, 0x92, 0xb8, + 0xed, 0x47, 0xfe, 0xc4, 0x07, 0x52, 0xf2, 0x43, 0x95, 0x81, 0x3d, 0xe4, 0xf7, 0xb8, 0xa7, 0x05, + 0x52, 0xe2, 0x9f, 0xd3, 0x87, 0x2f, 0xf1, 0xd1, 0x28, 0x5e, 0xac, 0xce, 0x55, 0x3f, 0x8c, 0x3c, + 0xe5, 0x79, 0x6b, 0xab, 0xdf, 0xe4, 0x06, 0x14, 0x65, 0x3a, 0x07, 0x91, 0x37, 0x46, 0x64, 0x72, + 0xb6, 0x53, 0x70, 0xf2, 0x3e, 0xcc, 0x26, 0x61, 0xb2, 0x97, 0xfc, 0x85, 0x5b, 0x5e, 0xb1, 0xf5, + 0x97, 0xbd, 0x18, 0xeb, 0xba, 0xc3, 0xbc, 0x66, 0xd2, 0xdd, 0xaa, 0x0a, 0x69, 0xf5, 0x6e, 0x55, + 0xc9, 0x3c, 0x8c, 0x6c, 0x55, 0x8d, 0x94, 0x53, 0x76, 0x0c, 0x60, 0xcd, 0x66, 0x5d, 0xa8, 0x04, + 0xf5, 0x43, 0x37, 0xa2, 0xf5, 0xa8, 0x1d, 0x88, 0x55, 0xd8, 0x4e, 0xc1, 0x89, 0x05, 0x63, 0xf7, + 0x9b, 0xee, 0x7e, 0x5d, 0x32, 0xe3, 0x22, 0x30, 0x60, 0xe4, 0x0d, 0x98, 0x58, 0xf3, 0xc2, 0xc8, + 0x69, 0x36, 0x37, 0x68, 0x74, 0xe8, 0x37, 0x44, 0xd2, 0x4c, 0x3b, 0x01, 0x65, 0xf5, 0x2e, 0xf9, + 0x5e, 0xe4, 0xb8, 0x1e, 0x0d, 0xec, 0xb6, 0x17, 0xb9, 0x47, 0x54, 0xf4, 0x3d, 0x05, 0x27, 0xef, + 0xc0, 0x8c, 0x82, 0x6d, 0x05, 0xf5, 0x43, 0x1a, 0x46, 0x01, 0x26, 0xa2, 0xc3, 0x80, 0x3f, 0x76, + 0x76, 0x21, 0xd6, 0xd0, 0xf4, 0xdb, 0x8d, 0x15, 0xef, 0xa9, 0x1b, 0xf8, 0x1e, 0xe6, 0xa6, 0x18, + 0x16, 0x35, 0x24, 0xe0, 0xd6, 0x1f, 0x0e, 0x67, 0x7e, 0xb6, 0x2f, 0x33, 0x07, 0xbf, 0x80, 0xb1, + 0x25, 0xa7, 0xe5, 0xec, 0xbb, 0x4d, 0x37, 0x72, 0x55, 0xc6, 0xae, 0x77, 0xbb, 0x7c, 0xf3, 0x32, + 0xc1, 0x07, 0x6d, 0xe8, 0xc4, 0xb6, 0xc1, 0x6a, 0xee, 0x6f, 0x06, 0x61, 0x26, 0x13, 0x8f, 0x5c, + 0x17, 0xa9, 0xbd, 0xd4, 0xba, 0x2a, 0x92, 0x5d, 0xd9, 0x49, 0x30, 0x1b, 0x4b, 0x04, 0x2d, 0x35, + 0xa9, 0xe3, 0xb5, 0x45, 0xaa, 0x2b, 0xdb, 0x80, 0xb1, 0xb1, 0x64, 0x7a, 0x83, 0xc6, 0x0c, 0x1d, + 0xa7, 0xed, 0x04, 0x94, 0x5c, 0x81, 0x51, 0x06, 0x91, 0xac, 0xfa, 0xf9, 0x13, 0x3f, 0x0d, 0xc4, + 0x38, 0x6d, 0xfa, 0x0d, 0xaa, 0x71, 0x1a, 0xe0, 0x9c, 0x4c, 0x28, 0xe3, 0xc4, 0x20, 0x92, 0xd3, + 0x20, 0xe7, 0xa4, 0x81, 0xc8, 0x6b, 0x30, 0x5e, 0x69, 0xb5, 0x34, 0x46, 0x98, 0xe3, 0xca, 0x36, + 0x81, 0xe4, 0x32, 0x40, 0xa5, 0xd5, 0x92, 0x6c, 0x30, 0x7f, 0x95, 0xad, 0x41, 0xc8, 0xcd, 0x38, + 0x5c, 0x99, 0xc6, 0x0a, 0xaf, 0x13, 0xec, 0x8c, 0x12, 0x26, 0x57, 0x15, 0xdb, 0x49, 0x30, 0x05, + 0x2e, 0xd7, 0x04, 0x98, 0x7c, 0x0c, 0x17, 0x12, 0x7e, 0x17, 0x5a, 0x05, 0x68, 0xea, 0xb7, 0xf3, + 0x11, 0xc8, 0x7b, 0x70, 0x3e, 0x51, 0x28, 0xab, 0x43, 0xab, 0xbe, 0x9d, 0x53, 0x4a, 0x3e, 0x84, + 0x52, 0xe2, 0xd9, 0x76, 0x5c, 0x29, 0x5a, 0xf0, 0xed, 0xdc, 0x72, 0xf6, 0x75, 0x25, 0xde, 0x7f, + 0x89, 0x2a, 0xf1, 0xb2, 0xd2, 0xce, 0x2e, 0x24, 0xab, 0x50, 0xce, 0xf4, 0x65, 0xd1, 0x2a, 0xc6, + 0xbc, 0x5c, 0x76, 0x37, 0x34, 0xb2, 0x08, 0xf3, 0x99, 0x28, 0xb2, 0x19, 0x98, 0xad, 0xcb, 0xee, + 0x88, 0x43, 0x16, 0x60, 0x3a, 0xf6, 0xe9, 0xd1, 0x9a, 0x80, 0x89, 0xba, 0xec, 0xcc, 0x32, 0xf2, + 0xb6, 0xf9, 0x38, 0x9f, 0x57, 0x86, 0x79, 0xba, 0xec, 0x74, 0x81, 0x75, 0x52, 0x80, 0xf9, 0xcc, + 0x8d, 0x52, 0xea, 0xf3, 0x73, 0x49, 0xc5, 0x51, 0x5b, 0x0b, 0x6e, 0x40, 0x3f, 0x2a, 0xf8, 0xdc, + 0x56, 0x2c, 0x7d, 0x4d, 0x91, 0x9e, 0xb3, 0x62, 0xa5, 0x36, 0xe2, 0x90, 0xfb, 0xea, 0x6e, 0xb0, + 0x0f, 0x2d, 0x19, 0xb7, 0x92, 0x0a, 0x54, 0x46, 0xe5, 0xfa, 0x1d, 0xa1, 0xbc, 0x0d, 0x7c, 0x99, + 0x6b, 0x98, 0xbf, 0x2c, 0x40, 0xb9, 0x8b, 0x7e, 0xa0, 0xfa, 0x54, 0x38, 0x45, 0x9f, 0x1e, 0xa8, + 0x3e, 0xf1, 0xb7, 0xb1, 0x0b, 0xa7, 0xd3, 0x41, 0x5e, 0x75, 0xb7, 0xda, 0x40, 0xd2, 0x6a, 0x28, + 0xf9, 0x2e, 0x8c, 0x54, 0xab, 0xab, 0x86, 0x43, 0x5f, 0xea, 0x72, 0x28, 0xc6, 0x20, 0xb7, 0x4f, + 0xe5, 0xc1, 0xa7, 0xf9, 0xef, 0x59, 0xcb, 0x50, 0xca, 0xd3, 0x20, 0x71, 0x61, 0xe1, 0xb1, 0xb5, + 0xb4, 0x8b, 0x25, 0xbe, 0xb0, 0x98, 0x60, 0xeb, 0x3d, 0x38, 0xaf, 0xa8, 0x79, 0xd2, 0x0e, 0xed, + 0xe1, 0xbf, 0x38, 0x76, 0xaa, 0x00, 0x03, 0x31, 0xc0, 0xfa, 0x8b, 0xfe, 0x14, 0x61, 0xb5, 0x7d, + 0x74, 0xe4, 0x04, 0xcf, 0x49, 0xc5, 0x24, 0xec, 0xeb, 0xaa, 0xe9, 0x2f, 0xf6, 0xff, 0xec, 0xb8, + 0xdc, 0xa3, 0x71, 0x67, 0xcb, 0x31, 0x6e, 0xec, 0x5e, 0x9d, 0xf2, 0x2b, 0xa9, 0x5e, 0x1e, 0xdc, + 0xc8, 0x00, 0x92, 0x3d, 0x18, 0x17, 0x5b, 0x26, 0xfe, 0x96, 0x53, 0xfb, 0x76, 0x72, 0x6a, 0x1b, + 0xcd, 0xbb, 0x69, 0x90, 0xf0, 0x49, 0x60, 0xb2, 0x21, 0x5f, 0xc0, 0x84, 0x54, 0x90, 0x04, 0x63, + 0xee, 0x44, 0x74, 0xa7, 0x33, 0x63, 0x93, 0x86, 0x73, 0x4e, 0x30, 0x62, 0x4d, 0x96, 0x6b, 0x0c, + 0xe7, 0x3c, 0x70, 0x9a, 0x26, 0x1b, 0x24, 0xa2, 0xc9, 0x06, 0x6c, 0xee, 0x07, 0x40, 0xd2, 0xfd, + 0xea, 0x36, 0x8b, 0xc7, 0xb5, 0x59, 0x3c, 0x57, 0x81, 0xa9, 0x8c, 0x0e, 0x9c, 0x89, 0xc5, 0x0f, + 0x80, 0xa4, 0x5b, 0x7a, 0x16, 0x0e, 0xd6, 0x75, 0x78, 0x43, 0x89, 0x40, 0xcd, 0x06, 0x83, 0xa7, + 0x34, 0x3c, 0xff, 0x66, 0x2f, 0x94, 0xbb, 0xa0, 0x92, 0x3f, 0x28, 0x24, 0xa5, 0xcd, 0x67, 0xe3, + 0x07, 0x49, 0x69, 0x67, 0xd3, 0x67, 0x88, 0x7d, 0xf1, 0xc3, 0x9f, 0xfe, 0xf5, 0x0b, 0x2b, 0xfc, + 0xe9, 0x21, 0x3b, 0xbb, 0xb4, 0xfa, 0x75, 0x69, 0xd9, 0x30, 0x6d, 0x1c, 0x95, 0x4e, 0xb3, 0x67, + 0x5c, 0x06, 0x10, 0x29, 0x3e, 0xd7, 0xfd, 0x03, 0xa1, 0x9e, 0x69, 0x10, 0xeb, 0x1e, 0xcc, 0x24, + 0x78, 0x0a, 0x63, 0xf8, 0x77, 0x41, 0x3d, 0xf0, 0x46, 0xa6, 0x7d, 0x8b, 0xe7, 0x7e, 0x71, 0x5c, + 0x1e, 0x67, 0x9a, 0xf4, 0xcd, 0x38, 0x7e, 0xbc, 0xfc, 0xcb, 0xda, 0xd0, 0xcd, 0xf9, 0x95, 0xa6, + 0x1e, 0xf8, 0x86, 0xdc, 0x81, 0x41, 0x0e, 0x49, 0x44, 0x69, 0xd6, 0xb1, 0xc5, 0x9a, 0x20, 0x10, + 0xad, 0x19, 0x7c, 0x8e, 0x8a, 0x3f, 0x2a, 0x71, 0xf8, 0x04, 0x6b, 0x97, 0x67, 0x2d, 0x89, 0xc1, + 0x2a, 0x12, 0x74, 0x7f, 0x25, 0x0e, 0xf3, 0x20, 0x7d, 0x2f, 0x24, 0x9e, 0xe7, 0x3f, 0x6b, 0xd2, + 0x06, 0xcf, 0x08, 0xb7, 0x38, 0x26, 0x7c, 0x2f, 0xfa, 0x1d, 0xc6, 0x00, 0xc9, 0xac, 0x4f, 0x61, + 0x86, 0x6d, 0xd0, 0x41, 0xb2, 0x3e, 0xcc, 0x55, 0xc0, 0x60, 0xa6, 0x43, 0xbb, 0xc3, 0x40, 0xe8, + 0xd0, 0x2e, 0x0a, 0xad, 0x75, 0xb8, 0xc0, 0x8d, 0x81, 0x7a, 0x97, 0x62, 0xd3, 0xfb, 0x00, 0xfe, + 0x4e, 0x3c, 0x66, 0xcc, 0xe8, 0x3d, 0xc7, 0xb3, 0x3e, 0xc1, 0xd7, 0x32, 0x62, 0x92, 0xba, 0xbe, + 0x17, 0x5b, 0xfe, 0x4e, 0xf7, 0xbc, 0xf6, 0xff, 0x86, 0xf9, 0x4a, 0xab, 0x45, 0xbd, 0x46, 0x4c, + 0xb8, 0x13, 0x38, 0xa7, 0x0c, 0x7e, 0x40, 0x2a, 0x30, 0x80, 0xd8, 0xea, 0xde, 0x52, 0x34, 0x37, + 0xa3, 0x39, 0x88, 0x27, 0xc2, 0x76, 0x62, 0x05, 0x9c, 0xd2, 0x6a, 0xc0, 0x6c, 0xb5, 0xbd, 0x7f, + 0xe4, 0x46, 0xe8, 0x06, 0x8f, 0x01, 0x44, 0x64, 0xdd, 0x6b, 0x32, 0xd1, 0x14, 0x17, 0xc6, 0xf5, + 0xf8, 0x55, 0x05, 0x7a, 0xd2, 0x8b, 0xa0, 0x22, 0x4f, 0xef, 0xdc, 0x8c, 0x49, 0xd1, 0xea, 0xc1, + 0x6b, 0xc1, 0x62, 0x91, 0x8c, 0xca, 0x9a, 0x82, 0x73, 0xfa, 0x1d, 0x10, 0x9f, 0x21, 0x33, 0x30, + 0x65, 0xde, 0xed, 0x70, 0xf0, 0xd7, 0x30, 0xcd, 0x6d, 0xcf, 0x3c, 0xec, 0xf6, 0x42, 0x1c, 0x61, + 0xba, 0x77, 0x6f, 0x21, 0xe1, 0x7f, 0x8f, 0x6e, 0xb9, 0x2a, 0xa1, 0xc2, 0xde, 0x02, 0x7f, 0xf1, + 0xf8, 0x74, 0xc1, 0xb8, 0x41, 0xec, 0xdd, 0x5b, 0x58, 0x1c, 0x12, 0xe1, 0x4b, 0x19, 0x77, 0x3e, + 0xfc, 0xdf, 0x0a, 0xf7, 0x05, 0x7c, 0x64, 0xbf, 0x4a, 0x1d, 0x7c, 0x10, 0x93, 0xfd, 0x54, 0x79, + 0x02, 0x7a, 0xdd, 0x86, 0x3c, 0xad, 0xbb, 0x0d, 0xeb, 0x4f, 0x0b, 0x70, 0x9d, 0xeb, 0x40, 0xd9, + 0x74, 0x78, 0xd1, 0x93, 0x43, 0x4c, 0xde, 0x07, 0x9e, 0xb5, 0x5d, 0x28, 0x9a, 0x96, 0x68, 0x79, + 0x27, 0x4e, 0x9c, 0x80, 0x54, 0x60, 0x4c, 0x7f, 0x52, 0x72, 0xba, 0xf0, 0x70, 0xf6, 0xe8, 0xd1, + 0x63, 0x47, 0x3d, 0x33, 0x79, 0x02, 0x17, 0x57, 0xbe, 0x61, 0x13, 0x42, 0xec, 0x4e, 0x42, 0x61, + 0x8f, 0x9f, 0xc2, 0x4e, 0xee, 0x88, 0x19, 0x63, 0x9e, 0xa6, 0x93, 0x60, 0x76, 0x34, 0x95, 0x1b, + 0x9c, 0xd2, 0x9a, 0x47, 0x6c, 0x03, 0x66, 0xfd, 0x45, 0x01, 0xe6, 0xb3, 0x6b, 0x13, 0x0b, 0xcb, + 0x1a, 0x9c, 0x5b, 0x72, 0x3c, 0xdf, 0x73, 0xeb, 0x4e, 0xb3, 0x5a, 0x3f, 0xa4, 0x8d, 0xb6, 0x0a, + 0x72, 0xaa, 0x56, 0x99, 0x03, 0xea, 0x49, 0x72, 0x89, 0x62, 0xa7, 0xa9, 0xd8, 0xa1, 0x0c, 0x5f, + 0x25, 0xf0, 0xb5, 0xb7, 0x49, 0x03, 0xc5, 0x8f, 0xb7, 0x2c, 0xa7, 0x94, 0xdc, 0x96, 0x46, 0xf6, + 0xc6, 0xae, 0xe7, 0x46, 0x8a, 0x88, 0x5b, 0x57, 0xb2, 0x8a, 0xac, 0x7f, 0x57, 0x80, 0x0b, 0x98, + 0xd7, 0xc8, 0xc8, 0x94, 0x18, 0xc7, 0xfa, 0x95, 0xe1, 0x6a, 0x0b, 0xc6, 0x2b, 0x0b, 0x03, 0xdb, + 0x8c, 0x5b, 0x4b, 0xde, 0x86, 0xfe, 0xaa, 0x74, 0x92, 0x9a, 0x48, 0xa4, 0xa1, 0x95, 0x29, 0xff, + 0xfd, 0x20, 0xb2, 0x11, 0x8b, 0xed, 0x39, 0xcb, 0x34, 0xac, 0x53, 0x0f, 0xf3, 0x05, 0xf3, 0xc3, + 0xbe, 0x06, 0x89, 0x43, 0x15, 0xf5, 0xe7, 0x85, 0x2a, 0x1a, 0x30, 0x43, 0x15, 0x59, 0x4f, 0x79, + 0x56, 0xa3, 0x64, 0x87, 0xc4, 0x20, 0x7d, 0x92, 0x4a, 0x2f, 0xcc, 0xf7, 0x81, 0xf3, 0x59, 0x3d, + 0xdb, 0xbb, 0x9b, 0xca, 0x1c, 0x9c, 0x1f, 0x5b, 0x77, 0x1b, 0x5e, 0x33, 0x70, 0x2b, 0xcd, 0xa6, + 0xff, 0x8c, 0x36, 0xb6, 0x03, 0xff, 0xc8, 0x8f, 0x8c, 0xac, 0x2e, 0x22, 0xbf, 0x76, 0x7c, 0x8d, + 0x22, 0x66, 0x65, 0x02, 0x6c, 0xfd, 0x5f, 0xf0, 0x7a, 0x17, 0x8e, 0xa2, 0x53, 0x55, 0x38, 0xe7, + 0x24, 0xca, 0xa4, 0xb7, 0xcb, 0xeb, 0x59, 0xfd, 0x4a, 0x32, 0x0a, 0xed, 0x34, 0xfd, 0x8d, 0x1d, + 0x23, 0x25, 0x2f, 0x29, 0xc1, 0xf4, 0xb6, 0xbd, 0xb5, 0xbc, 0xbb, 0xb4, 0x53, 0xdb, 0xf9, 0x62, + 0x7b, 0xa5, 0xb6, 0xbb, 0xf9, 0x70, 0x73, 0xeb, 0xd1, 0x26, 0x0f, 0x4e, 0x6d, 0x94, 0xec, 0xac, + 0x54, 0x36, 0x8a, 0x05, 0x32, 0x0d, 0x45, 0x03, 0xbc, 0xb2, 0xbb, 0x58, 0xec, 0xbd, 0xf1, 0xb5, + 0x91, 0x6a, 0x96, 0xcc, 0x43, 0xa9, 0xba, 0xbb, 0xbd, 0xbd, 0x65, 0x2b, 0xae, 0x7a, 0x68, 0xec, + 0x19, 0x38, 0x67, 0x94, 0xde, 0xb3, 0x57, 0x56, 0x8a, 0x05, 0xd6, 0x14, 0x03, 0xbc, 0x6d, 0xaf, + 0x6c, 0xac, 0xed, 0x6e, 0x14, 0x7b, 0x6f, 0xd4, 0xf4, 0xa7, 0x5d, 0xe4, 0x22, 0xcc, 0x2e, 0xaf, + 0xec, 0xad, 0x2d, 0xad, 0x64, 0xf1, 0x9e, 0x86, 0xa2, 0x5e, 0xb8, 0xb3, 0xb5, 0xb3, 0xcd, 0x59, + 0xeb, 0xd0, 0x47, 0x2b, 0x8b, 0x95, 0xdd, 0x9d, 0xd5, 0xcd, 0x62, 0x9f, 0xd5, 0x3f, 0xdc, 0x5b, + 0xec, 0xbd, 0xf1, 0x23, 0xe3, 0xdd, 0x17, 0x6b, 0xbe, 0x40, 0xdf, 0xad, 0x56, 0xee, 0xe7, 0x57, + 0xc1, 0x4b, 0x37, 0xee, 0x55, 0x8a, 0x05, 0x72, 0x09, 0x2e, 0x18, 0xd0, 0xed, 0x4a, 0xb5, 0xfa, + 0x68, 0xcb, 0x5e, 0x5e, 0x5f, 0xa9, 0x56, 0x8b, 0xbd, 0x37, 0xf6, 0x8c, 0xf0, 0x6c, 0xac, 0x86, + 0x8d, 0x7b, 0x95, 0x9a, 0xbd, 0xf2, 0xd9, 0xee, 0x9a, 0xbd, 0xb2, 0x9c, 0xae, 0xc1, 0x28, 0xfd, + 0x62, 0xa5, 0x5a, 0x2c, 0x90, 0x29, 0x98, 0x34, 0xa0, 0x9b, 0x5b, 0xc5, 0xde, 0x1b, 0x6f, 0x88, + 0x08, 0x5e, 0x64, 0x02, 0x60, 0x79, 0xa5, 0xba, 0xb4, 0xb2, 0xb9, 0xbc, 0xb6, 0x79, 0xbf, 0xd8, + 0x43, 0xc6, 0x61, 0xa4, 0xa2, 0x7e, 0x16, 0x6e, 0x7c, 0x08, 0x93, 0x89, 0x13, 0x35, 0xc3, 0x50, + 0x87, 0xd1, 0x62, 0x0f, 0x8a, 0x5f, 0xfe, 0x44, 0xb3, 0x26, 0x3f, 0x1c, 0x17, 0x0b, 0x37, 0x16, + 0x65, 0xea, 0x53, 0xed, 0x3b, 0x27, 0xa3, 0x30, 0xb4, 0xbc, 0x72, 0xaf, 0xb2, 0xbb, 0xbe, 0x53, + 0xec, 0x61, 0x3f, 0x96, 0xec, 0x95, 0xca, 0xce, 0xca, 0x72, 0xb1, 0x40, 0x46, 0x60, 0xa0, 0xba, + 0x53, 0xd9, 0x59, 0x29, 0xf6, 0x92, 0x61, 0xe8, 0xdf, 0xad, 0xae, 0xd8, 0xc5, 0xbe, 0x85, 0x3f, + 0xfa, 0x83, 0x02, 0xb7, 0xed, 0xc9, 0x37, 0x44, 0x5f, 0x6b, 0x87, 0x49, 0xb1, 0xe4, 0x89, 0x3c, + 0x8f, 0xb9, 0x27, 0x47, 0xd4, 0x02, 0xe6, 0x3a, 0x5c, 0x76, 0x20, 0xc2, 0xf5, 0xc2, 0xed, 0x02, + 0xb1, 0xd1, 0x39, 0x24, 0x71, 0xb6, 0x52, 0x9c, 0xb3, 0x8f, 0xbf, 0x73, 0x97, 0x3a, 0x1e, 0xc9, + 0xc8, 0xaf, 0x81, 0xa5, 0xf3, 0xcc, 0x39, 0x81, 0x7c, 0xf7, 0x74, 0x27, 0x0d, 0x59, 0xe7, 0x1b, + 0xa7, 0x43, 0x27, 0x0f, 0x60, 0x9c, 0xe9, 0xe6, 0x0a, 0x8d, 0x5c, 0x4c, 0x12, 0x6a, 0xc7, 0x81, + 0xb9, 0xf9, 0xec, 0x42, 0x95, 0x8a, 0x65, 0x0c, 0x3b, 0xc2, 0x0f, 0xd6, 0x21, 0x91, 0x51, 0x1e, + 0x24, 0x84, 0xaf, 0xf8, 0x73, 0xe7, 0x12, 0xe0, 0xbd, 0x3b, 0xb7, 0x0b, 0xa4, 0x8a, 0x21, 0xd6, + 0x0c, 0x25, 0x9f, 0xc8, 0x47, 0x6d, 0x69, 0xed, 0x9f, 0xb7, 0xa6, 0xac, 0x12, 0x27, 0xe6, 0x9c, + 0x0e, 0x36, 0x81, 0xa4, 0x75, 0x67, 0x72, 0x25, 0x9e, 0x07, 0xd9, 0x6a, 0xf5, 0xdc, 0xf9, 0x94, + 0xcf, 0xdf, 0x0a, 0xd3, 0x9e, 0xc8, 0x0a, 0x4c, 0x88, 0x27, 0xdc, 0x42, 0x9b, 0x27, 0x9d, 0xce, + 0x03, 0xb9, 0x6c, 0xee, 0xa3, 0x9c, 0xd4, 0x89, 0x80, 0xcc, 0xc5, 0xfd, 0x48, 0x1e, 0x13, 0xe6, + 0x2e, 0x66, 0x96, 0x89, 0xfe, 0xdd, 0x83, 0x09, 0xf3, 0x70, 0x41, 0xe4, 0x00, 0x65, 0x9e, 0x39, + 0x72, 0x1b, 0x54, 0x83, 0xd9, 0x0d, 0xc7, 0xc5, 0x2b, 0x0a, 0xe1, 0x59, 0x26, 0xfd, 0xc2, 0x48, + 0xb9, 0x83, 0xa3, 0x58, 0x95, 0x7a, 0x0d, 0x35, 0x08, 0x79, 0x61, 0xd5, 0xf1, 0xb3, 0xa9, 0x4a, + 0x1d, 0xd9, 0xf4, 0xab, 0x23, 0x96, 0x99, 0x0c, 0x37, 0xcb, 0x55, 0x72, 0x2e, 0xcf, 0xbb, 0x97, + 0x6c, 0xa0, 0x92, 0x9e, 0xe0, 0xa8, 0xcd, 0x89, 0x33, 0xb3, 0x2b, 0x61, 0x20, 0x01, 0x2d, 0x89, + 0xb8, 0x28, 0x0c, 0x49, 0x8e, 0xe0, 0x72, 0x99, 0xdd, 0x2e, 0x90, 0xaf, 0xf1, 0xab, 0xce, 0x64, + 0xf7, 0xc8, 0x8d, 0x0e, 0x85, 0xf6, 0x73, 0x31, 0x93, 0x81, 0xf8, 0x50, 0x3a, 0x70, 0xb7, 0x61, + 0x3a, 0xcb, 0xa1, 0x58, 0x09, 0xb4, 0x83, 0xb7, 0x71, 0xee, 0x2c, 0xb0, 0xd9, 0x51, 0xa3, 0x91, + 0x3f, 0x48, 0x1d, 0xfc, 0x59, 0x73, 0x79, 0x7e, 0x0c, 0x13, 0x6c, 0x96, 0x3c, 0xa4, 0xb4, 0x55, + 0x69, 0xba, 0x4f, 0x69, 0x48, 0x64, 0x7c, 0x5c, 0x05, 0xca, 0xa3, 0xbd, 0x5e, 0x20, 0xdf, 0x81, + 0xd1, 0x47, 0x4e, 0x54, 0x3f, 0x14, 0x71, 0x22, 0x65, 0x18, 0x49, 0x84, 0xcd, 0xc9, 0x5f, 0x58, + 0x78, 0xbb, 0x40, 0xbe, 0x0f, 0x43, 0xf7, 0x69, 0x84, 0x8f, 0x8a, 0xaf, 0x2a, 0xdf, 0x3a, 0x6e, + 0x9b, 0x5c, 0xf3, 0xd4, 0xcb, 0x19, 0xd9, 0xe0, 0xa4, 0x01, 0x95, 0xdc, 0x02, 0xe0, 0x0b, 0x02, + 0x72, 0x48, 0x16, 0xcf, 0xa5, 0x9a, 0x4d, 0xee, 0x33, 0xe5, 0xa1, 0x49, 0x23, 0x7a, 0xda, 0x2a, + 0xf3, 0x64, 0xb4, 0x0e, 0x13, 0x2a, 0x7b, 0xcd, 0x26, 0x86, 0xf3, 0xb0, 0x12, 0xcc, 0xc2, 0x33, + 0x70, 0xfb, 0x90, 0x7d, 0x15, 0x3c, 0x75, 0x2b, 0xc6, 0x7d, 0xc0, 0x95, 0x74, 0x56, 0x0f, 0x1e, + 0xa1, 0x2f, 0xa1, 0x52, 0x88, 0x1c, 0x4d, 0xa3, 0x5d, 0xf5, 0xc3, 0xc8, 0xa4, 0x55, 0x90, 0x6c, + 0xda, 0x5f, 0x85, 0x39, 0xbd, 0x5e, 0x33, 0x50, 0x71, 0xbc, 0xe6, 0xe6, 0xc5, 0x3f, 0x9e, 0xbb, + 0xda, 0x01, 0x43, 0x9c, 0xdf, 0xfa, 0x7e, 0xbb, 0xb7, 0x80, 0xcb, 0xc9, 0x32, 0x4c, 0xc9, 0xba, + 0xb6, 0x5a, 0xd4, 0xab, 0x56, 0x57, 0x31, 0x53, 0x89, 0xf4, 0xe4, 0xd0, 0x60, 0x92, 0x3b, 0x49, + 0x17, 0xb1, 0xad, 0xcf, 0x88, 0xef, 0x40, 0x3a, 0x45, 0x7d, 0x88, 0xb7, 0xbe, 0xcc, 0x08, 0xba, + 0x0f, 0xb9, 0x51, 0xc9, 0x50, 0xfe, 0xf7, 0x16, 0x48, 0x87, 0x03, 0xd0, 0x5c, 0xce, 0x11, 0xe2, + 0x76, 0x81, 0x7c, 0x01, 0x24, 0x7d, 0x24, 0x51, 0x22, 0xcc, 0x3d, 0x7e, 0x29, 0x11, 0x76, 0x38, + 0xcf, 0xac, 0xc0, 0x94, 0x8a, 0xee, 0x12, 0x97, 0x93, 0x9c, 0xb6, 0x74, 0xd8, 0xc1, 0x66, 0x32, + 0xd8, 0xec, 0x2d, 0x74, 0x60, 0x94, 0x09, 0x27, 0x9f, 0xc2, 0x94, 0x98, 0xfb, 0x46, 0x7b, 0x8a, + 0x6a, 0x19, 0x13, 0x87, 0x9b, 0xdc, 0x96, 0x3c, 0x80, 0x99, 0x6a, 0x42, 0xf0, 0xdc, 0x8f, 0xfd, + 0x82, 0xc9, 0x02, 0x81, 0x55, 0x1a, 0x71, 0xc9, 0x67, 0xf3, 0x7a, 0x08, 0x84, 0xdb, 0x96, 0x24, + 0xbb, 0xa7, 0x2e, 0x7d, 0x46, 0x2e, 0x25, 0x9a, 0xce, 0x80, 0x88, 0x86, 0xeb, 0x60, 0x6e, 0xcf, + 0x76, 0x78, 0xfe, 0x62, 0x84, 0x1a, 0x37, 0xe0, 0x57, 0x0c, 0x02, 0xe3, 0x12, 0x5d, 0x8c, 0xe3, + 0x85, 0x5c, 0x0c, 0xf2, 0x1b, 0x18, 0x9d, 0xb5, 0xf3, 0xe9, 0x8c, 0x7c, 0x27, 0xeb, 0x10, 0x9d, + 0x73, 0xbe, 0x9c, 0x7b, 0xfb, 0x74, 0xc8, 0xea, 0x3c, 0x3c, 0x7e, 0x9f, 0x46, 0xdb, 0xcd, 0xf6, + 0x81, 0x8b, 0x99, 0x2d, 0x89, 0xb2, 0x3d, 0x29, 0x90, 0x98, 0xde, 0x32, 0x28, 0x5a, 0x5c, 0x50, + 0xa5, 0x3f, 0x26, 0x6b, 0x50, 0xe4, 0xdb, 0x88, 0xc6, 0xe2, 0x52, 0x8a, 0x85, 0x40, 0x71, 0x02, + 0xe7, 0x28, 0xcc, 0x1d, 0xad, 0x5b, 0xdc, 0xe5, 0x88, 0xc8, 0x4f, 0x5b, 0xd7, 0x53, 0xa7, 0x0c, + 0x98, 0x8a, 0x58, 0xcf, 0x46, 0xc4, 0xa6, 0x21, 0x8d, 0x64, 0x18, 0x18, 0x9e, 0xd7, 0xf4, 0x5a, + 0xac, 0x33, 0xa4, 0x4b, 0xe3, 0x15, 0x24, 0x11, 0xb2, 0x6c, 0xef, 0x2e, 0x51, 0xb9, 0x5e, 0x33, + 0x98, 0xbe, 0x61, 0xa8, 0x36, 0x67, 0xe3, 0xfb, 0x0e, 0x6e, 0x65, 0x18, 0xfa, 0x66, 0x26, 0x6e, + 0x1b, 0xfb, 0x2d, 0xa9, 0xc6, 0x35, 0xaa, 0xbd, 0x05, 0x5c, 0x19, 0xd9, 0x5e, 0xcb, 0x34, 0xe1, + 0x76, 0x10, 0x50, 0x8f, 0x13, 0xe7, 0xa9, 0x2d, 0x59, 0xd4, 0x9f, 0xe0, 0x0a, 0xa6, 0x51, 0xf3, + 0xe7, 0x76, 0xdd, 0x58, 0xf0, 0x3c, 0x3c, 0xb7, 0x0b, 0xe4, 0x7d, 0x18, 0x16, 0x6d, 0x64, 0x44, + 0x46, 0xa3, 0xc3, 0x0e, 0xad, 0x46, 0x4a, 0xe0, 0x42, 0xc2, 0x36, 0x9b, 0x38, 0x79, 0xa3, 0xcf, + 0xdb, 0xfc, 0x3e, 0xdb, 0xb3, 0x1b, 0x2f, 0x42, 0xb9, 0x24, 0x37, 0x6f, 0xa4, 0x2c, 0xa9, 0x48, + 0x2c, 0x12, 0xd4, 0x65, 0x97, 0xe5, 0x4c, 0x98, 0xfa, 0x8d, 0x31, 0x07, 0x55, 0xe8, 0x30, 0xa5, + 0x7e, 0x1b, 0xe0, 0x6e, 0x5b, 0xf6, 0x1a, 0x14, 0x2b, 0x75, 0xdc, 0x50, 0xaa, 0xf4, 0xc8, 0x69, + 0x1d, 0xfa, 0x01, 0x55, 0x67, 0x9f, 0x64, 0x81, 0xe4, 0x35, 0xa3, 0x14, 0x14, 0x51, 0xb0, 0x4e, + 0x1d, 0x0c, 0xcc, 0x3c, 0xab, 0x34, 0x94, 0x44, 0x51, 0x36, 0x45, 0x87, 0xb3, 0xce, 0xf4, 0x12, + 0x3b, 0x9d, 0x35, 0x5f, 0x8e, 0xcd, 0x87, 0xb8, 0x60, 0x28, 0xe4, 0x50, 0xed, 0x10, 0x0a, 0xa4, + 0x4e, 0x85, 0xf2, 0xe5, 0x8d, 0x42, 0xad, 0xc8, 0xab, 0xe7, 0x58, 0x2c, 0x79, 0xd4, 0x79, 0xd5, + 0x7f, 0x0f, 0x26, 0x56, 0xd8, 0x82, 0xde, 0x6e, 0xb8, 0x3c, 0x18, 0x3d, 0x31, 0xa3, 0x8b, 0xe7, + 0x12, 0xae, 0xca, 0xd4, 0x57, 0x48, 0x2a, 0x2c, 0x08, 0x72, 0x4f, 0xd1, 0x60, 0x72, 0x3c, 0xa6, + 0x25, 0x5b, 0x91, 0x0f, 0x00, 0x4f, 0xf8, 0xc2, 0x64, 0x30, 0xcb, 0x15, 0xcb, 0x4a, 0xab, 0xd5, + 0x94, 0x96, 0x6d, 0x7e, 0x53, 0xff, 0xba, 0x71, 0x12, 0x4d, 0x95, 0x4b, 0xde, 0x69, 0xdd, 0xf3, + 0x73, 0x2d, 0x15, 0x6d, 0x0e, 0xcf, 0x9c, 0xf2, 0x6e, 0x73, 0x51, 0x85, 0x8f, 0xae, 0x34, 0x9b, + 0x29, 0xe2, 0x90, 0xbc, 0x65, 0x72, 0xcf, 0xc2, 0xe9, 0x56, 0x03, 0x9e, 0xf4, 0xb9, 0xf2, 0x56, + 0x69, 0xb5, 0xf8, 0x62, 0x79, 0x59, 0x2d, 0x18, 0x66, 0x41, 0xfa, 0xa4, 0x9f, 0x2c, 0x17, 0x6b, + 0xfb, 0x03, 0x9c, 0x66, 0x71, 0xbe, 0x5a, 0xa2, 0x9f, 0x9b, 0x93, 0xe9, 0x7a, 0x95, 0x2e, 0x97, + 0x28, 0x54, 0xfb, 0xc4, 0x64, 0x22, 0x75, 0xbf, 0x32, 0xf0, 0xa4, 0x52, 0xfa, 0x73, 0x7e, 0x97, + 0xf3, 0x8a, 0x95, 0xc1, 0xb5, 0x98, 0xcc, 0x09, 0xae, 0xba, 0x9c, 0x93, 0x6b, 0x5e, 0x75, 0x39, + 0x37, 0x99, 0xf8, 0x03, 0x28, 0x26, 0xd3, 0x11, 0x2b, 0xa6, 0x39, 0x79, 0x8a, 0x73, 0xc7, 0xe4, + 0x1e, 0x4c, 0xeb, 0x23, 0xaa, 0xfa, 0x9d, 0xb7, 0xfa, 0xe7, 0xf1, 0xd9, 0x81, 0x99, 0xcc, 0xec, + 0xc1, 0x6a, 0x8b, 0xed, 0x94, 0x5b, 0x38, 0x97, 0x2b, 0x85, 0xf3, 0xd9, 0x09, 0xc4, 0xc9, 0x6b, + 0xa6, 0xfd, 0x20, 0x3b, 0x9d, 0xf2, 0xdc, 0xeb, 0x5d, 0xb0, 0x84, 0x40, 0xbf, 0xc6, 0x1d, 0x30, + 0x55, 0xc7, 0x55, 0xcd, 0xa2, 0x90, 0x53, 0x81, 0xd5, 0x09, 0x45, 0xcd, 0x81, 0xe9, 0x8c, 0xe2, + 0x7c, 0x11, 0x5f, 0xcb, 0xe7, 0x19, 0x4f, 0xac, 0x3d, 0x19, 0x25, 0x39, 0x57, 0x32, 0x1d, 0x13, + 0x4d, 0x77, 0x38, 0x92, 0xce, 0xa9, 0xf9, 0x70, 0xfa, 0x26, 0xe7, 0x9b, 0x97, 0xa6, 0xb3, 0xd2, + 0x9b, 0x27, 0xad, 0x3f, 0x59, 0xd9, 0xab, 0x95, 0x18, 0x3a, 0xe6, 0x47, 0xdf, 0xe3, 0x96, 0x20, + 0x93, 0xbb, 0x6e, 0x09, 0xca, 0x64, 0x7d, 0x25, 0x1f, 0x21, 0x9e, 0x11, 0x46, 0xec, 0x75, 0xd1, + 0x7f, 0xfd, 0x9c, 0x95, 0x9d, 0xd8, 0x5a, 0xcd, 0x88, 0x4c, 0x14, 0xc1, 0xdd, 0x96, 0x1f, 0x5d, + 0x8e, 0x58, 0x3a, 0x24, 0xf5, 0xee, 0x70, 0x1c, 0x2a, 0xc5, 0x03, 0x97, 0x68, 0xf6, 0x59, 0x87, + 0xed, 0x6b, 0xb8, 0x90, 0x9b, 0xc0, 0x9b, 0xbc, 0x99, 0xfa, 0xa0, 0x73, 0x24, 0x91, 0xdf, 0xd2, + 0x71, 0x23, 0xf7, 0xb6, 0x32, 0x85, 0x25, 0xd2, 0x7c, 0xa7, 0x56, 0xec, 0x8c, 0x1c, 0xe0, 0xf7, + 0x51, 0xf3, 0xd5, 0xf2, 0x78, 0xe7, 0xf6, 0xf5, 0x52, 0x16, 0x9f, 0x30, 0xbd, 0xa6, 0x6a, 0xed, + 0x92, 0x9a, 0x58, 0xb2, 0xe0, 0x2c, 0x6b, 0xea, 0x69, 0x9a, 0x96, 0xc7, 0x67, 0x19, 0x46, 0xb5, + 0x04, 0xe0, 0xe4, 0x82, 0x21, 0x26, 0x63, 0x97, 0x9c, 0x33, 0x3a, 0x67, 0x6e, 0x90, 0x4b, 0x68, + 0x73, 0x56, 0x69, 0xc4, 0x73, 0x5b, 0x71, 0x31, 0xcd, 0xc3, 0xb0, 0x37, 0x2b, 0x29, 0xf0, 0xd6, + 0xcc, 0x27, 0x85, 0x63, 0x34, 0x28, 0xbf, 0x4b, 0x44, 0x17, 0x4d, 0x97, 0x26, 0xe5, 0x6b, 0xa8, + 0x53, 0x22, 0xcb, 0x28, 0x26, 0x43, 0x91, 0x31, 0xf9, 0xce, 0x2b, 0xe3, 0x99, 0x06, 0xed, 0x60, + 0xcb, 0xd8, 0xc6, 0xa7, 0x1d, 0x19, 0x19, 0xd1, 0xd5, 0x1a, 0xda, 0x31, 0x61, 0x7a, 0x86, 0x76, + 0xa6, 0x56, 0xe5, 0x5c, 0x8e, 0x1d, 0x53, 0xa4, 0xe7, 0xb6, 0xf4, 0x87, 0xda, 0xaa, 0x9c, 0xca, + 0x7b, 0x4e, 0xae, 0x27, 0x55, 0xb3, 0xbc, 0xd4, 0xe8, 0x1d, 0x56, 0xfd, 0xe9, 0xac, 0x94, 0xe9, + 0x9a, 0x01, 0x38, 0x37, 0x9f, 0x7a, 0x86, 0x14, 0xd4, 0xf2, 0x96, 0xc3, 0xad, 0x43, 0x02, 0xf5, + 0xdc, 0x16, 0x7e, 0xa9, 0x2d, 0x6f, 0x89, 0x44, 0xe7, 0xea, 0xc0, 0xdd, 0x25, 0x13, 0x7a, 0x2e, + 0xef, 0x4d, 0x7c, 0x0c, 0x94, 0xce, 0x52, 0xae, 0x74, 0x97, 0x4e, 0x39, 0xcc, 0x33, 0xed, 0xc3, + 0x33, 0xe9, 0x2e, 0x32, 0x7e, 0xe7, 0x13, 0xd6, 0xdd, 0x6e, 0x0d, 0x53, 0xeb, 0x70, 0x46, 0x76, + 0xf3, 0xc4, 0x3a, 0x9c, 0x9f, 0xff, 0xbc, 0xc3, 0x41, 0x67, 0xb2, 0xea, 0x1e, 0x78, 0x5a, 0x72, + 0x72, 0x75, 0xcc, 0x49, 0xe7, 0x4b, 0x57, 0x4b, 0x4c, 0x56, 0x2e, 0xf3, 0x2d, 0xa6, 0xe1, 0x70, + 0xfd, 0x5c, 0x4f, 0x33, 0x4d, 0xe6, 0xf2, 0xb3, 0x6b, 0xab, 0xe5, 0x26, 0x33, 0x2f, 0xb5, 0xc6, + 0x50, 0xcf, 0xf1, 0xac, 0x18, 0x66, 0xa4, 0x9b, 0x56, 0x0c, 0x33, 0x93, 0x42, 0xdf, 0x42, 0xbb, + 0x8a, 0xed, 0x37, 0xa9, 0x6e, 0x57, 0xd1, 0x92, 0x06, 0x27, 0xcc, 0x1a, 0xe4, 0x23, 0x34, 0x6a, + 0x74, 0xb6, 0x84, 0xcc, 0x9a, 0x9c, 0x74, 0xdf, 0x91, 0x11, 0x95, 0x91, 0x59, 0x59, 0xd1, 0x93, + 0x49, 0xa1, 0xe7, 0x4a, 0xe9, 0x02, 0x41, 0xff, 0xae, 0xb4, 0x8b, 0x60, 0x83, 0x4b, 0xa6, 0x3d, + 0x29, 0xbf, 0xcd, 0xef, 0x4a, 0xa3, 0x88, 0x41, 0x96, 0xca, 0xc7, 0x9c, 0x24, 0xfb, 0x1e, 0x8c, + 0xc5, 0xb9, 0x97, 0xf7, 0x16, 0x34, 0xc2, 0x44, 0x42, 0xe6, 0x24, 0xe1, 0xfb, 0xf2, 0xe2, 0x04, + 0xeb, 0x33, 0x0b, 0x3b, 0xdb, 0x4f, 0x3e, 0x91, 0x46, 0x18, 0xa3, 0xa5, 0xa9, 0x4c, 0xce, 0x1d, + 0x56, 0xee, 0x31, 0x3d, 0x61, 0xa4, 0x9a, 0x17, 0x19, 0x29, 0x5f, 0xd5, 0xbc, 0xc8, 0x4a, 0xd9, + 0x1a, 0x5f, 0x2c, 0x7c, 0x21, 0x2d, 0x0e, 0x31, 0xd3, 0x4b, 0x46, 0xb3, 0x52, 0x7c, 0x2f, 0xe7, + 0x15, 0x27, 0x59, 0x57, 0xa1, 0x98, 0xcc, 0x6e, 0xa9, 0x8e, 0x6b, 0x39, 0x69, 0x48, 0xd5, 0x19, + 0x30, 0x37, 0x2d, 0xe6, 0xb6, 0x34, 0x9f, 0x9b, 0x7c, 0xaf, 0x66, 0x37, 0x4a, 0x67, 0xdd, 0x59, + 0x2d, 0x8b, 0x13, 0x5d, 0xea, 0x07, 0xe9, 0x54, 0x22, 0x4d, 0x5d, 0x2d, 0xcb, 0xc8, 0x8d, 0xe9, + 0xca, 0x70, 0x4e, 0xd9, 0xf9, 0xb6, 0xdf, 0x32, 0x4f, 0xb8, 0x1d, 0xa2, 0xa2, 0x77, 0xbd, 0x64, + 0x26, 0xbf, 0x02, 0xb3, 0x39, 0x01, 0xa4, 0xc9, 0xeb, 0x09, 0x43, 0x6c, 0x76, 0x80, 0x69, 0x35, + 0x41, 0x32, 0x33, 0x50, 0x6f, 0xa0, 0x77, 0x82, 0x11, 0xb8, 0x21, 0x75, 0xe3, 0xf7, 0xc8, 0x8d, + 0x0e, 0x79, 0xa2, 0x65, 0x6d, 0xcd, 0xcd, 0x8c, 0xf8, 0x40, 0xaa, 0x78, 0x5e, 0x31, 0xa0, 0x19, + 0x97, 0x7e, 0x19, 0x0c, 0xe7, 0xb2, 0x19, 0xb2, 0xb5, 0x83, 0xcd, 0x85, 0x8c, 0xa8, 0x1a, 0x6a, + 0x2e, 0xe4, 0x47, 0xdc, 0xc8, 0x6d, 0xe6, 0xb6, 0x54, 0xb0, 0xb2, 0x39, 0xe6, 0x07, 0xd8, 0xc8, + 0xe5, 0xf8, 0x80, 0x71, 0x4c, 0xc5, 0xcc, 0x20, 0x39, 0xe8, 0x9d, 0x57, 0x0f, 0x5b, 0xee, 0xd7, + 0x26, 0xd5, 0x82, 0xd6, 0xbe, 0xbc, 0xe8, 0x1c, 0xb9, 0xed, 0x5b, 0x91, 0xdf, 0x53, 0x76, 0xfb, + 0x4e, 0xbb, 0x63, 0xab, 0xeb, 0xb1, 0x44, 0xd8, 0x16, 0xa3, 0xa3, 0x1a, 0x7c, 0x2e, 0x07, 0x4e, + 0x36, 0xd1, 0xdd, 0x28, 0x09, 0xd5, 0x0e, 0xae, 0xd9, 0x71, 0x61, 0x72, 0xf9, 0xf1, 0x79, 0x6c, + 0xc4, 0xd5, 0x38, 0xcb, 0x3c, 0x4e, 0x04, 0xe4, 0x10, 0xf3, 0xd8, 0x80, 0x9e, 0x6d, 0x1e, 0x27, + 0x18, 0x9a, 0xf3, 0x38, 0xd9, 0xcc, 0xa4, 0x21, 0x20, 0x77, 0x54, 0x93, 0xcd, 0x54, 0xf3, 0x38, + 0x9b, 0x63, 0x7e, 0xfc, 0x93, 0x5c, 0x8e, 0x6a, 0x1e, 0x9b, 0x1c, 0x73, 0xd0, 0x4f, 0x39, 0x8f, + 0x93, 0x95, 0x98, 0xf3, 0xf8, 0x4c, 0xed, 0x53, 0xf3, 0x38, 0xbb, 0x7d, 0x67, 0x9e, 0xc7, 0x89, + 0x80, 0x41, 0x46, 0x47, 0xb3, 0xe6, 0x71, 0x12, 0x9f, 0xcf, 0xe3, 0x24, 0x34, 0x61, 0x80, 0xe9, + 0x30, 0x8f, 0x93, 0x94, 0x9f, 0x21, 0xbf, 0x44, 0xb0, 0x93, 0xd3, 0xcc, 0xe4, 0xdc, 0x38, 0x29, + 0xe4, 0x11, 0x5a, 0xff, 0x12, 0xf0, 0xd3, 0xcd, 0xe6, 0xf9, 0x3c, 0xa6, 0x38, 0x9f, 0xf7, 0xa4, + 0x10, 0x93, 0xcd, 0x35, 0x4d, 0x5b, 0xd9, 0xb1, 0x5e, 0x3a, 0x34, 0x78, 0x8f, 0xcd, 0x9b, 0x46, + 0x07, 0xbe, 0x9d, 0x42, 0xd5, 0x74, 0xe0, 0xab, 0xce, 0x41, 0x49, 0xbe, 0xb9, 0x24, 0x9d, 0xe7, + 0xf7, 0xe7, 0xf2, 0xfe, 0x23, 0x49, 0xb7, 0x90, 0x38, 0x59, 0x9d, 0xb9, 0xa5, 0xea, 0x84, 0x95, + 0x6c, 0xe9, 0x59, 0xe7, 0xf9, 0x86, 0xd4, 0x1e, 0x52, 0x31, 0xae, 0x12, 0x9d, 0xd6, 0xe7, 0x7a, + 0x6e, 0x09, 0xd9, 0x41, 0x53, 0x6f, 0x1a, 0xae, 0x99, 0x89, 0xf3, 0x82, 0x69, 0x75, 0xe5, 0x9a, + 0x8a, 0xd6, 0xa3, 0x73, 0xcd, 0x0b, 0xe5, 0xa3, 0xb8, 0xa6, 0xa9, 0x3f, 0x45, 0xd3, 0x99, 0x78, + 0xd3, 0xe5, 0x3d, 0xf6, 0xf3, 0xcf, 0x39, 0x53, 0x86, 0x4b, 0x14, 0xc3, 0x45, 0x4f, 0xb4, 0x8f, + 0xc5, 0x05, 0x9f, 0x04, 0xe6, 0x0a, 0x3f, 0x8b, 0x9e, 0x7c, 0x0a, 0x45, 0xb1, 0xbc, 0xc5, 0x0c, + 0xb2, 0x10, 0x73, 0x87, 0x6e, 0x51, 0x5a, 0xec, 0x4e, 0xd1, 0x82, 0xd3, 0x58, 0xea, 0x4e, 0x23, + 0x89, 0x7c, 0xb3, 0x16, 0xdb, 0x0e, 0x77, 0x82, 0x76, 0x18, 0xd1, 0x46, 0xda, 0x1c, 0x65, 0x36, + 0x46, 0x3a, 0x4e, 0x98, 0xe8, 0x7b, 0x0b, 0x64, 0x0d, 0xd7, 0x36, 0x13, 0xdc, 0xc9, 0x5e, 0x97, + 0xcd, 0x06, 0x97, 0x9e, 0x55, 0xf5, 0x78, 0xc8, 0x6c, 0x53, 0x5e, 0xdd, 0xf9, 0x8d, 0x52, 0x22, + 0x3a, 0x65, 0xef, 0xf2, 0x44, 0xc4, 0x0f, 0xd4, 0xdc, 0x76, 0xd8, 0x4d, 0x32, 0xc9, 0xe7, 0x4c, + 0xe4, 0x07, 0x30, 0x22, 0x89, 0xbb, 0x0b, 0x24, 0x49, 0x8d, 0x02, 0x59, 0x86, 0x71, 0xe3, 0xad, + 0x96, 0x3a, 0xdd, 0x64, 0xbd, 0xe0, 0xea, 0x30, 0xce, 0xe3, 0xc6, 0x9b, 0x2c, 0xc5, 0x25, 0xeb, + 0xa5, 0x56, 0x2e, 0x97, 0xef, 0xc3, 0xa8, 0x10, 0x69, 0x47, 0x69, 0xe4, 0x1b, 0xeb, 0x66, 0x34, + 0xbf, 0xe7, 0x76, 0xc3, 0x8d, 0x96, 0x7c, 0xef, 0xb1, 0x7b, 0xd0, 0x55, 0x30, 0x69, 0x92, 0xbd, + 0x05, 0xf2, 0x15, 0xa6, 0x25, 0x96, 0xc9, 0xa2, 0x69, 0xf4, 0xcc, 0x0f, 0x9e, 0xb8, 0xde, 0x41, + 0x17, 0x96, 0x57, 0x4c, 0x96, 0x49, 0x3a, 0xe9, 0x5a, 0xf2, 0x15, 0xcc, 0x55, 0xf3, 0x99, 0x77, + 0x65, 0xd2, 0x79, 0x7b, 0xa9, 0xc2, 0x3c, 0x3a, 0xd7, 0x9c, 0xb5, 0xed, 0x1d, 0x99, 0x7e, 0xc1, + 0xc3, 0x24, 0x4a, 0x43, 0x7f, 0xdd, 0x0f, 0x1a, 0xdd, 0x39, 0x96, 0x4d, 0x77, 0xdd, 0x04, 0x99, + 0x14, 0xc6, 0x17, 0x70, 0xa1, 0x9a, 0xcb, 0xba, 0x1b, 0x8b, 0x6e, 0x9a, 0xe4, 0x45, 0x14, 0xc5, + 0x19, 0xdb, 0xdd, 0x91, 0xe7, 0x1a, 0xae, 0x69, 0x6c, 0x1f, 0xda, 0x0e, 0xe8, 0x63, 0x1a, 0xa0, + 0x53, 0x78, 0x37, 0x77, 0x68, 0x13, 0x5d, 0xf6, 0x7c, 0x0d, 0xce, 0x55, 0x53, 0xac, 0xf2, 0x48, + 0x3a, 0xb7, 0xea, 0x01, 0x4c, 0x61, 0x4f, 0x4f, 0xd9, 0xae, 0x2e, 0x4e, 0x44, 0xa3, 0xf7, 0x69, + 0xb4, 0xbb, 0xd6, 0x45, 0x4a, 0xf2, 0xd5, 0x82, 0x44, 0xdc, 0xbb, 0xc3, 0x28, 0xab, 0x1a, 0x65, + 0x1a, 0x23, 0xf7, 0xe3, 0xfd, 0x81, 0xbc, 0x48, 0xe9, 0x5a, 0x6d, 0x1e, 0x87, 0xbb, 0xb8, 0x16, + 0x0a, 0xc7, 0x68, 0xcd, 0x04, 0xc9, 0x21, 0xb1, 0xa9, 0x4e, 0xf3, 0x91, 0x0e, 0x49, 0x85, 0x1f, + 0xff, 0xf8, 0xf4, 0x10, 0xb0, 0xcb, 0x29, 0x87, 0xf9, 0x8e, 0x2c, 0xb8, 0x09, 0x75, 0xdd, 0xaf, + 0x3f, 0xd1, 0x4d, 0xa8, 0x5a, 0xe2, 0xfa, 0x39, 0x33, 0xad, 0xbc, 0x58, 0xf1, 0x31, 0xb7, 0xbc, + 0xee, 0x17, 0xa6, 0xa7, 0xae, 0xd7, 0x4d, 0xa8, 0x66, 0x92, 0xfd, 0xbb, 0xd2, 0xb6, 0x88, 0x15, + 0x9a, 0x9c, 0x73, 0x45, 0xa3, 0xcc, 0x8a, 0x48, 0x64, 0x9a, 0x15, 0xf5, 0x86, 0xe6, 0x5f, 0x04, + 0x90, 0x74, 0x96, 0x7d, 0x75, 0x58, 0xc9, 0x4d, 0xc0, 0xdf, 0xc1, 0xbd, 0x6b, 0x4a, 0x38, 0x05, + 0x19, 0x82, 0x57, 0xa1, 0x86, 0xd3, 0x65, 0xb1, 0x28, 0x75, 0x5f, 0xa5, 0xdb, 0x05, 0xb2, 0x09, + 0xe7, 0xef, 0xd3, 0x48, 0xac, 0x71, 0x36, 0x0d, 0xa3, 0xc0, 0xad, 0x47, 0x1d, 0x6f, 0x15, 0xe5, + 0xd9, 0x24, 0x83, 0x66, 0xef, 0x1d, 0xc6, 0xaf, 0x9a, 0xcd, 0xaf, 0x23, 0x5d, 0x07, 0x0f, 0x5a, + 0x71, 0x55, 0x71, 0x96, 0x26, 0xe6, 0x4f, 0xf1, 0x21, 0xee, 0xa0, 0x93, 0x4f, 0x5a, 0x8c, 0xe3, + 0x9a, 0x88, 0xd3, 0xd6, 0x4d, 0x18, 0xe4, 0x44, 0xb9, 0x1b, 0xea, 0x98, 0x4e, 0x43, 0xee, 0xc0, + 0x88, 0xf2, 0xb0, 0x21, 0x46, 0x51, 0x6e, 0xbb, 0xee, 0xc0, 0x08, 0x3f, 0x5a, 0x9d, 0x9e, 0xe4, + 0x23, 0x18, 0x51, 0x2e, 0x39, 0x67, 0xde, 0xe9, 0x3f, 0x85, 0x71, 0xdd, 0x39, 0xe7, 0xec, 0x82, + 0xfc, 0x3e, 0xde, 0xfd, 0xca, 0x2b, 0x96, 0x7c, 0xfa, 0x99, 0x44, 0x2e, 0x2f, 0x21, 0x52, 0xbe, + 0x40, 0x4a, 0x60, 0x6e, 0xf3, 0xcf, 0xa5, 0xa8, 0xc9, 0x47, 0xf2, 0xbd, 0x94, 0x22, 0x4e, 0x23, + 0x75, 0x90, 0xd9, 0x04, 0x17, 0xf3, 0x8b, 0x10, 0xab, 0x05, 0xb6, 0x6b, 0xb3, 0x4f, 0x73, 0x47, + 0xdd, 0x5d, 0x74, 0x79, 0x5c, 0xb6, 0x50, 0x4b, 0x4b, 0x65, 0x99, 0xcb, 0x67, 0x74, 0x39, 0x3f, + 0x31, 0x1d, 0x0e, 0xc6, 0x03, 0x3c, 0x05, 0xa6, 0x4a, 0x73, 0xbb, 0xd7, 0x21, 0xd1, 0x5d, 0x7c, + 0xec, 0x4d, 0xb3, 0xeb, 0x40, 0xd6, 0xe9, 0x14, 0x2d, 0x5e, 0x81, 0xbe, 0x12, 0x76, 0x6b, 0xd2, + 0xc7, 0xf1, 0xf4, 0x9d, 0xcd, 0x6f, 0xd9, 0xc5, 0x8c, 0x5b, 0xf1, 0xae, 0x63, 0x91, 0xc7, 0xee, + 0x57, 0x50, 0x3b, 0xcc, 0x0c, 0xf7, 0x95, 0xcf, 0xec, 0xba, 0xe6, 0x58, 0x91, 0x49, 0xa9, 0x36, + 0xbd, 0x27, 0xf8, 0x10, 0x2d, 0x3b, 0x0f, 0xdf, 0x1b, 0x5d, 0xb8, 0x48, 0x49, 0xbc, 0xd9, 0x15, + 0x4f, 0xdd, 0xb1, 0x5e, 0xe4, 0x3b, 0x6c, 0x76, 0x7d, 0x5d, 0xf2, 0x0a, 0x66, 0x5c, 0x7b, 0x2b, + 0x07, 0xd2, 0x6c, 0x86, 0xa6, 0x03, 0x69, 0xc7, 0x3e, 0xe4, 0x89, 0xff, 0x33, 0x28, 0xc7, 0xde, + 0x23, 0x67, 0x1b, 0x84, 0x7c, 0xbf, 0x45, 0x92, 0x92, 0x54, 0x48, 0x3a, 0x25, 0xda, 0x99, 0xbb, + 0x9a, 0x27, 0xe1, 0x50, 0x73, 0x4b, 0x12, 0x7e, 0x6f, 0x89, 0x8c, 0x94, 0x79, 0xb9, 0x2d, 0x3b, + 0xd8, 0x61, 0xc5, 0xcb, 0xbc, 0x57, 0xc2, 0x28, 0x3d, 0xda, 0x67, 0x67, 0xa4, 0x9c, 0x3b, 0x12, + 0x8c, 0xac, 0x0e, 0xc3, 0x7b, 0x16, 0xdf, 0xb5, 0xe4, 0x50, 0x9c, 0x75, 0x40, 0x9d, 0xf8, 0x35, + 0x5a, 0x22, 0x3a, 0xa0, 0xfe, 0x02, 0x38, 0x5d, 0x94, 0x7c, 0x4a, 0x95, 0x85, 0xa1, 0x3c, 0xaa, + 0x4a, 0xb2, 0x0a, 0x06, 0x67, 0x47, 0x11, 0x3f, 0x70, 0xa3, 0xe7, 0x4b, 0xf6, 0x7a, 0x6c, 0x56, + 0xd0, 0x0b, 0x24, 0x6f, 0x90, 0x85, 0xf6, 0x3a, 0xf9, 0x12, 0x97, 0x12, 0xc1, 0x7e, 0xd1, 0xf7, + 0xa3, 0x30, 0x0a, 0x9c, 0x56, 0xb5, 0x1e, 0xb8, 0xad, 0x28, 0xb7, 0xd3, 0xb1, 0x8b, 0x77, 0x16, + 0x99, 0xe6, 0x71, 0x2a, 0xa2, 0xc7, 0x67, 0xc5, 0xd7, 0x51, 0xaf, 0x6e, 0xb2, 0x0a, 0x3b, 0x9c, + 0x5c, 0xaa, 0x32, 0x5e, 0xfc, 0xab, 0x64, 0x5a, 0x83, 0xd9, 0x9c, 0xa8, 0x44, 0xea, 0xf6, 0xb6, + 0x73, 0xd4, 0xa2, 0xb9, 0xce, 0x15, 0x93, 0xaf, 0x60, 0x26, 0x33, 0x6c, 0x91, 0xb2, 0x40, 0x77, + 0x0a, 0x6a, 0xd4, 0x8d, 0xf9, 0x13, 0x28, 0xf1, 0xf7, 0x1e, 0xe8, 0xd6, 0x6c, 0x44, 0xb0, 0x89, + 0x5f, 0x01, 0xe5, 0x20, 0x24, 0xd7, 0xeb, 0x7c, 0x3c, 0xf5, 0xa4, 0x7d, 0x1a, 0x43, 0x97, 0x24, + 0x12, 0x9e, 0xab, 0x0f, 0x2f, 0xab, 0xb0, 0xd3, 0x53, 0xa3, 0x6d, 0x98, 0xd9, 0xa3, 0x81, 0xfb, + 0xf8, 0x79, 0x92, 0xa1, 0x94, 0x4c, 0x66, 0x69, 0x27, 0x8e, 0x9f, 0xc3, 0xec, 0x92, 0x7f, 0xd4, + 0x12, 0x8f, 0xfa, 0x0c, 0x9e, 0xea, 0x2a, 0x3e, 0xbb, 0xbc, 0xbb, 0x23, 0xd4, 0x5c, 0x7e, 0x6a, + 0x7a, 0xe5, 0xff, 0xd6, 0x35, 0x7b, 0xbd, 0x7a, 0x9a, 0x66, 0xd2, 0xef, 0xe0, 0x24, 0xcc, 0xca, + 0x55, 0xaf, 0x4f, 0xc2, 0x0e, 0xb9, 0xec, 0x73, 0x9e, 0x88, 0xcd, 0xe6, 0xa4, 0xa7, 0xef, 0xc0, + 0xf5, 0x14, 0xad, 0xdd, 0x94, 0x7b, 0x8b, 0x99, 0xc8, 0x3b, 0xe1, 0x53, 0x9d, 0x99, 0xe5, 0x3b, + 0xb3, 0x9d, 0x5a, 0xec, 0x86, 0x66, 0xb3, 0x83, 0x8a, 0x45, 0xf4, 0xe0, 0x0d, 0x0c, 0x13, 0x8d, + 0xf8, 0xe3, 0x3a, 0x6d, 0xa7, 0xd5, 0x3a, 0x45, 0x8c, 0x4a, 0xed, 0x87, 0x30, 0x56, 0xd5, 0x2b, + 0xcf, 0xa8, 0x24, 0x77, 0x52, 0xa8, 0x47, 0x42, 0xdd, 0xdb, 0xde, 0xc1, 0x91, 0x54, 0x6d, 0x3c, + 0xa7, 0xea, 0x45, 0xae, 0xeb, 0x8c, 0x91, 0x95, 0x4d, 0xed, 0x02, 0x59, 0x49, 0x13, 0x95, 0xeb, + 0x4c, 0x76, 0x22, 0xb7, 0x1a, 0xcf, 0x23, 0x93, 0xcc, 0x89, 0x49, 0xac, 0xee, 0xc9, 0x67, 0x95, + 0xcb, 0x7c, 0xc7, 0xa4, 0x9a, 0xdc, 0xcf, 0x27, 0xce, 0x43, 0xa7, 0xfb, 0xf9, 0xa4, 0xb2, 0xdb, + 0xe9, 0x7e, 0x3e, 0x19, 0xa9, 0xeb, 0x56, 0x90, 0x57, 0x9c, 0x80, 0xa7, 0x83, 0x31, 0x42, 0xb1, + 0xc9, 0xc8, 0xf3, 0xf3, 0x50, 0x0f, 0x01, 0xc2, 0xd3, 0xf6, 0x74, 0xb0, 0xb5, 0x26, 0x43, 0x7f, + 0x24, 0xf2, 0xfc, 0xdc, 0x83, 0x22, 0xcf, 0x60, 0x10, 0x47, 0x4d, 0x8c, 0xfd, 0x06, 0xd3, 0x89, + 0x15, 0x3a, 0x0c, 0x6a, 0x31, 0x19, 0x6f, 0x4e, 0x99, 0xcc, 0x72, 0x02, 0xd1, 0x75, 0x98, 0xaa, + 0x10, 0x47, 0x95, 0x53, 0x86, 0xa9, 0x54, 0xa0, 0xb9, 0xb9, 0x0b, 0x19, 0x25, 0x4a, 0xa5, 0x1c, + 0xd3, 0x63, 0xd0, 0xa9, 0x2e, 0x65, 0x04, 0xa6, 0x9b, 0xbb, 0x98, 0x59, 0x26, 0x18, 0x45, 0x3c, + 0xff, 0x72, 0x76, 0xd6, 0xe8, 0xf8, 0x9d, 0x57, 0x07, 0x1c, 0x59, 0xcd, 0x8d, 0xd3, 0xa0, 0x8a, + 0x5a, 0xa9, 0x4a, 0x3f, 0x94, 0x91, 0xaa, 0xfa, 0xcd, 0x8c, 0xf7, 0x18, 0x06, 0x46, 0xec, 0x0d, + 0xd6, 0x39, 0x6f, 0x36, 0x79, 0x24, 0xd3, 0xc1, 0xe4, 0xd4, 0xd4, 0x8d, 0x41, 0xee, 0x08, 0x3e, + 0x92, 0x09, 0x60, 0x5e, 0x35, 0xe3, 0x7d, 0x98, 0x4f, 0x3c, 0xf7, 0x30, 0x19, 0xdf, 0xc8, 0x7e, + 0x13, 0x92, 0x29, 0x9e, 0x7c, 0x9d, 0xfd, 0x4a, 0xfa, 0x6d, 0x48, 0x62, 0xdc, 0xcf, 0xba, 0xe6, + 0x6d, 0xc0, 0x04, 0x2e, 0x33, 0x32, 0xe9, 0x7a, 0x1c, 0x81, 0xc6, 0x04, 0x27, 0x43, 0x21, 0x25, + 0x4b, 0x95, 0xcb, 0xec, 0x98, 0x78, 0x33, 0xcc, 0x53, 0xb8, 0xcf, 0x99, 0x0f, 0x89, 0x11, 0x98, + 0xb5, 0x8b, 0x89, 0xcc, 0xf0, 0xe4, 0xfb, 0x30, 0x19, 0x3f, 0x25, 0xe6, 0x2c, 0x32, 0xd0, 0x3a, + 0x18, 0xca, 0x26, 0xe3, 0xf7, 0xc4, 0x67, 0x27, 0x5f, 0x95, 0x5b, 0x51, 0x4c, 0x7e, 0x29, 0xf5, + 0x4c, 0xc6, 0xe8, 0xc3, 0x69, 0x76, 0x24, 0x4d, 0xb6, 0x67, 0x1d, 0x9d, 0x3a, 0x7e, 0x6e, 0xd9, + 0xc1, 0x15, 0xf5, 0xcf, 0xad, 0x63, 0x00, 0x48, 0xa5, 0xfe, 0xe6, 0xf0, 0xd9, 0x80, 0x6b, 0x18, + 0x90, 0x65, 0x9b, 0x87, 0xe0, 0xcb, 0xc6, 0xca, 0x6f, 0x7b, 0x32, 0x8c, 0x4b, 0x13, 0xae, 0x76, + 0x8d, 0x2e, 0x49, 0x6e, 0x19, 0x2e, 0x2e, 0xdd, 0xe3, 0x50, 0x76, 0x7a, 0x9a, 0x96, 0x15, 0xa4, + 0x51, 0xed, 0xb3, 0x1d, 0xe2, 0x45, 0xaa, 0x7d, 0xb6, 0x63, 0x94, 0xc7, 0xcf, 0x31, 0xc7, 0x92, + 0xd8, 0xa3, 0x30, 0xc8, 0x12, 0xf5, 0x78, 0xd8, 0xe9, 0x8e, 0xd7, 0x3e, 0x57, 0xcd, 0x4b, 0xd1, + 0x14, 0x21, 0x9e, 0x69, 0x2e, 0x8b, 0x93, 0x58, 0x1e, 0xf3, 0xee, 0x4c, 0x3a, 0xb8, 0x56, 0x5f, + 0xe6, 0x13, 0xf0, 0xcc, 0x2d, 0xcf, 0x81, 0x2f, 0x2e, 0xff, 0xec, 0x3f, 0x5f, 0x2e, 0xfc, 0xec, + 0xe7, 0x97, 0x0b, 0xff, 0xfe, 0xe7, 0x97, 0x0b, 0xff, 0xe9, 0xe7, 0x97, 0x0b, 0x5f, 0x2e, 0x9c, + 0x2e, 0xf8, 0x71, 0xbd, 0xe9, 0x52, 0x2f, 0xba, 0xc5, 0xd9, 0x0d, 0xe2, 0x7f, 0x77, 0xff, 0x77, + 0x00, 0x00, 0x00, 0xff, 0xff, 0xbd, 0x9d, 0x6e, 0x3e, 0x9c, 0xe6, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -28268,6 +28361,46 @@ func (m *Features) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.AccessMonitoringConfigured { + i-- + if m.AccessMonitoringConfigured { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x2 + i-- + dAtA[i] = 0xa0 + } + if len(m.Entitlements) > 0 { + for k := range m.Entitlements { + v := m.Entitlements[k] + baseI := i + if v != nil { + { + size, err := v.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintAuthservice(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + i -= len(k) + copy(dAtA[i:], k) + i = encodeVarintAuthservice(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = encodeVarintAuthservice(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x2 + i-- + dAtA[i] = 0x9a + } + } if m.MobileDeviceManagement { i-- if m.MobileDeviceManagement { @@ -28616,6 +28749,48 @@ func (m *Features) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *EntitlementInfo) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *EntitlementInfo) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *EntitlementInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.Limit != 0 { + i = encodeVarintAuthservice(dAtA, i, uint64(m.Limit)) + i-- + dAtA[i] = 0x10 + } + if m.Enabled { + i-- + if m.Enabled { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + func (m *DeviceTrustFeature) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -29351,12 +29526,12 @@ func (m *GenerateAppTokenRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) dAtA[i] = 0x2a } } - n25, err25 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err25 != nil { - return 0, err25 + n26, err26 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err26 != nil { + return 0, err26 } - i -= n25 - i = encodeVarintAuthservice(dAtA, i, uint64(n25)) + i -= n26 + i = encodeVarintAuthservice(dAtA, i, uint64(n26)) i-- dAtA[i] = 0x22 if len(m.URI) > 0 { @@ -32673,21 +32848,21 @@ func (m *GetEventsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x22 } } - n60, err60 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.EndDate, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.EndDate):]) - if err60 != nil { - return 0, err60 - } - i -= n60 - i = encodeVarintAuthservice(dAtA, i, uint64(n60)) - i-- - dAtA[i] = 0x1a - n61, err61 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.StartDate, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.StartDate):]) + n61, err61 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.EndDate, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.EndDate):]) if err61 != nil { return 0, err61 } i -= n61 i = encodeVarintAuthservice(dAtA, i, uint64(n61)) i-- + dAtA[i] = 0x1a + n62, err62 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.StartDate, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.StartDate):]) + if err62 != nil { + return 0, err62 + } + i -= n62 + i = encodeVarintAuthservice(dAtA, i, uint64(n62)) + i-- dAtA[i] = 0x12 if len(m.Namespace) > 0 { i -= len(m.Namespace) @@ -32740,21 +32915,21 @@ func (m *GetSessionEventsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) i-- dAtA[i] = 0x18 } - n62, err62 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.EndDate, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.EndDate):]) - if err62 != nil { - return 0, err62 - } - i -= n62 - i = encodeVarintAuthservice(dAtA, i, uint64(n62)) - i-- - dAtA[i] = 0x12 - n63, err63 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.StartDate, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.StartDate):]) + n63, err63 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.EndDate, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.EndDate):]) if err63 != nil { return 0, err63 } i -= n63 i = encodeVarintAuthservice(dAtA, i, uint64(n63)) i-- + dAtA[i] = 0x12 + n64, err64 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.StartDate, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.StartDate):]) + if err64 != nil { + return 0, err64 + } + i -= n64 + i = encodeVarintAuthservice(dAtA, i, uint64(n64)) + i-- dAtA[i] = 0xa return len(dAtA) - i, nil } @@ -34119,12 +34294,12 @@ func (m *RecoveryCodes) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n70, err70 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) - if err70 != nil { - return 0, err70 + n71, err71 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + if err71 != nil { + return 0, err71 } - i -= n70 - i = encodeVarintAuthservice(dAtA, i, uint64(n70)) + i -= n71 + i = encodeVarintAuthservice(dAtA, i, uint64(n71)) i-- dAtA[i] = 0x12 if len(m.Codes) > 0 { @@ -35568,12 +35743,12 @@ func (m *SessionTrackerUpdateExpiry) MarshalToSizedBuffer(dAtA []byte) (int, err copy(dAtA[i:], m.XXX_unrecognized) } if m.Expires != nil { - n95, err95 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Expires):]) - if err95 != nil { - return 0, err95 + n96, err96 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Expires):]) + if err96 != nil { + return 0, err96 } - i -= n95 - i = encodeVarintAuthservice(dAtA, i, uint64(n95)) + i -= n96 + i = encodeVarintAuthservice(dAtA, i, uint64(n96)) i-- dAtA[i] = 0xa } @@ -39278,6 +39453,40 @@ func (m *Features) Size() (n int) { if m.MobileDeviceManagement { n += 3 } + if len(m.Entitlements) > 0 { + for k, v := range m.Entitlements { + _ = k + _ = v + l = 0 + if v != nil { + l = v.Size() + l += 1 + sovAuthservice(uint64(l)) + } + mapEntrySize := 1 + len(k) + sovAuthservice(uint64(len(k))) + l + n += mapEntrySize + 2 + sovAuthservice(uint64(mapEntrySize)) + } + } + if m.AccessMonitoringConfigured { + n += 3 + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *EntitlementInfo) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Enabled { + n += 2 + } + if m.Limit != 0 { + n += 1 + sovAuthservice(uint64(m.Limit)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -48265,6 +48474,245 @@ func (m *Features) Unmarshal(dAtA []byte) error { } } m.MobileDeviceManagement = bool(v != 0) + case 35: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Entitlements", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAuthservice + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAuthservice + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthAuthservice + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Entitlements == nil { + m.Entitlements = make(map[string]*EntitlementInfo) + } + var mapkey string + var mapvalue *EntitlementInfo + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAuthservice + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAuthservice + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return ErrInvalidLengthAuthservice + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthAuthservice + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var mapmsglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAuthservice + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + mapmsglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if mapmsglen < 0 { + return ErrInvalidLengthAuthservice + } + postmsgIndex := iNdEx + mapmsglen + if postmsgIndex < 0 { + return ErrInvalidLengthAuthservice + } + if postmsgIndex > l { + return io.ErrUnexpectedEOF + } + mapvalue = &EntitlementInfo{} + if err := mapvalue.Unmarshal(dAtA[iNdEx:postmsgIndex]); err != nil { + return err + } + iNdEx = postmsgIndex + } else { + iNdEx = entryPreIndex + skippy, err := skipAuthservice(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthAuthservice + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.Entitlements[mapkey] = mapvalue + iNdEx = postIndex + case 36: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AccessMonitoringConfigured", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAuthservice + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.AccessMonitoringConfigured = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := skipAuthservice(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthAuthservice + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *EntitlementInfo) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAuthservice + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: EntitlementInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: EntitlementInfo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Enabled", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAuthservice + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Enabled = bool(v != 0) + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Limit", wireType) + } + m.Limit = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAuthservice + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Limit |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipAuthservice(dAtA[iNdEx:]) diff --git a/api/client/webclient/webconfig.go b/api/client/webclient/webconfig.go index 0bf621a251dac..349489bf218d2 100644 --- a/api/client/webclient/webconfig.go +++ b/api/client/webclient/webconfig.go @@ -72,45 +72,71 @@ type WebConfig struct { // PlayableDatabaseProtocols is a list of database protocols which session // recordings can be played. PlayableDatabaseProtocols []string `json:"playable_db_protocols"` - // HideInaccessibleFeatures is true when features should be undiscoverable to users without the necessary permissions. - // Usually, in order to encourage discoverability of features, we show UI elements even if the user doesn't have permission to access them, - // this flag disables that behavior. - HideInaccessibleFeatures bool `json:"hideInaccessibleFeatures"` // CustomTheme is a string that represents the name of the custom theme that the WebUI should use. CustomTheme string `json:"customTheme"` + // Questionnaire indicates whether cluster users should get an onboarding questionnaire + Questionnaire bool `json:"questionnaire"` + // IsStripeManaged indicates if the cluster billing & lifecycle is managed via Stripe + IsStripeManaged bool `json:"isStripeManaged"` + // PremiumSupport indicates whether the customer has premium support + PremiumSupport bool `json:"premiumSupport"` + // Edition is the edition of Teleport + Edition string `json:"edition"` + // entitlements define a customer’s access to a specific features + Entitlements map[string]EntitlementInfo `json:"entitlements,omitempty"` + + // Deprecated Fields // Deprecated: IsTeam is true if [Features.ProductType] = Team // Prefer checking the cluster features over this flag, as this will be removed. IsTeam bool `json:"isTeam"` + // HideInaccessibleFeatures is true when features should be undiscoverable to users without the necessary permissions. + // Usually, in order to encourage discoverability of features, we show UI elements even if the user doesn't have permission to access them, + // this flag disables that behavior. + // Deprecated, use entitlements + HideInaccessibleFeatures bool `json:"hideInaccessibleFeatures"` // IsIGSEnabled is true if [Features.IdentityGovernance] = true + // Deprecated, use entitlements IsIGSEnabled bool `json:"isIgsEnabled"` // IsPolicyEnabled is true if [Features.Policy] = true + // Deprecated, use entitlements IsPolicyEnabled bool `json:"isPolicyEnabled"` // featureLimits define limits for features. // Typically used with feature teasers if feature is not enabled for the // product type eg: Team product contains teasers to upgrade to Enterprise. + // Deprecated, use entitlements FeatureLimits FeatureLimits `json:"featureLimits"` - // Questionnaire indicates whether cluster users should get an onboarding questionnaire - Questionnaire bool `json:"questionnaire"` - // IsStripeManaged indicates if the cluster billing & lifecycle is managed via Stripe - IsStripeManaged bool `json:"isStripeManaged"` // ExternalAuditStorage indicates whether the EAS feature is enabled in the cluster. + // Deprecated, use entitlements ExternalAuditStorage bool `json:"externalAuditStorage"` - // PremiumSupport indicates whether the customer has premium support - PremiumSupport bool `json:"premiumSupport"` // JoinActiveSessions indicates whether joining active sessions via web UI is enabled + // Deprecated, use entitlements JoinActiveSessions bool `json:"joinActiveSessions"` // AccessRequests indicates whether access requests are enabled + // Deprecated, use entitlements AccessRequests bool `json:"accessRequests"` // TrustedDevices indicates whether trusted devices page is enabled + // Deprecated, use entitlements TrustedDevices bool `json:"trustedDevices"` // OIDC indicates whether the OIDC integration flow is enabled + // Deprecated, use entitlements OIDC bool `json:"oidc"` // SAML indicates whether the SAML integration flow is enabled + // Deprecated, use entitlements SAML bool `json:"saml"` // MobileDeviceManagement indicates whether adding Jamf plugin is enabled + // Deprecated, use entitlements MobileDeviceManagement bool `json:"mobileDeviceManagement"` - // Edition is the edition of Teleport - Edition string `json:"edition"` +} + +// EntitlementInfo is the state and limits of a particular entitlement; Example for feature X: +// { Enabled: true, Limit: 0 } => unlimited access to feature X +// { Enabled: true, Limit: >0 } => limited access to feature X +// { Enabled: false, Limit: >=0 } => no access to feature X +type EntitlementInfo struct { + // Enabled indicates the feature is 'on' if true; feature is disabled if false + Enabled bool `json:"enabled"` + // Limit indicates the allotted amount of use when limited; if 0 use is unlimited + Limit int32 `json:"limit"` } // featureLimits define limits for features. diff --git a/api/proto/teleport/legacy/client/proto/authservice.proto b/api/proto/teleport/legacy/client/proto/authservice.proto index f17d14bf4014c..c2f9be76363ca 100644 --- a/api/proto/teleport/legacy/client/proto/authservice.proto +++ b/api/proto/teleport/legacy/client/proto/authservice.proto @@ -461,34 +461,31 @@ enum SupportType { // Features are auth server features. message Features { // Kubernetes enables Kubernetes Access product + // Deprecated remove in v18; leverage entitlements bool Kubernetes = 1 [(gogoproto.jsontag) = "kubernetes"]; // App enables Application Access product + // Deprecated remove in v18; leverage entitlements bool App = 2 [(gogoproto.jsontag) = "app"]; // DB enables database access product + // Deprecated remove in v18; leverage entitlements bool DB = 3 [(gogoproto.jsontag) = "db"]; // OIDC enables OIDC connectors + // Deprecated remove in v18; leverage entitlements bool OIDC = 4 [(gogoproto.jsontag) = "oidc"]; // SAML enables SAML connectors + // Deprecated remove in v18; leverage entitlements bool SAML = 5 [(gogoproto.jsontag) = "saml"]; // AccessControls enables FIPS access controls bool AccessControls = 6 [(gogoproto.jsontag) = "access_controls"]; - // Currently this flag is to gate actions from OSS clusters. - // - // Determining support for access request is currently determined by: - // 1) Enterprise + [Features.IdentityGovernanceSecurity] == true, new flag - // introduced with Enterprise Usage Based (EUB) product. - // 2) Enterprise + [Features.IsUsageBasedBilling] == false, legacy support - // where before EUB, it was unlimited. - // - // AdvancedAccessWorkflows is currently set to true for all - // enterprise editions (team, cloud, on-prem). Historically, access request - // was only available for enterprise cloud and enterprise on-prem. + // AdvancedAccessWorkflows is currently set to the value of the Cloud AccessRequests entitlement bool AdvancedAccessWorkflows = 7 [(gogoproto.jsontag) = "advanced_access_workflows"]; // Cloud enables some cloud-related features bool Cloud = 8 [(gogoproto.jsontag) = "cloud"]; // HSM enables PKCS#11 HSM support + // Deprecated remove in v18; leverage entitlements bool HSM = 9 [(gogoproto.jsontag) = "hsm"]; // Desktop enables desktop access product + // Deprecated remove in v18; leverage entitlements bool Desktop = 10 [(gogoproto.jsontag) = "desktop"]; reserved 11; // bool ModeratedSessions reserved 12; // bool MachineID @@ -502,17 +499,22 @@ message Features { // IsUsageBased enables some usage-based billing features bool IsUsageBased = 17 [(gogoproto.jsontag) = "is_usage_based"]; // Assist enables the Assistant feature + // Deprecated remove in v18; leverage entitlements bool Assist = 18 [(gogoproto.jsontag) = "assist"]; // DeviceTrust holds its namesake feature settings. + // Deprecated remove in v18; leverage entitlements DeviceTrustFeature DeviceTrust = 19 [(gogoproto.jsontag) = "device_trust,omitempty"]; // FeatureHiding enables hiding features from being discoverable for users who don't have the necessary permissions. + // Deprecated remove in v18; leverage entitlements bool FeatureHiding = 20 [(gogoproto.jsontag) = "feature_hiding,omitempty"]; // AccessRequests holds its namesake feature settings. + // Deprecated remove in v18; leverage entitlements AccessRequestsFeature AccessRequests = 21 [(gogoproto.jsontag) = "access_requests,omitempty"]; // CustomTheme holds the name of WebUI custom theme. string CustomTheme = 22 [(gogoproto.jsontag) = "custom_theme,omitempty"]; // IdentityGovernance indicates whether IGS related features are enabled: // access list, access request, access monitoring, device trust. + // Deprecated remove in v18; leverage entitlements bool IdentityGovernance = 23 [(gogoproto.jsontag) = "identity_governance,omitempty"]; // AccessGraph enables the usage of access graph. // NOTE: this is a legacy flag that is currently used to signal @@ -521,26 +523,46 @@ message Features { // TODO(justinas): remove this field once "TAG enabled" status is moved to a resource in the backend. bool AccessGraph = 24 [(gogoproto.jsontag) = "access_graph,omitempty"]; // AccessListFeature holds its namesake feature settings. + // Deprecated remove in v18; leverage entitlements AccessListFeature AccessList = 25 [(gogoproto.jsontag) = "access_list,omitempty"]; // AccessMonitoringFeature holds its namesake feature settings. + // Deprecated remove in v18; leverage entitlements for access and AccessMonitoringConfigured for enabled AccessMonitoringFeature AccessMonitoring = 26 [(gogoproto.jsontag) = "access_monitoring,omitempty"]; // ProductType describes the product being used. ProductType ProductType = 27 [(gogoproto.jsontag) = "product_type,omitempty"]; // Policy enables the Teleport Policy feature set. // At the time of writing, this includes Teleport Access Graph (TAG). + // Deprecated remove in v18; leverage entitlements PolicyFeature Policy = 28 [(gogoproto.jsontag) = "policy,omitempty"]; // Questionnaire indicates whether cluster users should get an onboarding questionnaire bool Questionnaire = 29 [(gogoproto.jsontag) = "questionnaire,omitempty"]; // IsStripeManaged indicates if the cluster billing is managed via Stripe bool IsStripeManaged = 30 [(gogoproto.jsontag) = "is_stripe_managed,omitempty"]; // ExternalAuditStorage indicates whether the EAS feature is enabled in the cluster. + // Deprecated remove in v18; leverage entitlements bool ExternalAuditStorage = 31 [(gogoproto.jsontag) = "external_audit_storage,omitempty"]; // SupportType indicates the type of the customer's support SupportType SupportType = 32 [(gogoproto.jsontag) = "support_type,omitempty"]; // JoinActiveSessions indicates whether joining active sessions via web UI is enabled + // Deprecated remove in v18; leverage entitlements bool JoinActiveSessions = 33 [(gogoproto.jsontag) = "join_active_sessions,omitempty"]; // MobileDeviceManagement indicates whether endpoint management (like Jamf Plugin) can be used in the cluster + // Deprecated remove in v18; leverage entitlements bool MobileDeviceManagement = 34 [(gogoproto.jsontag) = "mobile_device_management,omitempty"]; + // entitlements define a customer’s access to a specific features + map entitlements = 35; + // AccessMonitoringConfigured contributes to the enablement of access monitoring. + // NOTE: this flag is used to signal that Access Monitoring is *enabled* on a cluster. + // *Access* to the feature is gated on the `AccessMonitoring` entitlement. + bool AccessMonitoringConfigured = 36; +} + +// EntitlementInfo is the state and limits of a particular entitlement +message EntitlementInfo { + // enabled indicates the feature is 'on' if true + bool enabled = 1; + // limit indicates the allotted amount of use when limited + int32 limit = 2; } // DeviceTrustFeature holds the Device Trust feature general and usage-based diff --git a/api/types/license.go b/api/types/license.go index 9b1419f8b49fc..b255b921ee4db 100644 --- a/api/types/license.go +++ b/api/types/license.go @@ -105,7 +105,7 @@ type License interface { // GetSupportsFeatureHiding returns feature hiding support flag. GetSupportsFeatureHiding() Bool - // GetSupportsFeatureHiding sets feature hiding support flag. + // SetSupportsFeatureHiding sets feature hiding support flag. SetSupportsFeatureHiding(Bool) // GetTrial returns the trial flag. @@ -156,8 +156,24 @@ type License interface { // GetSupportsPolicy returns Teleport Policy support flag. GetSupportsPolicy() Bool - //SGetSupportsPolicy sets Teleport Policy support flag. + // SetSupportsPolicy sets Teleport Policy support flag. SetSupportsPolicy(Bool) + + // GetEntitlements returns the Entitlements object + GetEntitlements() map[string]EntitlementInfo + // SetEntitlements sets the Entitlements object + SetEntitlements(map[string]EntitlementInfo) +} + +// EntitlementInfo is the state and limits of a particular entitlement; Example for feature X: +// { Enabled: true, Limit: 0 } => unlimited access to feature X +// { Enabled: true, Limit: >0 } => limited access to feature X +// { Enabled: false, Limit: >=0 } => no access to feature X +type EntitlementInfo struct { + // Enabled indicates the feature is 'on' if true; feature is disabled if false + Enabled Bool + // Limit indicates the allotted amount of use when limited; if 0 use is unlimited + Limit int32 } // FeatureSource defines where the list of features enabled @@ -494,6 +510,16 @@ func (c *LicenseV3) SetSupportsPolicy(value Bool) { c.Spec.SupportsPolicy = value } +// GetEntitlements returns Entitlements +func (c *LicenseV3) GetEntitlements() map[string]EntitlementInfo { + return c.Spec.Entitlements +} + +// SetEntitlements sets Entitlements +func (c *LicenseV3) SetEntitlements(value map[string]EntitlementInfo) { + c.Spec.Entitlements = value +} + // String represents a human readable version of license enabled features func (c *LicenseV3) String() string { var features []string @@ -601,4 +627,7 @@ type LicenseSpecV3 struct { AnonymizationKey string `json:"anonymization_key,omitempty"` // SupportsPolicy turns Teleport Policy features on or off. SupportsPolicy Bool `json:"policy,omitempty"` + + // entitlements define a customer’s access to a specific features + Entitlements map[string]EntitlementInfo `json:"entitlements,omitempty"` } diff --git a/entitlements/entitlements.go b/entitlements/entitlements.go new file mode 100644 index 0000000000000..afde35c8c4f12 --- /dev/null +++ b/entitlements/entitlements.go @@ -0,0 +1,58 @@ +// Teleport +// Copyright (C) 2024 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package entitlements + +type EntitlementKind string + +// The EntitlementKind list should be 1:1 with the Features & FeatureStrings in salescenter/product/product.go, +// except CustomTheme which is dropped. CustomTheme entitlement only toggles the ability to "set" a theme; +// the value of that theme, if set, is stored and accessed outside of entitlements. +// +// All EntitlementKinds added here should also be added to AllEntitlements below and defaultEntitlements in +// web/packages/teleport/src/entitlement.ts. +const ( + AccessLists EntitlementKind = "AccessLists" + AccessMonitoring EntitlementKind = "AccessMonitoring" + AccessRequests EntitlementKind = "AccessRequests" + App EntitlementKind = "App" + CloudAuditLogRetention EntitlementKind = "CloudAuditLogRetention" + DB EntitlementKind = "DB" + Desktop EntitlementKind = "Desktop" + DeviceTrust EntitlementKind = "DeviceTrust" + ExternalAuditStorage EntitlementKind = "ExternalAuditStorage" + FeatureHiding EntitlementKind = "FeatureHiding" + HSM EntitlementKind = "HSM" + Identity EntitlementKind = "Identity" + JoinActiveSessions EntitlementKind = "JoinActiveSessions" + K8s EntitlementKind = "K8s" + MobileDeviceManagement EntitlementKind = "MobileDeviceManagement" + OIDC EntitlementKind = "OIDC" + OktaSCIM EntitlementKind = "OktaSCIM" + OktaUserSync EntitlementKind = "OktaUserSync" + Policy EntitlementKind = "Policy" + SAML EntitlementKind = "SAML" + SessionLocks EntitlementKind = "SessionLocks" + UpsellAlert EntitlementKind = "UpsellAlert" + UsageReporting EntitlementKind = "UsageReporting" +) + +// AllEntitlements returns all Entitlements; should be 1:1 with the const declared above. +var AllEntitlements = []EntitlementKind{ + AccessLists, AccessMonitoring, AccessRequests, App, CloudAuditLogRetention, DB, Desktop, DeviceTrust, + ExternalAuditStorage, FeatureHiding, HSM, Identity, JoinActiveSessions, K8s, MobileDeviceManagement, OIDC, OktaSCIM, + OktaUserSync, Policy, SAML, SessionLocks, UpsellAlert, UsageReporting, +} diff --git a/integration/appaccess/appaccess_test.go b/integration/appaccess/appaccess_test.go index 928b0f039a6f7..0b4b1965dbd18 100644 --- a/integration/appaccess/appaccess_test.go +++ b/integration/appaccess/appaccess_test.go @@ -40,6 +40,7 @@ import ( "github.com/gravitational/teleport" "github.com/gravitational/teleport/api/types" apievents "github.com/gravitational/teleport/api/types/events" + "github.com/gravitational/teleport/entitlements" "github.com/gravitational/teleport/integration/helpers" "github.com/gravitational/teleport/lib/events" "github.com/gravitational/teleport/lib/httplib/reverseproxy" @@ -265,7 +266,9 @@ func testClientCert(p *Pack, t *testing.T) { modules.SetTestModules(t, &modules.TestModules{ TestBuildType: modules.BuildEnterprise, TestFeatures: modules.Features{ - App: true, + Entitlements: map[entitlements.EntitlementKind]modules.EntitlementInfo{ + entitlements.App: {Enabled: true}, + }, }, }) evilUser, _ := p.CreateUser(t) diff --git a/integration/db/db_integration_test.go b/integration/db/db_integration_test.go index 21870f54b6611..ee87900db716d 100644 --- a/integration/db/db_integration_test.go +++ b/integration/db/db_integration_test.go @@ -37,6 +37,7 @@ import ( "github.com/gravitational/teleport" "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/entitlements" "github.com/gravitational/teleport/integration/helpers" "github.com/gravitational/teleport/lib/auth" "github.com/gravitational/teleport/lib/defaults" @@ -108,7 +109,11 @@ func TestDatabaseAccessSeparateListeners(t *testing.T) { func (p *DatabasePack) testIPPinning(t *testing.T) { modules.SetTestModules(t, &modules.TestModules{ TestBuildType: modules.BuildEnterprise, - TestFeatures: modules.Features{DB: true}, + TestFeatures: modules.Features{ + Entitlements: map[entitlements.EntitlementKind]modules.EntitlementInfo{ + entitlements.DB: {Enabled: true}, + }, + }, }) type testCase struct { diff --git a/integration/hsm/hsm_test.go b/integration/hsm/hsm_test.go index f5556ad724595..5c7427b06a148 100644 --- a/integration/hsm/hsm_test.go +++ b/integration/hsm/hsm_test.go @@ -36,6 +36,7 @@ import ( "github.com/gravitational/teleport/api/breaker" "github.com/gravitational/teleport/api/client" "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/entitlements" "github.com/gravitational/teleport/lib/auth/authclient" "github.com/gravitational/teleport/lib/auth/keystore" "github.com/gravitational/teleport/lib/auth/state" @@ -56,7 +57,9 @@ func TestMain(m *testing.M) { modules.SetModules(&modules.TestModules{ TestBuildType: modules.BuildEnterprise, TestFeatures: modules.Features{ - HSM: true, + Entitlements: map[entitlements.EntitlementKind]modules.EntitlementInfo{ + entitlements.HSM: {Enabled: true}, + }, }, }) diff --git a/integration/kube_integration_test.go b/integration/kube_integration_test.go index bcf21232a6062..5f4761a96a870 100644 --- a/integration/kube_integration_test.go +++ b/integration/kube_integration_test.go @@ -72,6 +72,7 @@ import ( apidefaults "github.com/gravitational/teleport/api/defaults" "github.com/gravitational/teleport/api/profile" "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/entitlements" "github.com/gravitational/teleport/integration/helpers" "github.com/gravitational/teleport/integration/kube" "github.com/gravitational/teleport/lib" @@ -1345,7 +1346,9 @@ func testKubeEphemeralContainers(t *testing.T, suite *KubeSuite) { modules.SetTestModules(t, &modules.TestModules{ TestBuildType: modules.BuildEnterprise, TestFeatures: modules.Features{ - Kubernetes: true, + Entitlements: map[entitlements.EntitlementKind]modules.EntitlementInfo{ + entitlements.K8s: {Enabled: true}, + }, }, }) diff --git a/integration/proxy/proxy_tunnel_strategy_test.go b/integration/proxy/proxy_tunnel_strategy_test.go index 3030534d17efc..bf89cf46506e9 100644 --- a/integration/proxy/proxy_tunnel_strategy_test.go +++ b/integration/proxy/proxy_tunnel_strategy_test.go @@ -33,6 +33,7 @@ import ( apidefaults "github.com/gravitational/teleport/api/defaults" "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/entitlements" "github.com/gravitational/teleport/integration/helpers" "github.com/gravitational/teleport/lib" "github.com/gravitational/teleport/lib/auth" @@ -158,7 +159,11 @@ func TestProxyTunnelStrategyProxyPeering(t *testing.T) { // This test cannot run in parallel as set module changes the global state. modules.SetTestModules(t, &modules.TestModules{ TestBuildType: modules.BuildEnterprise, - TestFeatures: modules.Features{DB: true}, + TestFeatures: modules.Features{ + Entitlements: map[entitlements.EntitlementKind]modules.EntitlementInfo{ + entitlements.DB: {Enabled: true}, + }, + }, }) p := newProxyTunnelStrategy(t, "proxy-tunnel-proxy-peer", diff --git a/integrations/access/accesslist/app_test.go b/integrations/access/accesslist/app_test.go index ebb8a1fb3d084..6d4eab0ada7d6 100644 --- a/integrations/access/accesslist/app_test.go +++ b/integrations/access/accesslist/app_test.go @@ -33,6 +33,7 @@ import ( "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/api/types/accesslist" "github.com/gravitational/teleport/api/types/header" + "github.com/gravitational/teleport/entitlements" "github.com/gravitational/teleport/integrations/access/common" "github.com/gravitational/teleport/integrations/access/common/teleport" "github.com/gravitational/teleport/lib/auth" @@ -204,7 +205,9 @@ func TestAccessListReminders_Single(t *testing.T) { func TestAccessListReminders_Batched(t *testing.T) { modules.SetTestModules(t, &modules.TestModules{ TestFeatures: modules.Features{ - IdentityGovernanceSecurity: true, + Entitlements: map[entitlements.EntitlementKind]modules.EntitlementInfo{ + entitlements.AccessLists: {Enabled: true}, + }, }, }) diff --git a/integrations/operator/controllers/resources/setup.go b/integrations/operator/controllers/resources/setup.go index 174206857ffa9..4b97e6f95cc35 100644 --- a/integrations/operator/controllers/resources/setup.go +++ b/integrations/operator/controllers/resources/setup.go @@ -26,7 +26,9 @@ import ( "github.com/gravitational/teleport/api/client" "github.com/gravitational/teleport/api/client/proto" + "github.com/gravitational/teleport/entitlements" "github.com/gravitational/teleport/integrations/operator/controllers" + "github.com/gravitational/teleport/lib/modules" ) type reconcilerFactory struct { @@ -48,20 +50,23 @@ func SetupAllControllers(log logr.Logger, mgr manager.Manager, teleportClient *c {"TeleportOpenSSHEICEServerV2", NewOpenSSHEICEServerV2Reconciler}, } - if features.GetOIDC() { + oidc := modules.GetProtoEntitlement(features, entitlements.OIDC) + saml := modules.GetProtoEntitlement(features, entitlements.SAML) + + if oidc.Enabled { reconcilers = append(reconcilers, reconcilerFactory{"TeleportOIDCConnector", NewOIDCConnectorReconciler}) } else { log.Info("OIDC connectors are only available in Teleport Enterprise edition. TeleportOIDCConnector resources won't be reconciled") } - if features.GetSAML() { + if saml.Enabled { reconcilers = append(reconcilers, reconcilerFactory{"TeleportSAMLConnector", NewSAMLConnectorReconciler}) } else { log.Info("SAML connectors are only available in Teleport Enterprise edition. TeleportSAMLConnector resources won't be reconciled") } // Login Rules are enterprise-only but there is no specific feature flag for them. - if features.GetOIDC() || features.GetSAML() { + if oidc.Enabled || saml.Enabled { reconcilers = append(reconcilers, reconcilerFactory{"TeleportLoginRule", NewLoginRuleReconciler}) } else { log.Info("Login Rules are only available in Teleport Enterprise edition. TeleportLoginRule resources won't be reconciled") diff --git a/integrations/operator/controllers/resources/testlib/env.go b/integrations/operator/controllers/resources/testlib/env.go index 4f0dc33470c85..03b201b0b5946 100644 --- a/integrations/operator/controllers/resources/testlib/env.go +++ b/integrations/operator/controllers/resources/testlib/env.go @@ -46,6 +46,7 @@ import ( "github.com/gravitational/teleport/api/client" "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/entitlements" "github.com/gravitational/teleport/integration/helpers" resourcesv1 "github.com/gravitational/teleport/integrations/operator/apis/resources/v1" resourcesv2 "github.com/gravitational/teleport/integrations/operator/apis/resources/v2" @@ -99,8 +100,10 @@ func defaultTeleportServiceConfig(t *testing.T) (*helpers.TeleInstance, string) modules.SetTestModules(t, &modules.TestModules{ TestBuildType: modules.BuildEnterprise, TestFeatures: modules.Features{ - OIDC: true, - SAML: true, + Entitlements: map[entitlements.EntitlementKind]modules.EntitlementInfo{ + entitlements.OIDC: {Enabled: true}, + entitlements.SAML: {Enabled: true}, + }, }, }) diff --git a/integrations/terraform/testlib/device_trust_test.go b/integrations/terraform/testlib/device_trust_test.go index e61d6e721ac3c..2d27ecd257e68 100644 --- a/integrations/terraform/testlib/device_trust_test.go +++ b/integrations/terraform/testlib/device_trust_test.go @@ -25,13 +25,15 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" "github.com/stretchr/testify/require" - // devicepb "github.com/gravitational/teleport/api/gen/proto/go/teleport/devicetrust/v1" "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/entitlements" + "github.com/gravitational/teleport/lib/modules" ) func (s *TerraformSuiteEnterprise) TestTrustedDevices() { + deviceTrust := modules.GetProtoEntitlement(s.teleportFeatures, entitlements.DeviceTrust) require.True(s.T(), - s.teleportFeatures.GetDeviceTrust().GetEnabled(), + deviceTrust.Enabled, "Test requires Device Trust", ) @@ -92,8 +94,9 @@ func (s *TerraformSuiteEnterprise) TestTrustedDevices() { } func (s *TerraformSuiteEnterprise) TestImportTrustedDevices() { + deviceTrust := modules.GetProtoEntitlement(s.teleportFeatures, entitlements.DeviceTrust) require.True(s.T(), - s.teleportFeatures.GetDeviceTrust().GetEnabled(), + deviceTrust.Enabled, "Test requires Device Trust", ) diff --git a/integrations/terraform/testlib/loginrule_test.go b/integrations/terraform/testlib/loginrule_test.go index 84e7fc080d8be..07057c24ed57f 100644 --- a/integrations/terraform/testlib/loginrule_test.go +++ b/integrations/terraform/testlib/loginrule_test.go @@ -25,11 +25,15 @@ import ( loginrulepb "github.com/gravitational/teleport/api/gen/proto/go/teleport/loginrule/v1" "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/entitlements" + "github.com/gravitational/teleport/lib/modules" ) func (s *TerraformSuiteEnterprise) TestLoginRule() { + oidc := modules.GetProtoEntitlement(s.teleportFeatures, entitlements.OIDC) + saml := modules.GetProtoEntitlement(s.teleportFeatures, entitlements.SAML) require.True(s.T(), - s.teleportFeatures.GetOIDC() || s.teleportFeatures.GetSAML(), + oidc.Enabled || saml.Enabled, "Test requires enterprise version of teleport", ) @@ -108,9 +112,11 @@ func (s *TerraformSuiteEnterprise) TestLoginRule() { } func (s *TerraformSuiteEnterprise) TestImportLoginRule() { + oidc := modules.GetProtoEntitlement(s.teleportFeatures, entitlements.OIDC) + saml := modules.GetProtoEntitlement(s.teleportFeatures, entitlements.SAML) require.True(s.T(), - s.teleportFeatures.GetOIDC() || s.teleportFeatures.GetSAML(), - "Test requires OIDC or SAML", + oidc.Enabled || saml.Enabled, + "Test requires enterprise version of teleport", ) ctx := context.Background() diff --git a/integrations/terraform/testlib/oidc_connector_test.go b/integrations/terraform/testlib/oidc_connector_test.go index 95e0c4d7ff315..95930313bc685 100644 --- a/integrations/terraform/testlib/oidc_connector_test.go +++ b/integrations/terraform/testlib/oidc_connector_test.go @@ -27,10 +27,16 @@ import ( "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/api/types/wrappers" + "github.com/gravitational/teleport/entitlements" + "github.com/gravitational/teleport/lib/modules" ) func (s *TerraformSuiteEnterprise) TestOIDCConnector() { - require.True(s.T(), s.teleportFeatures.GetOIDC(), "Test requires OIDC") + oidc := modules.GetProtoEntitlement(s.teleportFeatures, entitlements.OIDC) + require.True(s.T(), + oidc.Enabled, + "Test requires OIDC", + ) ctx, cancel := context.WithCancel(context.Background()) s.T().Cleanup(cancel) @@ -84,7 +90,11 @@ func (s *TerraformSuiteEnterprise) TestOIDCConnector() { } func (s *TerraformSuiteEnterprise) TestImportOIDCConnector() { - require.True(s.T(), s.teleportFeatures.GetOIDC(), "Test requires OIDC") + oidc := modules.GetProtoEntitlement(s.teleportFeatures, entitlements.OIDC) + require.True(s.T(), + oidc.Enabled, + "Test requires OIDC", + ) ctx, cancel := context.WithCancel(context.Background()) s.T().Cleanup(cancel) @@ -144,7 +154,11 @@ func (s *TerraformSuiteEnterprise) TestImportOIDCConnector() { } func (s *TerraformSuiteEnterprise) TestOIDCConnectorWithoutMaxAge() { - require.True(s.T(), s.teleportFeatures.GetOIDC(), "Test requires OIDC") + oidc := modules.GetProtoEntitlement(s.teleportFeatures, entitlements.OIDC) + require.True(s.T(), + oidc.Enabled, + "Test requires OIDC", + ) ctx, cancel := context.WithCancel(context.Background()) s.T().Cleanup(cancel) @@ -187,7 +201,11 @@ func (s *TerraformSuiteEnterprise) TestOIDCConnectorWithoutMaxAge() { } func (s *TerraformSuiteEnterprise) TestImportOIDCConnectorWithoutMaxAge() { - require.True(s.T(), s.teleportFeatures.GetOIDC(), "Test requires OIDC") + oidc := modules.GetProtoEntitlement(s.teleportFeatures, entitlements.OIDC) + require.True(s.T(), + oidc.Enabled, + "Test requires OIDC", + ) ctx, cancel := context.WithCancel(context.Background()) s.T().Cleanup(cancel) diff --git a/integrations/terraform/testlib/saml_connector_test.go b/integrations/terraform/testlib/saml_connector_test.go index 223b91c61dfd8..6a3859b1c3ecb 100644 --- a/integrations/terraform/testlib/saml_connector_test.go +++ b/integrations/terraform/testlib/saml_connector_test.go @@ -29,11 +29,14 @@ import ( "github.com/stretchr/testify/require" "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/entitlements" + "github.com/gravitational/teleport/lib/modules" ) func (s *TerraformSuiteEnterprise) TestSAMLConnector() { + saml := modules.GetProtoEntitlement(s.teleportFeatures, entitlements.SAML) require.True(s.T(), - s.teleportFeatures.GetSAML(), + saml.Enabled, "Test requires SAML", ) @@ -88,8 +91,9 @@ func (s *TerraformSuiteEnterprise) TestSAMLConnector() { } func (s *TerraformSuiteEnterprise) TestImportSAMLConnector() { + saml := modules.GetProtoEntitlement(s.teleportFeatures, entitlements.SAML) require.True(s.T(), - s.teleportFeatures.GetSAML(), + saml.Enabled, "Test requires SAML", ) @@ -166,8 +170,9 @@ func (s *TerraformSuiteEnterprise) TestImportSAMLConnector() { } func (s *TerraformSuiteEnterprise) TestSAMLConnectorWithEntityDescriptorURL() { + saml := modules.GetProtoEntitlement(s.teleportFeatures, entitlements.SAML) require.True(s.T(), - s.teleportFeatures.GetSAML(), + saml.Enabled, "Test requires SAML", ) @@ -187,8 +192,9 @@ func (s *TerraformSuiteEnterprise) TestSAMLConnectorWithEntityDescriptorURL() { } func (s *TerraformSuiteEnterprise) TestSAMLConnectorWithoutEntityDescriptor() { + saml := modules.GetProtoEntitlement(s.teleportFeatures, entitlements.SAML) require.True(s.T(), - s.teleportFeatures.GetSAML(), + saml.Enabled, "Test requires SAML", ) diff --git a/lib/auth/access_request_test.go b/lib/auth/access_request_test.go index 982c59b7804c9..faf59345a5bbf 100644 --- a/lib/auth/access_request_test.go +++ b/lib/auth/access_request_test.go @@ -44,6 +44,7 @@ import ( "github.com/gravitational/teleport/api/types/accesslist" "github.com/gravitational/teleport/api/types/header" "github.com/gravitational/teleport/api/utils/sshutils" + "github.com/gravitational/teleport/entitlements" "github.com/gravitational/teleport/lib/auth/authclient" "github.com/gravitational/teleport/lib/auth/testauthority" "github.com/gravitational/teleport/lib/backend/memory" @@ -1543,7 +1544,9 @@ func TestUpdateAccessRequestWithAdditionalReviewers(t *testing.T) { modules.SetTestModules(t, &modules.TestModules{ TestFeatures: modules.Features{ - IdentityGovernanceSecurity: true, + Entitlements: map[entitlements.EntitlementKind]modules.EntitlementInfo{ + entitlements.Identity: {Enabled: true}, + }, }, }) diff --git a/lib/auth/auth.go b/lib/auth/auth.go index 73e5ce870259d..01efc253bb34a 100644 --- a/lib/auth/auth.go +++ b/lib/auth/auth.go @@ -46,7 +46,6 @@ import ( "time" "github.com/coreos/go-oidc/oauth2" - "github.com/coreos/go-semver/semver" "github.com/google/uuid" liblicense "github.com/gravitational/license" "github.com/gravitational/trace" @@ -79,6 +78,7 @@ import ( "github.com/gravitational/teleport/api/utils/keys" "github.com/gravitational/teleport/api/utils/retryutils" apisshutils "github.com/gravitational/teleport/api/utils/sshutils" + "github.com/gravitational/teleport/entitlements" "github.com/gravitational/teleport/lib/auth/authclient" "github.com/gravitational/teleport/lib/auth/keystore" "github.com/gravitational/teleport/lib/auth/native" @@ -346,15 +346,15 @@ func NewServer(cfg *InitConfig, opts ...ServerOption) (*Server, error) { CloudClients: cfg.CloudClients, } if cfg.KeyStoreConfig.PKCS11 != (servicecfg.PKCS11Config{}) { - if !modules.GetModules().Features().HSM { + if !modules.GetModules().Features().GetEntitlement(entitlements.HSM).Enabled { return nil, fmt.Errorf("PKCS11 HSM support requires a license with the HSM feature enabled: %w", ErrRequiresEnterprise) } } else if cfg.KeyStoreConfig.GCPKMS != (servicecfg.GCPKMSConfig{}) { - if !modules.GetModules().Features().HSM { + if !modules.GetModules().Features().GetEntitlement(entitlements.HSM).Enabled { return nil, fmt.Errorf("Google Cloud KMS support requires a license with the HSM feature enabled: %w", ErrRequiresEnterprise) } } else if cfg.KeyStoreConfig.AWSKMS != (servicecfg.AWSKMSConfig{}) { - if !modules.GetModules().Features().HSM { + if !modules.GetModules().Features().GetEntitlement(entitlements.HSM).Enabled { return nil, fmt.Errorf("AWS KMS support requires a license with the HSM feature enabled: %w", ErrRequiresEnterprise) } } else { @@ -5384,7 +5384,7 @@ func (a *Server) UpsertNode(ctx context.Context, server types.Server) (*types.Ke func enforceLicense(t string) error { switch t { case types.KindKubeServer, types.KindKubernetesCluster: - if !modules.GetModules().Features().Kubernetes { + if !modules.GetModules().Features().GetEntitlement(entitlements.K8s).Enabled { return trace.AccessDenied( "this Teleport cluster is not licensed for Kubernetes, please contact the cluster administrator") } @@ -6002,10 +6002,6 @@ func (a *Server) Ping(ctx context.Context) (proto.PingResponse, error) { } features := modules.GetModules().Features().ToProto() - // DELETE IN 16.0 and the [func setAccessMonitoringFeatureForOlderClients] - // (no other changes necessary) - setAccessMonitoringFeatureForOlderClients(ctx, features, a.accessMonitoringEnabled) - return proto.PingResponse{ ClusterName: cn.GetClusterName(), ServerVersion: teleport.Version, @@ -6016,24 +6012,6 @@ func (a *Server) Ping(ctx context.Context) (proto.PingResponse, error) { }, nil } -// DELETE IN 16.0 -func setAccessMonitoringFeatureForOlderClients(ctx context.Context, features *proto.Features, accessMonitoringEnabled bool) { - clientVersionString, versionExists := metadata.ClientVersionFromContext(ctx) - - // Older proxies <= 14.2.0 will read from [Features.IdentityGovernance] to determine - // if access monitoring is enabled. - if versionExists { - clientVersion := semver.New(clientVersionString) - supportedVersion := semver.New("14.2.1") - if clientVersion.LessThan(*supportedVersion) { - features.IdentityGovernance = accessMonitoringEnabled - } - } - - // Newer proxies will read from new field [Features.AccessMonitoring.Enabled] - // which will be already set from startup, so nothing else to do here. -} - type maintenanceWindowCacheKey struct { key string } @@ -6890,10 +6868,13 @@ func (a *Server) getAccessRequestMonthlyUsage(ctx context.Context) (int, error) // If so, it returns an error. This is only applicable on usage-based billing plans. func (a *Server) verifyAccessRequestMonthlyLimit(ctx context.Context) error { f := modules.GetModules().Features() - if f.IsLegacy() || f.IGSEnabled() { - return nil // unlimited + accessRequestsEntitlement := f.GetEntitlement(entitlements.AccessRequests) + + if accessRequestsEntitlement.Limit == 0 { + return nil // unlimited access } - monthlyLimit := f.AccessRequests.MonthlyRequestLimit + + monthlyLimit := accessRequestsEntitlement.Limit const limitReachedMessage = "cluster has reached its monthly access request limit, please contact the cluster administrator" @@ -6901,7 +6882,7 @@ func (a *Server) verifyAccessRequestMonthlyLimit(ctx context.Context) error { if err != nil { return trace.Wrap(err) } - if usage >= monthlyLimit { + if usage >= int(monthlyLimit) { return trace.AccessDenied(limitReachedMessage) } diff --git a/lib/auth/auth_with_roles.go b/lib/auth/auth_with_roles.go index 7605176a34c84..21c4be9854dbb 100644 --- a/lib/auth/auth_with_roles.go +++ b/lib/auth/auth_with_roles.go @@ -45,6 +45,7 @@ import ( "github.com/gravitational/teleport/api/types/wrappers" apiutils "github.com/gravitational/teleport/api/utils" "github.com/gravitational/teleport/api/utils/keys" + "github.com/gravitational/teleport/entitlements" "github.com/gravitational/teleport/lib/auth/authclient" "github.com/gravitational/teleport/lib/auth/clusterconfig/clusterconfigv1" "github.com/gravitational/teleport/lib/auth/okta" @@ -3490,7 +3491,7 @@ func (a *ServerWithRoles) UpsertOIDCConnector(ctx context.Context, connector typ if err := a.authConnectorAction(apidefaults.Namespace, types.KindOIDC, types.VerbUpdate); err != nil { return nil, trace.Wrap(err) } - if !modules.GetModules().Features().OIDC { + if !modules.GetModules().Features().GetEntitlement(entitlements.OIDC).Enabled { // TODO(zmb3): ideally we would wrap ErrRequiresEnterprise here, but // we can't currently propagate wrapped errors across the gRPC boundary, // and we want tctl to display a clean user-facing message in this case @@ -3511,7 +3512,7 @@ func (a *ServerWithRoles) UpdateOIDCConnector(ctx context.Context, connector typ if err := a.authConnectorAction(apidefaults.Namespace, types.KindOIDC, types.VerbUpdate); err != nil { return nil, trace.Wrap(err) } - if !modules.GetModules().Features().OIDC { + if !modules.GetModules().Features().GetEntitlement(entitlements.OIDC).Enabled { // TODO(zmb3): ideally we would wrap ErrRequiresEnterprise here, but // we can't currently propagate wrapped errors across the gRPC boundary, // and we want tctl to display a clean user-facing message in this case @@ -3531,7 +3532,7 @@ func (a *ServerWithRoles) CreateOIDCConnector(ctx context.Context, connector typ if err := a.authConnectorAction(apidefaults.Namespace, types.KindOIDC, types.VerbCreate); err != nil { return nil, trace.Wrap(err) } - if !modules.GetModules().Features().OIDC { + if !modules.GetModules().Features().GetEntitlement(entitlements.OIDC).Enabled { // TODO(zmb3): ideally we would wrap ErrRequiresEnterprise here, but // we can't currently propagate wrapped errors across the gRPC boundary, // and we want tctl to display a clean user-facing message in this case @@ -3575,7 +3576,7 @@ func (a *ServerWithRoles) GetOIDCConnectors(ctx context.Context, withSecrets boo } func (a *ServerWithRoles) CreateOIDCAuthRequest(ctx context.Context, req types.OIDCAuthRequest) (*types.OIDCAuthRequest, error) { - if !modules.GetModules().Features().OIDC { + if !modules.GetModules().Features().GetEntitlement(entitlements.OIDC).Enabled { // TODO(zmb3): ideally we would wrap ErrRequiresEnterprise here, but // we can't currently propagate wrapped errors across the gRPC boundary, // and we want tctl to display a clean user-facing message in this case @@ -3649,7 +3650,7 @@ func (a *ServerWithRoles) DeleteOIDCConnector(ctx context.Context, connectorID s // UpsertSAMLConnector creates or updates a SAML connector. func (a *ServerWithRoles) UpsertSAMLConnector(ctx context.Context, connector types.SAMLConnector) (types.SAMLConnector, error) { - if !modules.GetModules().Features().SAML { + if !modules.GetModules().Features().GetEntitlement(entitlements.SAML).Enabled { return nil, trace.Wrap(ErrSAMLRequiresEnterprise) } @@ -3672,7 +3673,7 @@ func (a *ServerWithRoles) UpsertSAMLConnector(ctx context.Context, connector typ // CreateSAMLConnector creates a new SAML connector. func (a *ServerWithRoles) CreateSAMLConnector(ctx context.Context, connector types.SAMLConnector) (types.SAMLConnector, error) { - if !modules.GetModules().Features().SAML { + if !modules.GetModules().Features().GetEntitlement(entitlements.SAML).Enabled { return nil, trace.Wrap(ErrSAMLRequiresEnterprise) } @@ -3690,7 +3691,7 @@ func (a *ServerWithRoles) CreateSAMLConnector(ctx context.Context, connector typ // UpdateSAMLConnector updates an existing SAML connector func (a *ServerWithRoles) UpdateSAMLConnector(ctx context.Context, connector types.SAMLConnector) (types.SAMLConnector, error) { - if !modules.GetModules().Features().SAML { + if !modules.GetModules().Features().GetEntitlement(entitlements.SAML).Enabled { return nil, trace.Wrap(ErrSAMLRequiresEnterprise) } @@ -3736,7 +3737,7 @@ func (a *ServerWithRoles) GetSAMLConnectors(ctx context.Context, withSecrets boo } func (a *ServerWithRoles) CreateSAMLAuthRequest(ctx context.Context, req types.SAMLAuthRequest) (*types.SAMLAuthRequest, error) { - if !modules.GetModules().Features().SAML { + if !modules.GetModules().Features().GetEntitlement(entitlements.SAML).Enabled { return nil, trace.Wrap(ErrSAMLRequiresEnterprise) } diff --git a/lib/auth/clusterconfig/clusterconfigv1/service.go b/lib/auth/clusterconfig/clusterconfigv1/service.go index d990155b4eb83..037165d062cab 100644 --- a/lib/auth/clusterconfig/clusterconfigv1/service.go +++ b/lib/auth/clusterconfig/clusterconfigv1/service.go @@ -26,6 +26,7 @@ import ( clusterconfigpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/clusterconfig/v1" "github.com/gravitational/teleport/api/types" apievents "github.com/gravitational/teleport/api/types/events" + "github.com/gravitational/teleport/entitlements" "github.com/gravitational/teleport/lib/authz" dtconfig "github.com/gravitational/teleport/lib/devicetrust/config" "github.com/gravitational/teleport/lib/events" @@ -922,7 +923,7 @@ func (s *Service) GetClusterAccessGraphConfig(ctx context.Context, _ *clustercon } // If the policy feature is disabled in the license, return a disabled response. - if !modules.GetModules().Features().Policy.Enabled && !modules.GetModules().Features().AccessGraph { + if !modules.GetModules().Features().GetEntitlement(entitlements.Policy).Enabled && !modules.GetModules().Features().AccessGraph { return &clusterconfigpb.GetClusterAccessGraphConfigResponse{ AccessGraph: &clusterconfigpb.AccessGraphConfig{ Enabled: false, diff --git a/lib/auth/clusterconfig/clusterconfigv1/service_test.go b/lib/auth/clusterconfig/clusterconfigv1/service_test.go index 7bda35fabc733..196f3a3c4d22c 100644 --- a/lib/auth/clusterconfig/clusterconfigv1/service_test.go +++ b/lib/auth/clusterconfig/clusterconfigv1/service_test.go @@ -33,6 +33,7 @@ import ( clusterconfigpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/clusterconfig/v1" "github.com/gravitational/teleport/api/types" apievents "github.com/gravitational/teleport/api/types/events" + "github.com/gravitational/teleport/entitlements" "github.com/gravitational/teleport/lib/auth/clusterconfig/clusterconfigv1" "github.com/gravitational/teleport/lib/authz" "github.com/gravitational/teleport/lib/backend/memory" @@ -1825,8 +1826,8 @@ func TestGetAccessGraphConfig(t *testing.T) { testSetup: func(t *testing.T) { m := modules.TestModules{ TestFeatures: modules.Features{ - Policy: modules.PolicyFeature{ - Enabled: true, + Entitlements: map[entitlements.EntitlementKind]modules.EntitlementInfo{ + entitlements.Policy: {Enabled: true}, }, }, } @@ -1849,8 +1850,8 @@ func TestGetAccessGraphConfig(t *testing.T) { testSetup: func(t *testing.T) { m := modules.TestModules{ TestFeatures: modules.Features{ - Policy: modules.PolicyFeature{ - Enabled: true, + Entitlements: map[entitlements.EntitlementKind]modules.EntitlementInfo{ + entitlements.Policy: {Enabled: true}, }, }, } diff --git a/lib/auth/db.go b/lib/auth/db.go index 1716f5a2d91c5..40533a0120596 100644 --- a/lib/auth/db.go +++ b/lib/auth/db.go @@ -38,6 +38,7 @@ import ( apidefaults "github.com/gravitational/teleport/api/defaults" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/api/utils" + "github.com/gravitational/teleport/entitlements" "github.com/gravitational/teleport/lib/auth/keystore" "github.com/gravitational/teleport/lib/jwt" "github.com/gravitational/teleport/lib/modules" @@ -201,7 +202,7 @@ func getServerNames(req *proto.DatabaseCertRequest) []string { // SignDatabaseCSR generates a client certificate used by proxy when talking // to a remote database service. func (a *Server) SignDatabaseCSR(ctx context.Context, req *proto.DatabaseCSRRequest) (*proto.DatabaseCSRResponse, error) { - if !modules.GetModules().Features().DB { + if !modules.GetModules().Features().GetEntitlement(entitlements.DB).Enabled { return nil, trace.AccessDenied( "this Teleport cluster is not licensed for database access, please contact the cluster administrator") } @@ -290,7 +291,7 @@ func (a *Server) SignDatabaseCSR(ctx context.Context, req *proto.DatabaseCSRRequ // GenerateSnowflakeJWT generates JWT in the format required by Snowflake. func (a *Server) GenerateSnowflakeJWT(ctx context.Context, req *proto.SnowflakeJWTRequest) (*proto.SnowflakeJWTResponse, error) { - if !modules.GetModules().Features().DB { + if !modules.GetModules().Features().GetEntitlement(entitlements.DB).Enabled { return nil, trace.AccessDenied( "this Teleport cluster is not licensed for database access, please contact the cluster administrator") } diff --git a/lib/auth/desktop.go b/lib/auth/desktop.go index 835c97b6a93f5..39542b953a8a5 100644 --- a/lib/auth/desktop.go +++ b/lib/auth/desktop.go @@ -35,6 +35,7 @@ import ( "github.com/gravitational/teleport/api/client/proto" "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/entitlements" "github.com/gravitational/teleport/lib/modules" "github.com/gravitational/teleport/lib/tlsca" "github.com/gravitational/teleport/lib/utils" @@ -43,7 +44,7 @@ import ( // GenerateWindowsDesktopCert generates client certificate for Windows RDP // authentication. func (a *Server) GenerateWindowsDesktopCert(ctx context.Context, req *proto.WindowsDesktopCertRequest) (*proto.WindowsDesktopCertResponse, error) { - if !modules.GetModules().Features().Desktop { + if !modules.GetModules().Features().GetEntitlement(entitlements.Desktop).Enabled { return nil, trace.AccessDenied( "this Teleport cluster is not licensed for desktop access, please contact the cluster administrator") } diff --git a/lib/auth/desktop_test.go b/lib/auth/desktop_test.go index c9eb6b4c31830..0a6fcb2eb597f 100644 --- a/lib/auth/desktop_test.go +++ b/lib/auth/desktop_test.go @@ -25,6 +25,7 @@ import ( "github.com/stretchr/testify/require" "github.com/gravitational/teleport/api/client/proto" + "github.com/gravitational/teleport/entitlements" "github.com/gravitational/teleport/lib/modules" ) @@ -33,7 +34,9 @@ import ( func TestDesktopAccessDisabled(t *testing.T) { modules.SetTestModules(t, &modules.TestModules{ TestFeatures: modules.Features{ - Desktop: false, // Explicily turn off desktop access. + Entitlements: map[entitlements.EntitlementKind]modules.EntitlementInfo{ + entitlements.Desktop: {Enabled: false}, // Explicitly turn off desktop access. + }, }, }) diff --git a/lib/auth/grpcserver_test.go b/lib/auth/grpcserver_test.go index 3a5d98f284365..a96ad7abd9865 100644 --- a/lib/auth/grpcserver_test.go +++ b/lib/auth/grpcserver_test.go @@ -64,6 +64,7 @@ import ( "github.com/gravitational/teleport/api/utils" "github.com/gravitational/teleport/api/utils/keys" "github.com/gravitational/teleport/api/utils/sshutils" + "github.com/gravitational/teleport/entitlements" "github.com/gravitational/teleport/lib/auth/authclient" "github.com/gravitational/teleport/lib/auth/mocku2f" "github.com/gravitational/teleport/lib/auth/testauthority" @@ -856,7 +857,9 @@ func TestGenerateUserCerts_deviceAuthz(t *testing.T) { modules.SetTestModules(t, &modules.TestModules{ TestBuildType: modules.BuildEnterprise, // required for Device Trust. TestFeatures: modules.Features{ - App: true, + Entitlements: map[entitlements.EntitlementKind]modules.EntitlementInfo{ + entitlements.App: {Enabled: true}, + }, }, }) @@ -4188,7 +4191,11 @@ func TestExport(t *testing.T) { // a SAML connector. func TestSAMLValidation(t *testing.T) { modules.SetTestModules(t, &modules.TestModules{ - TestFeatures: modules.Features{SAML: true}, + TestFeatures: modules.Features{ + Entitlements: map[entitlements.EntitlementKind]modules.EntitlementInfo{ + entitlements.SAML: {Enabled: true}, + }, + }, }) // minimal entity_descriptor to pass validation. not actually valid @@ -4460,8 +4467,8 @@ func TestUpsertApplicationServerOrigin(t *testing.T) { func TestGetAccessGraphConfig(t *testing.T) { modules.SetTestModules(t, &modules.TestModules{ TestFeatures: modules.Features{ - Policy: modules.PolicyFeature{ - Enabled: true, + Entitlements: map[entitlements.EntitlementKind]modules.EntitlementInfo{ + entitlements.Policy: {Enabled: true}, }, }, }) diff --git a/lib/auth/kube_test.go b/lib/auth/kube_test.go index ddd18064ca4a9..9b8222deda8b7 100644 --- a/lib/auth/kube_test.go +++ b/lib/auth/kube_test.go @@ -31,6 +31,7 @@ import ( "github.com/stretchr/testify/require" "github.com/gravitational/teleport" + "github.com/gravitational/teleport/entitlements" "github.com/gravitational/teleport/lib/auth/authclient" "github.com/gravitational/teleport/lib/modules" "github.com/gravitational/teleport/lib/tlsca" @@ -39,7 +40,9 @@ import ( func TestProcessKubeCSR(t *testing.T) { modules.SetTestModules(t, &modules.TestModules{ TestFeatures: modules.Features{ - Kubernetes: true, // test requires kube feature is enabled + Entitlements: map[entitlements.EntitlementKind]modules.EntitlementInfo{ + entitlements.K8s: {Enabled: true}, // test requires kube feature is enabled + }, }, }) diff --git a/lib/auth/sessions.go b/lib/auth/sessions.go index 92cc0d17d1e84..dd428bcd9bf79 100644 --- a/lib/auth/sessions.go +++ b/lib/auth/sessions.go @@ -33,6 +33,7 @@ import ( "github.com/gravitational/teleport/api/types" apievents "github.com/gravitational/teleport/api/types/events" "github.com/gravitational/teleport/api/utils/keys" + "github.com/gravitational/teleport/entitlements" "github.com/gravitational/teleport/lib/auth/native" "github.com/gravitational/teleport/lib/defaults" dtconfig "github.com/gravitational/teleport/lib/devicetrust/config" @@ -384,7 +385,7 @@ type NewAppSessionRequest struct { // The certificate is used for all access requests, which is where access // control is enforced. func (a *Server) CreateAppSession(ctx context.Context, req *proto.CreateAppSessionRequest, identity tlsca.Identity, checker services.AccessChecker) (types.WebSession, error) { - if !modules.GetModules().Features().App { + if !modules.GetModules().Features().GetEntitlement(entitlements.App).Enabled { return nil, trace.AccessDenied( "this Teleport cluster is not licensed for application access, please contact the cluster administrator") } @@ -447,7 +448,7 @@ func (a *Server) CreateAppSession(ctx context.Context, req *proto.CreateAppSessi } func (a *Server) CreateAppSessionFromReq(ctx context.Context, req NewAppSessionRequest) (types.WebSession, error) { - if !modules.GetModules().Features().App { + if !modules.GetModules().Features().GetEntitlement(entitlements.App).Enabled { return nil, trace.AccessDenied( "this Teleport cluster is not licensed for application access, please contact the cluster administrator") } @@ -672,7 +673,7 @@ func (a *Server) CreateSessionCert(userState services.UserState, sessionTTL time func (a *Server) CreateSnowflakeSession(ctx context.Context, req types.CreateSnowflakeSessionRequest, identity tlsca.Identity, checker services.AccessChecker, ) (types.WebSession, error) { - if !modules.GetModules().Features().DB { + if !modules.GetModules().Features().GetEntitlement(entitlements.DB).Enabled { return nil, trace.AccessDenied( "this Teleport cluster is not licensed for database access, please contact the cluster administrator") } diff --git a/lib/auth/usage_test.go b/lib/auth/usage_test.go index c394d2c860f28..4cc3e36ac9e8c 100644 --- a/lib/auth/usage_test.go +++ b/lib/auth/usage_test.go @@ -31,6 +31,7 @@ import ( "github.com/gravitational/teleport/api/types" apievents "github.com/gravitational/teleport/api/types/events" + "github.com/gravitational/teleport/entitlements" "github.com/gravitational/teleport/lib/events" eventstest "github.com/gravitational/teleport/lib/events/test" "github.com/gravitational/teleport/lib/modules" @@ -72,8 +73,8 @@ func TestAccessRequest_WithAndWithoutLimit(t *testing.T) { _, err = s.testpack.a.CreateAccessRequestV2(ctx, req, tlsca.Identity{}) require.Error(t, err, "expected access request creation to fail due to the monthly limit") - // Lift limit with IGS, expect no limit error. - s.features.IdentityGovernanceSecurity = true + // Lift limit, expect no limit error. + s.features.Entitlements[entitlements.AccessRequests] = modules.EntitlementInfo{Enabled: true, Limit: 0} modules.SetTestModules(t, &modules.TestModules{ TestFeatures: s.features, }) @@ -81,20 +82,12 @@ func TestAccessRequest_WithAndWithoutLimit(t *testing.T) { require.NoError(t, err) // Put back limit, expect limit error. - s.features.IdentityGovernanceSecurity = false + s.features.Entitlements[entitlements.AccessRequests] = modules.EntitlementInfo{Enabled: true, Limit: 1} modules.SetTestModules(t, &modules.TestModules{ TestFeatures: s.features, }) _, err = s.testpack.a.CreateAccessRequestV2(ctx, req, tlsca.Identity{}) require.Error(t, err, "expected access request creation to fail due to the monthly limit") - - // Lift limit with legacy non-usage based, expect no limit error. - s.features.IsUsageBasedBilling = false - modules.SetTestModules(t, &modules.TestModules{ - TestFeatures: s.features, - }) - _, err = s.testpack.a.CreateAccessRequestV2(ctx, req, tlsca.Identity{}) - require.NoError(t, err) } type setupAccessRequestLimist struct { @@ -105,7 +98,7 @@ type setupAccessRequestLimist struct { } func setUpAccessRequestLimitForJulyAndAugust(t *testing.T, username string, rolename string) setupAccessRequestLimist { - monthlyLimit := 3 + monthlyLimit := int32(3) makeEvent := func(eventType string, id string, timestamp time.Time) apievents.AuditEvent { return &apievents.AccessRequestCreate{ @@ -119,7 +112,7 @@ func setUpAccessRequestLimitForJulyAndAugust(t *testing.T, username string, role features := modules.GetModules().Features() features.IsUsageBasedBilling = true - features.AccessRequests.MonthlyRequestLimit = monthlyLimit + features.Entitlements[entitlements.AccessRequests] = modules.EntitlementInfo{Limit: monthlyLimit, Enabled: true} modules.SetTestModules(t, &modules.TestModules{ TestFeatures: features, }) @@ -182,7 +175,7 @@ func setUpAccessRequestLimitForJulyAndAugust(t *testing.T, username string, role return setupAccessRequestLimist{ testpack: p, - monthlyLimit: monthlyLimit, + monthlyLimit: int(monthlyLimit), features: features, clock: clock, } diff --git a/lib/auth/userloginstate/generator_test.go b/lib/auth/userloginstate/generator_test.go index c7a9f591d1a6d..caf433dd2bf80 100644 --- a/lib/auth/userloginstate/generator_test.go +++ b/lib/auth/userloginstate/generator_test.go @@ -37,6 +37,7 @@ import ( "github.com/gravitational/teleport/api/types/header" "github.com/gravitational/teleport/api/types/trait" "github.com/gravitational/teleport/api/types/userloginstate" + "github.com/gravitational/teleport/entitlements" "github.com/gravitational/teleport/lib/backend/memory" "github.com/gravitational/teleport/lib/modules" "github.com/gravitational/teleport/lib/services" @@ -398,8 +399,10 @@ func TestAccessLists(t *testing.T) { modules.SetTestModules(t, &modules.TestModules{ TestBuildType: modules.BuildEnterprise, TestFeatures: modules.Features{ - Cloud: test.cloud, - IdentityGovernanceSecurity: true, + Cloud: test.cloud, + Entitlements: map[entitlements.EntitlementKind]modules.EntitlementInfo{ + entitlements.Identity: {Enabled: true}, + }, }, }) diff --git a/lib/integrations/externalauditstorage/configurator.go b/lib/integrations/externalauditstorage/configurator.go index 15b388a8659c4..dd63222b5bc20 100644 --- a/lib/integrations/externalauditstorage/configurator.go +++ b/lib/integrations/externalauditstorage/configurator.go @@ -36,6 +36,7 @@ import ( "github.com/gravitational/teleport" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/api/types/externalauditstorage" + "github.com/gravitational/teleport/entitlements" "github.com/gravitational/teleport/lib/modules" "github.com/gravitational/teleport/lib/services" ) @@ -182,7 +183,7 @@ func NewDraftConfigurator(ctx context.Context, ecaSvc ExternalAuditStorageGetter func newConfigurator(ctx context.Context, spec *externalauditstorage.ExternalAuditStorageSpec, integrationSvc services.IntegrationsGetter, alertService ClusterAlertService, optFns ...func(*Options)) (*Configurator, error) { // ExternalAuditStorage is only available in Cloud Enterprise - if !modules.GetModules().Features().Cloud || !modules.GetModules().Features().ExternalAuditStorage { + if !modules.GetModules().Features().Cloud || !modules.GetModules().Features().GetEntitlement(entitlements.ExternalAuditStorage).Enabled { return &Configurator{isUsed: false}, nil } diff --git a/lib/integrations/externalauditstorage/configurator_test.go b/lib/integrations/externalauditstorage/configurator_test.go index 08824475b453b..abb1ce1425b9e 100644 --- a/lib/integrations/externalauditstorage/configurator_test.go +++ b/lib/integrations/externalauditstorage/configurator_test.go @@ -37,6 +37,7 @@ import ( "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/api/types/externalauditstorage" "github.com/gravitational/teleport/api/types/header" + "github.com/gravitational/teleport/entitlements" "github.com/gravitational/teleport/lib/backend/memory" "github.com/gravitational/teleport/lib/modules" "github.com/gravitational/teleport/lib/services/local" @@ -102,8 +103,10 @@ func TestConfiguratorIsUsed(t *testing.T) { name: "cloud enterprise without config", modules: &modules.TestModules{ TestFeatures: modules.Features{ - Cloud: true, - ExternalAuditStorage: true, + Cloud: true, + Entitlements: map[entitlements.EntitlementKind]modules.EntitlementInfo{ + entitlements.ExternalAuditStorage: {Enabled: true}, + }, }, }, wantIsUsed: false, @@ -112,8 +115,10 @@ func TestConfiguratorIsUsed(t *testing.T) { name: "cloud enterprise with only draft", modules: &modules.TestModules{ TestFeatures: modules.Features{ - Cloud: true, - ExternalAuditStorage: true, + Cloud: true, + Entitlements: map[entitlements.EntitlementKind]modules.EntitlementInfo{ + entitlements.ExternalAuditStorage: {Enabled: true}, + }, }, }, // Just create draft, External Audit Storage should be disabled, it's @@ -129,8 +134,10 @@ func TestConfiguratorIsUsed(t *testing.T) { name: "cloud enterprise with cluster config", modules: &modules.TestModules{ TestFeatures: modules.Features{ - Cloud: true, - ExternalAuditStorage: true, + Cloud: true, + Entitlements: map[entitlements.EntitlementKind]modules.EntitlementInfo{ + entitlements.ExternalAuditStorage: {Enabled: true}, + }, }, }, // Create draft and promote it to cluster. @@ -178,8 +185,10 @@ func TestCredentialsCache(t *testing.T) { modules.SetTestModules(t, &modules.TestModules{ TestFeatures: modules.Features{ - Cloud: true, - ExternalAuditStorage: true, + Cloud: true, + Entitlements: map[entitlements.EntitlementKind]modules.EntitlementInfo{ + entitlements.ExternalAuditStorage: {Enabled: true}, + }, }, }) @@ -338,8 +347,10 @@ func TestDraftConfigurator(t *testing.T) { modules.SetTestModules(t, &modules.TestModules{ TestFeatures: modules.Features{ - Cloud: true, - ExternalAuditStorage: true, + Cloud: true, + Entitlements: map[entitlements.EntitlementKind]modules.EntitlementInfo{ + entitlements.ExternalAuditStorage: {Enabled: true}, + }, }, }) diff --git a/lib/kube/proxy/forwarder.go b/lib/kube/proxy/forwarder.go index 418e758893c15..5f7ac1736ae7c 100644 --- a/lib/kube/proxy/forwarder.go +++ b/lib/kube/proxy/forwarder.go @@ -67,6 +67,7 @@ import ( "github.com/gravitational/teleport/api/types" apievents "github.com/gravitational/teleport/api/types/events" apiutils "github.com/gravitational/teleport/api/utils" + "github.com/gravitational/teleport/entitlements" "github.com/gravitational/teleport/lib/auth" "github.com/gravitational/teleport/lib/auth/authclient" "github.com/gravitational/teleport/lib/authz" @@ -76,6 +77,7 @@ import ( "github.com/gravitational/teleport/lib/httplib/reverseproxy" "github.com/gravitational/teleport/lib/kube/proxy/responsewriters" "github.com/gravitational/teleport/lib/kube/proxy/streamproto" + "github.com/gravitational/teleport/lib/modules" "github.com/gravitational/teleport/lib/multiplexer" "github.com/gravitational/teleport/lib/reversetunnelclient" "github.com/gravitational/teleport/lib/service/servicecfg" @@ -172,6 +174,18 @@ type ForwarderConfig struct { // ClusterFeaturesGetter is a function that returns the Teleport cluster licensed features. type ClusterFeaturesGetter func() proto.Features +func (f ClusterFeaturesGetter) GetEntitlement(e entitlements.EntitlementKind) modules.EntitlementInfo { + al, ok := f().Entitlements[string(e)] + if !ok { + return modules.EntitlementInfo{} + } + + return modules.EntitlementInfo{ + Enabled: al.Enabled, + Limit: al.Limit, + } +} + // CheckAndSetDefaults checks and sets default values func (f *ForwarderConfig) CheckAndSetDefaults() error { if f.AuthClient == nil { @@ -491,7 +505,7 @@ const accessDeniedMsg = "[00] access denied" // authenticate function authenticates request func (f *Forwarder) authenticate(req *http.Request) (*authContext, error) { // If the cluster is not licensed for Kubernetes, return an error to the client. - if !f.cfg.ClusterFeatures().Kubernetes { + if !f.cfg.ClusterFeatures.GetEntitlement(entitlements.K8s).Enabled { // If the cluster is not licensed for Kubernetes, return an error to the client. return nil, trace.AccessDenied("Teleport cluster is not licensed for Kubernetes") } diff --git a/lib/kube/proxy/forwarder_test.go b/lib/kube/proxy/forwarder_test.go index 397a174566890..982fd6bb8bcfa 100644 --- a/lib/kube/proxy/forwarder_test.go +++ b/lib/kube/proxy/forwarder_test.go @@ -52,6 +52,7 @@ import ( "github.com/gravitational/teleport/api/client/proto" "github.com/gravitational/teleport/api/types" apievents "github.com/gravitational/teleport/api/types/events" + "github.com/gravitational/teleport/entitlements" "github.com/gravitational/teleport/lib/auth/authclient" "github.com/gravitational/teleport/lib/auth/testauthority" "github.com/gravitational/teleport/lib/authz" @@ -88,7 +89,9 @@ var ( func fakeClusterFeatures() proto.Features { return proto.Features{ - Kubernetes: true, + Entitlements: map[string]*proto.EntitlementInfo{ + string(entitlements.K8s): {Enabled: true}, + }, } } @@ -1487,14 +1490,18 @@ func TestKubernetesLicenseEnforcement(t *testing.T) { { name: "kubernetes agent is licensed", features: proto.Features{ - Kubernetes: true, + Entitlements: map[string]*proto.EntitlementInfo{ + string(entitlements.K8s): {Enabled: true}, + }, }, assertErrFunc: require.NoError, }, { name: "kubernetes isn't licensed", features: proto.Features{ - Kubernetes: false, + Entitlements: map[string]*proto.EntitlementInfo{ + string(entitlements.K8s): {Enabled: false}, + }, }, assertErrFunc: func(tt require.TestingT, err error, i ...interface{}) { require.Error(tt, err) diff --git a/lib/kube/proxy/moderated_sessions_test.go b/lib/kube/proxy/moderated_sessions_test.go index d16f37291a74c..1b2abc5704ea2 100644 --- a/lib/kube/proxy/moderated_sessions_test.go +++ b/lib/kube/proxy/moderated_sessions_test.go @@ -42,6 +42,7 @@ import ( "github.com/gravitational/teleport/api/constants" "github.com/gravitational/teleport/api/types" apievents "github.com/gravitational/teleport/api/types/events" + "github.com/gravitational/teleport/entitlements" "github.com/gravitational/teleport/lib/events" testingkubemock "github.com/gravitational/teleport/lib/kube/proxy/testing/kube_server" "github.com/gravitational/teleport/lib/modules" @@ -49,7 +50,11 @@ import ( func TestModeratedSessions(t *testing.T) { // enable enterprise features to have access to ModeratedSessions. - modules.SetTestModules(t, &modules.TestModules{TestBuildType: modules.BuildEnterprise, TestFeatures: modules.Features{Kubernetes: true}}) + modules.SetTestModules(t, &modules.TestModules{TestBuildType: modules.BuildEnterprise, TestFeatures: modules.Features{ + Entitlements: map[entitlements.EntitlementKind]modules.EntitlementInfo{ + entitlements.K8s: {Enabled: true}, + }, + }}) const ( moderatorUsername = "moderator_user" moderatorRoleName = "mod_role" @@ -496,7 +501,11 @@ func validateSessionTracker(testCtx *TestContext, sessionID string, reason strin // Lock watcher connection to be stale and it takes ~5 minutes to happen. func TestInteractiveSessionsNoAuth(t *testing.T) { // enable enterprise features to have access to ModeratedSessions. - modules.SetTestModules(t, &modules.TestModules{TestBuildType: modules.BuildEnterprise, TestFeatures: modules.Features{Kubernetes: true}}) + modules.SetTestModules(t, &modules.TestModules{TestBuildType: modules.BuildEnterprise, TestFeatures: modules.Features{ + Entitlements: map[entitlements.EntitlementKind]modules.EntitlementInfo{ + entitlements.K8s: {Enabled: true}, + }, + }}) const ( moderatorUsername = "moderator_user" moderatorRoleName = "mod_role" diff --git a/lib/kube/proxy/utils_testing.go b/lib/kube/proxy/utils_testing.go index 626fd4889adeb..95997812c6c81 100644 --- a/lib/kube/proxy/utils_testing.go +++ b/lib/kube/proxy/utils_testing.go @@ -47,6 +47,7 @@ import ( "github.com/gravitational/teleport/api/types" apievents "github.com/gravitational/teleport/api/types/events" "github.com/gravitational/teleport/api/utils/keys" + "github.com/gravitational/teleport/entitlements" "github.com/gravitational/teleport/lib/auth" "github.com/gravitational/teleport/lib/auth/authclient" "github.com/gravitational/teleport/lib/auth/keygen" @@ -209,7 +210,13 @@ func SetupTestContext(ctx context.Context, t *testing.T, cfg TestConfig) *TestCo heartbeatsWaitChannel := make(chan struct{}, len(cfg.Clusters)+1) client := newAuthClientWithStreamer(testCtx, cfg.CreateAuditStreamErr) - features := func() proto.Features { return proto.Features{Kubernetes: true} } + features := func() proto.Features { + return proto.Features{ + Entitlements: map[string]*proto.EntitlementInfo{ + string(entitlements.K8s): {Enabled: true}, + }, + } + } if cfg.ClusterFeatures != nil { features = cfg.ClusterFeatures } diff --git a/lib/modules/modules.go b/lib/modules/modules.go index affaa6a4f5f56..6265e999e90cb 100644 --- a/lib/modules/modules.go +++ b/lib/modules/modules.go @@ -38,6 +38,7 @@ import ( "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/api/types/accesslist" "github.com/gravitational/teleport/api/utils/keys" + "github.com/gravitational/teleport/entitlements" "github.com/gravitational/teleport/lib/auth/native" "github.com/gravitational/teleport/lib/automaticupgrades" "github.com/gravitational/teleport/lib/tlsca" @@ -45,177 +46,174 @@ import ( // Features provides supported and unsupported features type Features struct { - // Kubernetes enables Kubernetes Access product - Kubernetes bool - // App enables Application Access product - App bool - // DB enables database access product - DB bool - // OIDC enables OIDC connectors - OIDC bool - // SAML enables SAML connectors - SAML bool - // AccessControls enables FIPS access controls - AccessControls bool - // Currently this flag is to gate actions from OSS clusters. - // - // Determining support for access request is currently determined by: - // 1) Enterprise + [Features.IdentityGovernanceSecurity] == true, new flag - // introduced with Enterprise Usage Based (EUB) product. - // 2) Enterprise + [Features.IsUsageBasedBilling] == false, legacy support - // where before EUB, it was unlimited. - // - // AdvancedAccessWorkflows is currently set to true for all - // enterprise editions (team, cloud, on-prem). Historically, access request - // was only available for enterprise cloud and enterprise on-prem. - AdvancedAccessWorkflows bool + // --------------- Cloud Settings // Cloud enables some cloud-related features Cloud bool - // HSM enables PKCS#11 HSM support - HSM bool - // Desktop enables desktop access product - Desktop bool + // CustomTheme holds the name of WebUI custom theme. + CustomTheme string + // IsStripeManaged indicates if the cluster billing is managed via Stripe + IsStripeManaged bool + // IsUsageBasedBilling enables some usage-based billing features + IsUsageBasedBilling bool + // Questionnaire indicates whether cluster users should get an onboarding questionnaire + Questionnaire bool + // SupportType indicates the type of customer's support + SupportType proto.SupportType + // Entitlements reflect Cloud Entitlements including access and limits + Entitlements map[entitlements.EntitlementKind]EntitlementInfo + + // todo (michellescripts) have the following fields evaluated for deprecation, consolidation, or fetch from Cloud + // AdvancedAccessWorkflows is currently set to the value of the Cloud Access Requests entitlement + AdvancedAccessWorkflows bool // RecoveryCodes enables account recovery codes RecoveryCodes bool // Plugins enables hosted plugins Plugins bool // AutomaticUpgrades enables automatic upgrades of agents/services. AutomaticUpgrades bool - // IsUsageBasedBilling enables some usage-based billing features - IsUsageBasedBilling bool - // DeviceTrust holds its namesake feature settings. - DeviceTrust DeviceTrustFeature - // FeatureHiding enables hiding features from being discoverable for users who don't have the necessary permissions. - FeatureHiding bool - // AccessRequests holds its namesake feature settings. - AccessRequests AccessRequestsFeature - // CustomTheme holds the name of WebUI custom theme. - CustomTheme string - // AccessGraph enables the usage of access graph. // NOTE: this is a legacy flag that is currently used to signal // that Access Graph integration is *enabled* on a cluster. // *Access* to the feature is gated on the `Policy` flag. // TODO(justinas): remove this field once "TAG enabled" status is moved to a resource in the backend. AccessGraph bool - // IdentityGovernanceSecurity indicates whether IGS related features are enabled: - // access list, access request, access monitoring, device trust. - IdentityGovernanceSecurity bool - // AccessList holds its namesake feature settings. - AccessList AccessListFeature - // AccessMonitoring holds its namesake feature settings. - AccessMonitoring AccessMonitoringFeature + // AccessMonitoringConfigured contributes to the enablement of access monitoring. + // NOTE: this flag is used to signal that Access Monitoring is *enabled* on a cluster. + // *Access* to the feature is gated on the `AccessMonitoring` entitlement. + AccessMonitoringConfigured bool + // --------------- Deprecated Fields + // AccessControls enables FIPS access controls + // Deprecated + AccessControls bool + // Assist enables Assistant feature + // Deprecated + Assist bool // ProductType describes the product being used. + // Deprecated ProductType ProductType - // Policy holds settings for the Teleport Policy feature set. - // At the time of writing, this includes Teleport Access Graph (TAG). - Policy PolicyFeature - // Questionnaire indicates whether cluster users should get an onboarding questionnaire - Questionnaire bool - // IsStripeManaged indicates if the cluster billing is managed via Stripe - IsStripeManaged bool - // ExternalAuditStorage indicates whether the EAS feature is enabled in the cluster. - ExternalAuditStorage bool - // SupportType indicates the type of customer's support - SupportType proto.SupportType - // JoinActiveSessions indicates whether joining active sessions via web UI is enabled - JoinActiveSessions bool - // MobileDeviceManagement indicates whether endpoints management (like Jamf Plugin) can be used in the cluster - MobileDeviceManagement bool } -// DeviceTrustFeature holds the Device Trust feature general and usage-based -// settings. -// Limits have no affect if [Feature.IdentityGovernanceSecurity] is enabled. -type DeviceTrustFeature struct { - // Currently this flag is to gate actions from OSS clusters. - // - // Determining support for device trust is currently determined by: - // 1) Enterprise + [Features.IdentityGovernanceSecurity] == true, new flag - // introduced with Enterprise Usage Based (EUB) product. - // 2) Enterprise + [Features.IsUsageBasedBilling] == false, legacy support - // where before EUB, it was unlimited. +// EntitlementInfo is the state and limits of a particular entitlement +type EntitlementInfo struct { + // Enabled indicates the feature is 'on' if true; feature is disabled if false Enabled bool - // DevicesUsageLimit is the usage-based limit for the number of - // registered/enrolled devices, at the implementation's discretion. - DevicesUsageLimit int + // Limit indicates the allotted amount of use when limited; if 0 use is unlimited + Limit int32 } -// AccessRequestsFeature holds the Access Requests feature general and usage-based settings. -// Limits have no affect if [Feature.IdentityGovernanceSecurity] is enabled. -type AccessRequestsFeature struct { - // MonthlyRequestLimit is the usage-based limit for the number of - // access requests created in a calendar month. - MonthlyRequestLimit int +// UnderLimit tests that a given entitlement is under its prescribed limit +// based on the supplied use count. A return value of `true` indicates that +// there is still at least *some* capacity left in the entitlement. The actual +// definition of a "use" depends on the entitlement in question. +// A disabled entitlement is always out of its limit. +func (e EntitlementInfo) UnderLimit(count int) bool { + return e.Enabled && (e.Limit == 0 || count < int(e.Limit)) } -// AccessListFeature holds the Access List feature settings. -// Limits have no affect if feature is enabled. -type AccessListFeature struct { - // Limit for the number of access list creatable when feature is - // not enabled. - CreateLimit int +// ToProto converts Features into proto.Features +func (f Features) ToProto() *proto.Features { + protoF := &proto.Features{ + Cloud: f.Cloud, + CustomTheme: f.CustomTheme, + IsStripeManaged: f.IsStripeManaged, + IsUsageBased: f.IsUsageBasedBilling, + Questionnaire: f.Questionnaire, + SupportType: f.SupportType, + AccessControls: f.AccessControls, + AccessGraph: f.AccessGraph, + AdvancedAccessWorkflows: f.AdvancedAccessWorkflows, + AutomaticUpgrades: f.AutomaticUpgrades, + Plugins: f.Plugins, + ProductType: proto.ProductType(f.ProductType), + RecoveryCodes: f.RecoveryCodes, + AccessMonitoringConfigured: f.AccessMonitoringConfigured, + Entitlements: f.EntitlementsToProto(), + } + + // remove setLegacyLogic in v18 + setLegacyLogic(protoF, f) + return protoF +} + +// setLegacyLogic sets the deprecated fields; to be removed in v18 - use entitlements +func setLegacyLogic(protoF *proto.Features, f Features) { + protoF.Kubernetes = f.GetEntitlement(entitlements.K8s).Enabled + protoF.App = f.GetEntitlement(entitlements.App).Enabled + protoF.DB = f.GetEntitlement(entitlements.DB).Enabled + protoF.OIDC = f.GetEntitlement(entitlements.OIDC).Enabled + protoF.SAML = f.GetEntitlement(entitlements.SAML).Enabled + protoF.HSM = f.GetEntitlement(entitlements.HSM).Enabled + protoF.Desktop = f.GetEntitlement(entitlements.Desktop).Enabled + protoF.FeatureHiding = f.GetEntitlement(entitlements.FeatureHiding).Enabled + protoF.IdentityGovernance = f.GetEntitlement(entitlements.Identity).Enabled + protoF.ExternalAuditStorage = f.GetEntitlement(entitlements.ExternalAuditStorage).Enabled + protoF.JoinActiveSessions = f.GetEntitlement(entitlements.JoinActiveSessions).Enabled + protoF.MobileDeviceManagement = f.GetEntitlement(entitlements.MobileDeviceManagement).Enabled + + protoF.DeviceTrust = &proto.DeviceTrustFeature{ + Enabled: f.GetEntitlement(entitlements.DeviceTrust).Enabled, DevicesUsageLimit: f.GetEntitlement(entitlements.DeviceTrust).Limit, + } + protoF.AccessRequests = &proto.AccessRequestsFeature{ + MonthlyRequestLimit: f.GetEntitlement(entitlements.AccessRequests).Limit, + } + protoF.AccessMonitoring = &proto.AccessMonitoringFeature{ + Enabled: f.AccessMonitoringConfigured, MaxReportRangeLimit: f.GetEntitlement(entitlements.AccessMonitoring).Limit, + } + protoF.AccessList = &proto.AccessListFeature{ + CreateLimit: f.GetEntitlement(entitlements.AccessLists).Limit, + } + protoF.Policy = &proto.PolicyFeature{ + Enabled: f.GetEntitlement(entitlements.Policy).Enabled, + } } -// AccessMonitoring holds the Access Monitoring feature settings. -// Limits have no affect if [Feature.IdentityGovernanceSecurity] is enabled. -type AccessMonitoringFeature struct { - // True if enabled in the auth service config: [auth_service.access_monitoring.enabled]. - Enabled bool - // Defines the max number of days to include in an access report. - MaxReportRangeLimit int +// EntitlementsToProto takes the features.Entitlements object and returns a proto version. If not present on Features, the +// proto entitlement will default to false +func (f Features) EntitlementsToProto() map[string]*proto.EntitlementInfo { + all := entitlements.AllEntitlements + result := make(map[string]*proto.EntitlementInfo, len(all)) + + for _, e := range all { + al, ok := f.Entitlements[e] + if !ok { + result[string(e)] = &proto.EntitlementInfo{} + continue + } + + result[string(e)] = &proto.EntitlementInfo{ + Enabled: al.Enabled, + Limit: al.Limit, + } + } + + return result } -type PolicyFeature struct { - // Enabled is set to `true` if Teleport Policy is enabled in the license. - Enabled bool +// GetEntitlement takes an entitlement and returns either the Features entitlement, or if not present, a false entitlement +func (f Features) GetEntitlement(e entitlements.EntitlementKind) EntitlementInfo { + al, ok := f.Entitlements[e] + if !ok { + return EntitlementInfo{} + } + + return EntitlementInfo{ + Enabled: al.Enabled, + Limit: al.Limit, + } } -// ToProto converts Features into proto.Features -func (f Features) ToProto() *proto.Features { - return &proto.Features{ - ProductType: proto.ProductType(f.ProductType), - Kubernetes: f.Kubernetes, - App: f.App, - DB: f.DB, - OIDC: f.OIDC, - SAML: f.SAML, - AccessControls: f.AccessControls, - AdvancedAccessWorkflows: f.AdvancedAccessWorkflows, - Cloud: f.Cloud, - HSM: f.HSM, - Desktop: f.Desktop, - RecoveryCodes: f.RecoveryCodes, - Plugins: f.Plugins, - AutomaticUpgrades: f.AutomaticUpgrades, - IsUsageBased: f.IsUsageBasedBilling, - FeatureHiding: f.FeatureHiding, - CustomTheme: f.CustomTheme, - AccessGraph: f.AccessGraph, - DeviceTrust: &proto.DeviceTrustFeature{ - Enabled: f.DeviceTrust.Enabled, - DevicesUsageLimit: int32(f.DeviceTrust.DevicesUsageLimit), - }, - AccessRequests: &proto.AccessRequestsFeature{ - MonthlyRequestLimit: int32(f.AccessRequests.MonthlyRequestLimit), - }, - IdentityGovernance: f.IdentityGovernanceSecurity, - AccessMonitoring: &proto.AccessMonitoringFeature{ - Enabled: f.AccessMonitoring.Enabled, - MaxReportRangeLimit: int32(f.AccessMonitoring.MaxReportRangeLimit), - }, - AccessList: &proto.AccessListFeature{ - CreateLimit: int32(f.AccessList.CreateLimit), - }, - Policy: &proto.PolicyFeature{ - Enabled: f.Policy.Enabled, - }, - Questionnaire: f.Questionnaire, - IsStripeManaged: f.IsStripeManaged, - ExternalAuditStorage: f.ExternalAuditStorage, - SupportType: f.SupportType, - JoinActiveSessions: f.JoinActiveSessions, - MobileDeviceManagement: f.MobileDeviceManagement, +// GetProtoEntitlement takes a proto features set and an entitlement and returns either the proto features entitlement, +// or if not present, a false entitlement +func GetProtoEntitlement(f *proto.Features, e entitlements.EntitlementKind) *proto.EntitlementInfo { + fE := f.GetEntitlements() + al, ok := fE[string(e)] + if !ok { + return &proto.EntitlementInfo{} + } + + return &proto.EntitlementInfo{ + Enabled: al.Enabled, + Limit: al.Limit, } } @@ -230,23 +228,6 @@ const ( ProductTypeEUB ProductType = 2 ) -// IsLegacy describes the legacy enterprise product that existed before the -// usage-based product was introduced. Some features (Device Trust, for example) -// require the IGS add-on in usage-based products but are included for legacy -// licenses. -func (f Features) IsLegacy() bool { - return !f.IsUsageBasedBilling -} - -func (f Features) IGSEnabled() bool { - return f.IdentityGovernanceSecurity -} - -// TODO(mcbattirola): remove isTeam when it is no longer used -func (f Features) IsTeam() bool { - return f.ProductType == ProductTypeTeam -} - // AccessResourcesGetter is a minimal interface that is used to get access lists // and related resources from the backend. type AccessResourcesGetter interface { @@ -398,20 +379,23 @@ func (p *defaultModules) PrintVersion() { fmt.Printf("Teleport v%s git:%s %s\n", teleport.Version, teleport.Gitref, runtime.Version()) } -// Features returns supported features +// Features returns supported features for default modules which is applied for OSS users +// todo (michellescripts) remove deprecated features func (p *defaultModules) Features() Features { p.loadDynamicValues.Do(func() { p.automaticUpgrades = automaticupgrades.IsEnabled() }) return Features{ - Kubernetes: true, - DB: true, - App: true, - Desktop: true, - AutomaticUpgrades: p.automaticUpgrades, - JoinActiveSessions: true, - SupportType: proto.SupportType_SUPPORT_TYPE_FREE, + AutomaticUpgrades: p.automaticUpgrades, + SupportType: proto.SupportType_SUPPORT_TYPE_FREE, + Entitlements: map[entitlements.EntitlementKind]EntitlementInfo{ + entitlements.App: {Enabled: true, Limit: 0}, + entitlements.DB: {Enabled: true, Limit: 0}, + entitlements.Desktop: {Enabled: true, Limit: 0}, + entitlements.JoinActiveSessions: {Enabled: true, Limit: 0}, + entitlements.K8s: {Enabled: true, Limit: 0}, + }, } } diff --git a/lib/modules/modules_test.go b/lib/modules/modules_test.go index 4b00efd2d79f2..4d0946adf6011 100644 --- a/lib/modules/modules_test.go +++ b/lib/modules/modules_test.go @@ -20,13 +20,16 @@ package modules_test import ( "context" + "math" "os" "testing" "github.com/stretchr/testify/require" + "github.com/gravitational/teleport/api/client/proto" "github.com/gravitational/teleport/api/constants" "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/entitlements" "github.com/gravitational/teleport/lib/auth" "github.com/gravitational/teleport/lib/modules" ) @@ -86,3 +89,197 @@ func TestValidateSessionRecordingConfigOnCloud(t *testing.T) { _, err = testServer.AuthServer.UpsertSessionRecordingConfig(ctx, recConfig) require.EqualError(t, err, "cannot set proxy recording mode on Cloud") } + +func TestFeatures_ToProto(t *testing.T) { + expected := &proto.Features{ + CustomTheme: "dark", + ProductType: 1, + SupportType: 1, + AccessControls: true, + AccessGraph: true, + AdvancedAccessWorkflows: true, + AutomaticUpgrades: true, + Cloud: true, + IsStripeManaged: true, + IsUsageBased: true, + Plugins: true, + Questionnaire: true, + RecoveryCodes: true, + AccessMonitoringConfigured: false, + Entitlements: map[string]*proto.EntitlementInfo{ + string(entitlements.AccessLists): {Enabled: true, Limit: 111}, + string(entitlements.AccessMonitoring): {Enabled: true, Limit: 2113}, + string(entitlements.AccessRequests): {Enabled: true, Limit: 39}, + string(entitlements.App): {Enabled: false}, + string(entitlements.CloudAuditLogRetention): {Enabled: true}, + string(entitlements.DB): {Enabled: true}, + string(entitlements.Desktop): {Enabled: true}, + string(entitlements.DeviceTrust): {Enabled: true, Limit: 103}, + string(entitlements.ExternalAuditStorage): {Enabled: true}, + string(entitlements.FeatureHiding): {Enabled: true}, + string(entitlements.HSM): {Enabled: true}, + string(entitlements.Identity): {Enabled: true}, + string(entitlements.JoinActiveSessions): {Enabled: true}, + string(entitlements.K8s): {Enabled: true}, + string(entitlements.MobileDeviceManagement): {Enabled: true}, + string(entitlements.OIDC): {Enabled: true}, + string(entitlements.OktaSCIM): {Enabled: true}, + string(entitlements.OktaUserSync): {Enabled: true}, + string(entitlements.Policy): {Enabled: true}, + string(entitlements.SAML): {Enabled: true}, + string(entitlements.SessionLocks): {Enabled: true}, + string(entitlements.UpsellAlert): {Enabled: true}, + string(entitlements.UsageReporting): {Enabled: true}, + }, + // Legacy Fields; remove in v18 + Kubernetes: true, + App: false, + DB: true, + OIDC: true, + SAML: true, + HSM: true, + Desktop: true, + FeatureHiding: true, + IdentityGovernance: true, + ExternalAuditStorage: true, + JoinActiveSessions: true, + MobileDeviceManagement: true, + DeviceTrust: &proto.DeviceTrustFeature{ + Enabled: true, + DevicesUsageLimit: 103, + }, + AccessRequests: &proto.AccessRequestsFeature{ + MonthlyRequestLimit: 39, + }, + AccessMonitoring: &proto.AccessMonitoringFeature{ + Enabled: false, // set to value of AccessMonitoringConfigured + MaxReportRangeLimit: 2113, + }, + AccessList: &proto.AccessListFeature{ + CreateLimit: 111, + }, + Policy: &proto.PolicyFeature{ + Enabled: true, + }, + } + + f := modules.Features{ + CustomTheme: "dark", + ProductType: 1, + SupportType: 1, + AccessControls: true, + AccessGraph: true, + AdvancedAccessWorkflows: true, + Assist: true, + AutomaticUpgrades: true, + Cloud: true, + IsStripeManaged: true, + IsUsageBasedBilling: true, + Plugins: true, + Questionnaire: true, + RecoveryCodes: true, + AccessMonitoringConfigured: false, + Entitlements: map[entitlements.EntitlementKind]modules.EntitlementInfo{ + entitlements.AccessLists: {Enabled: true, Limit: 111}, + entitlements.AccessMonitoring: {Enabled: true, Limit: 2113}, + entitlements.AccessRequests: {Enabled: true, Limit: 39}, + entitlements.App: {Enabled: false, Limit: 0}, + entitlements.CloudAuditLogRetention: {Enabled: true, Limit: 0}, + entitlements.DB: {Enabled: true, Limit: 0}, + entitlements.Desktop: {Enabled: true, Limit: 0}, + entitlements.DeviceTrust: {Enabled: true, Limit: 103}, + entitlements.ExternalAuditStorage: {Enabled: true, Limit: 0}, + entitlements.FeatureHiding: {Enabled: true, Limit: 0}, + entitlements.HSM: {Enabled: true, Limit: 0}, + entitlements.Identity: {Enabled: true, Limit: 0}, + entitlements.JoinActiveSessions: {Enabled: true, Limit: 0}, + entitlements.K8s: {Enabled: true, Limit: 0}, + entitlements.MobileDeviceManagement: {Enabled: true, Limit: 0}, + entitlements.OIDC: {Enabled: true, Limit: 0}, + entitlements.OktaSCIM: {Enabled: true, Limit: 0}, + entitlements.OktaUserSync: {Enabled: true, Limit: 0}, + entitlements.Policy: {Enabled: true, Limit: 0}, + entitlements.SAML: {Enabled: true, Limit: 0}, + entitlements.SessionLocks: {Enabled: true, Limit: 0}, + entitlements.UpsellAlert: {Enabled: true, Limit: 0}, + entitlements.UsageReporting: {Enabled: true, Limit: 0}, + }, + } + + actual := f.ToProto() + require.Equal(t, expected, actual) +} + +func TestFeatures_GetEntitlement(t *testing.T) { + f := modules.Features{ + Entitlements: map[entitlements.EntitlementKind]modules.EntitlementInfo{ + entitlements.AccessLists: {Enabled: true, Limit: 111}, + entitlements.K8s: {Enabled: false}, + entitlements.SAML: {}, + }, + } + + actual := f.GetEntitlement(entitlements.AccessLists) + require.Equal(t, modules.EntitlementInfo{Enabled: true, Limit: 111}, actual) + + actual = f.GetEntitlement(entitlements.K8s) + require.Equal(t, modules.EntitlementInfo{Enabled: false}, actual) + + actual = f.GetEntitlement(entitlements.SAML) + require.Equal(t, modules.EntitlementInfo{}, actual) + + actual = f.GetEntitlement(entitlements.UsageReporting) + require.Equal(t, modules.EntitlementInfo{}, actual) +} + +func TestEntitlementInfo_UnderLimit(t *testing.T) { + testCases := []struct { + name string + count int + uut modules.EntitlementInfo + assert require.BoolAssertionFunc + }{ + { + name: "disabled is always out of limit", + count: 10, + uut: modules.EntitlementInfo{Enabled: false, Limit: 10000}, + assert: require.False, + }, + { + name: "within limits returns true", + count: 10, + uut: modules.EntitlementInfo{Enabled: true, Limit: 10000}, + assert: require.True, + }, + { + name: "at limits returns false", + count: 10000, + uut: modules.EntitlementInfo{Enabled: true, Limit: 10000}, + assert: require.False, + }, + { + name: "above limits returns false", + count: 10001, + uut: modules.EntitlementInfo{Enabled: true, Limit: 10000}, + assert: require.False, + }, + { + name: "zero limit implies max", + count: math.MaxInt64, + uut: modules.EntitlementInfo{Enabled: true, Limit: 0}, + assert: require.True, + }, + { + name: "handles above MaxInt32", + count: math.MaxInt32 + 1, + uut: modules.EntitlementInfo{Enabled: true, Limit: math.MaxInt32}, + assert: require.False, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + tc.assert(t, tc.uut.UnderLimit(tc.count)) + }) + } +} diff --git a/lib/service/kubernetes.go b/lib/service/kubernetes.go index 2681f7a404043..432ff238bcc0e 100644 --- a/lib/service/kubernetes.go +++ b/lib/service/kubernetes.go @@ -29,9 +29,11 @@ import ( "github.com/gravitational/teleport" apidefaults "github.com/gravitational/teleport/api/defaults" "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/entitlements" "github.com/gravitational/teleport/lib/authz" kubeproxy "github.com/gravitational/teleport/lib/kube/proxy" "github.com/gravitational/teleport/lib/labels" + "github.com/gravitational/teleport/lib/modules" "github.com/gravitational/teleport/lib/multiplexer" "github.com/gravitational/teleport/lib/reversetunnel" "github.com/gravitational/teleport/lib/reversetunnelclient" @@ -47,7 +49,9 @@ func (process *TeleportProcess) initKubernetes() { if conn == nil { return trace.Wrap(err) } - if !process.GetClusterFeatures().Kubernetes { + features := process.GetClusterFeatures() + k8s := modules.GetProtoEntitlement(&features, entitlements.K8s) + if !k8s.Enabled { logger.WarnContext(process.ExitContext(), "Warning: Kubernetes service not initialized because Teleport Auth Server is not licensed for Kubernetes Access. Please contact the cluster administrator to enable it.") return nil } diff --git a/lib/service/service_test.go b/lib/service/service_test.go index f1c4e37d43489..c9cc7bcfb5f93 100644 --- a/lib/service/service_test.go +++ b/lib/service/service_test.go @@ -49,6 +49,7 @@ import ( "github.com/gravitational/teleport" "github.com/gravitational/teleport/api/breaker" "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/entitlements" "github.com/gravitational/teleport/lib" "github.com/gravitational/teleport/lib/auth" "github.com/gravitational/teleport/lib/auth/authclient" @@ -477,8 +478,10 @@ func TestAthenaAuditLogSetup(t *testing.T) { ctx := context.Background() modules.SetTestModules(t, &modules.TestModules{ TestFeatures: modules.Features{ - Cloud: true, - ExternalAuditStorage: true, + Cloud: true, + Entitlements: map[entitlements.EntitlementKind]modules.EntitlementInfo{ + entitlements.ExternalAuditStorage: {Enabled: true}, + }, }, }) diff --git a/lib/services/local/access_list.go b/lib/services/local/access_list.go index 49c075448e246..97317a4648999 100644 --- a/lib/services/local/access_list.go +++ b/lib/services/local/access_list.go @@ -34,6 +34,7 @@ import ( "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/api/types/accesslist" "github.com/gravitational/teleport/api/types/header" + "github.com/gravitational/teleport/entitlements" "github.com/gravitational/teleport/lib/backend" "github.com/gravitational/teleport/lib/modules" "github.com/gravitational/teleport/lib/services" @@ -195,7 +196,7 @@ func (a *AccessListService) runOpWithLock(ctx context.Context, accessList *acces // the AccessList feature action := updateAccessList - if !modules.GetModules().Features().IGSEnabled() { + if !modules.GetModules().Features().GetEntitlement(entitlements.Identity).Enabled { action = func() error { err := a.service.RunWhileLocked(ctx, createAccessListLimitLockName, accessListLockTTL, func(ctx context.Context, _ backend.Backend) error { @@ -463,7 +464,7 @@ func (a *AccessListService) UpsertAccessListWithMembers(ctx context.Context, acc // AccessList feature action := reconcileMembers - if !modules.GetModules().Features().IGSEnabled() { + if !modules.GetModules().Features().GetEntitlement(entitlements.Identity).Enabled { action = func() error { return a.service.RunWhileLocked(ctx, createAccessListLimitLockName, 2*accessListLockTTL, func(ctx context.Context, _ backend.Backend) error { @@ -659,8 +660,8 @@ func lockName(accessListName string) string { // access list name matches the ones we retrieved. // Returns error if limit has been reached. func (a *AccessListService) VerifyAccessListCreateLimit(ctx context.Context, targetAccessListName string) error { - feature := modules.GetModules().Features() - if feature.IGSEnabled() { + f := modules.GetModules().Features() + if f.GetEntitlement(entitlements.Identity).Enabled { return nil // unlimited } @@ -669,6 +670,9 @@ func (a *AccessListService) VerifyAccessListCreateLimit(ctx context.Context, tar return trace.Wrap(err) } + // We are *always* allowed to create at least one AccessLists in order to + // demonstrate the functionality. + // TODO(tcsc): replace with a default OSS entitlement of 1 if len(lists) == 0 { return nil } @@ -681,7 +685,8 @@ func (a *AccessListService) VerifyAccessListCreateLimit(ctx context.Context, tar } } - if len(lists) < feature.AccessList.CreateLimit { + accessListEntitlement := f.GetEntitlement(entitlements.AccessLists) + if accessListEntitlement.UnderLimit(len(lists)) { return nil } diff --git a/lib/services/local/access_list_test.go b/lib/services/local/access_list_test.go index 4d572b091989c..c0a41478fbb61 100644 --- a/lib/services/local/access_list_test.go +++ b/lib/services/local/access_list_test.go @@ -34,6 +34,7 @@ import ( "github.com/gravitational/teleport/api/types/accesslist" "github.com/gravitational/teleport/api/types/header" "github.com/gravitational/teleport/api/types/trait" + "github.com/gravitational/teleport/entitlements" "github.com/gravitational/teleport/lib/backend" "github.com/gravitational/teleport/lib/backend/memory" "github.com/gravitational/teleport/lib/modules" @@ -140,36 +141,218 @@ func TestAccessListCRUD(t *testing.T) { require.ElementsMatch(t, expectedAccessList, created.Spec.Owners) } -// TestAccessListCreate_UpsertAccessList_WithoutLimit tests creating access list -// is unlimited if IGS feature is enabled. -func TestAccessListCreate_UpsertAccessList_WithoutLimit(t *testing.T) { +func requireAccessDenied(t require.TestingT, err error, i ...any) { + require.True( + t, + trace.IsAccessDenied(err), + "err should be access denied, was: %s", err, + ) +} + +// TestAccessList_EntitlementLimits asserts that any limits on creating +// AccessLists are correctly enforced at Upsert time. +func TestAccessList_EntitlementLimits(t *testing.T) { + type aclSelector func([]*accesslist.AccessList) *accesslist.AccessList + ctx := context.Background() clock := clockwork.NewFakeClock() - mem, err := memory.New(memory.Config{ - Context: ctx, - Clock: clock, - }) - require.NoError(t, err) + // an ACL selection function that creates a new AccessList to insert + createNew := func([]*accesslist.AccessList) *accesslist.AccessList { + return newAccessList(t, "test-target", clock) + } - service := newAccessListService(t, mem, clock, true /* igsEnabled */) + // an ACL selection function that selects the nth access list from the list + // of pre-created ACLs. Used to simulate an update. + update := func(n int) aclSelector { + return func(acls []*accesslist.AccessList) *accesslist.AccessList { + return acls[n] + } + } - accessList1 := newAccessList(t, "accessList1", clock) - accessList2 := newAccessList(t, "accessList2", clock) - accessList3 := newAccessList(t, "accessList3", clock) + testCases := []struct { + name string + igsEnabled bool + aclName string + entitlement modules.EntitlementInfo + existingACLCount int + aclSelector aclSelector + expectErrorFn require.ErrorAssertionFunc + expectedACLCount int + }{ + { + name: "igs-enabled-no-limit-on-create", + igsEnabled: true, + entitlement: modules.EntitlementInfo{Enabled: false}, + existingACLCount: 3, + aclSelector: createNew, + expectErrorFn: require.NoError, + expectedACLCount: 4, + }, + { + name: "can-create-one-access-list-when-disabled", + igsEnabled: false, + entitlement: modules.EntitlementInfo{Enabled: false}, + existingACLCount: 0, + aclSelector: createNew, + expectErrorFn: require.NoError, + expectedACLCount: 1, + }, + { + name: "cant-create-a-second-access-list-when-disabled", + igsEnabled: false, + entitlement: modules.EntitlementInfo{Enabled: false}, + existingACLCount: 1, + aclSelector: createNew, + expectErrorFn: requireAccessDenied, + expectedACLCount: 1, + }, + { + name: "disabled-allows-update", + igsEnabled: false, + entitlement: modules.EntitlementInfo{Enabled: false}, + existingACLCount: 3, + aclSelector: update(1), + expectErrorFn: require.NoError, + expectedACLCount: 3, + }, + { + name: "under-default-limit-succeeds", + igsEnabled: false, + entitlement: modules.EntitlementInfo{Enabled: true, Limit: 1}, + existingACLCount: 0, + aclSelector: createNew, + expectErrorFn: require.NoError, + expectedACLCount: 1, + }, + { + name: "at-default-limit-fails", + igsEnabled: false, + entitlement: modules.EntitlementInfo{Enabled: true, Limit: 1}, + existingACLCount: 1, + aclSelector: createNew, + expectErrorFn: requireAccessDenied, + expectedACLCount: 1, + }, + { + name: "at-default-limit-allows-update", + igsEnabled: false, + entitlement: modules.EntitlementInfo{Enabled: true, Limit: 1}, + existingACLCount: 1, + aclSelector: update(0), + expectErrorFn: require.NoError, + expectedACLCount: 1, + }, + { + name: "infinite-limit-succeeds", + igsEnabled: false, + entitlement: modules.EntitlementInfo{Enabled: true, Limit: 0}, + existingACLCount: 5, + aclSelector: createNew, + expectErrorFn: require.NoError, + expectedACLCount: 6, + }, + { + name: "above-limit-fails", + igsEnabled: false, + entitlement: modules.EntitlementInfo{Enabled: true, Limit: 10}, + existingACLCount: 20, + aclSelector: createNew, + expectErrorFn: requireAccessDenied, + expectedACLCount: 20, + }, + { + name: "above-limit-allows-update", + igsEnabled: false, + entitlement: modules.EntitlementInfo{Enabled: true, Limit: 10}, + existingACLCount: 20, + aclSelector: update(15), + expectErrorFn: require.NoError, + expectedACLCount: 20, + }, + } - // No limit to creating access list. - _, err = service.UpsertAccessList(ctx, accessList1) - require.NoError(t, err) - _, err = service.UpsertAccessList(ctx, accessList2) - require.NoError(t, err) - _, err = service.UpsertAccessList(ctx, accessList3) - require.NoError(t, err) + // aclOperation abstracts over Upsert and UpsertWithMembers so we can use + // the same test code and cases for both operations. + type aclOperation func(context.Context, *AccessListService, *accesslist.AccessList) (*accesslist.AccessList, error) - // Fetch all access lists. - out, err := service.GetAccessLists(ctx) - require.NoError(t, err) - require.Len(t, out, 3) + operations := []struct { + name string + invoke aclOperation + }{ + { + name: "Upsert", + invoke: func(ctx context.Context, uut *AccessListService, acl *accesslist.AccessList) (*accesslist.AccessList, error) { + return uut.UpsertAccessList(ctx, acl) + }, + }, + { + name: "UpsertWithMembers", + invoke: func(ctx context.Context, uut *AccessListService, acl *accesslist.AccessList) (*accesslist.AccessList, error) { + updatedACL, _, err := uut.UpsertAccessListWithMembers(ctx, acl, []*accesslist.AccessListMember{}) + return updatedACL, err + }, + }, + } + + for _, op := range operations { + t.Run(op.name, func(t *testing.T) { + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + // GIVEN an AccessList service specifically configured with/without + // IGS and a specific AccessList entitlement... + mem, err := memory.New(memory.Config{ + Context: ctx, + Clock: clock, + }) + require.NoError(t, err, "failed creating in-memory backend") + uut := newAccessListService(t, mem, clock, tc.igsEnabled) + + // note - we do this _after_ creating the AccessList Service test + // target because the `newAccessListService()` fixture also sets the + // test modules, and that would clobber our test setup if we went + // first + modules.SetTestModules(t, &modules.TestModules{ + TestBuildType: modules.BuildEnterprise, + TestFeatures: modules.Features{ + Entitlements: map[entitlements.EntitlementKind]modules.EntitlementInfo{ + entitlements.Identity: {Enabled: tc.igsEnabled}, + entitlements.AccessLists: tc.entitlement, + }, + }, + }) + + // ALSO GIVEN a number of pre-created AccessLists... + var preCreatedACLs []*accesslist.AccessList + for i := 0; i < tc.existingACLCount; i++ { + // note that we write these setup resources directly to the back-end + // service in order to bypass any limit enforcement. This lets us + // set up a wider range of interesting test cases + acl, err := uut.service.UpsertResource(ctx, + newAccessList(t, fmt.Sprintf("accessList-%02d", i), clock)) + require.NoError(t, err, "Creating existing AccessLists for test") + preCreatedACLs = append(preCreatedACLs, acl) + } + + // WHEN I attempt to create a new AccessList or update an existing + // one... + testACL := tc.aclSelector(preCreatedACLs) + _, err = op.invoke(ctx, uut, testACL) + + // EXPECT that the error state will match the expectation in the + // test case + + tc.expectErrorFn(t, err) + + // ALSO EXPECT that the number of AccessLists stored by the service + // matches the expectation in the test case + out, err := uut.GetAccessLists(ctx) + require.NoError(t, err) + require.Len(t, out, tc.expectedACLCount) + }) + } + }) + } } // TestAccessListCreate_UpdateAccessList tests creating access list @@ -206,148 +389,6 @@ func TestAccessListCreate_UpdateAccessList(t *testing.T) { require.True(t, trace.IsCompareFailed(err), "expected precondition failed error, got %v", err) } -// TestAccessListCreate_UpsertAccessList_WithLimit tests creating access list -// is limited to the limit defined in feature if IGS is NOT enabled. -// Also tests "upserting" and deleting is allowed despite "create" limit reached. -func TestAccessListCreate_UpsertAccessList_WithLimit(t *testing.T) { - ctx := context.Background() - clock := clockwork.NewFakeClock() - - mem, err := memory.New(memory.Config{ - Context: ctx, - Clock: clock, - }) - require.NoError(t, err) - - service := newAccessListService(t, mem, clock, false /* igsEnabled */) - - accessList1 := newAccessList(t, "accessList1", clock) - accessList2 := newAccessList(t, "accessList2", clock) - - // First create is free. - _, err = service.UpsertAccessList(ctx, accessList1) - require.NoError(t, err) - - // Second create should return an error. - _, err = service.UpsertAccessList(ctx, accessList2) - require.True(t, trace.IsAccessDenied(err), "expected access denied / license limit error, got %v", err) - require.ErrorContains(t, err, "reached its limit") - - // Double check only be one access list exists. - out, err := service.GetAccessLists(ctx) - require.NoError(t, err) - require.Len(t, out, 1) - - // Updating existing access list should be allowed. - accessList1.Spec.Description = "changing description" - _, err = service.UpsertAccessList(ctx, accessList1) - require.NoError(t, err) - - // Delete the one access list. - err = service.DeleteAccessList(ctx, "accessList1") - require.NoError(t, err) - - // Create the same list again. - _, err = service.UpsertAccessList(ctx, accessList1) - require.NoError(t, err) -} - -// TestAccessListCreate_UpsertAccessListWithMembers_WithLimit tests creating access list -// with members, is limited to the limit defined in feature if IGS is NOT enabled. -// Also tests "upserting" and deleting is allowed despite "create" limit reached. -func TestAccessListCreate_UpsertAccessListWithMembers_WithLimit(t *testing.T) { - ctx := context.Background() - clock := clockwork.NewFakeClock() - - mem, err := memory.New(memory.Config{ - Context: ctx, - Clock: clock, - }) - require.NoError(t, err) - - service := newAccessListService(t, mem, clock, false /* igsEnabled */) - - accessList1 := newAccessList(t, "accessList1", clock) - accessList2 := newAccessList(t, "accessList2", clock) - - accessListMember1 := newAccessListMember(t, accessList1.GetName(), "alice") - accessListMember2 := newAccessListMember(t, accessList1.GetName(), "bob") - - // First create is free. - _, _, err = service.UpsertAccessListWithMembers(ctx, accessList1, []*accesslist.AccessListMember{accessListMember1}) - require.NoError(t, err) - - // Check the count - count, err := service.CountAccessListMembers(ctx, accessList1.GetName()) - require.NoError(t, err) - require.Equal(t, uint32(1), count) - - // Second create should return an error. - _, _, err = service.UpsertAccessListWithMembers(ctx, accessList2, []*accesslist.AccessListMember{accessListMember2}) - require.True(t, trace.IsAccessDenied(err), "expected access denied / license limit error, got %v", err) - require.ErrorContains(t, err, "reached its limit") - - // Double check only be one access list exists. - out, err := service.GetAccessLists(ctx) - require.NoError(t, err) - require.Len(t, out, 1) - require.Equal(t, "accessList1", out[0].Metadata.Name) - - // Double check only one member exists. - members, _, err := service.ListAccessListMembers(ctx, accessList1.GetName(), 0 /* default size*/, "") - require.NoError(t, err) - require.Len(t, members, 1) - require.Equal(t, "alice", members[0].Metadata.Name) - - // Updating existing access list should be allowed. - accessList1.Spec.Description = "changing description" - _, _, err = service.UpsertAccessListWithMembers(ctx, accessList1, []*accesslist.AccessListMember{accessListMember1}) - require.NoError(t, err) - - // Delete the one access list. - err = service.DeleteAccessList(ctx, "accessList1") - require.NoError(t, err) - - // Create the same list again. - _, _, err = service.UpsertAccessListWithMembers(ctx, accessList1, []*accesslist.AccessListMember{accessListMember1}) - require.NoError(t, err) -} - -// TestAccessListCreate_UpsertAccessListWithMembers_WithoutLimit tests creating access list -// with members is unlimited if IGS feature is enabled. -func TestAccessListCreate_UpsertAccessListWithMembers_WithoutLimit(t *testing.T) { - ctx := context.Background() - clock := clockwork.NewFakeClock() - - mem, err := memory.New(memory.Config{ - Context: ctx, - Clock: clock, - }) - require.NoError(t, err) - - service := newAccessListService(t, mem, clock, true /* igsEnabled */) - - accessList1 := newAccessList(t, "accessList1", clock) - accessList2 := newAccessList(t, "accessList2", clock) - accessList3 := newAccessList(t, "accessList3", clock) - - accessListMember1 := newAccessListMember(t, accessList1.GetName(), "alice") - accessListMember2 := newAccessListMember(t, accessList1.GetName(), "bob") - - // No limit to creating access list. - _, _, err = service.UpsertAccessListWithMembers(ctx, accessList1, []*accesslist.AccessListMember{accessListMember1}) - require.NoError(t, err) - _, _, err = service.UpsertAccessListWithMembers(ctx, accessList2, []*accesslist.AccessListMember{accessListMember2}) - require.NoError(t, err) - _, _, err = service.UpsertAccessListWithMembers(ctx, accessList3, []*accesslist.AccessListMember{}) - require.NoError(t, err) - - // Fetch all access lists. - out, err := service.GetAccessLists(ctx) - require.NoError(t, err) - require.Len(t, out, 3) -} - func TestAccessListDedupeOwnersBackwardsCompat(t *testing.T) { ctx := context.Background() clock := clockwork.NewFakeClock() @@ -1167,9 +1208,9 @@ func newAccessListService(t *testing.T, mem *memory.Memory, clock clockwork.Cloc modules.SetTestModules(t, &modules.TestModules{ TestFeatures: modules.Features{ - IdentityGovernanceSecurity: igsEnabled, - AccessList: modules.AccessListFeature{ - CreateLimit: 1, + Entitlements: map[entitlements.EntitlementKind]modules.EntitlementInfo{ + entitlements.Identity: {Enabled: igsEnabled}, + entitlements.AccessLists: {Enabled: true, Limit: 1}, }, }, }) diff --git a/lib/srv/db/access_test.go b/lib/srv/db/access_test.go index 4a2ba8a53dca0..c3a62d899cd6f 100644 --- a/lib/srv/db/access_test.go +++ b/lib/srv/db/access_test.go @@ -54,6 +54,7 @@ import ( "github.com/gravitational/teleport" "github.com/gravitational/teleport/api/constants" "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/entitlements" "github.com/gravitational/teleport/lib/auth" "github.com/gravitational/teleport/lib/auth/authclient" "github.com/gravitational/teleport/lib/auth/native" @@ -1076,7 +1077,9 @@ func TestMongoDBMaxMessageSize(t *testing.T) { func TestAccessDisabled(t *testing.T) { modules.SetTestModules(t, &modules.TestModules{ TestFeatures: modules.Features{ - DB: false, + Entitlements: map[entitlements.EntitlementKind]modules.EntitlementInfo{ + entitlements.DB: {Enabled: false}, + }, }, }) diff --git a/lib/srv/discovery/access_graph.go b/lib/srv/discovery/access_graph.go index c92468a4e616c..3eec9262a16d1 100644 --- a/lib/srv/discovery/access_graph.go +++ b/lib/srv/discovery/access_graph.go @@ -34,7 +34,9 @@ import ( "github.com/gravitational/teleport/api/metadata" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/api/utils/retryutils" + "github.com/gravitational/teleport/entitlements" accessgraphv1alpha "github.com/gravitational/teleport/gen/proto/go/accessgraph/v1alpha" + "github.com/gravitational/teleport/lib/modules" "github.com/gravitational/teleport/lib/services" aws_sync "github.com/gravitational/teleport/lib/srv/discovery/fetchers/aws-sync" ) @@ -249,7 +251,8 @@ func (s *Server) initializeAndWatchAccessGraph(ctx context.Context, reloadCh <-c ) clusterFeatures := s.Config.ClusterFeatures() - if !clusterFeatures.AccessGraph && (clusterFeatures.Policy == nil || !clusterFeatures.Policy.Enabled) { + policy := modules.GetProtoEntitlement(&clusterFeatures, entitlements.Policy) + if !clusterFeatures.AccessGraph && !policy.Enabled { return trace.Wrap(errTAGFeatureNotEnabled) } diff --git a/lib/web/apiserver.go b/lib/web/apiserver.go index 07f87c6ab53f2..daa42d0a79d27 100644 --- a/lib/web/apiserver.go +++ b/lib/web/apiserver.go @@ -72,6 +72,7 @@ import ( "github.com/gravitational/teleport/api/types/installers" "github.com/gravitational/teleport/api/utils/keys" apisshutils "github.com/gravitational/teleport/api/utils/sshutils" + "github.com/gravitational/teleport/entitlements" "github.com/gravitational/teleport/lib/auth" "github.com/gravitational/teleport/lib/auth/authclient" "github.com/gravitational/teleport/lib/auth/state" @@ -1095,14 +1096,11 @@ func (h *Handler) getUserContext(w http.ResponseWriter, r *http.Request, p httpr if err != nil { return nil, trace.Wrap(err) } - accessMonitoringEnabled := pingResp.GetServerFeatures().GetAccessMonitoring().GetEnabled() - // DELETE IN 16.0 - // If ServerFeatures.AccessMonitoring is nil, then that means the response came from a older auth - // where ServerFeatures.AccessMonitoring field does not exist. - if pingResp.GetServerFeatures().GetAccessMonitoring() == nil { - accessMonitoringEnabled = pingResp.ServerFeatures != nil && pingResp.ServerFeatures.GetIdentityGovernance() - } + features := pingResp.GetServerFeatures() + entitlement := modules.GetProtoEntitlement(features, entitlements.AccessMonitoring) + // ensure entitlement is set & feature is configured + accessMonitoringEnabled := entitlement.Enabled && features.GetAccessMonitoringConfigured() userContext, err := ui.NewUserContext(user, accessChecker.Roles(), *pingResp.ServerFeatures, desktopRecordingEnabled, accessMonitoringEnabled) if err != nil { @@ -1646,11 +1644,6 @@ func (h *Handler) getWebConfig(w http.ResponseWriter, r *http.Request, p httprou } } - // TODO(mcbattirola): remove isTeam when it is no longer used - isTeam := clusterFeatures.GetProductType() == proto.ProductType_PRODUCT_TYPE_TEAM - - policy := clusterFeatures.GetPolicy() - webCfg := webclient.WebConfig{ Edition: modules.GetModules().BuildType(), Auth: authSettings, @@ -1660,33 +1653,22 @@ func (h *Handler) getWebConfig(w http.ResponseWriter, r *http.Request, p httprou RecoveryCodesEnabled: clusterFeatures.GetRecoveryCodes(), UI: h.getUIConfig(r.Context()), IsDashboard: services.IsDashboard(clusterFeatures), + IsTeam: false, IsUsageBasedBilling: clusterFeatures.GetIsUsageBased(), AutomaticUpgrades: automaticUpgradesEnabled, AutomaticUpgradesTargetVersion: automaticUpgradesTargetVersion, - HideInaccessibleFeatures: clusterFeatures.GetFeatureHiding(), CustomTheme: clusterFeatures.GetCustomTheme(), - IsIGSEnabled: clusterFeatures.GetIdentityGovernance(), - IsPolicyEnabled: policy != nil && policy.Enabled, + Questionnaire: clusterFeatures.GetQuestionnaire(), + IsStripeManaged: clusterFeatures.GetIsStripeManaged(), + PremiumSupport: clusterFeatures.GetSupportType() == proto.SupportType_SUPPORT_TYPE_PREMIUM, PlayableDatabaseProtocols: player.SupportedDatabaseProtocols, - FeatureLimits: webclient.FeatureLimits{ - AccessListCreateLimit: int(clusterFeatures.GetAccessList().GetCreateLimit()), - AccessMonitoringMaxReportRangeLimit: int(clusterFeatures.GetAccessMonitoring().GetMaxReportRangeLimit()), - AccessRequestMonthlyRequestLimit: int(clusterFeatures.GetAccessRequests().GetMonthlyRequestLimit()), - }, - Questionnaire: clusterFeatures.GetQuestionnaire(), - IsStripeManaged: clusterFeatures.GetIsStripeManaged(), - ExternalAuditStorage: clusterFeatures.GetExternalAuditStorage(), - PremiumSupport: clusterFeatures.GetSupportType() == proto.SupportType_SUPPORT_TYPE_PREMIUM, - AccessRequests: clusterFeatures.GetAccessRequests().MonthlyRequestLimit > 0, - TrustedDevices: clusterFeatures.GetDeviceTrust().GetEnabled(), - OIDC: clusterFeatures.GetOIDC(), - SAML: clusterFeatures.GetSAML(), - MobileDeviceManagement: clusterFeatures.GetMobileDeviceManagement(), - JoinActiveSessions: clusterFeatures.GetJoinActiveSessions(), - // TODO(mcbattirola): remove isTeam when it is no longer used - IsTeam: isTeam, + // Entitlements are reset/overridden in setEntitlementsWithLegacyLogic until setEntitlementsWithLegacyLogic is removed in v18 + Entitlements: GetWebCfgEntitlements(clusterFeatures.GetEntitlements()), } + // Set entitlements with backwards field compatibility + setEntitlementsWithLegacyLogic(&webCfg, clusterFeatures) + resource, err := h.cfg.ProxyClient.GetClusterName() if err != nil { h.log.WithError(err).Warn("Failed to query cluster name.") @@ -1703,6 +1685,105 @@ func (h *Handler) getWebConfig(w http.ResponseWriter, r *http.Request, p httprou return nil, nil } +// setEntitlementsWithLegacyLogic ensures entitlements on webCfg are backwards compatible +// If Entitlements are present, will set the legacy fields equal to the equivalent entitlement value +// i.e. webCfg.IsIGSEnabled = clusterFeatures.Entitlements[entitlements.Identity].Enabled +// && webCfg.Entitlements[entitlements.Identity] = clusterFeatures.Entitlements[entitlements.Identity].Enabled +// If Entitlements are not present, will set the legacy fields AND the entitlement equal to the legacy feature +// i.e. webCfg.IsIGSEnabled = clusterFeatures.GetIdentityGovernance() +// && webCfg.Entitlements[entitlements.Identity] = clusterFeatures.GetIdentityGovernance() +// todo (michellescripts) remove in v18; & inline entitlement logic above +func setEntitlementsWithLegacyLogic(webCfg *webclient.WebConfig, clusterFeatures proto.Features) { + // if Entitlements are not present, GetWebCfgEntitlements will return a map of entitlement to {enabled:false} + // if Entitlements are present, GetWebCfgEntitlements will populate the fields appropriately + webCfg.Entitlements = GetWebCfgEntitlements(clusterFeatures.GetEntitlements()) + + if ent := clusterFeatures.GetEntitlements(); len(ent) > 0 { + // webCfg.Entitlements: No update as they are set above + // webCfg.: set equal to entitlement value + webCfg.AccessRequests = modules.GetProtoEntitlement(&clusterFeatures, entitlements.AccessRequests).Enabled + webCfg.ExternalAuditStorage = modules.GetProtoEntitlement(&clusterFeatures, entitlements.ExternalAuditStorage).Enabled + webCfg.HideInaccessibleFeatures = modules.GetProtoEntitlement(&clusterFeatures, entitlements.FeatureHiding).Enabled + webCfg.IsIGSEnabled = modules.GetProtoEntitlement(&clusterFeatures, entitlements.Identity).Enabled + webCfg.IsPolicyEnabled = modules.GetProtoEntitlement(&clusterFeatures, entitlements.Policy).Enabled + webCfg.JoinActiveSessions = modules.GetProtoEntitlement(&clusterFeatures, entitlements.JoinActiveSessions).Enabled + webCfg.MobileDeviceManagement = modules.GetProtoEntitlement(&clusterFeatures, entitlements.MobileDeviceManagement).Enabled + webCfg.OIDC = modules.GetProtoEntitlement(&clusterFeatures, entitlements.OIDC).Enabled + webCfg.SAML = modules.GetProtoEntitlement(&clusterFeatures, entitlements.SAML).Enabled + webCfg.TrustedDevices = modules.GetProtoEntitlement(&clusterFeatures, entitlements.DeviceTrust).Enabled + webCfg.FeatureLimits = webclient.FeatureLimits{ + AccessListCreateLimit: int(modules.GetProtoEntitlement(&clusterFeatures, entitlements.AccessLists).Limit), + AccessMonitoringMaxReportRangeLimit: int(modules.GetProtoEntitlement(&clusterFeatures, entitlements.AccessMonitoring).Limit), + AccessRequestMonthlyRequestLimit: int(modules.GetProtoEntitlement(&clusterFeatures, entitlements.AccessRequests).Limit), + } + + } else { + // webCfg.Entitlements: All records are {enabled: false}; update to equal legacy feature value + webCfg.Entitlements[string(entitlements.ExternalAuditStorage)] = webclient.EntitlementInfo{Enabled: clusterFeatures.GetExternalAuditStorage()} + webCfg.Entitlements[string(entitlements.FeatureHiding)] = webclient.EntitlementInfo{Enabled: clusterFeatures.GetFeatureHiding()} + webCfg.Entitlements[string(entitlements.Identity)] = webclient.EntitlementInfo{Enabled: clusterFeatures.GetIdentityGovernance()} + webCfg.Entitlements[string(entitlements.JoinActiveSessions)] = webclient.EntitlementInfo{Enabled: clusterFeatures.GetJoinActiveSessions()} + webCfg.Entitlements[string(entitlements.MobileDeviceManagement)] = webclient.EntitlementInfo{Enabled: clusterFeatures.GetMobileDeviceManagement()} + webCfg.Entitlements[string(entitlements.OIDC)] = webclient.EntitlementInfo{Enabled: clusterFeatures.GetOIDC()} + webCfg.Entitlements[string(entitlements.Policy)] = webclient.EntitlementInfo{Enabled: clusterFeatures.GetPolicy() != nil && clusterFeatures.GetPolicy().Enabled} + webCfg.Entitlements[string(entitlements.SAML)] = webclient.EntitlementInfo{Enabled: clusterFeatures.GetSAML()} + + // set default Identity fields to legacy feature value + webCfg.Entitlements[string(entitlements.AccessLists)] = webclient.EntitlementInfo{Enabled: true, Limit: clusterFeatures.GetAccessList().GetCreateLimit()} + webCfg.Entitlements[string(entitlements.AccessMonitoring)] = webclient.EntitlementInfo{Enabled: clusterFeatures.GetAccessMonitoring().GetEnabled(), Limit: clusterFeatures.GetAccessMonitoring().GetMaxReportRangeLimit()} + webCfg.Entitlements[string(entitlements.AccessRequests)] = webclient.EntitlementInfo{Enabled: clusterFeatures.GetAccessRequests().MonthlyRequestLimit > 0, Limit: clusterFeatures.GetAccessRequests().GetMonthlyRequestLimit()} + webCfg.Entitlements[string(entitlements.DeviceTrust)] = webclient.EntitlementInfo{Enabled: clusterFeatures.GetDeviceTrust().GetEnabled(), Limit: clusterFeatures.GetDeviceTrust().GetDevicesUsageLimit()} + // override Identity Package features if Identity is enabled: set true and clear limit + if clusterFeatures.GetIdentityGovernance() { + webCfg.Entitlements[string(entitlements.AccessLists)] = webclient.EntitlementInfo{Enabled: true} + webCfg.Entitlements[string(entitlements.AccessMonitoring)] = webclient.EntitlementInfo{Enabled: true} + webCfg.Entitlements[string(entitlements.AccessRequests)] = webclient.EntitlementInfo{Enabled: true} + webCfg.Entitlements[string(entitlements.DeviceTrust)] = webclient.EntitlementInfo{Enabled: true} + webCfg.Entitlements[string(entitlements.OktaSCIM)] = webclient.EntitlementInfo{Enabled: true} + webCfg.Entitlements[string(entitlements.OktaUserSync)] = webclient.EntitlementInfo{Enabled: true} + webCfg.Entitlements[string(entitlements.SessionLocks)] = webclient.EntitlementInfo{Enabled: true} + } + + // webCfg.: set equal to legacy feature value + webCfg.AccessRequests = clusterFeatures.GetAccessRequests().MonthlyRequestLimit > 0 + webCfg.ExternalAuditStorage = clusterFeatures.GetExternalAuditStorage() + webCfg.HideInaccessibleFeatures = clusterFeatures.GetFeatureHiding() + webCfg.IsIGSEnabled = clusterFeatures.GetIdentityGovernance() + webCfg.IsPolicyEnabled = clusterFeatures.GetPolicy() != nil && clusterFeatures.GetPolicy().Enabled + webCfg.JoinActiveSessions = clusterFeatures.GetJoinActiveSessions() + webCfg.MobileDeviceManagement = clusterFeatures.GetMobileDeviceManagement() + webCfg.OIDC = clusterFeatures.GetOIDC() + webCfg.SAML = clusterFeatures.GetSAML() + webCfg.TrustedDevices = clusterFeatures.GetDeviceTrust().GetEnabled() + webCfg.FeatureLimits = webclient.FeatureLimits{ + AccessListCreateLimit: int(clusterFeatures.GetAccessList().GetCreateLimit()), + AccessMonitoringMaxReportRangeLimit: int(clusterFeatures.GetAccessMonitoring().GetMaxReportRangeLimit()), + AccessRequestMonthlyRequestLimit: int(clusterFeatures.GetAccessRequests().GetMonthlyRequestLimit()), + } + } +} + +// GetWebCfgEntitlements takes a cloud entitlement set and returns a modules Entitlement set +func GetWebCfgEntitlements(protoEntitlements map[string]*proto.EntitlementInfo) map[string]webclient.EntitlementInfo { + all := entitlements.AllEntitlements + result := make(map[string]webclient.EntitlementInfo, len(all)) + + for _, e := range all { + al, ok := protoEntitlements[string(e)] + if !ok { + result[string(e)] = webclient.EntitlementInfo{} + continue + } + + result[string(e)] = webclient.EntitlementInfo{ + Enabled: al.Enabled, + Limit: al.Limit, + } + } + + return result +} + type JWKSResponse struct { // Keys is a list of public keys in JWK format. Keys []jwt.JWK `json:"keys"` diff --git a/lib/web/apiserver_test.go b/lib/web/apiserver_test.go index 65b0bb108c8cd..ba567a46c6b6a 100644 --- a/lib/web/apiserver_test.go +++ b/lib/web/apiserver_test.go @@ -81,6 +81,7 @@ import ( "github.com/gravitational/teleport" "github.com/gravitational/teleport/api/breaker" authproto "github.com/gravitational/teleport/api/client/proto" + clientproto "github.com/gravitational/teleport/api/client/proto" "github.com/gravitational/teleport/api/client/webclient" "github.com/gravitational/teleport/api/constants" apidefaults "github.com/gravitational/teleport/api/defaults" @@ -94,6 +95,7 @@ import ( apiutils "github.com/gravitational/teleport/api/utils" "github.com/gravitational/teleport/api/utils/grpc/interceptors" "github.com/gravitational/teleport/api/utils/keys" + "github.com/gravitational/teleport/entitlements" "github.com/gravitational/teleport/lib" "github.com/gravitational/teleport/lib/agentless" "github.com/gravitational/teleport/lib/auth" @@ -4399,7 +4401,9 @@ func TestClusterAppsGet(t *testing.T) { func TestApplicationAccessDisabled(t *testing.T) { modules.SetTestModules(t, &modules.TestModules{ TestFeatures: modules.Features{ - App: false, + Entitlements: map[entitlements.EntitlementKind]modules.EntitlementInfo{ + entitlements.App: {Enabled: false}, + }, }, }) @@ -4508,7 +4512,7 @@ func TestApplicationWebSessionsDeletedAfterLogout(t *testing.T) { require.Empty(t, collectAppSessions(context.Background())) } -func TestGetWebConfig(t *testing.T) { +func TestGetWebConfig_WithEntitlements(t *testing.T) { ctx := context.Background() env := newWebPack(t, 1) @@ -4564,6 +4568,41 @@ func TestGetWebConfig(t *testing.T) { JoinActiveSessions: true, Edition: modules.BuildOSS, // testBuildType is empty PlayableDatabaseProtocols: player.SupportedDatabaseProtocols, + Entitlements: map[string]webclient.EntitlementInfo{ + string(entitlements.AccessLists): {Enabled: false}, + string(entitlements.AccessMonitoring): {Enabled: false}, + string(entitlements.AccessRequests): {Enabled: false}, + string(entitlements.App): {Enabled: true}, + string(entitlements.CloudAuditLogRetention): {Enabled: false}, + string(entitlements.DB): {Enabled: true}, + string(entitlements.Desktop): {Enabled: true}, + string(entitlements.DeviceTrust): {Enabled: false}, + string(entitlements.ExternalAuditStorage): {Enabled: false}, + string(entitlements.FeatureHiding): {Enabled: false}, + string(entitlements.HSM): {Enabled: false}, + string(entitlements.Identity): {Enabled: false}, + string(entitlements.JoinActiveSessions): {Enabled: true}, + string(entitlements.K8s): {Enabled: true}, + string(entitlements.MobileDeviceManagement): {Enabled: false}, + string(entitlements.OIDC): {Enabled: false}, + string(entitlements.OktaSCIM): {Enabled: false}, + string(entitlements.OktaUserSync): {Enabled: false}, + string(entitlements.Policy): {Enabled: false}, + string(entitlements.SAML): {Enabled: false}, + string(entitlements.SessionLocks): {Enabled: false}, + string(entitlements.UpsellAlert): {Enabled: false}, + string(entitlements.UsageReporting): {Enabled: false}, + }, + TunnelPublicAddress: "", + RecoveryCodesEnabled: false, + UI: webclient.UIConfig{}, + IsDashboard: false, + IsUsageBasedBilling: false, + AutomaticUpgradesTargetVersion: "", + CustomTheme: "", + Questionnaire: false, + IsStripeManaged: false, + PremiumSupport: false, } // Make a request. @@ -4587,6 +4626,11 @@ func TestGetWebConfig(t *testing.T) { Cloud: true, IsUsageBasedBilling: true, AutomaticUpgrades: true, + Entitlements: map[entitlements.EntitlementKind]modules.EntitlementInfo{ + entitlements.DB: {Enabled: true, Limit: 22}, + entitlements.DeviceTrust: {Enabled: true, Limit: 33}, + entitlements.Desktop: {Enabled: true, Limit: 44}, + }, }, }) @@ -4607,6 +4651,13 @@ func TestGetWebConfig(t *testing.T) { expectedCfg.AutomaticUpgradesTargetVersion = "v" + teleport.Version expectedCfg.JoinActiveSessions = false expectedCfg.Edition = "" // testBuildType is empty + expectedCfg.TrustedDevices = true + expectedCfg.Entitlements[string(entitlements.App)] = webclient.EntitlementInfo{Enabled: false} + expectedCfg.Entitlements[string(entitlements.DB)] = webclient.EntitlementInfo{Enabled: true, Limit: 22} + expectedCfg.Entitlements[string(entitlements.DeviceTrust)] = webclient.EntitlementInfo{Enabled: true, Limit: 33} + expectedCfg.Entitlements[string(entitlements.Desktop)] = webclient.EntitlementInfo{Enabled: true, Limit: 44} + expectedCfg.Entitlements[string(entitlements.JoinActiveSessions)] = webclient.EntitlementInfo{Enabled: false} + expectedCfg.Entitlements[string(entitlements.K8s)] = webclient.EntitlementInfo{Enabled: false} // request and verify enabled features are enabled. re, err = clt.Get(ctx, endpoint, nil) @@ -4626,6 +4677,10 @@ func TestGetWebConfig(t *testing.T) { } env.proxies[0].client = mockClient expectedCfg.AutomaticUpgrades = false + expectedCfg.TrustedDevices = false + expectedCfg.Entitlements[string(entitlements.DB)] = webclient.EntitlementInfo{Enabled: false} + expectedCfg.Entitlements[string(entitlements.Desktop)] = webclient.EntitlementInfo{Enabled: false} + expectedCfg.Entitlements[string(entitlements.DeviceTrust)] = webclient.EntitlementInfo{Enabled: false} // update modules but NOT the expected config modules.SetTestModules(t, &modules.TestModules{ @@ -4645,23 +4700,21 @@ func TestGetWebConfig(t *testing.T) { require.Equal(t, expectedCfg, cfg) } -func TestGetWebConfig_IGSFeatureLimits(t *testing.T) { +func TestGetWebConfig_LegacyFeatureLimits(t *testing.T) { ctx := context.Background() env := newWebPack(t, 1) modules.SetTestModules(t, &modules.TestModules{ TestFeatures: modules.Features{ - ProductType: modules.ProductTypeTeam, - IdentityGovernanceSecurity: true, - AccessList: modules.AccessListFeature{ - CreateLimit: 5, - }, - AccessMonitoring: modules.AccessMonitoringFeature{ - MaxReportRangeLimit: 10, - }, + ProductType: modules.ProductTypeTeam, IsUsageBasedBilling: true, IsStripeManaged: true, Questionnaire: true, + Entitlements: map[entitlements.EntitlementKind]modules.EntitlementInfo{ + entitlements.Identity: {Enabled: true}, + entitlements.AccessLists: {Enabled: true, Limit: 5}, + entitlements.AccessMonitoring: {Enabled: true, Limit: 10}, + }, }, }) @@ -4678,12 +4731,37 @@ func TestGetWebConfig_IGSFeatureLimits(t *testing.T) { AccessListCreateLimit: 5, AccessMonitoringMaxReportRangeLimit: 10, }, - IsTeam: true, + IsTeam: false, IsIGSEnabled: true, IsStripeManaged: true, Questionnaire: true, IsUsageBasedBilling: true, PlayableDatabaseProtocols: player.SupportedDatabaseProtocols, + Entitlements: map[string]webclient.EntitlementInfo{ + string(entitlements.AccessLists): {Enabled: true, Limit: 5}, + string(entitlements.AccessMonitoring): {Enabled: true, Limit: 10}, + string(entitlements.AccessRequests): {Enabled: false}, + string(entitlements.App): {Enabled: false}, + string(entitlements.CloudAuditLogRetention): {Enabled: false}, + string(entitlements.DB): {Enabled: false}, + string(entitlements.Desktop): {Enabled: false}, + string(entitlements.DeviceTrust): {Enabled: false}, + string(entitlements.ExternalAuditStorage): {Enabled: false}, + string(entitlements.FeatureHiding): {Enabled: false}, + string(entitlements.HSM): {Enabled: false}, + string(entitlements.Identity): {Enabled: true}, + string(entitlements.JoinActiveSessions): {Enabled: false}, + string(entitlements.K8s): {Enabled: false}, + string(entitlements.MobileDeviceManagement): {Enabled: false}, + string(entitlements.OIDC): {Enabled: false}, + string(entitlements.OktaSCIM): {Enabled: false}, + string(entitlements.OktaUserSync): {Enabled: false}, + string(entitlements.Policy): {Enabled: false}, + string(entitlements.SAML): {Enabled: false}, + string(entitlements.SessionLocks): {Enabled: false}, + string(entitlements.UpsellAlert): {Enabled: false}, + string(entitlements.UsageReporting): {Enabled: false}, + }, } // Make a request. @@ -8844,7 +8922,9 @@ func startKubeWithoutCleanup(ctx context.Context, t *testing.T, cfg startKubeOpt Clock: clockwork.NewRealClock(), ClusterFeatures: func() authproto.Features { return authproto.Features{ - Kubernetes: true, + Entitlements: map[string]*authproto.EntitlementInfo{ + string(entitlements.K8s): {Enabled: true}, + }, } }, }, @@ -10379,3 +10459,490 @@ func TestUnstartedServerShutdown(t *testing.T) { // Shutdown the server before starting it shouldn't panic. require.NoError(t, srv.Shutdown(context.Background())) } + +func Test_setEntitlementsWithLegacyLogic(t *testing.T) { + tests := []struct { + name string + config *webclient.WebConfig + clusterFeatures authproto.Features + expected *webclient.WebConfig + }{ + { + name: "sets entitlements", + config: &webclient.WebConfig{}, + clusterFeatures: authproto.Features{ + AccessControls: false, + AccessGraph: false, + AccessList: &clientproto.AccessListFeature{ + CreateLimit: 10, + }, + AccessMonitoring: &clientproto.AccessMonitoringFeature{ + Enabled: false, + MaxReportRangeLimit: 20, + }, + AccessMonitoringConfigured: false, + AccessRequests: &clientproto.AccessRequestsFeature{ + MonthlyRequestLimit: 30, + }, + AdvancedAccessWorkflows: false, + App: false, + Assist: false, + AutomaticUpgrades: false, + Cloud: false, + CustomTheme: "theme", + DB: false, + Desktop: false, + DeviceTrust: &clientproto.DeviceTrustFeature{ + Enabled: false, + DevicesUsageLimit: 40, + }, + ExternalAuditStorage: false, + FeatureHiding: false, + HSM: false, + IdentityGovernance: false, + IsStripeManaged: false, + IsUsageBased: false, + JoinActiveSessions: false, + Kubernetes: false, + MobileDeviceManagement: false, + OIDC: false, + Plugins: false, + Policy: nil, + ProductType: 0, + Questionnaire: false, + RecoveryCodes: false, + SAML: false, + SupportType: 0, + // since present, becomes source of truth for feature enablement + Entitlements: map[string]*authproto.EntitlementInfo{ + string(entitlements.AccessLists): {Enabled: true, Limit: 99}, + string(entitlements.AccessMonitoring): {Enabled: true, Limit: 99}, + string(entitlements.AccessRequests): {Enabled: true, Limit: 99}, + string(entitlements.App): {Enabled: true, Limit: 99}, + string(entitlements.CloudAuditLogRetention): {Enabled: true, Limit: 99}, + string(entitlements.DB): {Enabled: true, Limit: 99}, + string(entitlements.Desktop): {Enabled: true, Limit: 99}, + string(entitlements.DeviceTrust): {Enabled: true, Limit: 99}, + string(entitlements.ExternalAuditStorage): {Enabled: true, Limit: 99}, + string(entitlements.FeatureHiding): {Enabled: true, Limit: 99}, + string(entitlements.HSM): {Enabled: true, Limit: 99}, + string(entitlements.Identity): {Enabled: true, Limit: 99}, + string(entitlements.JoinActiveSessions): {Enabled: true, Limit: 99}, + string(entitlements.K8s): {Enabled: true, Limit: 99}, + string(entitlements.MobileDeviceManagement): {Enabled: true, Limit: 99}, + string(entitlements.OIDC): {Enabled: true, Limit: 99}, + string(entitlements.OktaSCIM): {Enabled: true, Limit: 99}, + string(entitlements.OktaUserSync): {Enabled: true, Limit: 99}, + string(entitlements.Policy): {Enabled: true, Limit: 99}, + string(entitlements.SAML): {Enabled: true, Limit: 99}, + string(entitlements.SessionLocks): {Enabled: true, Limit: 99}, + string(entitlements.UpsellAlert): {Enabled: true, Limit: 99}, + string(entitlements.UsageReporting): {Enabled: true, Limit: 99}, + }, + }, + expected: &webclient.WebConfig{ + Auth: webclient.WebConfigAuthSettings{}, + AutomaticUpgrades: false, + AutomaticUpgradesTargetVersion: "", + CanJoinSessions: false, + CustomTheme: "", + Edition: "", + IsCloud: false, + IsDashboard: false, + IsStripeManaged: false, + IsTeam: false, + IsUsageBasedBilling: false, + PlayableDatabaseProtocols: nil, + PremiumSupport: false, + ProxyClusterName: "", + Questionnaire: false, + RecoveryCodesEnabled: false, + TunnelPublicAddress: "", + UI: webclient.UIConfig{}, + // set by the equivalent entitlement value + AccessRequests: true, + ExternalAuditStorage: true, + HideInaccessibleFeatures: true, + IsIGSEnabled: true, + IsPolicyEnabled: true, + JoinActiveSessions: true, + MobileDeviceManagement: true, + OIDC: true, + SAML: true, + TrustedDevices: true, + FeatureLimits: webclient.FeatureLimits{ + AccessListCreateLimit: 99, + AccessMonitoringMaxReportRangeLimit: 99, + AccessRequestMonthlyRequestLimit: 99, + }, + Entitlements: map[string]webclient.EntitlementInfo{ + string(entitlements.AccessLists): {Enabled: true, Limit: 99}, + string(entitlements.AccessMonitoring): {Enabled: true, Limit: 99}, + string(entitlements.AccessRequests): {Enabled: true, Limit: 99}, + string(entitlements.App): {Enabled: true, Limit: 99}, + string(entitlements.CloudAuditLogRetention): {Enabled: true, Limit: 99}, + string(entitlements.DB): {Enabled: true, Limit: 99}, + string(entitlements.Desktop): {Enabled: true, Limit: 99}, + string(entitlements.DeviceTrust): {Enabled: true, Limit: 99}, + string(entitlements.ExternalAuditStorage): {Enabled: true, Limit: 99}, + string(entitlements.FeatureHiding): {Enabled: true, Limit: 99}, + string(entitlements.HSM): {Enabled: true, Limit: 99}, + string(entitlements.Identity): {Enabled: true, Limit: 99}, + string(entitlements.JoinActiveSessions): {Enabled: true, Limit: 99}, + string(entitlements.K8s): {Enabled: true, Limit: 99}, + string(entitlements.MobileDeviceManagement): {Enabled: true, Limit: 99}, + string(entitlements.OIDC): {Enabled: true, Limit: 99}, + string(entitlements.OktaSCIM): {Enabled: true, Limit: 99}, + string(entitlements.OktaUserSync): {Enabled: true, Limit: 99}, + string(entitlements.Policy): {Enabled: true, Limit: 99}, + string(entitlements.SAML): {Enabled: true, Limit: 99}, + string(entitlements.SessionLocks): {Enabled: true, Limit: 99}, + string(entitlements.UpsellAlert): {Enabled: true, Limit: 99}, + string(entitlements.UsageReporting): {Enabled: true, Limit: 99}, + }, + }, + }, + { + name: "sets legacy features when no entitlements are present (Identity true)", + config: &webclient.WebConfig{}, + clusterFeatures: authproto.Features{ + AccessControls: false, + AccessGraph: false, + AccessMonitoringConfigured: false, + AdvancedAccessWorkflows: false, + App: false, + Assist: false, + AutomaticUpgrades: false, + Cloud: false, + CustomTheme: "", + DB: false, + Desktop: false, + HSM: false, + IsStripeManaged: false, + IsUsageBased: false, + Kubernetes: false, + Plugins: false, + ProductType: 0, + Questionnaire: false, + RecoveryCodes: false, + SupportType: 0, + // not present + Entitlements: nil, + // will set equivalent entitlement values + ExternalAuditStorage: true, + FeatureHiding: true, + IdentityGovernance: true, + JoinActiveSessions: true, + MobileDeviceManagement: true, + OIDC: true, + SAML: true, + AccessRequests: &clientproto.AccessRequestsFeature{ + MonthlyRequestLimit: 88, + }, + AccessList: &clientproto.AccessListFeature{ + CreateLimit: 88, + }, + AccessMonitoring: &clientproto.AccessMonitoringFeature{ + Enabled: true, + MaxReportRangeLimit: 88, + }, + DeviceTrust: &clientproto.DeviceTrustFeature{ + Enabled: true, + DevicesUsageLimit: 88, + }, + Policy: &clientproto.PolicyFeature{ + Enabled: true, + }, + }, + expected: &webclient.WebConfig{ + Auth: webclient.WebConfigAuthSettings{}, + AutomaticUpgrades: false, + AutomaticUpgradesTargetVersion: "", + CanJoinSessions: false, + CustomTheme: "", + Edition: "", + IsCloud: false, + IsDashboard: false, + IsStripeManaged: false, + IsTeam: false, + IsUsageBasedBilling: false, + PlayableDatabaseProtocols: nil, + PremiumSupport: false, + ProxyClusterName: "", + Questionnaire: false, + RecoveryCodesEnabled: false, + TunnelPublicAddress: "", + UI: webclient.UIConfig{}, + // set to legacy feature + AccessRequests: true, + ExternalAuditStorage: true, + HideInaccessibleFeatures: true, + IsIGSEnabled: true, + IsPolicyEnabled: true, + JoinActiveSessions: true, + MobileDeviceManagement: true, + OIDC: true, + SAML: true, + TrustedDevices: true, + FeatureLimits: webclient.FeatureLimits{ + AccessListCreateLimit: 88, + AccessMonitoringMaxReportRangeLimit: 88, + AccessRequestMonthlyRequestLimit: 88, + }, + Entitlements: map[string]webclient.EntitlementInfo{ + // no equivalent legacy feature; defaults to false + string(entitlements.App): {Enabled: false}, + string(entitlements.CloudAuditLogRetention): {Enabled: false}, + string(entitlements.DB): {Enabled: false}, + string(entitlements.Desktop): {Enabled: false}, + string(entitlements.HSM): {Enabled: false}, + string(entitlements.K8s): {Enabled: false}, + string(entitlements.UpsellAlert): {Enabled: false}, + string(entitlements.UsageReporting): {Enabled: false}, + + // set to equivalent legacy feature + string(entitlements.ExternalAuditStorage): {Enabled: true}, + string(entitlements.FeatureHiding): {Enabled: true}, + string(entitlements.Identity): {Enabled: true}, + string(entitlements.JoinActiveSessions): {Enabled: true}, + string(entitlements.MobileDeviceManagement): {Enabled: true}, + string(entitlements.OIDC): {Enabled: true}, + string(entitlements.Policy): {Enabled: true}, + string(entitlements.SAML): {Enabled: true}, + // set to legacy feature "IsIGSEnabled"; true so set true and clear limits + string(entitlements.AccessLists): {Enabled: true}, + string(entitlements.AccessMonitoring): {Enabled: true}, + string(entitlements.AccessRequests): {Enabled: true}, + string(entitlements.DeviceTrust): {Enabled: true}, + string(entitlements.OktaSCIM): {Enabled: true}, + string(entitlements.OktaUserSync): {Enabled: true}, + string(entitlements.SessionLocks): {Enabled: true}, + }, + }, + }, + { + name: "sets legacy features when no entitlements are present (Identity false)", + config: &webclient.WebConfig{}, + clusterFeatures: authproto.Features{ + AccessControls: false, + AccessGraph: false, + AccessMonitoringConfigured: false, + AdvancedAccessWorkflows: false, + App: false, + Assist: false, + AutomaticUpgrades: false, + Cloud: false, + CustomTheme: "", + DB: false, + Desktop: false, + HSM: false, + IsStripeManaged: false, + IsUsageBased: false, + Kubernetes: false, + Plugins: false, + ProductType: 0, + Questionnaire: false, + RecoveryCodes: false, + SupportType: 0, + // not present + Entitlements: nil, + // will set equivalent entitlement values + ExternalAuditStorage: true, + FeatureHiding: true, + IdentityGovernance: false, + JoinActiveSessions: true, + MobileDeviceManagement: true, + OIDC: true, + SAML: true, + AccessRequests: &clientproto.AccessRequestsFeature{ + MonthlyRequestLimit: 88, + }, + AccessList: &clientproto.AccessListFeature{ + CreateLimit: 88, + }, + AccessMonitoring: &clientproto.AccessMonitoringFeature{ + Enabled: true, + MaxReportRangeLimit: 88, + }, + DeviceTrust: &clientproto.DeviceTrustFeature{ + Enabled: true, + DevicesUsageLimit: 88, + }, + Policy: &clientproto.PolicyFeature{ + Enabled: true, + }, + }, + expected: &webclient.WebConfig{ + Auth: webclient.WebConfigAuthSettings{}, + AutomaticUpgrades: false, + AutomaticUpgradesTargetVersion: "", + CanJoinSessions: false, + CustomTheme: "", + Edition: "", + IsCloud: false, + IsDashboard: false, + IsStripeManaged: false, + IsTeam: false, + IsUsageBasedBilling: false, + PlayableDatabaseProtocols: nil, + PremiumSupport: false, + ProxyClusterName: "", + Questionnaire: false, + RecoveryCodesEnabled: false, + TunnelPublicAddress: "", + UI: webclient.UIConfig{}, + // set to legacy feature + AccessRequests: true, + ExternalAuditStorage: true, + HideInaccessibleFeatures: true, + IsIGSEnabled: false, + IsPolicyEnabled: true, + JoinActiveSessions: true, + MobileDeviceManagement: true, + OIDC: true, + SAML: true, + TrustedDevices: true, + FeatureLimits: webclient.FeatureLimits{ + AccessListCreateLimit: 88, + AccessMonitoringMaxReportRangeLimit: 88, + AccessRequestMonthlyRequestLimit: 88, + }, + Entitlements: map[string]webclient.EntitlementInfo{ + // no equivalent legacy feature; defaults to false + string(entitlements.App): {Enabled: false}, + string(entitlements.CloudAuditLogRetention): {Enabled: false}, + string(entitlements.DB): {Enabled: false}, + string(entitlements.Desktop): {Enabled: false}, + string(entitlements.HSM): {Enabled: false}, + string(entitlements.K8s): {Enabled: false}, + string(entitlements.UpsellAlert): {Enabled: false}, + string(entitlements.UsageReporting): {Enabled: false}, + + // set to equivalent legacy feature + string(entitlements.ExternalAuditStorage): {Enabled: true}, + string(entitlements.FeatureHiding): {Enabled: true}, + string(entitlements.Identity): {Enabled: false}, + string(entitlements.JoinActiveSessions): {Enabled: true}, + string(entitlements.MobileDeviceManagement): {Enabled: true}, + string(entitlements.OIDC): {Enabled: true}, + string(entitlements.Policy): {Enabled: true}, + string(entitlements.SAML): {Enabled: true}, + // set to legacy feature "IsIGSEnabled"; false so set value and keep limits + string(entitlements.AccessLists): {Enabled: true, Limit: 88}, + string(entitlements.AccessMonitoring): {Enabled: true, Limit: 88}, + string(entitlements.AccessRequests): {Enabled: true, Limit: 88}, + string(entitlements.DeviceTrust): {Enabled: true, Limit: 88}, + string(entitlements.OktaSCIM): {Enabled: false}, + string(entitlements.OktaUserSync): {Enabled: false}, + string(entitlements.SessionLocks): {Enabled: false}, + }, + }, + }, + { + name: "retains non-feature field values", + config: &webclient.WebConfig{ + Auth: webclient.WebConfigAuthSettings{ + LocalAuthEnabled: true, + AllowPasswordless: true, + MOTD: "some-message", + }, + PlayableDatabaseProtocols: []string{"play-able"}, + UI: webclient.UIConfig{ + ScrollbackLines: 10, + ShowResources: "foo", + }, + Edition: "edition", + TunnelPublicAddress: "0000", + AutomaticUpgradesTargetVersion: "99", + CustomTheme: "theme", + CanJoinSessions: true, + IsCloud: true, + RecoveryCodesEnabled: true, + IsDashboard: true, + IsUsageBasedBilling: true, + AutomaticUpgrades: true, + Questionnaire: true, + IsStripeManaged: true, + PremiumSupport: true, + }, + clusterFeatures: authproto.Features{ + DeviceTrust: &clientproto.DeviceTrustFeature{}, + AccessRequests: &clientproto.AccessRequestsFeature{}, + AccessList: &clientproto.AccessListFeature{}, + AccessMonitoring: &clientproto.AccessMonitoringFeature{}, + Policy: &clientproto.PolicyFeature{}, + }, + expected: &webclient.WebConfig{ + Auth: webclient.WebConfigAuthSettings{ + LocalAuthEnabled: true, + AllowPasswordless: true, + MOTD: "some-message", + }, + PlayableDatabaseProtocols: []string{"play-able"}, + UI: webclient.UIConfig{ + ScrollbackLines: 10, + ShowResources: "foo", + }, + Edition: "edition", + TunnelPublicAddress: "0000", + AutomaticUpgradesTargetVersion: "99", + CustomTheme: "theme", + CanJoinSessions: true, + IsCloud: true, + RecoveryCodesEnabled: true, + IsDashboard: true, + IsUsageBasedBilling: true, + AutomaticUpgrades: true, + Questionnaire: true, + IsStripeManaged: true, + PremiumSupport: true, + // Default; not under test + ProxyClusterName: "", + FeatureLimits: webclient.FeatureLimits{}, + IsTeam: false, + HideInaccessibleFeatures: false, + IsIGSEnabled: false, + IsPolicyEnabled: false, + ExternalAuditStorage: false, + JoinActiveSessions: false, + AccessRequests: false, + TrustedDevices: false, + OIDC: false, + SAML: false, + MobileDeviceManagement: false, + Entitlements: map[string]webclient.EntitlementInfo{ + string(entitlements.AccessLists): {Enabled: true}, // AccessLists had no previous behavior from an enablement perspective; so we default to true + string(entitlements.AccessMonitoring): {Enabled: false}, + string(entitlements.AccessRequests): {Enabled: false}, + string(entitlements.App): {Enabled: false}, + string(entitlements.CloudAuditLogRetention): {Enabled: false}, + string(entitlements.DB): {Enabled: false}, + string(entitlements.Desktop): {Enabled: false}, + string(entitlements.DeviceTrust): {Enabled: false}, + string(entitlements.ExternalAuditStorage): {Enabled: false}, + string(entitlements.FeatureHiding): {Enabled: false}, + string(entitlements.HSM): {Enabled: false}, + string(entitlements.Identity): {Enabled: false}, + string(entitlements.JoinActiveSessions): {Enabled: false}, + string(entitlements.K8s): {Enabled: false}, + string(entitlements.MobileDeviceManagement): {Enabled: false}, + string(entitlements.OIDC): {Enabled: false}, + string(entitlements.OktaSCIM): {Enabled: false}, + string(entitlements.OktaUserSync): {Enabled: false}, + string(entitlements.Policy): {Enabled: false}, + string(entitlements.SAML): {Enabled: false}, + string(entitlements.SessionLocks): {Enabled: false}, + string(entitlements.UpsellAlert): {Enabled: false}, + string(entitlements.UsageReporting): {Enabled: false}, + }, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + setEntitlementsWithLegacyLogic(tt.config, tt.clusterFeatures) + + assert.Equal(t, tt.expected, tt.config) + }) + } +} diff --git a/tool/tctl/common/admin_action_test.go b/tool/tctl/common/admin_action_test.go index 48d9bec14bdcc..51ffb7cb893f1 100644 --- a/tool/tctl/common/admin_action_test.go +++ b/tool/tctl/common/admin_action_test.go @@ -40,6 +40,7 @@ import ( "github.com/gravitational/teleport/api/mfa" "github.com/gravitational/teleport/api/types" apiutils "github.com/gravitational/teleport/api/utils" + "github.com/gravitational/teleport/entitlements" "github.com/gravitational/teleport/lib/auth" "github.com/gravitational/teleport/lib/auth/authclient" "github.com/gravitational/teleport/lib/auth/mocku2f" @@ -954,8 +955,10 @@ func newAdminActionTestSuite(t *testing.T) *adminActionTestSuite { modules.SetTestModules(t, &modules.TestModules{ TestBuildType: modules.BuildEnterprise, TestFeatures: modules.Features{ - OIDC: true, - SAML: true, + Entitlements: map[entitlements.EntitlementKind]modules.EntitlementInfo{ + entitlements.OIDC: {Enabled: true}, + entitlements.SAML: {Enabled: true}, + }, }, }) diff --git a/tool/tctl/common/edit_command_test.go b/tool/tctl/common/edit_command_test.go index a84b34b15bd03..b42517ac70382 100644 --- a/tool/tctl/common/edit_command_test.go +++ b/tool/tctl/common/edit_command_test.go @@ -31,6 +31,7 @@ import ( "github.com/gravitational/teleport/api/constants" "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/entitlements" "github.com/gravitational/teleport/lib/auth/authclient" "github.com/gravitational/teleport/lib/backend" "github.com/gravitational/teleport/lib/modules" @@ -333,8 +334,10 @@ func TestEditEnterpriseResources(t *testing.T) { modules.SetTestModules(t, &modules.TestModules{ TestBuildType: modules.BuildEnterprise, TestFeatures: modules.Features{ - OIDC: true, - SAML: true, + Entitlements: map[entitlements.EntitlementKind]modules.EntitlementInfo{ + entitlements.OIDC: {Enabled: true}, + entitlements.SAML: {Enabled: true}, + }, }, }) log := utils.NewSlogLoggerForTests() diff --git a/tool/tctl/common/resource_command_test.go b/tool/tctl/common/resource_command_test.go index 5fdaf282691ff..e74a382166781 100644 --- a/tool/tctl/common/resource_command_test.go +++ b/tool/tctl/common/resource_command_test.go @@ -44,6 +44,7 @@ import ( "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/api/types/discoveryconfig" "github.com/gravitational/teleport/api/types/header" + "github.com/gravitational/teleport/entitlements" "github.com/gravitational/teleport/integration/helpers" "github.com/gravitational/teleport/lib/auth/authclient" "github.com/gravitational/teleport/lib/config" @@ -2020,8 +2021,10 @@ func TestCreateEnterpriseResources(t *testing.T) { modules.SetTestModules(t, &modules.TestModules{ TestBuildType: modules.BuildEnterprise, TestFeatures: modules.Features{ - OIDC: true, - SAML: true, + Entitlements: map[entitlements.EntitlementKind]modules.EntitlementInfo{ + entitlements.OIDC: {Enabled: true}, + entitlements.SAML: {Enabled: true}, + }, }, }) diff --git a/tool/teleport/testenv/test_server.go b/tool/teleport/testenv/test_server.go index aa479fa51dd41..bdb1dcf9bc01f 100644 --- a/tool/teleport/testenv/test_server.go +++ b/tool/teleport/testenv/test_server.go @@ -44,6 +44,7 @@ import ( "github.com/gravitational/teleport/api/types/accesslist" "github.com/gravitational/teleport/api/utils/keys" apisshutils "github.com/gravitational/teleport/api/utils/sshutils" + "github.com/gravitational/teleport/entitlements" "github.com/gravitational/teleport/lib" "github.com/gravitational/teleport/lib/auth" "github.com/gravitational/teleport/lib/auth/authclient" @@ -435,9 +436,11 @@ func (p *cliModules) PrintVersion() { // Features returns supported features func (p *cliModules) Features() modules.Features { return modules.Features{ - Kubernetes: true, - DB: true, - App: true, + Entitlements: map[entitlements.EntitlementKind]modules.EntitlementInfo{ + entitlements.K8s: {Enabled: true}, + entitlements.DB: {Enabled: true}, + entitlements.App: {Enabled: true}, + }, AdvancedAccessWorkflows: true, AccessControls: true, } diff --git a/tool/tsh/common/access_request_test.go b/tool/tsh/common/access_request_test.go index f0673bfe7ad85..7f25c5157149b 100644 --- a/tool/tsh/common/access_request_test.go +++ b/tool/tsh/common/access_request_test.go @@ -29,6 +29,7 @@ import ( "github.com/stretchr/testify/require" "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/entitlements" "github.com/gravitational/teleport/lib" "github.com/gravitational/teleport/lib/asciitable" "github.com/gravitational/teleport/lib/modules" @@ -40,7 +41,9 @@ func TestAccessRequestSearch(t *testing.T) { modules.SetTestModules(t, &modules.TestModules{ TestBuildType: modules.BuildEnterprise, TestFeatures: modules.Features{ - Kubernetes: true, + Entitlements: map[entitlements.EntitlementKind]modules.EntitlementInfo{ + entitlements.K8s: {Enabled: true}, + }, }, }, ) diff --git a/tool/tsh/common/db_test.go b/tool/tsh/common/db_test.go index 3cca05d12162e..ccb239057cf3d 100644 --- a/tool/tsh/common/db_test.go +++ b/tool/tsh/common/db_test.go @@ -40,6 +40,7 @@ import ( apidefaults "github.com/gravitational/teleport/api/defaults" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/api/utils/keys" + "github.com/gravitational/teleport/entitlements" "github.com/gravitational/teleport/lib/client" "github.com/gravitational/teleport/lib/defaults" "github.com/gravitational/teleport/lib/fixtures" @@ -76,7 +77,9 @@ func TestTshDB(t *testing.T) { &modules.TestModules{ TestBuildType: modules.BuildEnterprise, TestFeatures: modules.Features{ - DB: true, + Entitlements: map[entitlements.EntitlementKind]modules.EntitlementInfo{ + entitlements.DB: {Enabled: true}, + }, }, }, ) diff --git a/tool/tsh/common/hardware_key_test.go b/tool/tsh/common/hardware_key_test.go index 7e4bcd4cbc233..4c37d45a92960 100644 --- a/tool/tsh/common/hardware_key_test.go +++ b/tool/tsh/common/hardware_key_test.go @@ -36,6 +36,7 @@ import ( "github.com/gravitational/teleport/api/constants" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/api/utils/keys" + "github.com/gravitational/teleport/entitlements" "github.com/gravitational/teleport/lib" "github.com/gravitational/teleport/lib/auth/authclient" "github.com/gravitational/teleport/lib/auth/mocku2f" @@ -292,7 +293,9 @@ func TestHardwareKeyApp(t *testing.T) { testModules := &modules.TestModules{ TestBuildType: modules.BuildEnterprise, TestFeatures: modules.Features{ - App: true, + Entitlements: map[entitlements.EntitlementKind]modules.EntitlementInfo{ + entitlements.App: {Enabled: true}, + }, }, } modules.SetTestModules(t, testModules) diff --git a/tool/tsh/common/kube_test.go b/tool/tsh/common/kube_test.go index c8f6226b47090..5cd3aefd1ffbd 100644 --- a/tool/tsh/common/kube_test.go +++ b/tool/tsh/common/kube_test.go @@ -47,6 +47,7 @@ import ( "github.com/gravitational/teleport/api/types" apiutils "github.com/gravitational/teleport/api/utils" "github.com/gravitational/teleport/api/utils/keypaths" + "github.com/gravitational/teleport/entitlements" "github.com/gravitational/teleport/lib" "github.com/gravitational/teleport/lib/asciitable" "github.com/gravitational/teleport/lib/defaults" @@ -320,7 +321,9 @@ func TestKubeSelection(t *testing.T) { &modules.TestModules{ TestBuildType: modules.BuildEnterprise, TestFeatures: modules.Features{ - Kubernetes: true, + Entitlements: map[entitlements.EntitlementKind]modules.EntitlementInfo{ + entitlements.K8s: {Enabled: true}, + }, }, }, ) diff --git a/tool/tsh/common/tsh_test.go b/tool/tsh/common/tsh_test.go index 80c7197c6bdde..2907fb1e32a77 100644 --- a/tool/tsh/common/tsh_test.go +++ b/tool/tsh/common/tsh_test.go @@ -70,6 +70,7 @@ import ( "github.com/gravitational/teleport/api/utils/keypaths" "github.com/gravitational/teleport/api/utils/keys" "github.com/gravitational/teleport/api/utils/prompt" + "github.com/gravitational/teleport/entitlements" "github.com/gravitational/teleport/integration/kube" "github.com/gravitational/teleport/lib" "github.com/gravitational/teleport/lib/auth" @@ -227,9 +228,11 @@ func (p *cliModules) PrintVersion() { // Features returns supported features func (p *cliModules) Features() modules.Features { return modules.Features{ - Kubernetes: true, - DB: true, - App: true, + Entitlements: map[entitlements.EntitlementKind]modules.EntitlementInfo{ + entitlements.K8s: {Enabled: true}, + entitlements.DB: {Enabled: true}, + entitlements.App: {Enabled: true}, + }, AdvancedAccessWorkflows: true, AccessControls: true, } diff --git a/web/packages/teleport/src/Sessions/Sessions.story.test.tsx b/web/packages/teleport/src/Sessions/Sessions.story.test.tsx index 6ded560b167cf..0487ef2abb799 100644 --- a/web/packages/teleport/src/Sessions/Sessions.story.test.tsx +++ b/web/packages/teleport/src/Sessions/Sessions.story.test.tsx @@ -33,8 +33,7 @@ test('loaded', () => { expect(container.firstChild).toMatchSnapshot(); }); -test('active sessions CTA', () => { - cfg.isTeam = true; +test('active sessions CTA', async () => { cfg.isEnterprise = true; const { container } = render(); expect(container.firstChild).toMatchSnapshot(); diff --git a/web/packages/teleport/src/Sessions/__snapshots__/Sessions.story.test.tsx.snap b/web/packages/teleport/src/Sessions/__snapshots__/Sessions.story.test.tsx.snap index 772095ec8d4ae..273b15338eaa3 100644 --- a/web/packages/teleport/src/Sessions/__snapshots__/Sessions.story.test.tsx.snap +++ b/web/packages/teleport/src/Sessions/__snapshots__/Sessions.story.test.tsx.snap @@ -484,7 +484,7 @@ exports[`active sessions CTA 1`] = ` { test('support Enterprise with CTA', () => { cfg.isEnterprise = true; - cfg.isTeam = true; const { container } = render( diff --git a/web/packages/teleport/src/Support/__snapshots__/Support.story.test.tsx.snap b/web/packages/teleport/src/Support/__snapshots__/Support.story.test.tsx.snap index 98f6f53ff89c4..b4577279c3d70 100644 --- a/web/packages/teleport/src/Support/__snapshots__/Support.story.test.tsx.snap +++ b/web/packages/teleport/src/Support/__snapshots__/Support.story.test.tsx.snap @@ -1134,7 +1134,7 @@ exports[`support Enterprise with CTA 1`] = ` . + */ + +// entitlement list should be 1:1 with EntitlementKinds in entitlements/entitlements.go +type entitlement = + | 'AccessLists' + | 'AccessMonitoring' + | 'AccessRequests' + | 'App' + | 'CloudAuditLogRetention' + | 'DB' + | 'Desktop' + | 'DeviceTrust' + | 'ExternalAuditStorage' + | 'FeatureHiding' + | 'HSM' + | 'Identity' + | 'JoinActiveSessions' + | 'K8s' + | 'MobileDeviceManagement' + | 'OIDC' + | 'OktaSCIM' + | 'OktaUserSync' + | 'Policy' + | 'SAML' + | 'SessionLocks' + | 'UpsellAlert' + | 'UsageReporting'; + +export const defaultEntitlements: Record< + entitlement, + { enabled: boolean; limit: number } +> = { + AccessLists: { enabled: false, limit: 0 }, + AccessMonitoring: { enabled: false, limit: 0 }, + AccessRequests: { enabled: false, limit: 0 }, + App: { enabled: false, limit: 0 }, + CloudAuditLogRetention: { enabled: false, limit: 0 }, + DB: { enabled: false, limit: 0 }, + Desktop: { enabled: false, limit: 0 }, + DeviceTrust: { enabled: false, limit: 0 }, + ExternalAuditStorage: { enabled: false, limit: 0 }, + FeatureHiding: { enabled: false, limit: 0 }, + HSM: { enabled: false, limit: 0 }, + Identity: { enabled: false, limit: 0 }, + JoinActiveSessions: { enabled: false, limit: 0 }, + K8s: { enabled: false, limit: 0 }, + MobileDeviceManagement: { enabled: false, limit: 0 }, + OIDC: { enabled: false, limit: 0 }, + OktaSCIM: { enabled: false, limit: 0 }, + OktaUserSync: { enabled: false, limit: 0 }, + Policy: { enabled: false, limit: 0 }, + SAML: { enabled: false, limit: 0 }, + SessionLocks: { enabled: false, limit: 0 }, + UpsellAlert: { enabled: false, limit: 0 }, + UsageReporting: { enabled: false, limit: 0 }, +}; diff --git a/web/packages/teleport/src/services/sales/index.ts b/web/packages/teleport/src/services/sales/index.ts index e4750fa1b0e22..de5c8c27f923b 100644 --- a/web/packages/teleport/src/services/sales/index.ts +++ b/web/packages/teleport/src/services/sales/index.ts @@ -17,12 +17,10 @@ */ import { CtaEvent } from 'teleport/services/userEvent'; -import cfg from 'teleport/config'; // These URLs are the shorten URL version. These marketing URL's // are defined in the "next" repo. // eg: https://github.com/gravitational/next/pull/2298 -const UPGRADE_TEAM_URL = 'https://goteleport.com/r/upgrade-team'; const UPGRADE_COMMUNITY_URL = 'https://goteleport.com/r/upgrade-community'; // UPGRADE_IGS_URL is enterprise upgrading to enterprise with Identity Governance & Security const UPGRADE_IGS_URL = 'https://goteleport.com/r/upgrade-igs'; @@ -46,11 +44,7 @@ export function getSalesURL( url?: string ) { if (!url) { - url = UPGRADE_COMMUNITY_URL; - if (isEnterprise) { - // TODO(mcbattirola): remove isTeam when it is no longer used - url = cfg.isTeam ? UPGRADE_TEAM_URL : UPGRADE_IGS_URL; - } + url = isEnterprise ? UPGRADE_IGS_URL : UPGRADE_COMMUNITY_URL; } const params = getParams(version, isEnterprise, event); return `${url}?${params}`; diff --git a/web/packages/teleport/src/services/storageService/types.ts b/web/packages/teleport/src/services/storageService/types.ts index c4aad5d9b4e1c..d604d289bfa7e 100644 --- a/web/packages/teleport/src/services/storageService/types.ts +++ b/web/packages/teleport/src/services/storageService/types.ts @@ -41,7 +41,7 @@ export const KeysEnum = { export type SurveyRequest = { companyName: string; employeeCount: string; - resourcesList: Array; + resources: Array; role: string; team: string; }; diff --git a/web/packages/teleport/src/teleportContext.tsx b/web/packages/teleport/src/teleportContext.tsx index 6405a9a5e1305..1f40c5ceee3c6 100644 --- a/web/packages/teleport/src/teleportContext.tsx +++ b/web/packages/teleport/src/teleportContext.tsx @@ -77,15 +77,14 @@ class TeleportContext implements types.Context { // lockedFeatures are the features disabled in the user's cluster. // Mainly used to hide features and/or show CTAs when the user cluster doesn't support it. lockedFeatures: types.LockedFeatures = { - authConnectors: !(cfg.oidc && cfg.saml), - // Below should be locked for the following cases: - // 1) feature disabled in the cluster features - // 2) is not a legacy and igs is not enabled. legacies should have unlimited access. - accessRequests: - !cfg.accessRequests || (!cfg.isLegacyEnterprise() && !cfg.isIgsEnabled), - trustedDevices: - !cfg.trustedDevices || (!cfg.isLegacyEnterprise() && !cfg.isIgsEnabled), + authConnectors: !( + cfg.entitlements.OIDC.enabled && cfg.entitlements.SAML.enabled + ), + accessRequests: !cfg.entitlements.AccessRequests.enabled, + trustedDevices: !cfg.entitlements.DeviceTrust.enabled, }; + // entitlements define a customer’s access to a specific features + entitlements = cfg.entitlements; // hasExternalAuditStorage indicates if an account has set up external audit storage. It is used to show or hide the External Audit Storage CTAs. hasExternalAuditStorage = false; From 6c1b9f9d10cec964a672f937b0dc8bab8ba4c095 Mon Sep 17 00:00:00 2001 From: Michelle Bergquist <11967646+michellescripts@users.noreply.github.com> Date: Fri, 2 Aug 2024 13:15:03 -0600 Subject: [PATCH 052/139] bump e (#45023) --- e | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e b/e index 8c671ad7b60bd..fd62d6f18bf69 160000 --- a/e +++ b/e @@ -1 +1 @@ -Subproject commit 8c671ad7b60bd83e6b8f247c366320400fe4d44e +Subproject commit fd62d6f18bf6949c6f2fa70cdca2ffee8ec22aeb From facba1d60d19dc573f248ccb9ac6ef0580179e68 Mon Sep 17 00:00:00 2001 From: Jakub Nyckowski Date: Sat, 3 Aug 2024 05:11:27 -0400 Subject: [PATCH 053/139] Add Query field to CrownJewel specifications (#44981) Introduced a Query field to the CrownJewelSpec to facilitate Access Graph queries. Updated corresponding protobuf definitions, validation logic, and tests to support the new field. --- .../teleport/crownjewel/v1/crownjewel.pb.go | 72 +++++++++++-------- .../teleport/crownjewel/v1/crownjewel.proto | 4 ++ lib/auth/crownjewel/object.go | 2 +- lib/auth/crownjewel/object_test.go | 12 ++++ lib/services/crown_jewels_test.go | 2 + 5 files changed, 61 insertions(+), 31 deletions(-) diff --git a/api/gen/proto/go/teleport/crownjewel/v1/crownjewel.pb.go b/api/gen/proto/go/teleport/crownjewel/v1/crownjewel.pb.go index a5ed1ffa34534..6ddfa5028e2d7 100644 --- a/api/gen/proto/go/teleport/crownjewel/v1/crownjewel.pb.go +++ b/api/gen/proto/go/teleport/crownjewel/v1/crownjewel.pb.go @@ -132,9 +132,13 @@ type CrownJewelSpec struct { unknownFields protoimpl.UnknownFields // TeleportMatchers is a list of teleport matchers. + // DEPRECATED: Use query instead. TeleportMatchers []*TeleportMatcher `protobuf:"bytes,1,rep,name=teleport_matchers,json=teleportMatchers,proto3" json:"teleport_matchers,omitempty"` // AWSMatchers is a list of AWS matchers. + // DEPRECATED: Use query instead. AwsMatchers []*AWSMatcher `protobuf:"bytes,2,rep,name=aws_matchers,json=awsMatchers,proto3" json:"aws_matchers,omitempty"` + // Query is a Access Graph query to match resources. + Query string `protobuf:"bytes,3,opt,name=query,proto3" json:"query,omitempty"` } func (x *CrownJewelSpec) Reset() { @@ -183,6 +187,13 @@ func (x *CrownJewelSpec) GetAwsMatchers() []*AWSMatcher { return nil } +func (x *CrownJewelSpec) GetQuery() string { + if x != nil { + return x.Query + } + return "" +} + // TeleportMatcher represents a matcher for Teleport resources. type TeleportMatcher struct { state protoimpl.MessageState @@ -415,7 +426,7 @@ var file_teleport_crownjewel_v1_crownjewel_proto_rawDesc = []byte{ 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x63, 0x72, 0x6f, 0x77, 0x6e, 0x6a, 0x65, 0x77, 0x65, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x6f, 0x77, 0x6e, 0x4a, 0x65, 0x77, 0x65, 0x6c, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, - 0x63, 0x22, 0xad, 0x01, 0x0a, 0x0e, 0x43, 0x72, 0x6f, 0x77, 0x6e, 0x4a, 0x65, 0x77, 0x65, 0x6c, + 0x63, 0x22, 0xc3, 0x01, 0x0a, 0x0e, 0x43, 0x72, 0x6f, 0x77, 0x6e, 0x4a, 0x65, 0x77, 0x65, 0x6c, 0x53, 0x70, 0x65, 0x63, 0x12, 0x54, 0x0a, 0x11, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x63, 0x72, 0x6f, 0x77, 0x6e, @@ -426,35 +437,36 @@ var file_teleport_crownjewel_v1_crownjewel_proto_rawDesc = []byte{ 0x32, 0x22, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x63, 0x72, 0x6f, 0x77, 0x6e, 0x6a, 0x65, 0x77, 0x65, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x57, 0x53, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x52, 0x0b, 0x61, 0x77, 0x73, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, - 0x73, 0x22, 0x7b, 0x0a, 0x0f, 0x54, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x4d, 0x61, 0x74, - 0x63, 0x68, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x6b, 0x69, 0x6e, 0x64, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x05, 0x6b, 0x69, 0x6e, 0x64, 0x73, 0x12, 0x30, 0x0a, 0x06, 0x6c, 0x61, - 0x62, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x65, 0x6c, - 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x4c, - 0x61, 0x62, 0x65, 0x6c, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x14, 0x0a, 0x05, - 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x8f, - 0x01, 0x0a, 0x0a, 0x41, 0x57, 0x53, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x12, 0x14, 0x0a, - 0x05, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x74, 0x79, - 0x70, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x32, 0x0a, - 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x74, 0x65, - 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x63, 0x72, 0x6f, 0x77, 0x6e, 0x6a, 0x65, 0x77, 0x65, - 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x57, 0x53, 0x54, 0x61, 0x67, 0x52, 0x04, 0x74, 0x61, 0x67, - 0x73, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x72, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x04, 0x61, 0x72, 0x6e, 0x73, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x52, 0x03, 0x61, 0x72, 0x6e, - 0x22, 0x50, 0x0a, 0x06, 0x41, 0x57, 0x53, 0x54, 0x61, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x34, 0x0a, 0x06, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x73, 0x42, 0x58, 0x5a, 0x56, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x74, - 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, 0x6e, 0x2f, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, - 0x74, 0x2f, 0x63, 0x72, 0x6f, 0x77, 0x6e, 0x6a, 0x65, 0x77, 0x65, 0x6c, 0x2f, 0x76, 0x31, 0x3b, - 0x63, 0x72, 0x6f, 0x77, 0x6e, 0x6a, 0x65, 0x77, 0x65, 0x6c, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x73, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x7b, 0x0a, 0x0f, 0x54, 0x65, 0x6c, 0x65, 0x70, + 0x6f, 0x72, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x6b, 0x69, + 0x6e, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6b, 0x69, 0x6e, 0x64, 0x73, + 0x12, 0x30, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x18, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6c, 0x61, 0x62, 0x65, + 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x8f, 0x01, 0x0a, 0x0a, 0x41, 0x57, 0x53, 0x4d, 0x61, 0x74, 0x63, + 0x68, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x05, 0x74, 0x79, 0x70, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x67, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x67, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x32, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1e, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x63, 0x72, 0x6f, + 0x77, 0x6e, 0x6a, 0x65, 0x77, 0x65, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x57, 0x53, 0x54, 0x61, + 0x67, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x72, 0x6e, 0x73, 0x18, + 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x61, 0x72, 0x6e, 0x73, 0x4a, 0x04, 0x08, 0x04, 0x10, + 0x05, 0x52, 0x03, 0x61, 0x72, 0x6e, 0x22, 0x50, 0x0a, 0x06, 0x41, 0x57, 0x53, 0x54, 0x61, 0x67, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x34, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x42, 0x58, 0x5a, 0x56, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x74, + 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x63, 0x72, 0x6f, 0x77, 0x6e, 0x6a, 0x65, 0x77, + 0x65, 0x6c, 0x2f, 0x76, 0x31, 0x3b, 0x63, 0x72, 0x6f, 0x77, 0x6e, 0x6a, 0x65, 0x77, 0x65, 0x6c, + 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/api/proto/teleport/crownjewel/v1/crownjewel.proto b/api/proto/teleport/crownjewel/v1/crownjewel.proto index 170a7da8d8ea6..55c453a913e18 100644 --- a/api/proto/teleport/crownjewel/v1/crownjewel.proto +++ b/api/proto/teleport/crownjewel/v1/crownjewel.proto @@ -42,9 +42,13 @@ message CrownJewel { // CrownJewelSpec is the specification of a Crown Jewel. message CrownJewelSpec { // TeleportMatchers is a list of teleport matchers. + // DEPRECATED: Use query instead. repeated TeleportMatcher teleport_matchers = 1; // AWSMatchers is a list of AWS matchers. + // DEPRECATED: Use query instead. repeated AWSMatcher aws_matchers = 2; + // Query is a Access Graph query to match resources. + string query = 3; } // TeleportMatcher represents a matcher for Teleport resources. diff --git a/lib/auth/crownjewel/object.go b/lib/auth/crownjewel/object.go index 8dd3d99506678..2d7b4f5d55318 100644 --- a/lib/auth/crownjewel/object.go +++ b/lib/auth/crownjewel/object.go @@ -60,7 +60,7 @@ func ValidateCrownJewel(jewel *crownjewelv1.CrownJewel) error { return trace.BadParameter("crown jewel name is empty") case jewel.Spec == nil: return trace.BadParameter("crown jewel spec is nil") - case len(jewel.Spec.TeleportMatchers) == 0 && len(jewel.Spec.AwsMatchers) == 0: + case len(jewel.Spec.TeleportMatchers) == 0 && len(jewel.Spec.AwsMatchers) == 0 && jewel.Spec.Query == "": return trace.BadParameter("crown jewel must have at least one matcher") } diff --git a/lib/auth/crownjewel/object_test.go b/lib/auth/crownjewel/object_test.go index 748b0890b5cec..db1c23bbb2687 100644 --- a/lib/auth/crownjewel/object_test.go +++ b/lib/auth/crownjewel/object_test.go @@ -78,6 +78,18 @@ func TestValidateCrownJewel(t *testing.T) { }, wantErr: require.NoError, }, + { + name: "ValidCrownJewelWithQuery", + jewel: &crownjewelv1.CrownJewel{ + Metadata: &headerv1.Metadata{ + Name: "test", + }, + Spec: &crownjewelv1.CrownJewelSpec{ + Query: "SELECT * FROM nodes", + }, + }, + wantErr: require.NoError, + }, { name: "MissingMatchers", jewel: &crownjewelv1.CrownJewel{ diff --git a/lib/services/crown_jewels_test.go b/lib/services/crown_jewels_test.go index 62f579ea11f47..4b9347ea61d01 100644 --- a/lib/services/crown_jewels_test.go +++ b/lib/services/crown_jewels_test.go @@ -65,6 +65,7 @@ func TestUnmarshalCrownJewel(t *testing.T) { }, }, Spec: &crownjewelv1.CrownJewelSpec{ + Query: "SELECT * FROM nodes", TeleportMatchers: []*crownjewelv1.TeleportMatcher{ { Kinds: []string{"node"}, @@ -106,6 +107,7 @@ metadata: env: example name: example-crown-jewel spec: + query: "SELECT * FROM nodes" aws_matchers: - regions: - us-west-1 From 7287a11cd5003f1c1e16e35004f6909114bbd739 Mon Sep 17 00:00:00 2001 From: "teleport-post-release-automation[bot]" <128860004+teleport-post-release-automation[bot]@users.noreply.github.com> Date: Sat, 3 Aug 2024 15:00:25 +0000 Subject: [PATCH 054/139] [auto] docs: Update version to v16.1.1 (#44898) Co-authored-by: GitHub Co-authored-by: Steven Martin --- docs/config.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/config.json b/docs/config.json index 908e9ef4eb148..842f813aa6b91 100644 --- a/docs/config.json +++ b/docs/config.json @@ -1614,17 +1614,17 @@ "teleport": { "git": "api/14.0.0-gd1e081e", "major_version": "16", - "version": "16.1.0", + "version": "16.1.1", "url": "teleport.example.com", "golang": "1.22", "plugin": { - "version": "16.1.0" + "version": "16.1.1" }, "helm_repo_url": "https://charts.releases.teleport.dev", - "latest_oss_docker_image": "public.ecr.aws/gravitational/teleport-distroless:16.1.0", - "latest_oss_debug_docker_image": "public.ecr.aws/gravitational/teleport-distroless-debug:16.1.0", - "latest_ent_docker_image": "public.ecr.aws/gravitational/teleport-ent-distroless:16.1.0", - "latest_ent_debug_docker_image": "public.ecr.aws/gravitational/teleport-ent-distroless-debug:16.1.0" + "latest_oss_docker_image": "public.ecr.aws/gravitational/teleport-distroless:16.1.1", + "latest_oss_debug_docker_image": "public.ecr.aws/gravitational/teleport-distroless-debug:16.1.1", + "latest_ent_docker_image": "public.ecr.aws/gravitational/teleport-ent-distroless:16.1.1", + "latest_ent_debug_docker_image": "public.ecr.aws/gravitational/teleport-ent-distroless-debug:16.1.1" }, "terraform": { "version": "1.0.0" From 994d3145f4e23ed8b776c7179b22c6e9d04f7538 Mon Sep 17 00:00:00 2001 From: Steven Martin Date: Mon, 5 Aug 2024 08:17:49 -0400 Subject: [PATCH 055/139] docs: remove notice that tctl only linux and macos (#45039) Co-authored-by: Steven Martin --- docs/pages/includes/tctl.mdx | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/pages/includes/tctl.mdx b/docs/pages/includes/tctl.mdx index 3944936f36935..87915700bd659 100644 --- a/docs/pages/includes/tctl.mdx +++ b/docs/pages/includes/tctl.mdx @@ -1,6 +1,5 @@ To check that you can connect to your Teleport cluster, sign in with `tsh login`, then verify that you can run `tctl` commands using your current credentials. -`tctl` is supported on macOS and Linux machines. For example: From 783cf7db1767f5528084b7b441615970232de5a2 Mon Sep 17 00:00:00 2001 From: Alan Parra Date: Mon, 5 Aug 2024 11:06:09 -0300 Subject: [PATCH 056/139] [v16] Document SSO caveats on UserSpecV2.TrustedDeviceIDs (#44986) * Document SSO caveats on UserSpecV2.TrustedDeviceIDs * Update generated protos * Run `make -C integrations/operator manifests` * Run `make -C integrations/terraform docs` --- api/proto/teleport/legacy/types/types.proto | 7 +++++++ api/types/types.pb.go | 7 +++++++ .../reference/terraform-provider/data-sources/user.mdx | 2 +- .../pages/reference/terraform-provider/resources/user.mdx | 2 +- .../operator-crds/resources.teleport.dev_users.yaml | 8 ++++++-- .../config/crd/bases/resources.teleport.dev_users.yaml | 8 ++++++-- integrations/terraform/tfschema/types_terraform.go | 2 +- 7 files changed, 29 insertions(+), 7 deletions(-) diff --git a/api/proto/teleport/legacy/types/types.proto b/api/proto/teleport/legacy/types/types.proto index 5b909502bb7b8..55c9078370f7a 100644 --- a/api/proto/teleport/legacy/types/types.proto +++ b/api/proto/teleport/legacy/types/types.proto @@ -3467,6 +3467,13 @@ message UserSpecV2 { LocalAuthSecrets LocalAuth = 9 [(gogoproto.jsontag) = "local_auth,omitempty"]; // TrustedDeviceIDs contains the IDs of trusted devices enrolled by the user. + // + // Note that SSO users are transient and thus may contain an empty + // TrustedDeviceIDs field, even though the user->device association exists + // under the Device Trust subsystem. Do not rely on this field to determine + // device associations or ownership, it exists for legacy/informative purposes + // only. + // // Managed by the Device Trust subsystem, avoid manual edits. repeated string TrustedDeviceIDs = 10 [(gogoproto.jsontag) = "trusted_device_ids,omitempty"]; } diff --git a/api/types/types.pb.go b/api/types/types.pb.go index c1ccbdd9a2a1d..cb23b68b643fc 100644 --- a/api/types/types.pb.go +++ b/api/types/types.pb.go @@ -8622,6 +8622,13 @@ type UserSpecV2 struct { // authentication LocalAuth *LocalAuthSecrets `protobuf:"bytes,9,opt,name=LocalAuth,proto3" json:"local_auth,omitempty"` // TrustedDeviceIDs contains the IDs of trusted devices enrolled by the user. + // + // Note that SSO users are transient and thus may contain an empty + // TrustedDeviceIDs field, even though the user->device association exists + // under the Device Trust subsystem. Do not rely on this field to determine + // device associations or ownership, it exists for legacy/informative purposes + // only. + // // Managed by the Device Trust subsystem, avoid manual edits. TrustedDeviceIDs []string `protobuf:"bytes,10,rep,name=TrustedDeviceIDs,proto3" json:"trusted_device_ids,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` diff --git a/docs/pages/reference/terraform-provider/data-sources/user.mdx b/docs/pages/reference/terraform-provider/data-sources/user.mdx index b2b12619f9268..67f8e507b287e 100644 --- a/docs/pages/reference/terraform-provider/data-sources/user.mdx +++ b/docs/pages/reference/terraform-provider/data-sources/user.mdx @@ -46,7 +46,7 @@ Optional: - `roles` (List of String) Roles is a list of roles assigned to user - `saml_identities` (Attributes List) SAMLIdentities lists associated SAML identities that let user log in using externally verified identity (see [below for nested schema](#nested-schema-for-specsaml_identities)) - `traits` (Map of List of String) -- `trusted_device_ids` (List of String) TrustedDeviceIDs contains the IDs of trusted devices enrolled by the user. Managed by the Device Trust subsystem, avoid manual edits. +- `trusted_device_ids` (List of String) TrustedDeviceIDs contains the IDs of trusted devices enrolled by the user. Note that SSO users are transient and thus may contain an empty TrustedDeviceIDs field, even though the user->device association exists under the Device Trust subsystem. Do not rely on this field to determine device associations or ownership, it exists for legacy/informative purposes only. Managed by the Device Trust subsystem, avoid manual edits. ### Nested Schema for `spec.github_identities` diff --git a/docs/pages/reference/terraform-provider/resources/user.mdx b/docs/pages/reference/terraform-provider/resources/user.mdx index f65fd9bb950db..989c39616ab6d 100644 --- a/docs/pages/reference/terraform-provider/resources/user.mdx +++ b/docs/pages/reference/terraform-provider/resources/user.mdx @@ -92,7 +92,7 @@ Optional: - `roles` (List of String) Roles is a list of roles assigned to user - `saml_identities` (Attributes List) SAMLIdentities lists associated SAML identities that let user log in using externally verified identity (see [below for nested schema](#nested-schema-for-specsaml_identities)) - `traits` (Map of List of String) -- `trusted_device_ids` (List of String) TrustedDeviceIDs contains the IDs of trusted devices enrolled by the user. Managed by the Device Trust subsystem, avoid manual edits. +- `trusted_device_ids` (List of String) TrustedDeviceIDs contains the IDs of trusted devices enrolled by the user. Note that SSO users are transient and thus may contain an empty TrustedDeviceIDs field, even though the user->device association exists under the Device Trust subsystem. Do not rely on this field to determine device associations or ownership, it exists for legacy/informative purposes only. Managed by the Device Trust subsystem, avoid manual edits. ### Nested Schema for `spec.github_identities` diff --git a/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_users.yaml b/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_users.yaml index f8720f714d3c9..0c5221f64b369 100644 --- a/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_users.yaml +++ b/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_users.yaml @@ -119,8 +119,12 @@ spec: type: object trusted_device_ids: description: TrustedDeviceIDs contains the IDs of trusted devices - enrolled by the user. Managed by the Device Trust subsystem, avoid - manual edits. + enrolled by the user. Note that SSO users are transient and thus + may contain an empty TrustedDeviceIDs field, even though the user->device + association exists under the Device Trust subsystem. Do not rely + on this field to determine device associations or ownership, it + exists for legacy/informative purposes only. Managed by the Device + Trust subsystem, avoid manual edits. items: type: string nullable: true diff --git a/integrations/operator/config/crd/bases/resources.teleport.dev_users.yaml b/integrations/operator/config/crd/bases/resources.teleport.dev_users.yaml index f8720f714d3c9..0c5221f64b369 100644 --- a/integrations/operator/config/crd/bases/resources.teleport.dev_users.yaml +++ b/integrations/operator/config/crd/bases/resources.teleport.dev_users.yaml @@ -119,8 +119,12 @@ spec: type: object trusted_device_ids: description: TrustedDeviceIDs contains the IDs of trusted devices - enrolled by the user. Managed by the Device Trust subsystem, avoid - manual edits. + enrolled by the user. Note that SSO users are transient and thus + may contain an empty TrustedDeviceIDs field, even though the user->device + association exists under the Device Trust subsystem. Do not rely + on this field to determine device associations or ownership, it + exists for legacy/informative purposes only. Managed by the Device + Trust subsystem, avoid manual edits. items: type: string nullable: true diff --git a/integrations/terraform/tfschema/types_terraform.go b/integrations/terraform/tfschema/types_terraform.go index 8778b4c65099b..5b77cc5b1dbf5 100644 --- a/integrations/terraform/tfschema/types_terraform.go +++ b/integrations/terraform/tfschema/types_terraform.go @@ -2556,7 +2556,7 @@ func GenSchemaUserV2(ctx context.Context) (github_com_hashicorp_terraform_plugin }, "traits": GenSchemaTraits(ctx), "trusted_device_ids": { - Description: "TrustedDeviceIDs contains the IDs of trusted devices enrolled by the user. Managed by the Device Trust subsystem, avoid manual edits.", + Description: "TrustedDeviceIDs contains the IDs of trusted devices enrolled by the user. Note that SSO users are transient and thus may contain an empty TrustedDeviceIDs field, even though the user->device association exists under the Device Trust subsystem. Do not rely on this field to determine device associations or ownership, it exists for legacy/informative purposes only. Managed by the Device Trust subsystem, avoid manual edits.", Optional: true, Type: github_com_hashicorp_terraform_plugin_framework_types.ListType{ElemType: github_com_hashicorp_terraform_plugin_framework_types.StringType}, }, From 12e975d46d4fa9be6d76bee15cf99d7bc4a796e3 Mon Sep 17 00:00:00 2001 From: Marco Dinis Date: Mon, 5 Aug 2024 15:23:46 +0100 Subject: [PATCH 057/139] Fix Help And Support links (#44879) --- web/packages/teleport/src/Support/Support.tsx | 4 ++-- .../__snapshots__/Support.story.test.tsx.snap | 20 +++++++++---------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/web/packages/teleport/src/Support/Support.tsx b/web/packages/teleport/src/Support/Support.tsx index fe40920857a96..ad1ec0360d030 100644 --- a/web/packages/teleport/src/Support/Support.tsx +++ b/web/packages/teleport/src/Support/Support.tsx @@ -174,9 +174,9 @@ const getDocUrls = (version = '', isEnterprise: boolean) => { } return { - getStarted: withUTM(`https://goteleport.com/docs${docVer}/getting-started`), + getStarted: withUTM(`https://goteleport.com/docs${docVer}`), tshGuide: withUTM( - `https://goteleport.com/docs${docVer}/server-access/guides/tsh` + `https://goteleport.com/docs${docVer}/connect-your-client/tsh/` ), adminGuide: withUTM( `https://goteleport.com/docs${docVer}/management/admin/` diff --git a/web/packages/teleport/src/Support/__snapshots__/Support.story.test.tsx.snap b/web/packages/teleport/src/Support/__snapshots__/Support.story.test.tsx.snap index b4577279c3d70..2ee5a24fbd5dd 100644 --- a/web/packages/teleport/src/Support/__snapshots__/Support.story.test.tsx.snap +++ b/web/packages/teleport/src/Support/__snapshots__/Support.story.test.tsx.snap @@ -245,7 +245,7 @@ exports[`support Cloud 1`] = ` @@ -253,7 +253,7 @@ exports[`support Cloud 1`] = ` @@ -687,7 +687,7 @@ exports[`support Enterprise 1`] = ` @@ -695,7 +695,7 @@ exports[`support Enterprise 1`] = ` @@ -1205,7 +1205,7 @@ exports[`support Enterprise with CTA 1`] = ` @@ -1213,7 +1213,7 @@ exports[`support Enterprise with CTA 1`] = ` @@ -1640,7 +1640,7 @@ exports[`support OSS 1`] = ` @@ -1648,7 +1648,7 @@ exports[`support OSS 1`] = ` @@ -2158,7 +2158,7 @@ exports[`support OSSWithCTA 1`] = ` @@ -2166,7 +2166,7 @@ exports[`support OSSWithCTA 1`] = ` From 3791c74ccb21f2335e64314afd28d7c7e6c32423 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Cie=C5=9Blak?= Date: Mon, 5 Aug 2024 16:29:16 +0200 Subject: [PATCH 058/139] [v16] Update electron to 31.3.1 and electron-builder to 25.0.3 (#45043) * Update electron and electron-builder * Clean up electron-builder peer deps --- pnpm-lock.yaml | 86 +++++++++---------- .../build_resources/linux/after-install.tpl | 9 +- web/packages/teleterm/package.json | 4 +- 3 files changed, 52 insertions(+), 47 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index aa1e48dc003da..e4f2e4c8f2b35 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -453,11 +453,11 @@ importers: specifier: ^5.5.0 version: 5.5.0 electron: - specifier: 31.1.0 - version: 31.1.0 + specifier: 31.3.1 + version: 31.3.1 electron-builder: - specifier: ^25.0.1 - version: 25.0.1(electron-builder-squirrel-windows@25.0.1(dmg-builder@25.0.1)) + specifier: ^25.0.3 + version: 25.0.3(electron-builder-squirrel-windows@25.0.3(dmg-builder@25.0.3)) electron-notarize: specifier: ^1.2.2 version: 1.2.2 @@ -3086,15 +3086,15 @@ packages: resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} engines: {node: '>= 8'} - app-builder-bin@5.0.0-alpha.6: - resolution: {integrity: sha512-KVrQQpaYHTlzuj1TE8k+qwwu/o/R8bsFyglUl/3guc2MUbSYvVqeAlxucotAxfp4SnNNBdNE6GGMbhqAKagakQ==} + app-builder-bin@5.0.0-alpha.7: + resolution: {integrity: sha512-ww2mK4ITUvqisnqOuUWAeHzokpPidyZ7a0ZkwW+V7sF5/Pdi2OldkRjAWqEzn6Xtmj3SLVT84as4wB59A6jJ4g==} - app-builder-lib@25.0.1: - resolution: {integrity: sha512-zpSaCgGnv1D+dv9IC/ry/x4JAuqHsW/VFDp7lg+IzvTOIgLJkfqyavyP5gEOtUFI5rOO3bwB2TENV5i6lLIpIQ==} + app-builder-lib@25.0.3: + resolution: {integrity: sha512-c0LJCJMGgDDGmZUSKeyDYKI5rYc6sQ4PS0Ak62HWArotHDwgAk9qIIewNnvIn/9KskEGwHQr8Y/TumWRqUKRwQ==} engines: {node: '>=14.0.0'} peerDependencies: - dmg-builder: 25.0.1 - electron-builder-squirrel-windows: 25.0.1 + dmg-builder: 25.0.3 + electron-builder-squirrel-windows: 25.0.3 app-root-dir@1.0.2: resolution: {integrity: sha512-jlpIfsOoNoafl92Sz//64uQHGSyMrD2vYG5d8o2a4qGvyNCvXur7bzIsWtAC/6flI2RYAp3kv8rsfBtaLm7w0g==} @@ -3458,8 +3458,8 @@ packages: resolution: {integrity: sha512-HjIDfhvqx/8B3TDN4GbABQcgpewTU4LMRTQPkVpKYV3lsuxEJoIfvg09GyWTNmfVNSUAYf+fbTN//JX4TH20pg==} engines: {node: '>=12.0.0'} - builder-util@25.0.1: - resolution: {integrity: sha512-bxT7+1rnxEGIZGrzBdMAL0brasBmQV4bon3sZC0XC4V2Za4FZ7CXAO9tuetuVpFXYFau+6BL63UbN9HFGMmV5g==} + builder-util@25.0.3: + resolution: {integrity: sha512-eH5c1ukdY2xjtFQWQ6jlzEuXuqcuAVc3UQ6V6fdYu9Kg3CkDbCR82Mox42uaJDmee9WXSbP/88cOworFdOHPhw==} bytes@3.0.0: resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} @@ -4123,8 +4123,8 @@ packages: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} - dmg-builder@25.0.1: - resolution: {integrity: sha512-9mGcvQeQBsXOAuqJf5Z0xTsa0LQZmqaLbc5n6TucviN16OjyRsieNv2ogvEvJPScL8jyPSM062FHAhxsVys0Hg==} + dmg-builder@25.0.3: + resolution: {integrity: sha512-RAzB1NSOkzDA19Kl+R/rndYFfMCZDN4pmg5TNwQPeV+ICig12xQDqlPoql1Eay79pXM45CG74aTuBOcK/thGJg==} dmg-license@1.0.11: resolution: {integrity: sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==} @@ -4205,11 +4205,11 @@ packages: engines: {node: '>=0.10.0'} hasBin: true - electron-builder-squirrel-windows@25.0.1: - resolution: {integrity: sha512-MsfO7wHky5aYf72i9wFd1hZINyQHvnB4o2CHcXnEzsM21WHZJpXol62NBJhp+1pk6fuARA0jF1DtAcBco+y9YA==} + electron-builder-squirrel-windows@25.0.3: + resolution: {integrity: sha512-VeKeCKn8VgMG3loPnCtxPcximwpyb9a1YVubsyYMN/0CDGlsjfwdQEjrU5FD2/DkbZT7ghjei4QGjCQkRlZ1Cg==} - electron-builder@25.0.1: - resolution: {integrity: sha512-1ft2JHDQeXRicAC8Icqf0ErzeY5cDXesmkKZsI9EWzOlvm+Dm6z8oRpPt39IFl7LbPlJ2yRrLE7DahktiRTFrg==} + electron-builder@25.0.3: + resolution: {integrity: sha512-CToK0oEH/vxTbnEhXgInQWAuPEgkj11nQ3Jlse/Pc/aPNULxRSimH2UodZHrVlmVLozI4XVJqqh+pTVFXXZBaw==} engines: {node: '>=14.0.0'} hasBin: true @@ -4218,8 +4218,8 @@ packages: engines: {node: '>= 10.0.0'} deprecated: Please use @electron/notarize moving forward. There is no API change, just a package name change - electron-publish@25.0.1: - resolution: {integrity: sha512-9ADYaKARy9rfCgiaFt/q2YJxZdx26WAZbnq06LBaZEg48YnlyPBo2ZwcIVbt6+RszTOgKvaZY/KqT6GkDRiikw==} + electron-publish@25.0.3: + resolution: {integrity: sha512-wSGm+TFK2lArswIFBPLuIRHbo945s3MCvG5y1xVC57zL/PsrElUkaGH2ERtRrcKNpaDNq77rDA9JnMJhAFJjUg==} electron-to-chromium@1.4.805: resolution: {integrity: sha512-8W4UJwX/w9T0QSzINJckTKG6CYpAUTqsaWcWIsdud3I1FYJcMgW9QqT1/4CBff/pP/TihWh13OmiyY8neto6vw==} @@ -4235,8 +4235,8 @@ packages: '@swc/core': optional: true - electron@31.1.0: - resolution: {integrity: sha512-TBOwqLxSxnx6+pH6GMri7R3JPH2AkuGJHfWZS0p1HsmN+Qr1T9b0IRJnnehSd/3NZAmAre4ft9Ljec7zjyKFJA==} + electron@31.3.1: + resolution: {integrity: sha512-9fiuWlRhBfygtcT+auRd/WdBK/f8LZZcrpx0RjpXhH2DPTP/PfnkC4JB1PW55qCbGbh4wAgkYbf4ExIag8oGCA==} engines: {node: '>= 12.20.55'} hasBin: true @@ -12013,9 +12013,9 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.1 - app-builder-bin@5.0.0-alpha.6: {} + app-builder-bin@5.0.0-alpha.7: {} - app-builder-lib@25.0.1(dmg-builder@25.0.1(electron-builder-squirrel-windows@25.0.1))(electron-builder-squirrel-windows@25.0.1(dmg-builder@25.0.1)): + app-builder-lib@25.0.3(dmg-builder@25.0.3(electron-builder-squirrel-windows@25.0.3))(electron-builder-squirrel-windows@25.0.3(dmg-builder@25.0.3)): dependencies: '@develar/schema-utils': 2.6.5 '@electron/notarize': 2.3.2 @@ -12026,14 +12026,14 @@ snapshots: '@types/fs-extra': 9.0.13 async-exit-hook: 2.0.1 bluebird-lst: 1.0.9 - builder-util: 25.0.1 + builder-util: 25.0.3 builder-util-runtime: 9.2.5 chromium-pickle-js: 0.2.0 debug: 4.3.4(supports-color@5.5.0) - dmg-builder: 25.0.1(electron-builder-squirrel-windows@25.0.1) + dmg-builder: 25.0.3(electron-builder-squirrel-windows@25.0.3) ejs: 3.1.10 - electron-builder-squirrel-windows: 25.0.1(dmg-builder@25.0.1) - electron-publish: 25.0.1 + electron-builder-squirrel-windows: 25.0.3(dmg-builder@25.0.3) + electron-publish: 25.0.3 form-data: 4.0.0 fs-extra: 10.1.0 hosted-git-info: 4.1.0 @@ -12576,11 +12576,11 @@ snapshots: transitivePeerDependencies: - supports-color - builder-util@25.0.1: + builder-util@25.0.3: dependencies: 7zip-bin: 5.2.0 '@types/debug': 4.1.8 - app-builder-bin: 5.0.0-alpha.6 + app-builder-bin: 5.0.0-alpha.7 bluebird-lst: 1.0.9 builder-util-runtime: 9.2.5 chalk: 4.1.2 @@ -13333,10 +13333,10 @@ snapshots: dependencies: path-type: 4.0.0 - dmg-builder@25.0.1(electron-builder-squirrel-windows@25.0.1): + dmg-builder@25.0.3(electron-builder-squirrel-windows@25.0.3): dependencies: - app-builder-lib: 25.0.1(dmg-builder@25.0.1(electron-builder-squirrel-windows@25.0.1))(electron-builder-squirrel-windows@25.0.1(dmg-builder@25.0.1)) - builder-util: 25.0.1 + app-builder-lib: 25.0.3(dmg-builder@25.0.3(electron-builder-squirrel-windows@25.0.3))(electron-builder-squirrel-windows@25.0.3(dmg-builder@25.0.3)) + builder-util: 25.0.3 builder-util-runtime: 9.2.5 fs-extra: 10.1.0 iconv-lite: 0.6.3 @@ -13434,24 +13434,24 @@ snapshots: dependencies: jake: 10.8.5 - electron-builder-squirrel-windows@25.0.1(dmg-builder@25.0.1): + electron-builder-squirrel-windows@25.0.3(dmg-builder@25.0.3): dependencies: - app-builder-lib: 25.0.1(dmg-builder@25.0.1(electron-builder-squirrel-windows@25.0.1))(electron-builder-squirrel-windows@25.0.1(dmg-builder@25.0.1)) + app-builder-lib: 25.0.3(dmg-builder@25.0.3(electron-builder-squirrel-windows@25.0.3))(electron-builder-squirrel-windows@25.0.3(dmg-builder@25.0.3)) archiver: 5.3.2 - builder-util: 25.0.1 + builder-util: 25.0.3 fs-extra: 10.1.0 transitivePeerDependencies: - bluebird - dmg-builder - supports-color - electron-builder@25.0.1(electron-builder-squirrel-windows@25.0.1(dmg-builder@25.0.1)): + electron-builder@25.0.3(electron-builder-squirrel-windows@25.0.3(dmg-builder@25.0.3)): dependencies: - app-builder-lib: 25.0.1(dmg-builder@25.0.1(electron-builder-squirrel-windows@25.0.1))(electron-builder-squirrel-windows@25.0.1(dmg-builder@25.0.1)) - builder-util: 25.0.1 + app-builder-lib: 25.0.3(dmg-builder@25.0.3(electron-builder-squirrel-windows@25.0.3))(electron-builder-squirrel-windows@25.0.3(dmg-builder@25.0.3)) + builder-util: 25.0.3 builder-util-runtime: 9.2.5 chalk: 4.1.2 - dmg-builder: 25.0.1(electron-builder-squirrel-windows@25.0.1) + dmg-builder: 25.0.3(electron-builder-squirrel-windows@25.0.3) fs-extra: 10.1.0 is-ci: 3.0.1 lazy-val: 1.0.5 @@ -13470,10 +13470,10 @@ snapshots: transitivePeerDependencies: - supports-color - electron-publish@25.0.1: + electron-publish@25.0.3: dependencies: '@types/fs-extra': 9.0.13 - builder-util: 25.0.1 + builder-util: 25.0.3 builder-util-runtime: 9.2.5 chalk: 4.1.2 fs-extra: 10.1.0 @@ -13498,7 +13498,7 @@ snapshots: transitivePeerDependencies: - supports-color - electron@31.1.0: + electron@31.3.1: dependencies: '@electron/get': 2.0.2 '@types/node': 20.14.9 diff --git a/web/packages/teleterm/build_resources/linux/after-install.tpl b/web/packages/teleterm/build_resources/linux/after-install.tpl index 74e29dd5bf724..98ee9fec46b1c 100644 --- a/web/packages/teleterm/build_resources/linux/after-install.tpl +++ b/web/packages/teleterm/build_resources/linux/after-install.tpl @@ -6,8 +6,13 @@ set -eu # https://github.com/electron-userland/electron-builder/blob/v24.4.0/packages/app-builder-lib/templates/linux/after-install.tpl ### -# SUID chrome-sandbox for Electron 5+ -chmod 4755 "/opt/${sanitizedProductName}/chrome-sandbox" || true +# Check if user namespaces are supported by the kernel and working with a quick test: +if ! { [[ -L /proc/self/ns/user ]] && unshare --user true; }; then + # Use SUID chrome-sandbox only on systems without user namespaces: + chmod 4755 '/opt/${sanitizedProductName}/chrome-sandbox' || true +else + chmod 0755 '/opt/${sanitizedProductName}/chrome-sandbox' || true +fi # update-mime-database and update-desktop-database might be missing from minimal variants of some # Linux distributions. diff --git a/web/packages/teleterm/package.json b/web/packages/teleterm/package.json index 760d33cec8c16..4f301f3e4c3d1 100644 --- a/web/packages/teleterm/package.json +++ b/web/packages/teleterm/package.json @@ -44,8 +44,8 @@ "@types/whatwg-url": "^11.0.5", "@xterm/xterm": "^5.5.0", "@xterm/addon-fit": "^0.10.0", - "electron": "31.1.0", - "electron-builder": "^25.0.1", + "electron": "31.3.1", + "electron-builder": "^25.0.3", "electron-notarize": "^1.2.2", "electron-vite": "^2.3.0", "events": "3.3.0", From 3a80237818c9a7df79f4936eef3c93a3c2bf4944 Mon Sep 17 00:00:00 2001 From: Steven Martin Date: Mon, 5 Aug 2024 10:37:57 -0400 Subject: [PATCH 059/139] docs: update tctl references to include windows (#45062) Co-authored-by: Steven Martin --- .../server-access/getting-started.mdx | 14 -------------- docs/pages/installation.mdx | 2 +- 2 files changed, 1 insertion(+), 15 deletions(-) diff --git a/docs/pages/enroll-resources/server-access/getting-started.mdx b/docs/pages/enroll-resources/server-access/getting-started.mdx index 576e6dab49a85..dc8e08c29e774 100644 --- a/docs/pages/enroll-resources/server-access/getting-started.mdx +++ b/docs/pages/enroll-resources/server-access/getting-started.mdx @@ -67,25 +67,11 @@ that a user intends to access. On your local workstation, create a join token so you can add the server to your Teleport cluster: - - - -```code -Let's save the token to a file -$ tctl tokens add --type=node --format=text > token.file -``` - - - - ```code Let's save the token to a file $ tctl tokens add --type=node --format=text > token.file ``` - - - `--type=node` specifies that the Teleport process will act and join as an SSH server. diff --git a/docs/pages/installation.mdx b/docs/pages/installation.mdx index 4b851ef016523..5280ea57fc821 100644 --- a/docs/pages/installation.mdx +++ b/docs/pages/installation.mdx @@ -34,7 +34,7 @@ running Teleport on UNIX variants other than Linux \[1]. | - | - | - | - | - | - | | Linux v2.6.23+ (RHEL/CentOS 7+, Amazon Linux 2+, Amazon Linux 2023+, Ubuntu 16.04+, Debian 9+, SLES 12 SP 5+, and SLES 15 SP 5+) \[3] | yes | yes | yes | yes | yes | | macOS v10.15+ (Catalina)| yes | yes | yes | yes | yes | -| Windows 10+ (rev. 1607) \[4] | no | no | yes | yes | no | +| Windows 10+ (rev. 1607) \[4] | no | yes | yes | yes | no | \[1] *Teleport is written in Go and many of these system requirements are due to the requirements of the [Go toolchain](https://github.com/golang/go/wiki/MinimumRequirements)*. From 1761f3485a2bd0422a0f5e7eab16f29206829f32 Mon Sep 17 00:00:00 2001 From: Paul Gottschling Date: Mon, 5 Aug 2024 10:40:09 -0400 Subject: [PATCH 060/139] Fill in missing CHANGELOG releases (#44940) Fixes #32790 Use a tool to merge version-specific H2 sections from v14, v15, and v16 of the CHANGELOG. Also changes version-specific H3 sections to H2s, and always includes a major, minor, and patch version, in order to keep the CHANGELOG consistent. --- CHANGELOG.md | 571 ++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 516 insertions(+), 55 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 21e392418c643..e83df372b946e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -379,6 +379,137 @@ follow the manual setup guide. All Teleport Assist functionality and OpenAI integration has been removed from Teleport. +## 15.4.10 (07/29/24) + +* Fixed an issue that could cause auth servers to panic when their backend connectivity was interrupted. [#44787](https://github.com/gravitational/teleport/pull/44787) +* Reduced the probability that the event-handler deadlocks when encountering errors processing session recordings. [#44772](https://github.com/gravitational/teleport/pull/44772) +* Improved event-handler diagnostics by providing a way to capture profiles dynamically via `SIGUSR1`. [#44759](https://github.com/gravitational/teleport/pull/44759) +* Added support for Teams to Opsgenie plugin alert creation. [#44330](https://github.com/gravitational/teleport/pull/44330) +* Improved stability of very large teleport clusters during temporary backend disruption/degradation. [#44695](https://github.com/gravitational/teleport/pull/44695) +* Resolved compatibility issue with Paramiko and Machine ID's SSH multiplexer SSH agent. [#44672](https://github.com/gravitational/teleport/pull/44672) +* Fixed a fatal error in `tbot` when unable to lookup the user from a given UID in containerized environments for checking ACL configuration. [#44646](https://github.com/gravitational/teleport/pull/44646) +* Fixed Application Access regression where an HTTP header wasn't set in forwarded requests. [#44629](https://github.com/gravitational/teleport/pull/44629) +* Use the registered port of the target host when `tsh puttyconfig` is invoked without `--port`. [#44573](https://github.com/gravitational/teleport/pull/44573) +* Added more icons for guessing application icon by name or by label `teleport.icon` in the web UI. [#44568](https://github.com/gravitational/teleport/pull/44568) +* Removed deprecated S3 bucket option when creating or editing AWS OIDC integration in the web UI. [#44487](https://github.com/gravitational/teleport/pull/44487) +* Fixed terminal sessions with a database CLI client in Teleport Connect hanging indefinitely if the client cannot be found. [#44466](https://github.com/gravitational/teleport/pull/44466) +* Added application-tunnel service to Machine ID for establishing a long-lived tunnel to a HTTP or TCP application for Machine to Machine access. [#44446](https://github.com/gravitational/teleport/pull/44446) +* Fixed a low-probability panic in audit event upload logic. [#44424](https://github.com/gravitational/teleport/pull/44424) +* Fixed Teleport Connect binaries not being signed correctly. [#44420](https://github.com/gravitational/teleport/pull/44420) +* Prevented DoSing the cluster during a mass failed join event by agents. [#44415](https://github.com/gravitational/teleport/pull/44415) +* Added audit events for AWS and Azure integration resource actions. [#44404](https://github.com/gravitational/teleport/pull/44404) +* Fixed automatic updates with previous versions of the `teleport.yaml` config. [#44378](https://github.com/gravitational/teleport/pull/44378) +* Added support for Rocky and AlmaLinux when enrolling a new server from the UI. [#44331](https://github.com/gravitational/teleport/pull/44331) +* Fixed Teleport access plugin tarballs containing a `build` directory, which was accidentally added upon v15.4.5 release. [#44301](https://github.com/gravitational/teleport/pull/44301) +* Prevented an infinite loop in DynamoDB event querying by advancing the cursor to the next day when the limit is reached at the end of a day with an empty iterator. This ensures the cursor does not reset to the beginning of the day. [#44274](https://github.com/gravitational/teleport/pull/44274) +* The clipboard sharing tooltip for desktop sessions now indicates why clipboard sharing is disabled. [#44238](https://github.com/gravitational/teleport/pull/44238) +* Fixed a `kube-agent-updater` bug affecting resolutions of private images. [#44192](https://github.com/gravitational/teleport/pull/44192) +* Prevented redirects to arbitrary URLs when launching an app. [#44189](https://github.com/gravitational/teleport/pull/44189) +* Added audit event field describing if the "MFA for admin actions" requirement changed. [#44185](https://github.com/gravitational/teleport/pull/44185) +* The `teleport-cluster` chart can now use existing ingresses instead of creating its own. [#44147](https://github.com/gravitational/teleport/pull/44147) +* Ensured that `tsh login` outputs accurate status information for the new session. [#44144](https://github.com/gravitational/teleport/pull/44144) +* Fixed "device trust mode _x_ requires Teleport Enterprise" errors on `tctl`. [#44134](https://github.com/gravitational/teleport/pull/44134) +* Added a `--skip-idle-time` flag to `tsh play`. [#44095](https://github.com/gravitational/teleport/pull/44095) +* Added the `tbot install systemd` command for installing tbot as a service on Linux systems. [#44082](https://github.com/gravitational/teleport/pull/44082) +* Added ability to list access list members in json format in `tctl` cli tool. [#44072](https://github.com/gravitational/teleport/pull/44072) +* Made `tbot` compilable on Windows. [#44070](https://github.com/gravitational/teleport/pull/44070) +* For slack integration, Access List reminders are batched into 1 message and provides link out to the web UI. [#44035](https://github.com/gravitational/teleport/pull/44035) +* Fixed denying access despite access being configured for Notification Routing Rules in the web UI. [#44028](https://github.com/gravitational/teleport/pull/44028) +* Fixed eBPF error occurring during startup on Linux RHEL 9. [#44024](https://github.com/gravitational/teleport/pull/44024) +* Lowered latency of detecting Kubernetes cluster becoming online. [#43971](https://github.com/gravitational/teleport/pull/43971) +* Enabled Access Monitoring Rules routing with Mattermost plugin. [#43600](https://github.com/gravitational/teleport/pull/43600) + +Enterprise: +* Fixed an Access List permission bug where an access list owner, who is also a member, was not able to add/rm access list member. +* Fixed an issue with incorrect yum/zypper updater packages being installed. +* Fixed empty condition from unquoted string with yaml editor for Notification Routing Rules in the Web UI. + +## 15.4.9 (07/11/24) + +* Honor proxy templates in tsh ssh. [#44027](https://github.com/gravitational/teleport/pull/44027) +* Fixed Redshift auto-user deactivation/deletion failure that occurs when a user is created or deleted and another user is deactivated concurrently. [#43975](https://github.com/gravitational/teleport/pull/43975) +* Teleport AMIs now optionally source environment variables from `/etc/default/teleport` as regular Teleport package installations do. [#43961](https://github.com/gravitational/teleport/pull/43961) +* Enabled setting event types to forward, skip events, skip session types in event-handler helm chart. [#43939](https://github.com/gravitational/teleport/pull/43939) +* Correctly propagate `extraLabels` configured in teleport-kube-agent chart values to post-delete hooks. A new `extraLabels.job` object has been added for labels which should only apply to the post-delete job. [#43931](https://github.com/gravitational/teleport/pull/43931) +* Machine ID outputs now execute individually and concurrently, meaning that one failing output does not disrupt other outputs, and that performance when generating a large number of outputs is improved. [#43883](https://github.com/gravitational/teleport/pull/43883) +* Omit control plane services from the inventory list output for Cloud-Hosted instances. [#43778](https://github.com/gravitational/teleport/pull/43778) +* Fixed session recordings getting overwritten or not uploaded. [#42164](https://github.com/gravitational/teleport/pull/42164) + +Enterprise: +* Fixed inaccurately notifying user that access list reviews are due in the web UI. + +## 15.4.7 (07/03/24) + +* Added audit events for discovery config actions. [#43794](https://github.com/gravitational/teleport/pull/43794) +* Updated Go toolchain to v1.22.5. [#43769](https://github.com/gravitational/teleport/pull/43769) +* Reduced CPU usage in auth servers experiencing very high concurrent request load. [#43760](https://github.com/gravitational/teleport/pull/43760) +* Machine ID defaults to disabling the use of the Kubernetes exec plugin when writing a Kubeconfig to a directory destination. This removes the need to manually configure `disable_exec_plugin`. [#43656](https://github.com/gravitational/teleport/pull/43656) +* Fixed startup crash of Teleport Connect on Ubuntu 24.04 by adding an AppArmor profile. [#43652](https://github.com/gravitational/teleport/pull/43652) +* Added support for dialling leaf clusters to the tbot SSH multiplexer. [#43635](https://github.com/gravitational/teleport/pull/43635) +* Extend Teleport ability to use non-default cluster domains in Kubernetes, avoiding the assumption of `cluster.local`. [#43632](https://github.com/gravitational/teleport/pull/43632) +* Wait for user MFA input when reissuing expired certificates for a kube proxy. [#43613](https://github.com/gravitational/teleport/pull/43613) +* Improved error diagnostics when using Machine ID's SSH multiplexer. [#43587](https://github.com/gravitational/teleport/pull/43587) + +Enterprise: +* Increased Access Monitoring refresh interval to 24h. +* Teleport Enterprise now supports the `TELEPORT_REPORTING_HTTP(S)_PROXY` environment variable to specify the URL of the HTTP(S) proxy used for connections to our usage reporting ingest service. + +## 15.4.6 (06/27/24) + +This release of Teleport contains a fix for medium-level security issue impacting +Teleport Enterprise, as well as various other updates and improvements + +### Security Fixes + +* **[Medium]** Fixes issue where a SCIM client could potentially overwrite. + Teleport system Roles using specially crafted groups. This issue impacts + Teleport Enterprise deployments using the Okta integration with SCIM support + enabled. + +We strongly recommend all customers upgrade to the latest releases of Teleport. + +### Other updates and improvements + +* Fixed Discover setup access error when updating user. [#43561](https://github.com/gravitational/teleport/pull/43561) +* Updated Go toolchain to 1.22. [#43550](https://github.com/gravitational/teleport/pull/43550) +* Fixed remote port forwarding validation error. [#43517](https://github.com/gravitational/teleport/pull/43517) +* Added support to trust system CAs for self-hosted databases. [#43500](https://github.com/gravitational/teleport/pull/43500) +* Added error display in the Web UI for SSH and Kubernetes sessions. [#43491](https://github.com/gravitational/teleport/pull/43491) +* Update `go-retryablehttp` to v0.7.7 (fixes CVE-2024-6104). [#43475](https://github.com/gravitational/teleport/pull/43475) +* Fixed accurate inventory reporting of the updater after it is removed.. [#43453](https://github.com/gravitational/teleport/pull/43453) +* `tctl alerts ls` now displays remaining alert ttl. [#43435](https://github.com/gravitational/teleport/pull/43435) +* Fixed input search for Teleport Connect's access request listing. [#43430](https://github.com/gravitational/teleport/pull/43430) +* Added `Debug` setting for event-handler. [#43409](https://github.com/gravitational/teleport/pull/43409) +* Fixed Headless auth for sso users, including when local auth is disabled. [#43362](https://github.com/gravitational/teleport/pull/43362) +* Added configuration for custom CAs in the event-handler helm chart. [#43341](https://github.com/gravitational/teleport/pull/43341) +* Fixed an issue with Database Access Controls preventing users from making additional database connections depending on their permissions. [#43302](https://github.com/gravitational/teleport/pull/43302) +* Fixed Connect My Computer in Teleport Connect failing with "bind: invalid argument". [#43288](https://github.com/gravitational/teleport/pull/43288) + +### Enterprise only updates and improvements + +* The teleport updater will no longer default to using the global version channel, avoiding incompatible updates. [#4476](https://github.com/gravitational/teleport.e/pull/4476) + +## 15.4.5 (06/20/24) + +* Added a missing `[Install]` section to the `teleport-acm` systemd unit file as used by Teleport AMIs. [#43256](https://github.com/gravitational/teleport/pull/43256) +* Patched timing variability in curve25519-dalek. [#43249](https://github.com/gravitational/teleport/pull/43249) +* Updated `tctl` to ignore a configuration file if the `auth_service` section is disabled, and prefer loading credentials from a given identity file or tsh profile instead. [#43203](https://github.com/gravitational/teleport/pull/43203) +* Fixed setting request reason for automatic ssh access requests. [#43180](https://github.com/gravitational/teleport/pull/43180) +* Updated `teleport` to skip `jamf_service` validation when the Jamf service is not enabled. [#43169](https://github.com/gravitational/teleport/pull/43169) +* Improved log rotation logic in Teleport Connect; now the non-numbered files always contain recent logs. [#43162](https://github.com/gravitational/teleport/pull/43162) +* Made `tsh` and Teleport Connect return early during login if ping to proxy service was not successful. [#43086](https://github.com/gravitational/teleport/pull/43086) +* Added ability to edit user traits from the Web UI. [#43068](https://github.com/gravitational/teleport/pull/43068) +* Enforce limits when reading events from Firestore to prevent OOM events. [#42967](https://github.com/gravitational/teleport/pull/42967) +* Fixed updating groups for Teleport-created host users. [#42884](https://github.com/gravitational/teleport/pull/42884) +* Added support for `crown_jewel` resource. [#42866](https://github.com/gravitational/teleport/pull/42866) +* Added ability to edit user traits from the Web UI. [#43068](https://github.com/gravitational/teleport/pull/43068) +* Fixed gRPC disconnection on certificate expiry even though DisconnectCertExpiry was false. [#43291](https://github.com/gravitational/teleport/pull/43291) +* Fixed issue where a Teleport instance running only Jamf or Discovery service would never have a healthy `/readyz` endpoint. [#43284](https://github.com/gravitational/teleport/pull/43284) + +### Enterprise-only changes + +* Fixed sync error in Okta SCIM integration. + ## 15.4.4 (06/13/24) * Improve search and predicate/label based dialing performance in large clusters under very high load. [#42941](https://github.com/gravitational/teleport/pull/42941) @@ -1401,6 +1532,337 @@ characters. The account lockout interval has been increased from 20 to 30 minutes. +## 14.3.21 (06/20/24) + +* Fixed bug that caused gRPC connections to be disconnected when their certificate expired even though DisconnectCertExpiry was false. [#43292](https://github.com/gravitational/teleport/pull/43292) +* Fixed bug where a Teleport instance running only Jamf or Discovery service would never have a healthy `/readyz` endpoint. [#43285](https://github.com/gravitational/teleport/pull/43285) +* Added a missing `[Install]` section to the `teleport-acm` systemd unit file as used by Teleport AMIs. [#43258](https://github.com/gravitational/teleport/pull/43258) +* Updated `teleport` to skip `jamf_service` validation when the Jamf is not enabled. [#43170](https://github.com/gravitational/teleport/pull/43170) +* Improved log rotation logic in Teleport Connect; now the non-numbered files always contain recent logs. [#43163](https://github.com/gravitational/teleport/pull/43163) +* Made tsh and Teleport Connect return early during login if ping to proxy service was not successful. [#43087](https://github.com/gravitational/teleport/pull/43087) +* Added ability to edit user traits from the Web UI. [#43070](https://github.com/gravitational/teleport/pull/43070) +* Enforce limits when reading events from Firestore to prevent OOM events. [#42968](https://github.com/gravitational/teleport/pull/42968) +* Fixed an issue Oracle access failed through trusted cluster. [#42929](https://github.com/gravitational/teleport/pull/42929) +* Fixes errors caused by `dynamoevents` query `StartKey` not being within the [From, To] window. [#42914](https://github.com/gravitational/teleport/pull/42914) +* Fixed updating groups for Teleport-created host users. [#42883](https://github.com/gravitational/teleport/pull/42883) +* Update azidentity to v1.6.0 (patches CVE-2024-35255). [#42860](https://github.com/gravitational/teleport/pull/42860) +* Remote rate limits on endpoints used extensively to connect to the cluster. [#42836](https://github.com/gravitational/teleport/pull/42836) +* Improved the performance of the Athena audit log and S3 session storage backends. [#42796](https://github.com/gravitational/teleport/pull/42796) +* Prevented a panic in the Proxy when accessing an offline application. [#42787](https://github.com/gravitational/teleport/pull/42787) +* Improve backoff of session recording uploads by teleport agents. [#42775](https://github.com/gravitational/teleport/pull/42775) +* Reduced backend writes incurred by tracking status of non-recorded sessions. [#42695](https://github.com/gravitational/teleport/pull/42695) +* Fixed listing available DB users in Teleport Connect for databases from leaf clusters obtained through access requests. [#42681](https://github.com/gravitational/teleport/pull/42681) +* Fixed not being able to logout from the web UI when session invalidation errors. [#42654](https://github.com/gravitational/teleport/pull/42654) +* Updated OpenSSL to 3.0.14. [#42643](https://github.com/gravitational/teleport/pull/42643) +* Teleport Connect binaries for Windows are now signed. [#42473](https://github.com/gravitational/teleport/pull/42473) +* Updated Go to 1.21.11. [#42416](https://github.com/gravitational/teleport/pull/42416) +* Fix web UI notification dropdown menu height from growing too long from many notifications. [#42338](https://github.com/gravitational/teleport/pull/42338) +* Disabled session recordings for non-interactive sessions when enhanced recording is disabled. [#42321](https://github.com/gravitational/teleport/pull/42321) +* Fixed issue where removing an app could make teleport app agents incorrectly report as unhealthy for a short time. [#42269](https://github.com/gravitational/teleport/pull/42269) +* Fixed a panic in the DynamoDB audit log backend when the cursor fell outside of the [From,To] interval. [#42266](https://github.com/gravitational/teleport/pull/42266) +* The `teleport configure` command now supports a `--node-name` flag for overriding the node's hostname. [#42249](https://github.com/gravitational/teleport/pull/42249) +* Fixed an issue where mix-and-match of join tokens could interfere with some services appearing correctly in heartbeats. [#42188](https://github.com/gravitational/teleport/pull/42188) +* Improved temporary disk space usage for session recording processing. [#42175](https://github.com/gravitational/teleport/pull/42175) +* Fixed a regression where Kubernetes Exec audit events were not properly populated and lacked error details. [#42146](https://github.com/gravitational/teleport/pull/42146) +* Fix Azure join method when using Resource Groups in the allow section. [#42140](https://github.com/gravitational/teleport/pull/42140) +* Fixed resource leak in session recording cleanup. [#42069](https://github.com/gravitational/teleport/pull/42069) +* Reduced memory and cpu usage after control plane restarts in clusters with a high number of roles. [#42064](https://github.com/gravitational/teleport/pull/42064) +* Fixed the field `allowed_https_hostnames` in the Teleport Operator resources: SAML, OIDC, and GitHub Connector. [#42056](https://github.com/gravitational/teleport/pull/42056) +* Enhanced error messaging for clients using `kubectl exec` v1.30+ to include warnings about a breaking change in Kubernetes. [#41989](https://github.com/gravitational/teleport/pull/41989) + +### Enterprise-Only changes: +* Improved memory usage when reconciling Access Lists members to prevent Out of Memory events when reconciling a large number of Access Lists members. +* Prevented Access Monitoring reports from crashing when large datasets are returned. +* Ensured graceful restart of `teleport.service` after an upgrade. + +## 14.3.20 (05/23/24) + +This release contains fixes for several high-severity security issues, as well +as numerous other bug fixes and improvements. + +### Security Fixes + +#### **[High]** Unrestricted redirect in SSO Authentication + +Teleport didn’t sufficiently validate the client redirect URL. This could allow +an attacker to trick Teleport users into performing an SSO authentication and +redirect to an attacker-controlled URL allowing them to steal the credentials. +[#41834](https://github.com/gravitational/teleport/pull/41834). + +Warning: Teleport will now disallow non-localhost callback URLs for SSO logins +unless otherwise configured. Users of the `tsh login --callback` feature should +modify their auth connector configuration as follows: + +```yaml +version: vX +kind: (saml|oidc|github) +metadata: + name: ... +spec: + ... + client_redirect_settings: + allowed_https_hostnames: + - '*.app.github.dev' + - '^\d+-[a-zA-Z0-9]+\.foo.internal$' + ``` + +The `allowed_https_hostnames` field is an array containing allowed hostnames, +supporting glob matching and, if the string begins and ends with `^` and `$` +respectively, full regular expression syntax. Custom callback URLs are required +to be HTTPS on the standard port (443). + +#### **[High]** CockroachDB authorization bypass + +When connecting to CockroachDB using Database Access, Teleport did not properly +consider the username case when running RBAC checks. As such, it was possible to +establish a connection using an explicitly denied username when using a +different case. [#41823](https://github.com/gravitational/teleport/pull/41823). + +#### **[High]** Long-lived connection persistence issue with expired certificates + +Teleport did not terminate some long-running mTLS-authenticated connections past +the expiry of client certificates for users with the `disconnect_expired_cert` +option. This could allow such users to perform some API actions after their +certificate has expired. +[#41827](https://github.com/gravitational/teleport/pull/41827). + +#### **[High]** PagerDuty integration privilege escalation + +When creating a role access request, Teleport would include PagerDuty +annotations from the entire user’s role set rather than a specific role being +requested. For users who run multiple PagerDuty access plugins with +auto-approval, this could result in a request for a different role being +inadvertently auto-approved than the one which corresponds to the user’s active +on-call schedule. +[#41837](https://github.com/gravitational/teleport/pull/41837). + +#### **[High]** SAML IdP session privilege escalation + +When using Teleport as SAML IdP, authorization wasn’t properly enforced on the +SAML IdP session creation. As such, authenticated users could use an internal +API to escalate their own privileges by crafting a malicious program. +[#41846](https://github.com/gravitational/teleport/pull/41846). + +We strongly recommend all customers upgrade to the latest releases of Teleport. + +### Other fixes and improvements + +* Fixed session upload completion in situations where there's a large number of in-flight session uploads. [#41853](https://github.com/gravitational/teleport/pull/41853) +* Debug symbols are now stripped from Windows builds, resulting in smaller tsh and tctl binaries. [#41839](https://github.com/gravitational/teleport/pull/41839) +* Fixed an issue that the server version of the registered MySQL databases is not automatically updated upon new connections. [#41820](https://github.com/gravitational/teleport/pull/41820) +* Add read-only permissions for cluster maintenance config. [#41791](https://github.com/gravitational/teleport/pull/41791) +* Simplified how Bots are shown on the Users list page. [#41739](https://github.com/gravitational/teleport/pull/41739) +* Fix missing variable and script options in Default Agentless Installer script. [#41722](https://github.com/gravitational/teleport/pull/41722) +* Improved reliability of aggregated usage reporting with some cluster state storage backends (Teleport Enterprise only). [#41703](https://github.com/gravitational/teleport/pull/41703) +* Adds the remote address to audit log events emitted when a join for a Bot or Instance fails or succeeds. [#41699](https://github.com/gravitational/teleport/pull/41699) +* Allow the application service to heartbeat on behalf of more than 1000 dynamic applications. [#41627](https://github.com/gravitational/teleport/pull/41627) +* Ensure responses to Kubernetes watch requests are written sequentially. [#41625](https://github.com/gravitational/teleport/pull/41625) +* Install Script used in discover wizard now supports Ubuntu 24.04. [#41588](https://github.com/gravitational/teleport/pull/41588) +* Ensured that systemd always restarts Teleport on any failure unless explicitly stopped. [#41582](https://github.com/gravitational/teleport/pull/41582) +* Teleport service config is now reloaded on upgrades. [#41548](https://github.com/gravitational/teleport/pull/41548) +* Fix AccessList reconciler comparison causing audit events noise. [#41541](https://github.com/gravitational/teleport/pull/41541) +* Prevent SSH connections opened in the UI from leaking if the browser tab is closed while the SSH connection is being established. [#41519](https://github.com/gravitational/teleport/pull/41519) +* Emit login login failed audit events for invalid passwords on password+webauthn local authentication. [#41433](https://github.com/gravitational/teleport/pull/41433) +* Allow setting Kubernetes Cluster name when using non-default addresses. [#41355](https://github.com/gravitational/teleport/pull/41355) +* Added support to automatically download CA for MongoDB Atlas databases. [#41339](https://github.com/gravitational/teleport/pull/41339) +* Fix broken finish web page for SSO user's on auto discover. [#41336](https://github.com/gravitational/teleport/pull/41336) +* Add fallback on GetAccessList cache miss call. [#41327](https://github.com/gravitational/teleport/pull/41327) +* Validate application URL extracted from the web application launcher request route. [#41305](https://github.com/gravitational/teleport/pull/41305) +* Allow defining custom database names and users when selecting wildcard during test connection when enrolling a database through the web UI. [#41302](https://github.com/gravitational/teleport/pull/41302) +* Updated Go to v1.21.10. [#41282](https://github.com/gravitational/teleport/pull/41282) +* Forbid SSO users from local logins or password changes. [#41271](https://github.com/gravitational/teleport/pull/41271) +* Prevents Cloud tenants from updating `cluster_networking_config` fields `keep_alive_count_max`, `keep_alive_interval`, `tunnel_strategy`, or `proxy_listener_mode`. [#41248](https://github.com/gravitational/teleport/pull/41248) + +## 14.3.18 (05/07/24) + +* Ensure that the active sessions page shows up in the web UI for users with permissions to join sessions. [#41222](https://github.com/gravitational/teleport/pull/41222) +* Fix a bug that was preventing tsh proxy kube certificate renewal from working when accessing a leaf kubernetes cluster via the root. [#41157](https://github.com/gravitational/teleport/pull/41157) +* Add lock target to lock deletion audit events. [#41111](https://github.com/gravitational/teleport/pull/41111) +* Improve the reliability of the upload completer. [#41104](https://github.com/gravitational/teleport/pull/41104) +* Allows the listener for the tbot database-tunnel service to be set to a unix socket. [#41042](https://github.com/gravitational/teleport/pull/41042) + +## 14.3.17 (04/30/24) + +* Fixed user SSO bypass by performing a local passwordless login. [#41071](https://github.com/gravitational/teleport/pull/41071) +* Enforce allow_passwordless server-side. [#41058](https://github.com/gravitational/teleport/pull/41058) +* Fixed a memory leak caused by incorrectly passing the offset when paginating all Access Lists' members when there are more than the default pagesize (200) Access Lists. [#41044](https://github.com/gravitational/teleport/pull/41044) +* Fixed a regression causing roles filtering to not work. [#41000](https://github.com/gravitational/teleport/pull/41000) +* Allow AWS integration to be used for global services without specifying a valid region. [#40990](https://github.com/gravitational/teleport/pull/40990) +* Fixed access requests lingering in the UI and tctl after expiry. [#40965](https://github.com/gravitational/teleport/pull/40965) +* Made `podSecurityContext` configurable in the `teleport-cluster` Helm chart. [#40950](https://github.com/gravitational/teleport/pull/40950) +* Allow mounting extra volumes in the updater pod deployed by the `teleport-kube-agent`chart. [#40949](https://github.com/gravitational/teleport/pull/40949) +* Improved error message when performing an SSO login with a hardware key. [#40924](https://github.com/gravitational/teleport/pull/40924) +* Fixed a bug in the `teleport-cluster` Helm chart that happened when `sessionRecording` was `off`. [#40920](https://github.com/gravitational/teleport/pull/40920) +* Allows setting additional Kubernetes labels on resources created by the `teleport-cluster` Helm chart. [#40916](https://github.com/gravitational/teleport/pull/40916) +* Fixed audit event failures when using DynamoDB event storage. [#40912](https://github.com/gravitational/teleport/pull/40912) +* Properly enforce session moderation requirements when starting Kubernetes ephemeral containers. [#40907](https://github.com/gravitational/teleport/pull/40907) +* Introduced the tpm join method, which allows for secure joining in on-prem environments without the need for a shared secret. [#40875](https://github.com/gravitational/teleport/pull/40875) +* Issue cert.create events during device authentication. [#40873](https://github.com/gravitational/teleport/pull/40873) +* Add the ability to control `ssh_config` generation in Machine ID's Identity Outputs. This allows the generation of the `ssh_config` to be disabled if unnecessary, improving performance and removing the dependency on the Proxy being online. [#40862](https://github.com/gravitational/teleport/pull/40862) +* Prevented deleting AWS OIDC integration used by External Audit Storage. [#40853](https://github.com/gravitational/teleport/pull/40853) +* Reduced parallelism when polling AWS resources to prevent API throttling when exporting them to Teleport Access Graph. [#40812](https://github.com/gravitational/teleport/pull/40812) +* Added hardware key support for agentless connections [#40929](https://github.com/gravitational/teleport/pull/40929) + +## 14.3.16 (04/23/24) + +* Fixed a deprecation warning being shown when `tbot` is used with OpenSSH. [#40838](https://github.com/gravitational/teleport/pull/40838) +* Added a new Audit log event that is emitted when an Agent or Bot request to join the cluster is denied. [#40815](https://github.com/gravitational/teleport/pull/40815) +* Added a new Prometheus metric to track requests initiated by Teleport against the control plane API. [#40755](https://github.com/gravitational/teleport/pull/40755) +* Fixed uploading zip files larger than 10MiB when updating an AWS Lambda function via tsh app access. [#40738](https://github.com/gravitational/teleport/pull/40738) +* Fixed possible data race that could lead to concurrent map read and map write while proxying Kubernetes requests. [#40721](https://github.com/gravitational/teleport/pull/40721) +* Fixed access request promotion of windows_desktop resources. [#40711](https://github.com/gravitational/teleport/pull/40711) +* Fixed spurious ambiguous host errors in ssh routing. [#40709](https://github.com/gravitational/teleport/pull/40709) +* Patched CVE-2023-45288 and CVE-2024-32473. [#40696](https://github.com/gravitational/teleport/pull/40696) +* Generic "not found" errors are returned whether a remote cluster can't be found or access is denied. [#40682](https://github.com/gravitational/teleport/pull/40682) +* Fixed a resource leak in the Teleport proxy server when using proxy peering. [#40675](https://github.com/gravitational/teleport/pull/40675) +* Allow other issue types when configuring JIRA plugin. [#40645](https://github.com/gravitational/teleport/pull/40645) +* Added the ability to configure labels that should be set on the Kubernetes secret when using the `kubernetes_secret` destination in `tbot`. [#40551](https://github.com/gravitational/teleport/pull/40551) +* Updated cosign to address CVE-2024-29902 and CVE-2024-29903. [#40498](https://github.com/gravitational/teleport/pull/40498) +* The Web UI now supports large number of roles by paginating them. [#40464](https://github.com/gravitational/teleport/pull/40464) + +## 14.3.15 (04/12/24) + +* Fixed accidental passkey "downgrades" to MFA. [#40410](https://github.com/gravitational/teleport/pull/40410) +* Added `tsh proxy kube --exec` mode that spawns kube proxy in the background, which re-executes the user shell with the appropriate kubeconfig. [#40394](https://github.com/gravitational/teleport/pull/40394) +* Made Amazon S3 fields optional when creating or editing AWS OIDC integration on the web UI. [#40372](https://github.com/gravitational/teleport/pull/40372) +* Changed Teleport Connect to hide cluster name in the connection list if there is only a single cluster available. [#40357](https://github.com/gravitational/teleport/pull/40357) +* Changed Teleport Connect to now show all recent connections instead of capping them at 10. [#40251](https://github.com/gravitational/teleport/pull/40251) +* Fixed an issue that prevents the Teleport service from restarting. [#40230](https://github.com/gravitational/teleport/pull/40230) +* Added a new resource filtering predicates to allow exact matches on a single item of a delimited list stored in a label value. For example, if given the following label containing a string separated list of values `foo=bar,baz,bang`, it is now possible to match on any resources with a label `foo` that contains the element `bar` via `contains(split(labels[foo], ","), bar)`. [#40184](https://github.com/gravitational/teleport/pull/40184) +* Updated Go to 1.21.9. [#40177](https://github.com/gravitational/teleport/pull/40177) +* Added `disable_exec_plugin` option to the Machine ID Kubernetes Output to remove the dependency on `tbot` existing in the target environment. [#40163](https://github.com/gravitational/teleport/pull/40163) +* Added the database-tunnel service to `tbot` which allows an authenticated database tunnel to be opened by `tbot`. This is an improvement over the original technique of using `tbot proxy db`. [#40160](https://github.com/gravitational/teleport/pull/40160) +* Enabled diagnostic endpoints access behind a PROXY protocol enabled loadbalancer/proxy. [#40139](https://github.com/gravitational/teleport/pull/40139) +* Added system annotations to audit event entries for access requests. [#40122](https://github.com/gravitational/teleport/pull/40122) +* Fixed "Invalid URI" error in Teleport Connect when starting MongoDB `mongosh` from the database connection tab. [#40105](https://github.com/gravitational/teleport/pull/40105) +* Improved the performance of filtering resources via predicate expressions. [#39975](https://github.com/gravitational/teleport/pull/39975) +* Fixed a verbosity issue that caused the `teleport-kube-agent-updater` to output debug logs by default. [#39954](https://github.com/gravitational/teleport/pull/39954) +* Reduced default Jamf inventory page size, and added support for custom values. [#39934](https://github.com/gravitational/teleport/pull/39934) +* Added support to the `teleport-cluster` Helm chart for using an Amazon Athena event backend. [#39908](https://github.com/gravitational/teleport/pull/39908) +* Improved the performance of resource filtering via labels and fuzzy search. [#39792](https://github.com/gravitational/teleport/pull/39792) + +## 14.3.14 (03/27/24) + +* Fixed possible phishing links which could result in code execution with install and join scripts. [#39838](https://github.com/gravitational/teleport/pull/39838) +* Fixed MFA checks not being prompted when joining a session. [#39815](https://github.com/gravitational/teleport/pull/39815) +* Fixed potential issue with some resources expiry being set to 01/01/1970 instead of never. [#39774](https://github.com/gravitational/teleport/pull/39774) +* Added support for Kubernetes websocket streaming subprotocol v5 connections. [#39771](https://github.com/gravitational/teleport/pull/39771) +* Fixed broken SSO login landing page on certain versions of Google Chrome. [#39722](https://github.com/gravitational/teleport/pull/39722) +* Updated Electron to v29 in Teleport Connect. [#39658](https://github.com/gravitational/teleport/pull/39658) +* Fixed a bug in Teleport Cloud causing the hosted ServiceNow plugin to crash when setting up the integration. [#39604](https://github.com/gravitational/teleport/pull/39604) +* Fixed Teleport updater metrics for AWS OIDC deployments. [#39531](https://github.com/gravitational/teleport/pull/39531) +* Fixed allowing invalid access request start time date to be set. [#39324](https://github.com/gravitational/teleport/pull/39324) + +## 14.3.13 (03/20/24) + +* Fixed the discovery script failing when `jq` was not installed. [#39600](https://github.com/gravitational/teleport/pull/39600) +* Improve performance when listing nodes with tsh or tctl. [#39568](https://github.com/gravitational/teleport/pull/39568) +* Require AWS S3 bucket fields when creating/editing AWS OIDC integration in the web UI. [#39513](https://github.com/gravitational/teleport/pull/39513) +* Removed implicit AccessList membership and ownership modes. All AccessList owners and members must be explicitly specified. [#39388](https://github.com/gravitational/teleport/pull/39388) + +## 14.3.11 (03/18/24) + +* Fixed an issue with AWS IAM permissions that may prevent AWS database access when discovery_service is enabled in the same Teleport config as the db_service, namely AWS RDS, Redshift, Elasticache, and MemoryDB. [#39487](https://github.com/gravitational/teleport/pull/39487) + +## 14.3.10 (03/16/24) + +* Fixed issue with Teleport auth server panicking when Access Graph is enabled in discovery service. [#39456](https://github.com/gravitational/teleport/pull/39456) + +## 14.3.8 (03/15/24) + +* Improve error messaging when creating resources fails because they already exist or updating resources fails because they were removed. [#39396](https://github.com/gravitational/teleport/pull/39396) +* Support logging in with an identity file with `tsh login -i identity.pem`. This allows running `tsh app login` in CI environments where MachineID is impossible. [#39374](https://github.com/gravitational/teleport/pull/39374) +* Only allow necessary operations during moderated file transfers and limit in-flight file transfer requests to one per session. [#39352](https://github.com/gravitational/teleport/pull/39352) +* Make the Jira access plugin log Jira errors properly. [#39347](https://github.com/gravitational/teleport/pull/39347) +* Teleport Enterprise now attempts to load the license file from the configured data directory if not otherwise specified. [#39313](https://github.com/gravitational/teleport/pull/39313) +* Patched CVE-2024-27304 (Postgres driver). [#39259](https://github.com/gravitational/teleport/pull/39259) +* Raised concurrent connection limits between Teleport Cloud regions and in clusters that use proxy peering. [#39232](https://github.com/gravitational/teleport/pull/39232) +* Improved clean up of system resources during a fast shutdown of Teleport. [#39213](https://github.com/gravitational/teleport/pull/39213) +* Fixed an issue where it was possible to skip providing old password when setting a new one. [#39126](https://github.com/gravitational/teleport/pull/39126) + +## 14.3.7 (03/11/24) + +* Resolved sporadic errors caused by requests fail to comply with Kubernetes API spec by not specifying resource identifiers. [#39167](https://github.com/gravitational/teleport/pull/39167) +* Fixed a bug when using automatic updates and the discovery service. The default install script now installs the correct Teleport version by querying the version server. [#39100](https://github.com/gravitational/teleport/pull/39100) +* Teleport Proxy Service now runs a version server by default serving its own version. [#39096](https://github.com/gravitational/teleport/pull/39096) +* Fixed a regression where `tsh kube credentials` fails to re-login when credentials expire. [#39074](https://github.com/gravitational/teleport/pull/39074) +* TBot now supports `--proxy-server` for explicitly configuring the Proxy address. We recommend switching to this if you currently specify the address of your Teleport proxy to `--auth-server`. [#39056](https://github.com/gravitational/teleport/pull/39056) +* Expanded the EC2 joining process to include newly created AWS regions. [#39052](https://github.com/gravitational/teleport/pull/39052) +* Added GCP MySQL access IAM Authentication support. [#39041](https://github.com/gravitational/teleport/pull/39041) +* Fixed an issue in SAML IdP entity descriptor generator process, which would fail to generate entity descriptor if the configured Entity ID endpoint would return HTTP status code above `200` and below `400`. [#38988](https://github.com/gravitational/teleport/pull/38988) +* Updated Go to 1.21.8. [#38985](https://github.com/gravitational/teleport/pull/38985) +* Updated electron-builder dependency to address possible arbitrary code execution in the Windows installer of Teleport Connect (CVE-2024-27303). [#38966](https://github.com/gravitational/teleport/pull/38966) +* Improved reliability and performance of `tbot`. [#38929](https://github.com/gravitational/teleport/pull/38929) +* Filtered terminated sessions from the `tsh sessions ls` output. [#38886](https://github.com/gravitational/teleport/pull/38886) +* Prevented panic when AccessList's status field is not set. [#38862](https://github.com/gravitational/teleport/pull/38862) +* Fixed an issue with over counting of reported Teleport updater metrics. [#38832](https://github.com/gravitational/teleport/pull/38832) +* Fixed a bug that caused `tsh` to return "private key policy not met" errors instead of automatically initiating re-login to satisfy the private key policy. [#38818](https://github.com/gravitational/teleport/pull/38818) +* Fixed application access events being overwritten when using DynamoDB as event storage. [#38816](https://github.com/gravitational/teleport/pull/38816) +* Fixed issue where DynamoDB writes could fail when recording too many records. [#38762](https://github.com/gravitational/teleport/pull/38762) +* Added a tbot-only `tbot-distroless` container image, bringing an 80% size reduction over the Teleport `teleport` image. [#38719](https://github.com/gravitational/teleport/pull/38719) +* Fixed a Postgres v16.x compatibility issue preventing multiple connections for auto-provisioned users. [#38542](https://github.com/gravitational/teleport/pull/38542) +* Tsh will now show access list review deadlines in dates rather than remaining hours.. [#38526](https://github.com/gravitational/teleport/pull/38526) +* Fixed an issue where tsh would not function if one of its profiles is invalid. [#38513](https://github.com/gravitational/teleport/pull/38513) +* Fixed an issue where `teleport configure` command logs would not use the configured logger. [#38509](https://github.com/gravitational/teleport/pull/38509) +* Removed `telnet` from legacy Ubuntu images due to CVE-2021-40491. Netcat `nc` can be used instead. [#38506](https://github.com/gravitational/teleport/pull/38506) +* Fixed a tsh WebAuthn.dll panic on Windows Server 2019. [#38489](https://github.com/gravitational/teleport/pull/38489) +* Added `ssh_service.enhanced_recording.root_path` configuration option to change the cgroup slice path used by the agent. [#38395](https://github.com/gravitational/teleport/pull/38395) +* Fixed a bug which allowed the operator to delete resources it does not own. [#37751](https://github.com/gravitational/teleport/pull/37751) + +## 14.3.6 (02/16/24) + +* Fixed a potential panic in the `tsh status` command. [#38304](https://github.com/gravitational/teleport/pull/38304) +* Fixed locking SSO user in the setup access step of the RDS auto discover flow in the web UI. [#38284](https://github.com/gravitational/teleport/pull/38284) +* Optionally permit the auth server to terminate client connections from unsupported versions. [#38186](https://github.com/gravitational/teleport/pull/38186) +* Removed access tokens from URL parameters, preventing them from being leaked to intermediary systems that may log them in plaintext. [#38070](https://github.com/gravitational/teleport/pull/38070) +* Added option to validate hardware key serial numbers with hardware key support. [#38069](https://github.com/gravitational/teleport/pull/38069) +* Forced agents to terminate Auth connections if joining fails. [#38004](https://github.com/gravitational/teleport/pull/38004) +* Added a tsh sessions ls command to list active sessions. [#37970](https://github.com/gravitational/teleport/pull/37970) +* Improved error handling when idle desktop connections are terminated. [#37956](https://github.com/gravitational/teleport/pull/37956) +* Updated Go to 1.21.7. [#37848](https://github.com/gravitational/teleport/pull/37848) +* Discover flow now starts two instances of DatabaseServices when setting up access to Amazon RDS. [#37804](https://github.com/gravitational/teleport/pull/37804) +* Fixed incorrect resizing of CLI apps in Teleport Connect on Windows. [#37799](https://github.com/gravitational/teleport/pull/37799) +* Fixed handling of non-registered U2F keys. [#37722](https://github.com/gravitational/teleport/pull/37722) +* Fixed memory leak in tbot caused by never closing reverse tunnel address resolvers. [#37719](https://github.com/gravitational/teleport/pull/37719) +* Fixed app redirection loop on browser's incognito mode and 3rd party cookie block. [#37692](https://github.com/gravitational/teleport/pull/37692) + +## 14.3.4 (02/01/24) + +* Skip `tsh` AppID pre-flight check whenever possible. [#37643](https://github.com/gravitational/teleport/pull/37643) +* Update OpenSSL to `3.0.13`. [#37552](https://github.com/gravitational/teleport/pull/37552) +* `tsh` FIDO2 backend re-written for improved responsiveness and reliability. [#37538](https://github.com/gravitational/teleport/pull/37538) +* Do not add alphabetically first Kube cluster's name to a user certificate on login. [#37501](https://github.com/gravitational/teleport/pull/37501) +* Allow to replicate proxy pods when using an ingress in the `teleport-cluster` Helm chart. [#37480](https://github.com/gravitational/teleport/pull/37480) +* Fix an issue `tsh` uses wrong default username for auto-user provisioning enabled databases in remote clusters [#37418](https://github.com/gravitational/teleport/pull/37418) +* Prevent backend throttling caused by a large number of app sessions. [#37391](https://github.com/gravitational/teleport/pull/37391) +* Emit audit events when SFTP or SCP commands are blocked. [#37385](https://github.com/gravitational/teleport/pull/37385) +* Fix goroutine leak on PostgreSQL access. [#37342](https://github.com/gravitational/teleport/pull/37342) +* Fixed incompatibility between leaf clusters and ProxyJump. [#37319](https://github.com/gravitational/teleport/pull/37319) +* Fixed a potential crash when setting up the Connect My Computer role in Teleport Connect. [#37314](https://github.com/gravitational/teleport/pull/37314) +* Fixed CA key generation when two auth servers share a single YubiHSM2. [#37296](https://github.com/gravitational/teleport/pull/37296) +* Add support for cancelling CockroachDB requests. [#37282](https://github.com/gravitational/teleport/pull/37282) +* Fix Terraform provider creating AccessLists with next audit date set to Epoch. [#37262](https://github.com/gravitational/teleport/pull/37262) +* Fix an issue selecting MySQL database is not reflected in the audit logs. [#37257](https://github.com/gravitational/teleport/pull/37257) +* The login screen will no longer be rendered for authenticated users. [#37230](https://github.com/gravitational/teleport/pull/37230) +* Fixed missing proxy address in GCP and Azure VM auto-discovery. [#37215](https://github.com/gravitational/teleport/pull/37215) +* Teleport namespace label prefixes are now sorted toward the end of the labels list in the web UI. [#37191](https://github.com/gravitational/teleport/pull/37191) +* Adds `tbot proxy kube` to support connecting to Kubernetes clusters using Machine ID when the Proxy is behind a L7 LB. [#37157](https://github.com/gravitational/teleport/pull/37157) +* Fix a bug that was breaking web UI if automatic upgrades are misconfigured. [#37130](https://github.com/gravitational/teleport/pull/37130) +* Fix an issue AWS Redshift auto-provisioned user not deleted in drop mode. [#37036](https://github.com/gravitational/teleport/pull/37036) +* Fix an issue database auto-user provisioning fails to connect a second session on MariaDB older than 10.7. [#37028](https://github.com/gravitational/teleport/pull/37028) +* Improved styling of the login form in Connect and Web UI. [#37003](https://github.com/gravitational/teleport/pull/37003) +* Ensure that moderated sessions do not get stuck in the event of an unexpected drop in the moderator's connection. [#36917](https://github.com/gravitational/teleport/pull/36917) +* The web terminal now properly displays underscores on Linux. [#36890](https://github.com/gravitational/teleport/pull/36890) +* Fix `tsh` panic on Windows if `WebAuthn.dll` is missing. [#36868](https://github.com/gravitational/teleport/pull/36868) +* Increased timeout when waiting for response from Jira API and webhook to reconcile. [#36818](https://github.com/gravitational/teleport/pull/36818) +* Ensure `connect_to_node_attempts_total` is always incremented when dialing hosts. [#36739](https://github.com/gravitational/teleport/pull/36739) +* Fixed a potential crash in Teleport Connect after downgrading the app from v15+. [#36730](https://github.com/gravitational/teleport/pull/36730) +* Prevent a goroutine leak caused by app sessions not cleaning up resources properly. [#36668](https://github.com/gravitational/teleport/pull/36668) +* Added `tctl idp saml test-attribute-mapping` command to test SAML IdP attribute mapping. [#36662](https://github.com/gravitational/teleport/pull/36662) +* Fixed an issue where valid SAML entity descriptors could be rejected. [#36485](https://github.com/gravitational/teleport/pull/36485) +* Updated SAML IdP UI to display entity ID, SSO URL and X.509 certificate. [#3322](https://github.com/gravitational/teleport.e/pull/3322) +* Updated access request creation dialog to pre-select suggested reviewers. [#3325](https://github.com/gravitational/teleport.e/pull/3325) + ## 14.3.3 (01/12/24) * Fixed routing to nodes by their public addresses. [#36624](https://github.com/gravitational/teleport/pull/36624) @@ -1836,8 +2298,7 @@ Teleport 14 adds database access support for ClickHouse HTTP and native (TCP) protocols. When using HTTP protocol, the user's query activity is captured in the Teleport audit log. -See how to connect ClickHouse to Teleport -[here](docs/pages/enroll-resources/database-access/enroll-self-hosted-databases/clickhouse-self-hosted.mdx). +See how to connect ClickHouse to Teleport [here](docs/pages/enroll-resources/database-access/enroll-self-hosted-databases/clickhouse-self-hosted.mdx). #### Oracle database access audit logging support @@ -4431,10 +4892,10 @@ CentOS 6 support was deprecated in Teleport 8 and has now been removed. #### Desktop access -desktop access now authenticates to LDAP using X.509 client certificates. +Desktop access now authenticates to LDAP using X.509 client certificates. Support for the `password_file` configuration option has been removed. -## 8.0.0 +## 8.0.0 Teleport 8.0 is a major release of Teleport that contains new features, improvements, and bug fixes. @@ -4663,7 +5124,7 @@ Kubernetes access will no longer automatically register a cluster named after th `tsh login` has been updated to no longer change the current Kubernetes context. While `tsh login` will write credentials to `kubeconfig` it will only update your context if `tsh login --kube-cluster` or `tsh kube login ` is used. [#6045](https://github.com/gravitational/teleport/issues/6045) -## 6.2 +## 6.2.0 Teleport 6.2 contains new features, improvements, and bug fixes. @@ -4959,15 +5420,15 @@ This release of Teleport contains multiple bug fixes. * Fixes streaming k8s responses (`kubectl logs -f`, `kubectl run -it`, etc) [#5009](https://github.com/gravitational/teleport/pull/5009) * Multiple fixes for the k8s forwarder [#5038](https://github.com/gravitational/teleport/pull/5038) -## 5.0.0 +## 5.0.0 Teleport 5.0 is a major release with new features, functionality, and bug fixes. Users can review [5.0 closed issues](https://github.com/gravitational/teleport/milestone/39?closed=1) on Github for details of all items. -#### New Features +### New Features Teleport 5.0 introduces two distinct features: Teleport application access and significant Kubernetes access improvements - multi-cluster support. -##### Teleport application access +#### Teleport application access Teleport can now be used to provide secure access to web applications. This new feature was built with the express intention of securing internal apps which might have once lived on a VPN or had a simple authorization and authentication mechanism with little to no audit trail. application access works with everything from dashboards to single page Javascript applications (SPA). @@ -5051,7 +5512,7 @@ proxy_service: You can learn more in the [Application Access introduction](./docs/pages/enroll-resources/application-access/introduction.mdx). -##### Teleport Kubernetes access +#### Teleport Kubernetes access Teleport 5.0 also introduces two highly requested features for Kubernetes. @@ -5203,7 +5664,7 @@ Please follow our [standard upgrade procedure](./docs/pages/upgrading.mdx). * Optional: Consider updating `https_key_file` & `https_cert_file` to our new `https_keypairs:` format. * Optional: Consider migrating Kubernetes access from `proxy_service` to `kubernetes_service` after the upgrade. -### 4.4.6 +## 4.4.6 This release of teleport contains a security fix and a bug fix. @@ -5214,13 +5675,13 @@ Any Enterprise SSO users using Okta, Active Directory, OneLogin or custom SAML c * Fix an issue where `tsh login` would fail with an `AccessDenied` error if the user was perviously logged into a leaf cluster. [#5105](https://github.com/gravitational/teleport/pull/5105) -### 4.4.5 +## 4.4.5 This release of Teleport contains a bug fix. * Fixed an issue where a slow or unresponsive Teleport auth service could hang client connections in async recording mode. [#4696](https://github.com/gravitational/teleport/pull/4696) -### 4.4.4 +## 4.4.4 This release of Teleport adds enhancements to the Access Workflows API. @@ -5239,25 +5700,25 @@ identity providers to determine which roles a user can request. manage and audit, including support for human-readable request/approve/deny reasons and structured annotations. -### 4.4.2 +## 4.4.2 This release of Teleport adds support for a new build architecture. * Added automatic arm64 builds of Teleport to the download portal. -### 4.4.1 +## 4.4.1 This release of Teleport contains a bug fix. * Fixed an issue where defining multiple logging configurations would cause Teleport to crash. [#4598](https://github.com/gravitational/teleport/issues/4598) -### 4.4.0 +## 4.4.0 This is a major Teleport release with a focus on new features, functionality, and bug fixes. It’s a substantial release and users can review [4.4 closed issues](https://github.com/gravitational/teleport/milestone/40?closed=1) on Github for details of all items. -#### New Features +### New Features -##### Concurrent Session Control +#### Concurrent Session Control This addition to Teleport helps customers obtain AC-10 control. We now provide two new optional configuration values: `max_connections` and `max_sessions`. @@ -5315,7 +5776,7 @@ auth_service: session_recording: "node-sync" ``` -#### Improvements +### Improvements * Added session streaming. [#4045](https://github.com/gravitational/teleport/pull/4045) * Added concurrent session control. [#4138](https://github.com/gravitational/teleport/pull/4138) @@ -5324,7 +5785,7 @@ auth_service: * Added node ID to heartbeat debug log [#4291](https://github.com/gravitational/teleport/pull/4291) * Added the option to trigger `pam_authenticate` on login [#3966](https://github.com/gravitational/teleport/pull/3966) -#### Fixes +### Fixes * Fixed issue that caused some idle `kubectl exec` sessions to terminate. [#4377](https://github.com/gravitational/teleport/pull/4377) * Fixed symlink issued when using `tsh` on Windows. [#4347](https://github.com/gravitational/teleport/pull/4347) @@ -5332,19 +5793,19 @@ auth_service: * Fixed issue that caused DynamoDB not to respect HTTP CONNECT proxies. [#4271](https://github.com/gravitational/teleport/pull/4271) * Fixed `/readyz` endpoint to recover much quicker. [#4223](https://github.com/gravitational/teleport/pull/4223) -#### Documentation +### Documentation * Updated Google Workspace documentation to add clarification on supported account types. [#4394](https://github.com/gravitational/teleport/pull/4394) * Updated IoT instructions on necessary ports. [#4398](https://github.com/gravitational/teleport/pull/4398) * Updated Trusted Cluster documentation on how to remove trust from root and leaf clusters. [#4358](https://github.com/gravitational/teleport/pull/4358) * Updated the PAM documentation with PAM authentication usage information. [#4352](https://github.com/gravitational/teleport/pull/4352) -#### Upgrade Notes +### Upgrade Notes Please follow our [standard upgrade procedure](docs/pages/upgrading.mdx). -## 4.3.9 +## 4.3.9 This release of Teleport contains a security fix. @@ -5352,13 +5813,13 @@ This release of Teleport contains a security fix. Any Enterprise SSO users using Okta, Active Directory, OneLogin or custom SAML connectors should upgrade their auth servers to version 4.3.9 and restart Teleport. If you are unable to upgrade immediately, we suggest disabling SAML connectors for all clusters until the updates can be applied. -## 4.3.8 +## 4.3.8 This release of Teleport adds support for a new build architecture. * Added automatic arm64 builds of Teleport to the download portal. -## 4.3.7 +## 4.3.7 This release of Teleport contains a security fix and a bug fix. @@ -5377,7 +5838,7 @@ If you are unable to upgrade immediately, we suggest deleting SAML connectors fo * Fixed an issue where DynamoDB connections made by Teleport would not respect the `HTTP_PROXY` or `HTTPS_PROXY` environment variables. [#4271](https://github.com/gravitational/teleport/pull/4271) -## 4.3.6 +## 4.3.6 This release of Teleport contains multiple bug fixes. @@ -5386,13 +5847,13 @@ This release of Teleport contains multiple bug fixes. * Updated `/readyz` endpoint to recover faster after node goes into degraded state. [#4223](https://github.com/gravitational/teleport/pull/4223) * Added node UUID to debug logs to allow correlation between TCP connections and nodes. [#4291](https://github.com/gravitational/teleport/pull/4291) -## 4.3.5 +## 4.3.5 This release of Teleport contains a bug fix. * Fixed issue that caused Teleport Docker images to be built incorrectly. [#4201](https://github.com/gravitational/teleport/pull/4201) -## 4.3.4 +## 4.3.4 This release of Teleport contains multiple bug fixes. @@ -5640,7 +6101,13 @@ This is a minor Teleport release with a focus on new features and bug fixes. * Adopting root/leaf terminology for trusted clusters. [Trusted cluster documentation](./docs/pages/management/admin/trustedclusters.mdx). * Documented Teleport FedRAMP & FIPS Support. [FedRAMP & FIPS documentation](./docs/pages/access-controls/compliance-frameworks/fedramp.mdx). -## 4.1.11 +## 4.1.13 + +This release of Teleport contains a bug fix. + +* Fixed issue where the port forwarding option in a role was ignored. [#3208](https://github.com/gravitational/teleport/pull/3208) + +## 4.1.11 This release of Teleport contains a security fix. @@ -5657,7 +6124,7 @@ Active Directory, OneLogin or custom SAML connectors should upgrade their auth s If you are unable to upgrade immediately, we suggest deleting SAML connectors for all clusters until the updates can be applied. -## 4.1.10 +## 4.1.10 As part of a routine security audit of Teleport, a security vulnerability was discovered that affects all recent releases of Teleport. We strongly suggest upgrading to the latest patched release to mitigate this vulnerability. @@ -5673,43 +6140,43 @@ Command line programs like `tsh` (or `ssh`) are not affected by this vulnerabili To mitigate this issue, upgrade and restart all Teleport proxy processes. -## 4.1.9 +## 4.1.9 This release of Teleport contains a security fix. * Mitigated [CVE-2020-9283](https://groups.google.com/forum/#!msg/golang-announce/3L45YRc91SY/ywEPcKLnGQAJ) by updating golang.org/x/crypto. -## 4.1.8 +## 4.1.8 This release of Teleport contains a bug fix. * Fixed a regression in role mapping between trusted clusters. [#3252](https://github.com/gravitational/teleport/issues/3252) -## 4.1.7 +## 4.1.7 This release of Teleport contains a bug fix. * Fixed issue where the port forwarding option in a role was ignored. [#3208](https://github.com/gravitational/teleport/pull/3208) -## 4.1.6 +## 4.1.6 This release of Teleport contains a bug fix. * Fixed an issue that caused Teleport not to start with certain OIDC claims. [#3053](https://github.com/gravitational/teleport/issues/3053) -## 4.1.5 +## 4.1.5 This release of Teleport adds support for an older version of Linux. * Added RHEL/CentOS 6.x builds to the build pipeline. [#3175](https://github.com/gravitational/teleport/pull/3175) -## 4.1.4 +## 4.1.4 This release of Teleport contains a bug fix. * Fixed GSuite integration by adding support for service accounts. [#3122](https://github.com/gravitational/teleport/pull/3122) -## 4.1.3 +## 4.1.3 This release of Teleport contains multiple bug fixes. @@ -5717,20 +6184,20 @@ This release of Teleport contains multiple bug fixes. * Fixed issues with `local_auth` for FIPS builds. [#3100](https://github.com/gravitational/teleport/pull/3100) * Upgraded Go runtime to 1.13.2 to mitigate [CVE-2019-16276](https://github.com/golang/go/issues/34540) and [CVE-2019-17596](https://github.com/golang/go/issues/34960). -## 4.1.2 +## 4.1.2 This release of Teleport contains improvements to the build code. * Added support for building Docker images using the FIPS-compliant version of Teleport. The first of these images is quay.io/gravitational/teleport-ent:4.1.2-fips * In future, these images will be automatically built for use by Teleport Enterprise customers. -## 4.1.1 +## 4.1.1 This release of Teleport contains a bug fix. * Fixed an issue with multi-cluster EKS when the Teleport proxy runs outside EKS. [#3070](https://github.com/gravitational/teleport/pull/3070) -## 4.1.0 +## 4.1.0 This is a major Teleport release with a focus on stability and bug fixes. @@ -5753,7 +6220,7 @@ This is a major Teleport release with a focus on stability and bug fixes. * Teleport truncates MOTD with PAM. [#2477](https://github.com/gravitational/teleport/issues/2477) * Miscellaneous fixes around error handling and reporting. -## 4.0.16 +## 4.0.16 As part of a routine security audit of Teleport, a security vulnerability was discovered that affects all recent releases of Teleport. We strongly suggest upgrading to the latest patched release to mitigate this vulnerability. @@ -5781,13 +6248,7 @@ This release of Teleport contains a bug fix. * Fixed a regression in role mapping between trusted clusters. [#3252](https://github.com/gravitational/teleport/issues/3252) -## 4.1.13 - -This release of Teleport contains a bug fix. - -* Fixed issue where the port forwarding option in a role was ignored. [#3208](https://github.com/gravitational/teleport/pull/3208) - -## 4.0.12 +## 4.0.12 This release of Teleport contains a bug fix. @@ -5954,7 +6415,7 @@ This release of Teleport contains a new feature. * Added `--bind-addr` to force `tsh` to bind to a specific port during SSO login. [#2620](https://github.com/gravitational/teleport/issues/2620) -## 3.2 +## 3.2.0 This version brings support for Amazon's managed Kubernetes offering (EKS). @@ -6060,7 +6521,7 @@ Teleport 3.1.1 contains a security fix. We strongly encourage anyone running Tel * Upgraded Go to 1.11.4 to mitigate CVE-2018-16875: [CPU denial of service in chain validation](https://golang.org/issue/29233) Go. For customers using the RHEL5.x compatible release of Teleport, we've backported this fix to Go 1.9.7, before releasing RHEL 5.x compatible binaries. -## 3.1 +## 3.1.0 This is a major Teleport release with a focus on backwards compatibility, stability, and bug fixes. Some of the improvements: @@ -6099,19 +6560,19 @@ Teleport 3.0.3 contains a security fix. We strongly encourage anyone running Tel * Due to the flaw in internal RBAC verification logic, a compromised node, trusted cluster or authenticated non-privileged user can craft special request to Teleport's internal auth server API to gain access to the private key material of the cluster's internal certificate authorities and elevate their privileges to gain full administrative access to the Teleport cluster. This vulnerability only affects authenticated clients, there is no known way to exploit this vulnerability outside the cluster for unauthenticated clients. -## 3.0.2 +## 3.0.2 Teleport 3.0.2 contains a security fix. We strongly encourage anyone running Teleport 3.0.1 to upgrade. * Upgraded Go to 1.11.4 to mitigate CVE-2018-16875: [CPU denial of service in chain validation](https://golang.org/issue/29233) Go. For customers using the RHEL5.x compatible release of Teleport, we've backported this fix to Go 1.9.7, before releasing RHEL 5.x compatible binaries. -## 3.0.1 +## 3.0.1 This release of Teleport contains the following bug fix: * Fix regression that marked ADFS claims as invalid. [#2293](https://github.com/gravitational/teleport/pull/2293) -## 3.0 +## 3.0.0 This is a major Teleport release which introduces support for Kubernetes clusters. In addition to this new feature this release includes several @@ -6826,7 +7287,7 @@ The most pressing issues (a phishing attack which can potentially be used to ext * Fixed Regressions. [#874](https://github.com/gravitational/teleport/pull/874), [#876](https://github.com/gravitational/teleport/pull/876), [#883](https://github.com/gravitational/teleport/pull/883), [#892](https://github.com/gravitational/teleport/pull/892), and [#906](https://github.com/gravitational/teleport/pull/906) -## 2.0 +## 2.0.0 This is a major new release of Teleport. @@ -6875,7 +7336,7 @@ v1.3.1 is a maintenance release which fixes a few issues found in 1.3 * U2F documentation has been improved -## 1.3 +## 1.3.0 This release includes several major new features and it's recommended for production use. @@ -6939,6 +7400,6 @@ to OSS Teleport users. * Guessing `advertise_ip` chooses IPv6 address space. #486 -## 1.0 +## 1.0.0 The first official release of Teleport! From 69b836a58548801d3fe9cbfb350eac04bf6aa537 Mon Sep 17 00:00:00 2001 From: Steven Martin Date: Mon, 5 Aug 2024 11:08:08 -0400 Subject: [PATCH 061/139] docs: include tpm in machine-id join reference (#45006) Co-authored-by: Steven Martin --- .../enroll-resources/machine-id/reference/configuration.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/pages/enroll-resources/machine-id/reference/configuration.mdx b/docs/pages/enroll-resources/machine-id/reference/configuration.mdx index ed64c25c775e0..54a5e15b780db 100644 --- a/docs/pages/enroll-resources/machine-id/reference/configuration.mdx +++ b/docs/pages/enroll-resources/machine-id/reference/configuration.mdx @@ -91,6 +91,7 @@ onboarding: # - `ec2` # - `kubernetes` # - `spacelift` + # - `tpm` join_method: "token" # ca_pins are used to validate the identity of the Teleport Auth Service on From a7b981520bb30fdf68bfdcd2cce07c082d8f48b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Cie=C5=9Blak?= Date: Mon, 5 Aug 2024 18:06:45 +0200 Subject: [PATCH 062/139] Remove warnings about passwordless support in Firefox (#45051) --- .../NewCredentials/NewPasswordlessDevice.tsx | 17 +---------------- .../src/components/FormLogin/FormLogin.tsx | 13 ------------- 2 files changed, 1 insertion(+), 29 deletions(-) diff --git a/web/packages/teleport/src/Welcome/NewCredentials/NewPasswordlessDevice.tsx b/web/packages/teleport/src/Welcome/NewCredentials/NewPasswordlessDevice.tsx index 530789ba55cf5..3b6b30db51248 100644 --- a/web/packages/teleport/src/Welcome/NewCredentials/NewPasswordlessDevice.tsx +++ b/web/packages/teleport/src/Welcome/NewCredentials/NewPasswordlessDevice.tsx @@ -18,7 +18,7 @@ import React, { useState } from 'react'; import { Text, Box, ButtonPrimary, ButtonText } from 'design'; -import { Danger, Info } from 'design/Alert'; +import { Danger } from 'design/Alert'; import FieldInput from 'shared/components/FieldInput'; import Validation, { Validator } from 'shared/components/Validation'; import { requiredField } from 'shared/components/Validation/rules'; @@ -73,15 +73,6 @@ export function NewPasswordlessDevice(props: UseTokenState & SliderProps) { changeFlow({ flow: 'local', applyNextAnimation }); } - // Firefox currently does not support passwordless and when - // registering, users will 'soft lock' where firefox prompts - // but when touching the device, it does not do anything. - // We display a soft warning because firefox may provide - // support in the near future: https://github.com/gravitational/webapps/pull/876 - const isFirefox = window.navigator?.userAgent - ?.toLowerCase() - .includes('firefox'); - return ( {({ validator }) => ( @@ -92,12 +83,6 @@ export function NewPasswordlessDevice(props: UseTokenState & SliderProps) { {submitAttempt.status === 'failed' && ( )} - {isFirefox && ( - - Firefox may not support passwordless register. Please try Chrome - or Safari. - - )} Setting up account for: {resetToken.user} diff --git a/web/packages/teleport/src/components/FormLogin/FormLogin.tsx b/web/packages/teleport/src/components/FormLogin/FormLogin.tsx index e7bb637d6c317..45400996944ac 100644 --- a/web/packages/teleport/src/components/FormLogin/FormLogin.tsx +++ b/web/packages/teleport/src/components/FormLogin/FormLogin.tsx @@ -141,21 +141,8 @@ const Passwordless = ({ const ref = useRefAutoFocus({ shouldFocus: hasTransitionEnded && autoFocus, }); - // Firefox currently does not support passwordless and when - // logging in, it will return an ambiguous error. - // We display a soft warning because firefox may provide - // support in the near future: https://github.com/gravitational/webapps/pull/876 - const isFirefox = window.navigator?.userAgent - ?.toLowerCase() - .includes('firefox'); return ( - {isFirefox && ( - - Firefox may not support passwordless login. Please try Chrome or - Safari. - - )} Date: Mon, 5 Aug 2024 18:07:28 +0200 Subject: [PATCH 063/139] Set `TERM_PROGRAM` and `TERM_PROGRAM_VERSION` (#45063) --- .../teleterm/src/services/pty/ptyHost/buildPtyOptions.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/web/packages/teleterm/src/services/pty/ptyHost/buildPtyOptions.ts b/web/packages/teleterm/src/services/pty/ptyHost/buildPtyOptions.ts index e4b34c934b782..1e122404e3f09 100644 --- a/web/packages/teleterm/src/services/pty/ptyHost/buildPtyOptions.ts +++ b/web/packages/teleterm/src/services/pty/ptyHost/buildPtyOptions.ts @@ -66,6 +66,8 @@ export async function buildPtyOptions( const combinedEnv = { ...process.env, ...shellEnv, + TERM_PROGRAM: 'Teleport_Connect', + TERM_PROGRAM_VERSION: settings.appVersion, TELEPORT_HOME: settings.tshd.homeDir, TELEPORT_CLUSTER: cmd.clusterName, TELEPORT_PROXY: cmd.proxyHost, From 5f36d04bafe4db78c513f3027ba317620385aeed Mon Sep 17 00:00:00 2001 From: Steven Martin Date: Mon, 5 Aug 2024 12:54:41 -0400 Subject: [PATCH 064/139] docs: adding getting-started to route to linux demo (#45074) Co-authored-by: Steven Martin --- docs/config.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/config.json b/docs/config.json index 842f813aa6b91..aa7c086abf8fc 100644 --- a/docs/config.json +++ b/docs/config.json @@ -2821,6 +2821,11 @@ "destination": "/deploy-a-cluster/linux-demo/", "permanent": true }, + { + "source": "/getting-started/", + "destination": "/deploy-a-cluster/linux-demo/", + "permanent": true + }, { "source": "/database-access/guides/snowflake/", "destination": "/enroll-resources/database-access/enroll-managed-databases/snowflake/", From 7421e0f00fd5006b98e0ff5f2e383c23f6e3e6d6 Mon Sep 17 00:00:00 2001 From: matheus Date: Mon, 5 Aug 2024 15:17:42 -0300 Subject: [PATCH 065/139] Update install script references to use CDN (#44838) (#45060) --- .github/workflows/post-release.yaml | 3 ++- docs/config.json | 3 ++- docs/pages/deploy-a-cluster/linux-demo.mdx | 2 +- docs/pages/includes/install-linux-oss.mdx | 2 +- docs/pages/includes/install-linux.mdx | 2 +- docs/pages/installation.mdx | 2 +- docs/pages/upgrading/automatic-agent-updates.mdx | 2 +- docs/pages/upgrading/reference.mdx | 2 +- examples/agent-pool-terraform/teleport/userdata | 2 +- 9 files changed, 11 insertions(+), 9 deletions(-) diff --git a/.github/workflows/post-release.yaml b/.github/workflows/post-release.yaml index d04e66d573acd..05e12675db625 100644 --- a/.github/workflows/post-release.yaml +++ b/.github/workflows/post-release.yaml @@ -104,7 +104,8 @@ jobs: .variables.teleport.latest_oss_docker_image |= sub(":.*";":")+$version | .variables.teleport.latest_oss_debug_docker_image |= sub(":.*";":")+$version | .variables.teleport.latest_ent_docker_image |= sub(":.*";":")+$version | - .variables.teleport.latest_ent_debug_docker_image |= sub(":.*";":")+$version' \ + .variables.teleport.latest_ent_debug_docker_image |= sub(":.*";":")+$version | + .variables.teleport.teleport_install_script_url |= sub("install-v.*.sh"; "install-v"+$version+".sh")' \ docs/config.json > docs/confignew.json cat docs/confignew.json mv docs/confignew.json docs/config.json diff --git a/docs/config.json b/docs/config.json index aa7c086abf8fc..627c021c6fd3b 100644 --- a/docs/config.json +++ b/docs/config.json @@ -1624,7 +1624,8 @@ "latest_oss_docker_image": "public.ecr.aws/gravitational/teleport-distroless:16.1.1", "latest_oss_debug_docker_image": "public.ecr.aws/gravitational/teleport-distroless-debug:16.1.1", "latest_ent_docker_image": "public.ecr.aws/gravitational/teleport-ent-distroless:16.1.1", - "latest_ent_debug_docker_image": "public.ecr.aws/gravitational/teleport-ent-distroless-debug:16.1.1" + "latest_ent_debug_docker_image": "public.ecr.aws/gravitational/teleport-ent-distroless-debug:16.1.1", + "teleport_install_script_url": "https://cdn.teleport.dev/install-v16.1.1.sh" }, "terraform": { "version": "1.0.0" diff --git a/docs/pages/deploy-a-cluster/linux-demo.mdx b/docs/pages/deploy-a-cluster/linux-demo.mdx index 2632218545855..4e3c751d5a9e8 100644 --- a/docs/pages/deploy-a-cluster/linux-demo.mdx +++ b/docs/pages/deploy-a-cluster/linux-demo.mdx @@ -88,7 +88,7 @@ set up records for: On your Linux host, run the following command to install the Teleport binary: ```code -$ curl https://goteleport.com/static/install.sh | bash -s (=teleport.version=) +$ curl (=teleport.teleport_install_script_url=) | bash -s (=teleport.version=) ``` ### Configure Teleport diff --git a/docs/pages/includes/install-linux-oss.mdx b/docs/pages/includes/install-linux-oss.mdx index a14d4c32c61be..d63d205e9cc28 100644 --- a/docs/pages/includes/install-linux-oss.mdx +++ b/docs/pages/includes/install-linux-oss.mdx @@ -2,6 +2,6 @@ The following command updates the repository for the package manager on the local operating system and installs the provided Teleport version: ```code -$ curl https://goteleport.com/static/install.sh | bash -s (=teleport.version=) +$ curl (=teleport.teleport_install_script_url=) | bash -s (=teleport.version=) ``` diff --git a/docs/pages/includes/install-linux.mdx b/docs/pages/includes/install-linux.mdx index 28a1b1804a4e5..e7091bb737b52 100644 --- a/docs/pages/includes/install-linux.mdx +++ b/docs/pages/includes/install-linux.mdx @@ -28,7 +28,7 @@ Install Teleport on your Linux server: 1. Install Teleport on your Linux server: ```code - $ curl https://goteleport.com/static/install.sh | bash -s ${TELEPORT_VERSION} + $ curl (=teleport.teleport_install_script_url=) | bash -s ${TELEPORT_VERSION} ``` The installation script detects the package manager on your Linux server and diff --git a/docs/pages/installation.mdx b/docs/pages/installation.mdx index 5280ea57fc821..9ed070789c532 100644 --- a/docs/pages/installation.mdx +++ b/docs/pages/installation.mdx @@ -126,7 +126,7 @@ Download and run the installation script on the server where you want to install Teleport: ```code -$ curl https://goteleport.com/static/install.sh | bash -s ${TELEPORT_VERSION?} ${TELEPORT_EDITION?} +$ curl (=teleport.teleport_install_script_url=) | bash -s ${TELEPORT_VERSION?} ${TELEPORT_EDITION?} ``` ### Package repositories diff --git a/docs/pages/upgrading/automatic-agent-updates.mdx b/docs/pages/upgrading/automatic-agent-updates.mdx index 86f2174bb335d..3260f4149ed5d 100644 --- a/docs/pages/upgrading/automatic-agent-updates.mdx +++ b/docs/pages/upgrading/automatic-agent-updates.mdx @@ -183,7 +183,7 @@ Server ID Hostname Services Version Upgrader ```code - $ curl https://goteleport.com/static/install.sh | bash -s ${TELEPORT_VERSION?} cloud + $ curl (=teleport.teleport_install_script_url=) | bash -s ${TELEPORT_VERSION?} cloud ``` diff --git a/docs/pages/upgrading/reference.mdx b/docs/pages/upgrading/reference.mdx index 5ed1618a08e84..d6635b32442e1 100644 --- a/docs/pages/upgrading/reference.mdx +++ b/docs/pages/upgrading/reference.mdx @@ -327,7 +327,7 @@ Service, then on each of your agents: 1. Install the new Teleport version on your Linux server: ```code - $ curl https://goteleport.com/static/install.sh | bash -s + $ curl (=teleport.teleport_install_script_url=) | bash -s ``` The installation script detects the package manager on your Linux server and diff --git a/examples/agent-pool-terraform/teleport/userdata b/examples/agent-pool-terraform/teleport/userdata index b68110177dc46..c417d6119e6cf 100644 --- a/examples/agent-pool-terraform/teleport/userdata +++ b/examples/agent-pool-terraform/teleport/userdata @@ -1,6 +1,6 @@ #!/bin/bash -curl https://goteleport.com/static/install.sh | bash -s ${teleport_version} ${teleport_edition} +curl https://cdn.teleport.dev/install-v${teleport_version}.sh | bash -s ${teleport_version} ${teleport_edition} echo ${token} > /var/lib/teleport/token cat</etc/teleport.yaml From 247c8df7c0a071317d02a70658af3f1a633f38e2 Mon Sep 17 00:00:00 2001 From: Steven Martin Date: Mon, 5 Aug 2024 14:39:30 -0400 Subject: [PATCH 066/139] docs: include all services in kube agent description (#45075) --- docs/pages/installation.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/pages/installation.mdx b/docs/pages/installation.mdx index 9ed070789c532..7abefdf5850fb 100644 --- a/docs/pages/installation.mdx +++ b/docs/pages/installation.mdx @@ -757,7 +757,7 @@ chart. |Chart|Included Services|Values Reference| |-|-|-| |`teleport-cluster`|Auth Service
Proxy Service
Other Teleport services if using a custom configuration|[Reference](reference/helm-reference/teleport-cluster.mdx) -|`teleport-kube-agent`|Kubernetes Service
Application Service
Database Service|[Reference](reference/helm-reference/teleport-kube-agent.mdx)| +|`teleport-kube-agent`|Kubernetes Service
Application Service
Database Service
Discovery Service
Jamf Service|[Reference](reference/helm-reference/teleport-kube-agent.mdx)| ## macOS From c2fae09e91caef3af4b3051677d7b2a16f4721ab Mon Sep 17 00:00:00 2001 From: Steven Martin Date: Mon, 5 Aug 2024 15:02:51 -0400 Subject: [PATCH 067/139] docs: include tctl.exe in uninstalling from windows (#45090) --- docs/pages/management/admin/uninstall-teleport.mdx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/pages/management/admin/uninstall-teleport.mdx b/docs/pages/management/admin/uninstall-teleport.mdx index 30dc2a7ebd304..7e810d9b613ee 100644 --- a/docs/pages/management/admin/uninstall-teleport.mdx +++ b/docs/pages/management/admin/uninstall-teleport.mdx @@ -179,10 +179,11 @@ Follow the instructions for your Linux distribution: ### Windows - Remove the `tsh.exe` binary from the machine: + Remove the `tsh.exe` and `tctl.exe` binaries from the machine: ```code $ del C:\Path\To\tsh.exe + $ del C:\Path\To\tctl.exe ``` (!docs/pages/includes/uninstall-teleport-connect-windows.mdx!) From 05d26453e2a4024d93fa84d087202fc6afe1972e Mon Sep 17 00:00:00 2001 From: Hugo Shaka Date: Mon, 5 Aug 2024 18:33:31 -0400 Subject: [PATCH 068/139] [v16] Document that crdb can be used a a pg replacement for events (#45071) * Document that crdb can be used a a pg replacement for events * Apply suggestions from code review Co-authored-by: rosstimothy <39066650+rosstimothy@users.noreply.github.com> * Update docs/pages/reference/backends.mdx Co-authored-by: Paul Gottschling * address feedback * Update docs/pages/reference/backends.mdx Co-authored-by: rosstimothy <39066650+rosstimothy@users.noreply.github.com> --------- Co-authored-by: rosstimothy <39066650+rosstimothy@users.noreply.github.com> Co-authored-by: Paul Gottschling --- docs/pages/reference/backends.mdx | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/docs/pages/reference/backends.mdx b/docs/pages/reference/backends.mdx index 310aee9d1a578..faf52ea888e62 100644 --- a/docs/pages/reference/backends.mdx +++ b/docs/pages/reference/backends.mdx @@ -10,12 +10,12 @@ For self-hosted Teleport deployments, you can configure Teleport to integrate with other storage types based on the nature of the stored data (size, read/write ratio, mutability, etc.). -| Data type | Description | Supported storage backends | -| - | - | - | -| core cluster state | Cluster configuration (e.g. users, roles, auth connectors) and identity (e.g. certificate authorities, registered nodes, trusted clusters). | Local directory (SQLite), etcd, PostgreSQL, Amazon DynamoDB, GCP Firestore, CockroachDB | -| audit events | JSON-encoded events from the audit log (e.g. user logins, RBAC changes) | Local directory, PostgreSQL, AWS DynamoDB, GCP Firestore | -| session recordings | Raw terminal recordings of interactive user sessions | Local directory, AWS S3 (and any S3-compatible product), GCP Cloud Storage, Azure Blob Storage | -| teleport instance state | ID and credentials of a non-auth teleport instance (e.g. node, proxy) | Local directory, Kubernetes Secret | +| Data type | Description | Supported storage backends | +|-------------------------|---------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------| +| core cluster state | Cluster configuration (e.g. users, roles, auth connectors) and identity (e.g. certificate authorities, registered nodes, trusted clusters). | Local directory (SQLite), etcd, PostgreSQL, Amazon DynamoDB, GCP Firestore, CockroachDB | +| audit events | JSON-encoded events from the audit log (e.g. user logins, RBAC changes) | Local directory, PostgreSQL, CockroachDB, Amazon DynamoDB, GCP Firestore | +| session recordings | Raw terminal recordings of interactive user sessions | Local directory, AWS S3 (and any S3-compatible product), GCP Cloud Storage, Azure Blob Storage | +| teleport instance state | ID and credentials of a non-auth teleport instance (e.g. node, proxy) | Local directory, Kubernetes Secret | ## Cluster state @@ -209,6 +209,13 @@ its repository. The plugin is pre-installed with no extra steps to take in [Azure Database for PostgreSQL](https://azure.microsoft.com/en-us/products/postgresql). + +CockroachDB can be used as a PostgreSQL drop-in replacement to store audit events (requires Teleport version >= 15.4.2). + +Teleport can store the cluster state in CockroachDB but this require CockroachDB-specific configuration. +See the [CockroachDB backend section](#cockroachdb) for more details. + + Teleport needs separate databases for the cluster state and the audit log, and it will attempt to create them if given permissions to do so; it will also set up the database schemas as needed, so we recommend giving the user @@ -1453,15 +1460,6 @@ to achieve high availability and survive regional failures. You must take steps protect access to CockroachDB in this configuration because that is where Teleport secrets like keys and user records will be stored. - - CockroachDB can currently only be used to store Teleport's cluster state. - It cannot be used for Teleport's audit log in the same way that - [DynamoDB](#dynamodb) or [Firestore](#firestore) can. - - At a minimum you must configure CockroachDB to allow Teleport to create tables. Teleport will create the database if given permission to do so but this is not required if the database already exists. From 75e5bdc551fe38db4cbec56f3534395b3fcb10cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Cie=C5=9Blak?= Date: Tue, 6 Aug 2024 10:16:40 +0200 Subject: [PATCH 069/139] pluralize: Return plural noun when num is 0 (#45049) --- web/packages/shared/utils/text.test.ts | 5 +++-- web/packages/shared/utils/text.ts | 8 ++++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/web/packages/shared/utils/text.test.ts b/web/packages/shared/utils/text.test.ts index af62870c5dfcd..f9dc2729ff7db 100644 --- a/web/packages/shared/utils/text.test.ts +++ b/web/packages/shared/utils/text.test.ts @@ -18,8 +18,9 @@ import { pluralize, capitalizeFirstLetter } from './text'; -test('pluralize: sending in zero number', () => { - expect(pluralize(0, 'apple')).toBe('apple'); +test('pluralize', () => { + expect(pluralize(0, 'apple')).toBe('apples'); + expect(pluralize(1, 'apple')).toBe('apple'); expect(pluralize(2, 'apple')).toBe('apples'); }); diff --git a/web/packages/shared/utils/text.ts b/web/packages/shared/utils/text.ts index b2bd37544f299..a424ea5bd9b14 100644 --- a/web/packages/shared/utils/text.ts +++ b/web/packages/shared/utils/text.ts @@ -17,17 +17,17 @@ */ /** - * pluralize adds an 's' to the given word if num is bigger than 1. + * pluralize adds an 's' to the given word if num is other than 1. */ // If you ever need to pluralize a word which cannot be pluralized by appending 's', just add a // third optional argument which is the pluralized noun. // https://api.rubyonrails.org/v7.0.4.2/classes/ActionView/Helpers/TextHelper.html#method-i-pluralize export function pluralize(num: number, word: string) { - if (num > 1) { - return `${word}s`; + if (num === 1) { + return word; } - return word; + return `${word}s`; } /** From aebfd1c6683eafbf39dd9075f1430401ff906c0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Cie=C5=9Blak?= Date: Tue, 6 Aug 2024 13:29:42 +0200 Subject: [PATCH 070/139] Bump e ref (#45111) --- e | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e b/e index fd62d6f18bf69..79f164550ca7d 160000 --- a/e +++ b/e @@ -1 +1 @@ -Subproject commit fd62d6f18bf6949c6f2fa70cdca2ffee8ec22aeb +Subproject commit 79f164550ca7d8964677c87acf9b45c7c5540d77 From c7f4e8451b8e5e8b070e91a9104578d6078e9cc2 Mon Sep 17 00:00:00 2001 From: Gus Luxton Date: Tue, 6 Aug 2024 11:20:07 -0300 Subject: [PATCH 071/139] tctl: Fix typo in tctl desktop bootstrap (#45125) --- lib/auth/windows/configure-ad.ps1 | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/auth/windows/configure-ad.ps1 b/lib/auth/windows/configure-ad.ps1 index aceac25d6b43c..e33127976ecb2 100644 --- a/lib/auth/windows/configure-ad.ps1 +++ b/lib/auth/windows/configure-ad.ps1 @@ -18,7 +18,7 @@ This script will configure your Active Directory system to integrate with Telepo - Enabling RemoteFX for improved remote desktop performance. Ensure you've reviewed this script itself and/or the equivalent manual documentation before proceeding. -For the manual documentation, see: https://goteleport.com/docs/desktop-access/active-directory +For the manual documentation, see: https://goteleport.com/docs/enroll-resources/desktop-access/active-directory Press 'Y' to acknowledge and continue, or any other key to exit. "@ @@ -223,9 +223,9 @@ connections. The next step is to connect a Windows Desktop Service to your Teleport cluster and configure it to connect to the LDAP server of this domain. Instructions for this can be found starting at -https://goteleport.com/docs/desktop-access/active-directory/#step-67-configure-teleport. You may -use the `ldap` section printed above as the basis for your Windows Desktop Service configuration, -which contains values derived from the configuration of this domain.`n +https://goteleport.com/docs/enroll-resources/desktop-access/active-directory/#step-67-configure-teleport. +You may use the `ldap` section printed above as the basis for your Windows Desktop Service +configuration, which contains values derived from the configuration of this domain.`n "@ -f $LDAP_CONFIG_YAML Write-Output $OUTPUT @@ -234,7 +234,7 @@ if ($host.name -match 'ISE') { $WHITESPACE_WARNING=@' # WARNING: -# If you'r copying and pasting the ldap config from above, PowerShell ISE will add whitespace to the start - delete this before you save the config. +# If you're copying and pasting the ldap config from above, PowerShell ISE will add whitespace to the start - delete this before you save the config. '@ Write-Output $WHITESPACE_WARNING From 5791905a3dbf4876a87fd4902bff024ed153d22c Mon Sep 17 00:00:00 2001 From: Alan Parra Date: Tue, 6 Aug 2024 11:41:44 -0300 Subject: [PATCH 072/139] [v16] Document changes to auto-enroll since v16.1.1 (#45073) * Document changes to auto-enroll since v16.1.1 * Change edit to an Admonition/tip --- .../access-controls/device-trust/device-management.mdx | 10 +++++++--- docs/pages/access-controls/guides/webauthn.mdx | 10 +++++++--- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/docs/pages/access-controls/device-trust/device-management.mdx b/docs/pages/access-controls/device-trust/device-management.mdx index 583dc122c71bf..34a249103701a 100644 --- a/docs/pages/access-controls/device-trust/device-management.mdx +++ b/docs/pages/access-controls/device-trust/device-management.mdx @@ -144,6 +144,11 @@ integration, like the [Jamf Pro integration](./jamf-integration.mdx). - Auto-enrollment must be enabled in the cluster setting. - User must have either preset `editor` or `device-enroll` (available v13.3.6+) role assigned to them. + + Since Teleport v16.1.1 users don't need the device/enroll permission to + benefit from auto-enrollment. + + Enable auto-enrollment in your cluster settings: @@ -179,9 +184,8 @@ After saving the changes, restart the Teleport service. -Once enabled, user's with their device registered in Teleport and with the required permission -(preset `editor` or `device-enroll` role) will have their device enrolled to Teleport in -their next login. +Once enabled, users with their device registered in Teleport will have their +device enrolled to Teleport in their next login. ```code $ tsh logout diff --git a/docs/pages/access-controls/guides/webauthn.mdx b/docs/pages/access-controls/guides/webauthn.mdx index 66316faaf0ef0..46c9114fc9b64 100644 --- a/docs/pages/access-controls/guides/webauthn.mdx +++ b/docs/pages/access-controls/guides/webauthn.mdx @@ -387,6 +387,11 @@ integration, like the [Jamf Pro integration](../device-trust/jamf-integration.md - Auto-enrollment must be enabled in the cluster setting. - User must have either preset `editor` or `device-enroll` (available v13.3.6+) role assigned to them. + + Since Teleport v16.1.1 users don't need the device/enroll permission to + benefit from auto-enrollment. + + ### Step 1/2. Enable auto-enrollment in your cluster settings Modify the dynamic config resource using `tctl edit cluster_auth_preference`: @@ -405,9 +410,8 @@ spec: ### Step 2/2. Log out and back in -Once enabled, user's with their device registered in Teleport and with the required permission -(preset `editor` or `device-enroll` role) will have their device enrolled to Teleport in -their next login. +Once enabled, users with their device registered in Teleport will have their +device enrolled to Teleport in their next login. ```code $ tsh logout From 622d155aebf9d41d9b467b77d10cdac0080920d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Cie=C5=9Blak?= Date: Tue, 6 Aug 2024 16:59:39 +0200 Subject: [PATCH 073/139] Update pnpm to 9.6.0 (#45129) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 522042577e05a..89e4f6c75e296 100644 --- a/package.json +++ b/package.json @@ -87,5 +87,5 @@ "tslib": "^2.6.3", "whatwg-fetch": "^3.6.20" }, - "packageManager": "pnpm@9.5.0" + "packageManager": "pnpm@9.6.0" } From 7c99ad4210294373588d10d9133bb5b14ff9e70b Mon Sep 17 00:00:00 2001 From: Gus Luxton Date: Tue, 6 Aug 2024 12:39:08 -0300 Subject: [PATCH 074/139] [v16] docs: Don't provide commands to use Homebrew (#45128) * docs: Don't provide commands to use Homebrew Also clarify language around Touch ID support in versions installed from Homebrew * Add note about building from source * Apply suggestions from code review Co-authored-by: Zac Bergquist --------- Co-authored-by: Zac Bergquist --- .../access-controls/guides/passwordless.mdx | 4 ++-- docs/pages/includes/install-tsh.mdx | 17 ++++++----------- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/docs/pages/access-controls/guides/passwordless.mdx b/docs/pages/access-controls/guides/passwordless.mdx index 3affe077ea202..73904b3dc249a 100644 --- a/docs/pages/access-controls/guides/passwordless.mdx +++ b/docs/pages/access-controls/guides/passwordless.mdx @@ -19,8 +19,8 @@ usernameless authentication for Teleport. - A web browser with WebAuthn support. To see if your browser supports WebAuthn, check the [WebAuthn Compatibility](https://developers.yubico.com/WebAuthn/WebAuthn_Browser_Support/) page. -- A signed and notarized version of `tsh` is required for Touch ID. This precludes - versions installed from Homebrew. [Download the macOS tsh installer](../../installation.mdx#macos). +- A signed and notarized version of `tsh` is required for Touch ID. This means versions + installed from Homebrew or compiled from source will not work. [Download the macOS tsh installer](../../installation.mdx#macos). - (!docs/pages/includes/tctl.mdx!) A Teleport cluster capable of WebAuthn is automatically capable of passwordless. diff --git a/docs/pages/includes/install-tsh.mdx b/docs/pages/includes/install-tsh.mdx index b77a95bf4346b..39eb755811923 100644 --- a/docs/pages/includes/install-tsh.mdx +++ b/docs/pages/includes/install-tsh.mdx @@ -9,18 +9,13 @@ - ```code - $ brew install teleport - ``` - - - The Teleport package in Homebrew is not maintained by Teleport and we can't - guarantee its reliability or security. We recommend the use of our [own Teleport packages](https://goteleport.com/download?os=mac). + + Using Homebrew to install Teleport is not supported. The Teleport package in + Homebrew is not maintained by Teleport and we can't guarantee its reliability or + security. - If you choose to use Homebrew, you must verify that the versions of `tsh` and - `tctl` are compatible with the versions you run server-side. Homebrew usually - ships the latest release of Teleport, which may be incompatible with older - versions. See our [compatibility policy](../upgrading/overview.mdx) for details. + We recommend the use of our [own Teleport packages](https://goteleport.com/download?os=mac) + for any installations on macOS. From d584a901b5b43cae8e69598fc40152704804660c Mon Sep 17 00:00:00 2001 From: Steven Martin Date: Tue, 6 Aug 2024 11:41:32 -0400 Subject: [PATCH 075/139] docs: update role specification for agent updates (#45131) Co-authored-by: Steven Martin --- docs/pages/upgrading/automatic-agent-updates.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/pages/upgrading/automatic-agent-updates.mdx b/docs/pages/upgrading/automatic-agent-updates.mdx index 3260f4149ed5d..269b37b917800 100644 --- a/docs/pages/upgrading/automatic-agent-updates.mdx +++ b/docs/pages/upgrading/automatic-agent-updates.mdx @@ -84,7 +84,7 @@ Teleport cluster that agents use to determine when to check for upgrades. 1. Add the role to your Teleport user: - (!docs/pages/includes/add-role-to-user.mdx!) + (!docs/pages/includes/add-role-to-user.mdx role="cmc-editor"!) 1. Create a cluster maintenance config in a file called `cmc.yaml`. The following example allows maintenance on Monday, Wednesday and Friday between From c5d845714a9f3e82ea07ac8a5b21994937cbcf2d Mon Sep 17 00:00:00 2001 From: Steven Martin Date: Tue, 6 Aug 2024 12:42:47 -0400 Subject: [PATCH 076/139] docs: include Panther link in export audit logs intro (#45117) Co-authored-by: Steven Martin --- docs/pages/management/export-audit-events.mdx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/pages/management/export-audit-events.mdx b/docs/pages/management/export-audit-events.mdx index c287f63bb8c91..fac23f189c4cd 100644 --- a/docs/pages/management/export-audit-events.mdx +++ b/docs/pages/management/export-audit-events.mdx @@ -22,6 +22,9 @@ events to your solution of choice: Stack](./export-audit-events/elastic-stack.mdx): How to configure the Event Handler plugin to forward Teleport audit logs to Logstash for ingestion in Elasticsearch so you can explore them in Kibana. +- [Monitor Teleport Audit Events with Panther](./export-audit-events/panther.mdx): + How to configure the Event Handler plugin to send logs to Panther via Fluentd + so you can explore your audit events in Panther. - [Monitor Teleport Audit Events with Splunk](./export-audit-events/splunk.mdx): How to configure the Event Handler plugin to send logs to Splunk's Universal Forwarder so you can explore your audit events in Splunk. From 2fe5aab95664a377dfafcbb8d7d9a317d3eac0da Mon Sep 17 00:00:00 2001 From: Andrew LeFevre Date: Tue, 6 Aug 2024 13:00:45 -0400 Subject: [PATCH 077/139] [v16] fix regression that denied access to launch some Apps (#45149) * fix regression that denied access to launch some Apps * Fix test, and wrap new URL with its own try catch block * improve URL parsing fail error message --------- Co-authored-by: Andrew LeFevre Co-authored-by: Lisa Kim --- .../src/AppLauncher/AppLauncher.test.tsx | 271 ++++++++++++++++-- .../teleport/src/AppLauncher/AppLauncher.tsx | 38 ++- 2 files changed, 277 insertions(+), 32 deletions(-) diff --git a/web/packages/teleport/src/AppLauncher/AppLauncher.test.tsx b/web/packages/teleport/src/AppLauncher/AppLauncher.test.tsx index c0c5199047779..273fa2238bebd 100644 --- a/web/packages/teleport/src/AppLauncher/AppLauncher.test.tsx +++ b/web/packages/teleport/src/AppLauncher/AppLauncher.test.tsx @@ -17,7 +17,7 @@ */ import React from 'react'; -import { render, waitFor } from 'design/utils/testing'; +import { render, waitFor, screen } from 'design/utils/testing'; import { createMemoryHistory } from 'history'; import { Router } from 'react-router'; @@ -28,7 +28,11 @@ import service from 'teleport/services/apps'; import { AppLauncher } from './AppLauncher'; -const testCases: { name: string; path: string; expectedPath: string }[] = [ +const launcherPathTestCases: { + name: string; + path: string; + expectedPath: string; +}[] = [ { name: 'no state and no path', path: '?path=', @@ -97,54 +101,263 @@ describe('app launcher path is properly formed', () => { assignMock.mockClear(); }); - test.each(testCases)('$name', async ({ path: query, expectedPath }) => { - const launcherPath = `/web/launch/grafana.localhost${query}`; - const mockHistory = createMemoryHistory({ - initialEntries: [launcherPath], + test.each(launcherPathTestCases)( + '$name', + async ({ path: query, expectedPath }) => { + render( + + + + + + ); + + await waitFor(() => + expect(window.location.replace).toHaveBeenCalledWith( + `https://grafana.localhost/${expectedPath}` + ) + ); + expect(screen.queryByText(/access denied/i)).not.toBeInTheDocument(); + } + ); +}); + +const appSessionTestCases: { + name: string; + path: string; + returnedFqdn: string; + expectedFqdn: string; + expectedPublicAddr: string; + expectedArn: string; +}[] = [ + { + name: 'ARN URL', + path: 'test-app.test.teleport/test.teleport/test-app.test.teleport/arn:aws:iam::joe123:role%2FEC2FullAccess?state=ABC', + returnedFqdn: 'test-app.test.teleport', + expectedFqdn: 'test-app.test.teleport', + expectedPublicAddr: 'test-app.test.teleport', + expectedArn: 'arn:aws:iam::joe123:role/EC2FullAccess', + }, + { + name: 'uppercase resolved FQDN', + path: 'test-app.test.teleport/test.teleport/test-app.test.teleport?state=ABC', + returnedFqdn: 'TEST-APP.test.teleport', + expectedFqdn: 'test-app.test.teleport', + expectedPublicAddr: 'test-app.test.teleport', + expectedArn: undefined, + }, + { + name: 'uppercase public addr', + path: 'test-app.test.teleport/test.teleport/TEST-APP.test.teleport?state=ABC', + returnedFqdn: 'test-app.test.teleport', + expectedFqdn: 'test-app.test.teleport', + expectedPublicAddr: 'TEST-APP.test.teleport', + expectedArn: undefined, + }, + { + name: 'uppercase FQDN', + path: 'TEST-APP.test.teleport/test.teleport/test-app.test.teleport?state=ABC', + returnedFqdn: 'test-app.test.teleport', + expectedFqdn: 'test-app.test.teleport', + expectedPublicAddr: 'test-app.test.teleport', + expectedArn: undefined, + }, + { + name: 'uppercase resolved FQDN, public addr', + path: 'test-app.test.teleport/test.teleport/TEST-APP.test.teleport?state=ABC', + returnedFqdn: 'TEST-APP.test.teleport', + expectedFqdn: 'test-app.test.teleport', + expectedPublicAddr: 'TEST-APP.test.teleport', + expectedArn: undefined, + }, + { + name: 'uppercase resolved FQDN,FQDN', + path: 'TEST-APP.test.teleport/test.teleport/test-app.test.teleport?state=ABC', + returnedFqdn: 'TEST-APP.test.teleport', + expectedFqdn: 'test-app.test.teleport', + expectedPublicAddr: 'test-app.test.teleport', + expectedArn: undefined, + }, + { + name: 'uppercase public addr, FQDN', + path: 'TEST-APP.test.teleport/test.teleport/TEST-APP.test.teleport?state=ABC', + returnedFqdn: 'test-app.test.teleport', + expectedFqdn: 'test-app.test.teleport', + expectedPublicAddr: 'TEST-APP.test.teleport', + expectedArn: undefined, + }, + { + name: 'uppercase FQDN, resolved FQDN, public addr', + path: 'TEST-APP.test.teleport/test.teleport/TEST-APP.test.teleport?state=ABC', + returnedFqdn: 'TEST-APP.test.teleport', + expectedFqdn: 'test-app.test.teleport', + expectedPublicAddr: 'TEST-APP.test.teleport', + expectedArn: undefined, + }, + { + name: 'public addr with port', + path: 'test-app.test.teleport/test.teleport/test-app.test.teleport:443?state=ABC', + returnedFqdn: 'test-app.test.teleport', + expectedFqdn: 'test-app.test.teleport', + expectedPublicAddr: 'test-app.test.teleport', + expectedArn: undefined, + }, + { + name: 'FQDN with port', + path: 'test-app.test.teleport:443/test.teleport/test-app.test.teleport?state=ABC', + returnedFqdn: 'test-app.test.teleport', + expectedFqdn: 'test-app.test.teleport:443', + expectedPublicAddr: 'test-app.test.teleport', + expectedArn: undefined, + }, + { + name: 'resolved FQDN with port', + path: 'test-app.test.teleport/test.teleport/test-app.test.teleport?state=ABC', + returnedFqdn: 'test-app.test.teleport:443', + expectedFqdn: 'test-app.test.teleport', + expectedPublicAddr: 'test-app.test.teleport', + expectedArn: undefined, + }, + { + name: 'FQDN, public addr with port', + path: 'test-app.test.teleport:443/test.teleport/test-app.test.teleport:443?state=ABC', + returnedFqdn: 'test-app.test.teleport', + expectedFqdn: 'test-app.test.teleport:443', + expectedPublicAddr: 'test-app.test.teleport', + expectedArn: undefined, + }, + { + name: 'FQDN, resolved FQDN with port', + path: 'test-app.test.teleport:443/test.teleport/test-app.test.teleport?state=ABC', + returnedFqdn: 'test-app.test.teleport:443', + expectedFqdn: 'test-app.test.teleport:443', + expectedPublicAddr: 'test-app.test.teleport', + expectedArn: undefined, + }, + { + name: 'public addr, resolved FQDN with port', + path: 'test-app.test.teleport/test.teleport/test-app.test.teleport:443?state=ABC', + returnedFqdn: 'test-app.test.teleport:443', + expectedFqdn: 'test-app.test.teleport', + expectedPublicAddr: 'test-app.test.teleport', + expectedArn: undefined, + }, + { + name: 'FQDN, public addr, resolved FQDN with port', + path: 'test-app.test.teleport:443/test.teleport/test-app.test.teleport:443?state=ABC', + returnedFqdn: 'test-app.test.teleport:443', + expectedFqdn: 'test-app.test.teleport:443', + expectedPublicAddr: 'test-app.test.teleport', + expectedArn: undefined, + }, +]; + +describe('fqdn is matched', () => { + const realLocation = window.location; + const assignMock = jest.fn(); + + beforeEach(() => { + global.fetch = jest.fn(() => Promise.resolve({})) as jest.Mock; + jest.spyOn(api, 'get').mockResolvedValue({}); + jest.spyOn(api, 'post').mockResolvedValue({}); + + delete window.location; + window.location = { ...realLocation, replace: assignMock }; + }); + + afterEach(() => { + window.location = realLocation; + assignMock.mockClear(); + }); + + test.each(appSessionTestCases)( + '$name', + async ({ + path, + returnedFqdn, + expectedFqdn, + expectedPublicAddr, + expectedArn, + }) => { + jest.spyOn(service, 'getAppFqdn').mockResolvedValue({ + fqdn: returnedFqdn, + }); + jest.spyOn(service, 'createAppSession'); + + render( + + + + + + ); + + await waitFor(() => { + expect(service.createAppSession).toHaveBeenCalledWith({ + fqdn: expectedFqdn, + clusterId: 'test.teleport', + publicAddr: expectedPublicAddr, + arn: expectedArn, + }); + }); + + await waitFor(() => expect(window.location.replace).toHaveBeenCalled()); + expect(screen.queryByText(/access denied/i)).not.toBeInTheDocument(); + } + ); + + test('not matching FQDN throws error', async () => { + jest.spyOn(service, 'getAppFqdn').mockResolvedValue({ + fqdn: 'different.fqdn', }); render( - + ); - await waitFor(() => - expect(window.location.replace).toHaveBeenCalledWith( - `https://grafana.localhost/${expectedPath}` + await screen.findByText(/access denied/i); + expect( + screen.getByText( + /failed to match applications with FQDN "test-app.test.teleport:443"/i ) - ); + ).toBeInTheDocument(); + expect(window.location.replace).not.toHaveBeenCalled(); }); - test('arn is url decoded', async () => { + test('invalid URL when constructing a new URL with a malformed FQDN', async () => { jest.spyOn(service, 'getAppFqdn').mockResolvedValue({ - fqdn: 'test-app.test.teleport', - }); - jest.spyOn(service, 'createAppSession'); - - const launcherPath = - '/web/launch/test-app.test.teleport/test.teleport/test-app.test.teleport/arn:aws:iam::joe123:role%2FEC2FullAccess?state=ABC'; - const mockHistory = createMemoryHistory({ - initialEntries: [launcherPath], + fqdn: 'invalid.fqdn:3080:3090', }); render( - + ); - await waitFor(() => { - expect(service.createAppSession).toHaveBeenCalledWith({ - fqdn: 'test-app.test.teleport', - clusterId: 'test.teleport', - publicAddr: 'test-app.test.teleport', - arn: 'arn:aws:iam::joe123:role/EC2FullAccess', - }); - }); + await screen.findByText(/access denied/i); + expect(screen.getByText(/Failed to parse URL:/i)).toBeInTheDocument(); + expect(window.location.replace).not.toHaveBeenCalled(); }); }); + +function createMockHistory(path: string) { + const launcherPath = `/web/launch/${path}`; + return createMemoryHistory({ + initialEntries: [launcherPath], + }); +} diff --git a/web/packages/teleport/src/AppLauncher/AppLauncher.tsx b/web/packages/teleport/src/AppLauncher/AppLauncher.tsx index f1740376b19fb..0008a04ca9c53 100644 --- a/web/packages/teleport/src/AppLauncher/AppLauncher.tsx +++ b/web/packages/teleport/src/AppLauncher/AppLauncher.tsx @@ -52,8 +52,14 @@ export function AppLauncher() { publicAddr: params.publicAddr, arn: params.arn, }); - if (resolvedApp.fqdn !== params.fqdn) { - throw Error(`Failed to match applications with FQDN ${params.fqdn}`); + // Because the ports are stripped from the FQDNs before they are + // compared, an attacker can pass a FQDN with a different port than + // what the app's public address is configured with and have Teleport + // redirect to the public address with an arbitrary port. But because + // the attacker can't control what domain is redirected to this has + // a low risk factor. + if (prepareFqdn(resolvedApp.fqdn) !== prepareFqdn(params.fqdn)) { + throw Error(`Failed to match applications with FQDN "${params.fqdn}"`); } let path = ''; @@ -140,8 +146,30 @@ export function AppLauncherAccessDenied(props: AppLauncherAccessDeniedProps) { return ; } +// prepareFqdn removes the port from the FQDN if it has one and ensures +// the FQDN is lowercase. This is to prevent issues matching the +// resolved fqdn with the one that was passed. Apps generally aren't +// supposed to have a port in the public address but some integrations +// create apps that do. The FQDN is also lowercased to prevent +// issues with case sensitivity. +function prepareFqdn(fqdn: string) { + try { + const fqdnUrl = new URL('https://' + fqdn); + fqdnUrl.port = ''; + // The returned FQDN will have a scheme added to it, but that's + // fine because we're just using it to compare the FQDNs. + return fqdnUrl.toString().toLowerCase(); + } catch (err) { + throwFailedToParseUrlError(err); + } +} + function getXTeleportAuthUrl({ fqdn, port }: { fqdn: string; port: string }) { - return new URL(`https://${fqdn}${port}/x-teleport-auth`); + try { + return new URL(`https://${fqdn}${port}/x-teleport-auth`); + } catch (err) { + throwFailedToParseUrlError(err); + } } // initiateNewAuthExchange is the first step to gaining access to an @@ -197,3 +225,7 @@ function initiateNewAuthExchange({ window.location.replace(url.toString()); } + +function throwFailedToParseUrlError(err: TypeError) { + throw Error(`Failed to parse URL: ${err.message}`); +} From 73ccf00bc300a7725de1becf0ea24ee63ea8ccca Mon Sep 17 00:00:00 2001 From: Hugo Shaka Date: Tue, 6 Aug 2024 13:01:44 -0400 Subject: [PATCH 078/139] Make bot resource expire (#45130) --- lib/auth/machineid/machineidv1/bot_service.go | 30 ++- .../machineid/machineidv1/machineidv1_test.go | 217 ++++++++++++++++++ 2 files changed, 245 insertions(+), 2 deletions(-) diff --git a/lib/auth/machineid/machineidv1/bot_service.go b/lib/auth/machineid/machineidv1/bot_service.go index ee898d6614cf0..e9d24cb74b716 100644 --- a/lib/auth/machineid/machineidv1/bot_service.go +++ b/lib/auth/machineid/machineidv1/bot_service.go @@ -29,6 +29,7 @@ import ( "github.com/jonboulle/clockwork" "github.com/sirupsen/logrus" "google.golang.org/protobuf/types/known/emptypb" + "google.golang.org/protobuf/types/known/timestamppb" "github.com/gravitational/teleport" headerv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/header/v1" @@ -619,11 +620,14 @@ func botFromUserAndRole(user types.User, role types.Role) (*pb.Bot, error) { return nil, trace.BadParameter("user missing bot label") } + expiry := botExpiryFromUser(user) + b := &pb.Bot{ Kind: types.KindBot, Version: types.V1, Metadata: &headerv1.Metadata{ - Name: botName, + Name: botName, + Expires: expiry, }, Status: &pb.BotStatus{ UserName: user.GetName(), @@ -686,6 +690,7 @@ func botToUserAndRole(bot *pb.Bot, now time.Time, createdBy string) (types.User, roleMeta.Labels = map[string]string{ types.BotLabel: bot.Metadata.Name, } + roleMeta.Expires = userAndRoleExpiryFromBot(bot) role.SetMetadata(roleMeta) // Setup user @@ -707,7 +712,7 @@ func botToUserAndRole(bot *pb.Bot, now time.Time, createdBy string) (types.User, // We always set this to zero here - but in Upsert, we copy from the // previous user before writing if necessary userMeta.Labels[types.BotGenerationLabel] = "0" - + userMeta.Expires = userAndRoleExpiryFromBot(bot) user.SetMetadata(userMeta) traits := map[string][]string{} @@ -728,3 +733,24 @@ func botToUserAndRole(bot *pb.Bot, now time.Time, createdBy string) (types.User, return user, role, nil } + +func userAndRoleExpiryFromBot(bot *pb.Bot) *time.Time { + if bot.Metadata.GetExpires() == nil { + return nil + } + + expiry := bot.Metadata.GetExpires().AsTime() + if expiry.IsZero() || expiry.Unix() == 0 { + return nil + } + return &expiry +} + +func botExpiryFromUser(user types.User) *timestamppb.Timestamp { + userMeta := user.GetMetadata() + userExpiry := userMeta.Expiry() + if userExpiry.IsZero() || userExpiry.Unix() == 0 { + return nil + } + return timestamppb.New(userExpiry) +} diff --git a/lib/auth/machineid/machineidv1/machineidv1_test.go b/lib/auth/machineid/machineidv1/machineidv1_test.go index b95624faaf96b..6e66704c674ee 100644 --- a/lib/auth/machineid/machineidv1/machineidv1_test.go +++ b/lib/auth/machineid/machineidv1/machineidv1_test.go @@ -33,6 +33,7 @@ import ( "github.com/stretchr/testify/require" "google.golang.org/protobuf/testing/protocmp" "google.golang.org/protobuf/types/known/fieldmaskpb" + "google.golang.org/protobuf/types/known/timestamppb" "github.com/gravitational/teleport/api/constants" "github.com/gravitational/teleport/api/defaults" @@ -104,6 +105,7 @@ func TestCreateBot(t *testing.T) { }, ) require.NoError(t, err) + expiry := time.Now().Add(time.Hour) tests := []struct { name string @@ -223,6 +225,118 @@ func TestCreateBot(t *testing.T) { }, }, }, + { + name: "success with expiry", + user: botCreator.GetName(), + req: &machineidv1pb.CreateBotRequest{ + Bot: &machineidv1pb.Bot{ + Metadata: &headerv1.Metadata{ + Name: "success-with-expiry", + Labels: map[string]string{ + "my-label": "my-value", + "my-other-label": "my-other-value", + }, + Expires: timestamppb.New(expiry), + }, + Spec: &machineidv1pb.BotSpec{ + Roles: []string{testRole.GetName()}, + Traits: []*machineidv1pb.Trait{ + { + Name: constants.TraitLogins, + Values: []string{"root"}, + }, + { + Name: constants.TraitKubeUsers, + Values: []string{}, + }, + }, + }, + }, + }, + + assertError: require.NoError, + want: &machineidv1pb.Bot{ + Kind: types.KindBot, + Version: types.V1, + Metadata: &headerv1.Metadata{ + Name: "success-with-expiry", + Labels: map[string]string{ + "my-label": "my-value", + "my-other-label": "my-other-value", + }, + Expires: timestamppb.New(expiry), + }, + Spec: &machineidv1pb.BotSpec{ + Roles: []string{testRole.GetName()}, + Traits: []*machineidv1pb.Trait{ + { + Name: constants.TraitLogins, + Values: []string{"root"}, + }, + }, + }, + Status: &machineidv1pb.BotStatus{ + UserName: "bot-success-with-expiry", + RoleName: "bot-success-with-expiry", + }, + }, + wantUser: &types.UserV2{ + Kind: types.KindUser, + Version: types.V2, + Metadata: types.Metadata{ + Name: "bot-success-with-expiry", + Namespace: defaults.Namespace, + Labels: map[string]string{ + types.BotLabel: "success-with-expiry", + types.BotGenerationLabel: "0", + "my-label": "my-value", + "my-other-label": "my-other-value", + }, + Expires: &expiry, + }, + Spec: types.UserSpecV2{ + CreatedBy: types.CreatedBy{ + User: types.UserRef{Name: botCreator.GetName()}, + }, + Roles: []string{"bot-success-with-expiry"}, + Traits: map[string][]string{ + constants.TraitLogins: {"root"}, + }, + }, + Status: types.UserStatusV2{ + PasswordState: types.PasswordState_PASSWORD_STATE_UNSET, + }, + }, + wantRole: &types.RoleV6{ + Kind: types.KindRole, + Version: types.V7, + Metadata: types.Metadata{ + Name: "bot-success-with-expiry", + Namespace: defaults.Namespace, + Labels: map[string]string{ + types.BotLabel: "success-with-expiry", + }, + Description: "Automatically generated role for bot success-with-expiry", + Expires: &expiry, + }, + Spec: types.RoleSpecV6{ + Options: types.RoleOptions{ + MaxSessionTTL: types.Duration(12 * time.Hour), + }, + Allow: types.RoleConditions{ + Impersonate: &types.ImpersonateConditions{ + Roles: []string{testRole.GetName()}, + }, + Rules: []types.Rule{ + types.NewRule( + types.KindCertAuthority, + []string{types.VerbReadNoSecrets}, + ), + }, + }, + }, + }, + }, { name: "bot already exists", user: botCreator.GetName(), @@ -759,6 +873,7 @@ func TestUpsertBot(t *testing.T) { }, }) require.NoError(t, err) + expiry := time.Now().Add(time.Hour) // We find the user associated with the Bot and set the generation label. This allows us to ensure that the // generation label is preserved when UpsertBot is called. @@ -880,6 +995,108 @@ func TestUpsertBot(t *testing.T) { }, }, }, + { + name: "new with expiry", + user: botCreator.GetName(), + req: &machineidv1pb.UpsertBotRequest{ + Bot: &machineidv1pb.Bot{ + Metadata: &headerv1.Metadata{ + Name: "new-with-expiry", + Labels: map[string]string{ + "my-label": "my-value", + "my-other-label": "my-other-value", + }, + Expires: timestamppb.New(expiry), + }, + Spec: &machineidv1pb.BotSpec{ + Roles: []string{testRole.GetName()}, + Traits: []*machineidv1pb.Trait{ + { + Name: constants.TraitLogins, + Values: []string{"root"}, + }, + }, + }, + }, + }, + + assertError: require.NoError, + want: &machineidv1pb.Bot{ + Kind: types.KindBot, + Version: types.V1, + Metadata: &headerv1.Metadata{ + Name: "new-with-expiry", + Labels: map[string]string{ + "my-label": "my-value", + "my-other-label": "my-other-value", + }, + Expires: timestamppb.New(expiry), + }, + Spec: &machineidv1pb.BotSpec{ + Roles: []string{testRole.GetName()}, + Traits: []*machineidv1pb.Trait{ + { + Name: constants.TraitLogins, + Values: []string{"root"}, + }, + }, + }, + Status: &machineidv1pb.BotStatus{ + UserName: "bot-new-with-expiry", + RoleName: "bot-new-with-expiry", + }, + }, + wantUser: &types.UserV2{ + Kind: types.KindUser, + Version: types.V2, + Metadata: types.Metadata{ + Name: "bot-new-with-expiry", + Namespace: defaults.Namespace, + Labels: map[string]string{ + types.BotLabel: "new-with-expiry", + types.BotGenerationLabel: "0", + "my-label": "my-value", + "my-other-label": "my-other-value", + }, + Expires: &expiry, + }, + Spec: types.UserSpecV2{ + Roles: []string{"bot-new-with-expiry"}, + Traits: map[string][]string{ + constants.TraitLogins: {"root"}, + }, + CreatedBy: types.CreatedBy{ + User: types.UserRef{Name: botCreator.GetName()}, + }, + }, + }, + wantRole: &types.RoleV6{ + Kind: types.KindRole, + Version: types.V7, + Metadata: types.Metadata{ + Name: "bot-new-with-expiry", + Namespace: defaults.Namespace, + Labels: map[string]string{ + types.BotLabel: "new-with-expiry", + }, + Description: "Automatically generated role for bot new-with-expiry", + Expires: &expiry, + }, + Spec: types.RoleSpecV6{ + Options: types.RoleOptions{ + MaxSessionTTL: types.Duration(12 * time.Hour), + }, + Allow: types.RoleConditions{ + Impersonate: &types.ImpersonateConditions{ + Roles: []string{testRole.GetName()}, + }, + Rules: []types.Rule{ + types.NewRule(types.KindCertAuthority, []string{types.VerbReadNoSecrets}), + }, + }, + }, + }, + }, { name: "already exists", user: botCreator.GetName(), From 224ec626851c2631f9af183300877a3882b4b415 Mon Sep 17 00:00:00 2001 From: Gus Luxton Date: Tue, 6 Aug 2024 14:04:06 -0300 Subject: [PATCH 079/139] docs: Fix singing -> signing typos (#45142) --- docs/pages/reference/join-methods.mdx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/pages/reference/join-methods.mdx b/docs/pages/reference/join-methods.mdx index 51daab28fa040..7a1b4c91abc46 100644 --- a/docs/pages/reference/join-methods.mdx +++ b/docs/pages/reference/join-methods.mdx @@ -87,7 +87,7 @@ for an instance to join the cluster. Secret-based join methods are universal: Teleport service can use a secret-based join method regardless of the platform/cloud provider it runs on. The joining instance -sends the secret and the Auth Service validates that it matches the one it +sends the secret and the Auth Service validates that it matches the one it knows. Those joining methods are inherently prone to secret exfiltration and the delegated join methods should be preferred when available. If you have to use a secret-based join method, it is recommended to use short-lived tokens @@ -138,7 +138,7 @@ Renewable join-methods are: - [static `token`](#static-tokens) - [`ec2`](#aws-ec2-identity-document-ec2) -Nodes with non-renewable certificates must join again in order to get a new +Nodes with non-renewable certificates must join again in order to get a new certificate before expiry. The instance will have to prove again that it is legitimate. The non-renewable join methods guarantee that an attacker stealing the instance certificates will not be able to maintain access to the Teleport cluster. @@ -172,7 +172,7 @@ spec: # - edit the token to update the roles (e.g. add "App") # - un-register the Teleport instance # - modify its configuration to enable the new service (here "app_service.enabled") - # - have the instance join again + # - have the instance join again # # You should use the minimal set of system roles required. # Common roles are: @@ -184,7 +184,7 @@ spec: # - "WindowsDesktop" for Windows Desktop Service # - "Discovery" for Discovery Service # - "Bot" for MachineID (when set, "spec.bot_name" must be set in the token) - roles: + roles: - Node - App join_method: gcp @@ -408,7 +408,7 @@ The Kubernetes JWKS join method is available in Teleport 14+. After rotating the Kubernetes CA, you must update the Kubernetes JWKS tokens -to contain the new Kubernetes singing keys (update the +to contain the new Kubernetes signing keys (update the `spec.kubernetes.static_jwks.jwks` field). From 091710c375aa4b321098643ec1a242e9eeee7daf Mon Sep 17 00:00:00 2001 From: Steven Martin Date: Tue, 6 Aug 2024 13:26:40 -0400 Subject: [PATCH 080/139] spelling fixes for examples (#45153) Co-authored-by: Steven Martin --- examples/athena/variables.tf | 2 +- .../charts/teleport-operator/templates/crds.yaml | 2 +- examples/chart/teleport-cluster/values.yaml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/athena/variables.tf b/examples/athena/variables.tf index e0bd51db529f8..21827d3b713e8 100644 --- a/examples/athena/variables.tf +++ b/examples/athena/variables.tf @@ -53,7 +53,7 @@ variable "workgroup_max_scanned_bytes_per_query" { # search events API to prevent increasing costs in case of aggressive use of API. # In current version Athena Audit logger is not prepared for polling of API. # Burst=20, time=1m and amount=5, means that you can do 20 requests without any -# throtling, next requests will be thottled, and tokens will be filled to +# throttling, next requests will be throttled, and tokens will be filled to # rate limit bucket at amount 5 every 1m. variable "search_event_limiter_burst" { description = "Number of tokens available for rate limit used on top of search event API" diff --git a/examples/chart/teleport-cluster/charts/teleport-operator/templates/crds.yaml b/examples/chart/teleport-cluster/charts/teleport-operator/templates/crds.yaml index 5217aaac84c40..feacc38b749c2 100644 --- a/examples/chart/teleport-cluster/charts/teleport-operator/templates/crds.yaml +++ b/examples/chart/teleport-cluster/charts/teleport-operator/templates/crds.yaml @@ -2,7 +2,7 @@ and creates them if needed. It also adds common labels, like any other Helm-deployed resource. -We cannot rely on the "crds/" Helm directory as Helm's startegy is "fire and forget". +We cannot rely on the "crds/" Helm directory as Helm's strategy is "fire and forget". We have no way to update the CRDs after the initial deployment. As Teleport keeps adding new field to existing CRs, we need a deployment strategy that supports updating CRDs. diff --git a/examples/chart/teleport-cluster/values.yaml b/examples/chart/teleport-cluster/values.yaml index d4b70bec775e0..526f1ed85518b 100644 --- a/examples/chart/teleport-cluster/values.yaml +++ b/examples/chart/teleport-cluster/values.yaml @@ -287,7 +287,7 @@ global: clusterDomain: cluster.local # Labels is a map of key-value pairs about this cluster. Those labels are used -# in Teleport to access the Kuebrnetes cluster. They must not be confused with +# in Teleport to access the Kubernetes cluster. They must not be confused with # `extraLabels` which are additional labels to add on Kubernetes resources # created by the Helm chart. labels: {} From 81b5a3fcf30900ee18986d5bc1f964a6a5523a7c Mon Sep 17 00:00:00 2001 From: Russell Jones Date: Tue, 6 Aug 2024 10:40:52 -0700 Subject: [PATCH 081/139] Added 07/31 Upcoming Releases Update (#44891) --- docs/pages/upcoming-releases.mdx | 39 ++++++++++++++++++++++++-------- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/docs/pages/upcoming-releases.mdx b/docs/pages/upcoming-releases.mdx index 27e3170e37a06..2c3a3cb02de7f 100644 --- a/docs/pages/upcoming-releases.mdx +++ b/docs/pages/upcoming-releases.mdx @@ -15,11 +15,6 @@ The Teleport team delivers a new major release roughly every 4 months. ### 16.2.0 -#### Nested Access Lists - -Teleport admins and Access List owners will be able to add Access Lists as -members in other Access Lists. - #### NLA Support Teleport will support Network Level Authentication (NLA) when connecting to @@ -44,8 +39,26 @@ to the `tctl tokens` commands. Teleport will support secure joining via Terraform Cloud, allowing Machine ID workflows to run on Terraform Cloud without shared secrets. +#### Nested Access Lists + +Teleport admins and Access List owners will be able to add Access Lists as +members in other Access Lists. + +*Delayed from Teleport 16.2.0.* + +#### Hardware Key support for Teleport Connect + +Teleport's support for [hardware-backed private +keys](access-controls/guides/hardware-key-support.mdx) will be extended to +Teleport Connect. + ### 17.0.0 +#### New Nav + +Teleport 17 will include navigation updates to enhance usability and +scalability of the web UI. + #### Modern Signature Algorithms Teleport admins will have to option to use elliptic curve cryptography for the @@ -58,14 +71,22 @@ Teleport will integrate with AWS Identity Center to allow users to sync and manage AWS IC group and their members and allow them to request access to AWS IC permission sets. +#### Out-of-band user creation + +Cluster administrators will be able to configure Teleport's `ssh_service` to +ensure that certain host users exist on the machine without the need to start +an SSH session. + ## Teleport Cloud The key deliverables for Teleport Cloud in the next quarter: -| Week of | Description | -|-----------------|--------------------------------------------------------------| -| August 19, 2024 | Teleport 16.2 will begin rollout on Cloud. | -| August 19, 2024 | Teleport 16.2 agents will begin rollout to eligible tenants. | +| Week of | Description | +|--------------------|--------------------------------------------------------------| +| August 19, 2024 | Teleport 16.2 will begin rollout on Cloud. | +| August 19, 2024 | Teleport 16.2 agents will begin rollout to eligible tenants. | +| September 16, 2024 | Teleport 16.3 will begin rollout on Cloud. | +| September 16, 2024 | Teleport 16.3 agents will begin rollout to eligible tenants. | ## Production readiness From c98c305d86f8dbf88742545e7659b3abe0963d4e Mon Sep 17 00:00:00 2001 From: Michael Date: Tue, 6 Aug 2024 12:44:17 -0500 Subject: [PATCH 082/139] Add Device Trust Requirement icon to web UI (#45079) This PR expands upon the previous Device Trust topbar icon by adding a new icon to signal to users that device trust is required if they did not authorize the session --- api/proto/teleport/legacy/types/types.proto | 3 - api/types/types.pb.go | 3 - lib/auth/sessions.go | 26 +++--- lib/web/apiserver.go | 8 +- web/packages/design/src/Icon/Icons.story.tsx | 1 + .../design/src/Icon/Icons/ShieldWarning.tsx | 70 +++++++++++++++ .../design/src/Icon/assets/ShieldWarning.svg | 5 ++ web/packages/design/src/Icon/index.ts | 1 + .../teleport/src/DeviceTrust/types.ts | 6 ++ web/packages/teleport/src/Login/useLogin.ts | 10 ++- .../teleport/src/TopBar/DeviceTrustIcon.tsx | 55 ++++++++---- .../teleport/src/TopBar/DeviceTrustStatus.tsx | 89 +++++++++++++++++++ .../teleport/src/TopBar/TopBar.test.tsx | 32 +++++++ web/packages/teleport/src/TopBar/TopBar.tsx | 5 +- .../Authenticated/Authenticated.tsx | 4 + .../UserMenuNav/UserMenuNav.test.tsx | 2 +- .../components/UserMenuNav/UserMenuNav.tsx | 14 +-- .../src/services/websession/websession.ts | 8 ++ 18 files changed, 288 insertions(+), 54 deletions(-) create mode 100644 web/packages/design/src/Icon/Icons/ShieldWarning.tsx create mode 100644 web/packages/design/src/Icon/assets/ShieldWarning.svg create mode 100644 web/packages/teleport/src/TopBar/DeviceTrustStatus.tsx diff --git a/api/proto/teleport/legacy/types/types.proto b/api/proto/teleport/legacy/types/types.proto index 55c9078370f7a..b7be2466b7301 100644 --- a/api/proto/teleport/legacy/types/types.proto +++ b/api/proto/teleport/legacy/types/types.proto @@ -3910,9 +3910,6 @@ message WebSessionSpecV2 { // // If during login a device is required and DeviceWebToken is nil, then it's // likely the user needs to enroll their device to avoid impacting access. - // - // Transient, only set in certain situations (such as the initial session - // returned during login). TrustedDeviceRequirement TrustedDeviceRequirement = 14 [(gogoproto.jsontag) = "trusted_device_requirement,omitempty"]; } diff --git a/api/types/types.pb.go b/api/types/types.pb.go index cb23b68b643fc..71cdcffcd6fd5 100644 --- a/api/types/types.pb.go +++ b/api/types/types.pb.go @@ -9832,9 +9832,6 @@ type WebSessionSpecV2 struct { // // If during login a device is required and DeviceWebToken is nil, then it's // likely the user needs to enroll their device to avoid impacting access. - // - // Transient, only set in certain situations (such as the initial session - // returned during login). TrustedDeviceRequirement TrustedDeviceRequirement `protobuf:"varint,14,opt,name=TrustedDeviceRequirement,proto3,enum=types.TrustedDeviceRequirement" json:"trusted_device_requirement,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` diff --git a/lib/auth/sessions.go b/lib/auth/sessions.go index dd428bcd9bf79..bb37d71e9f22d 100644 --- a/lib/auth/sessions.go +++ b/lib/auth/sessions.go @@ -103,7 +103,7 @@ func (r *NewWebSessionRequest) CheckAndSetDefaults() error { } func (a *Server) CreateWebSessionFromReq(ctx context.Context, req NewWebSessionRequest) (types.WebSession, error) { - session, sessionChecker, err := a.newWebSession(ctx, req, nil /* opts */) + session, _, err := a.newWebSession(ctx, req, nil /* opts */) if err != nil { return nil, trace.Wrap(err) } @@ -121,19 +121,6 @@ func (a *Server) CreateWebSessionFromReq(ctx context.Context, req NewWebSessionR } } - // Assign the TrustedDeviceRequirement to the session, but do not persist it, - // so only the initial session gets it. - // This avoids persisting a possibly stale value. - if tdr, err := a.calculateTrustedDeviceMode(ctx, func() ([]types.Role, error) { - return sessionChecker.Roles(), nil - }); err != nil { - log. - WithError(err). - Warnf("Failed to calculate trusted device mode for session") - } else { - session.SetTrustedDeviceRequirement(tdr) - } - return session, nil } @@ -324,6 +311,17 @@ func (a *Server) newWebSession( if err != nil { return nil, nil, trace.Wrap(err) } + + if tdr, err := a.calculateTrustedDeviceMode(ctx, func() ([]types.Role, error) { + return checker.Roles(), nil + }); err != nil { + log. + WithError(err). + Warn("Failed to calculate trusted device mode for session") + } else { + sess.SetTrustedDeviceRequirement(tdr) + } + return sess, checker, nil } diff --git a/lib/web/apiserver.go b/lib/web/apiserver.go index daa42d0a79d27..2c43ae4c2506f 100644 --- a/lib/web/apiserver.go +++ b/lib/web/apiserver.go @@ -1004,12 +1004,14 @@ func (h *Handler) Close() error { } type userStatusResponse struct { - HasDeviceExtensions bool `json:"hasDeviceExtensions,omitempty"` - Message string `json:"message"` // Always set to "ok" + RequiresDeviceTrust types.TrustedDeviceRequirement `json:"requiresDeviceTrust,omitempty"` + HasDeviceExtensions bool `json:"hasDeviceExtensions,omitempty"` + Message string `json:"message"` // Always set to "ok" } func (h *Handler) getUserStatus(w http.ResponseWriter, r *http.Request, _ httprouter.Params, c *SessionContext) (interface{}, error) { return userStatusResponse{ + RequiresDeviceTrust: c.cfg.Session.GetTrustedDeviceRequirement(), HasDeviceExtensions: c.cfg.Session.GetHasDeviceExtensions(), Message: "ok", }, nil @@ -2140,7 +2142,7 @@ type CreateSessionResponse struct { DeviceWebToken *types.DeviceWebToken `json:"deviceWebToken,omitempty"` // TrustedDeviceRequirement calculated for the web session. // Follows [types.TrustedDeviceRequirement]. - TrustedDeviceRequirement int32 `json:"trusted_device_requirement,omitempty"` + TrustedDeviceRequirement int32 `json:"trustedDeviceRequirement,omitempty"` } func newSessionResponse(sctx *SessionContext) (*CreateSessionResponse, error) { diff --git a/web/packages/design/src/Icon/Icons.story.tsx b/web/packages/design/src/Icon/Icons.story.tsx index c4672580afa47..42002a906c9ba 100644 --- a/web/packages/design/src/Icon/Icons.story.tsx +++ b/web/packages/design/src/Icon/Icons.story.tsx @@ -182,6 +182,7 @@ export const Icons = () => ( + diff --git a/web/packages/design/src/Icon/Icons/ShieldWarning.tsx b/web/packages/design/src/Icon/Icons/ShieldWarning.tsx new file mode 100644 index 0000000000000..0d3274d654d30 --- /dev/null +++ b/web/packages/design/src/Icon/Icons/ShieldWarning.tsx @@ -0,0 +1,70 @@ +/** + * Teleport + * Copyright (C) 2023 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +/* MIT License + +Copyright (c) 2020 Phosphor Icons + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +import React from 'react'; + +import { Icon, IconProps } from '../Icon'; + +/* + +THIS FILE IS GENERATED. DO NOT EDIT. + +*/ + +export function ShieldWarning({ size = 24, color, ...otherProps }: IconProps) { + return ( + + + + + + ); +} diff --git a/web/packages/design/src/Icon/assets/ShieldWarning.svg b/web/packages/design/src/Icon/assets/ShieldWarning.svg new file mode 100644 index 0000000000000..b1ec93b336b18 --- /dev/null +++ b/web/packages/design/src/Icon/assets/ShieldWarning.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/web/packages/design/src/Icon/index.ts b/web/packages/design/src/Icon/index.ts index 24769fbac3aec..73318bc91288f 100644 --- a/web/packages/design/src/Icon/index.ts +++ b/web/packages/design/src/Icon/index.ts @@ -170,6 +170,7 @@ export { Scan } from './Icons/Scan'; export { Server } from './Icons/Server'; export { Share } from './Icons/Share'; export { ShieldCheck } from './Icons/ShieldCheck'; +export { ShieldWarning } from './Icons/ShieldWarning'; export { Sliders } from './Icons/Sliders'; export { SlidersVertical } from './Icons/SlidersVertical'; export { Speed } from './Icons/Speed'; diff --git a/web/packages/teleport/src/DeviceTrust/types.ts b/web/packages/teleport/src/DeviceTrust/types.ts index 7341003ff18b0..1c4463fc39a67 100644 --- a/web/packages/teleport/src/DeviceTrust/types.ts +++ b/web/packages/teleport/src/DeviceTrust/types.ts @@ -36,3 +36,9 @@ export type DeviceListProps = { fetchStatus?: 'loading' | 'disabled' | ''; fetchData?: () => void; }; + +export enum TrustedDeviceRequirement { + UNSPECIFIED, + NOT_REQUIRED, + REQUIRED, +} diff --git a/web/packages/teleport/src/Login/useLogin.ts b/web/packages/teleport/src/Login/useLogin.ts index 2ef46613d5919..8c5a1da3d574c 100644 --- a/web/packages/teleport/src/Login/useLogin.ts +++ b/web/packages/teleport/src/Login/useLogin.ts @@ -25,6 +25,7 @@ import history from 'teleport/services/history'; import cfg from 'teleport/config'; import auth, { UserCredentials } from 'teleport/services/auth'; import { storageService } from 'teleport/services/storageService'; +import { TrustedDeviceRequirement } from 'teleport/DeviceTrust/types'; export default function useLogin() { const [attempt, attemptActions] = useAttempt({ isProcessing: false }); @@ -50,10 +51,16 @@ export default function useLogin() { // onSuccess can receive a device webtoken. If so, it will // enable a prompt to allow users to authorize the current - function onSuccess({ deviceWebToken }: LoginResponse) { + function onSuccess({ + deviceWebToken, + trustedDeviceRequirement, + }: LoginResponse) { // deviceWebToken will only exist on a login response // from enterprise but just in case there is a version mismatch // between the webclient and proxy + if (trustedDeviceRequirement === TrustedDeviceRequirement.REQUIRED) { + session.setDeviceTrustRequired(); + } if (deviceWebToken && cfg.isEnterprise) { return authorizeWithDeviceTrust(deviceWebToken); } @@ -123,6 +130,7 @@ type DeviceWebToken = { type LoginResponse = { deviceWebToken?: DeviceWebToken; + trustedDeviceRequirement?: TrustedDeviceRequirement; }; function authorizeWithDeviceTrust(token: DeviceWebToken) { diff --git a/web/packages/teleport/src/TopBar/DeviceTrustIcon.tsx b/web/packages/teleport/src/TopBar/DeviceTrustIcon.tsx index 5030690c56351..c888896d5fb5c 100644 --- a/web/packages/teleport/src/TopBar/DeviceTrustIcon.tsx +++ b/web/packages/teleport/src/TopBar/DeviceTrustIcon.tsx @@ -18,35 +18,52 @@ import styled from 'styled-components'; import { Flex } from 'design'; -import { ShieldCheck } from 'design/Icon'; -import { HoverTooltip } from 'shared/components/ToolTip'; +import { ShieldCheck, ShieldWarning } from 'design/Icon'; +import { IconProps } from 'design/Icon/Icon'; -import session from 'teleport/services/websession'; +import { DeviceTrustStatusKind } from './DeviceTrustStatus'; -export const DeviceTrustIcon = ({ iconSize = 24 }: { iconSize?: number }) => { - const deviceTrusted = session.getIsDeviceTrusted(); +export const DeviceTrustIcon = ({ kind }: { kind: DeviceTrustStatusKind }) => { + const iconSize = 18; - if (!deviceTrusted) { - return null; + if (kind === 'authorized') { + return ( + + ); } return ( - - - - + + ); +}; + +const ShieldIcon = ({ + Icon, + iconSize, + color, + ...props +}: { + Icon: (props: IconProps) => JSX.Element; + iconSize: number; + color: string; +}) => { + return ( + + ); }; const Wrapper = styled(Flex)` height: 100%; - padding-left: 8px; `; diff --git a/web/packages/teleport/src/TopBar/DeviceTrustStatus.tsx b/web/packages/teleport/src/TopBar/DeviceTrustStatus.tsx new file mode 100644 index 0000000000000..ca5e054373020 --- /dev/null +++ b/web/packages/teleport/src/TopBar/DeviceTrustStatus.tsx @@ -0,0 +1,89 @@ +/** + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import styled from 'styled-components'; +import { Flex, Text } from 'design'; + +import session from 'teleport/services/websession'; + +import { DeviceTrustIcon } from './DeviceTrustIcon'; + +export type DeviceTrustStatusKind = 'authorized' | 'warning' | 'none'; + +const DeviceTrustText = ({ kind }: { kind: DeviceTrustStatusKind }) => { + if (kind === 'authorized') { + return ( + + Session authorized with device trust. + + ); + } + if (kind === 'warning') { + return ( + + Session is not authorized with Device Trust. Access is restricted. + + ); + } + return null; +}; + +function getDeviceTrustStatusKind( + deviceTrusted: boolean, + deviceTrustRequired: boolean +): DeviceTrustStatusKind { + if (deviceTrustRequired && deviceTrusted) { + return 'authorized'; + } + if (deviceTrustRequired) { + return 'warning'; + } + + return 'none'; +} + +export const DeviceTrustStatus = ({ + iconOnly = false, +}: { + iconOnly?: boolean; +}) => { + const deviceTrustRequired = session.getDeviceTrustRequired(); + const deviceTrusted = session.getIsDeviceTrusted(); + const kind = getDeviceTrustStatusKind(deviceTrusted, deviceTrustRequired); + if (kind === 'none') { + return null; + } + + return ( + + + {!iconOnly && } + + ); +}; + +const Wrapper = styled(Flex)<{ $iconOnly?: boolean }>` + ${p => (p.$iconOnly ? 'padding-left: 16px' : 'padding: 12px;')} + align-items: center; +`; + +const StatusText = styled(Text)` + font-size: ${p => p.theme.fontSizes[1]}px; + margin-left: 16px; + font-style: italic; +`; diff --git a/web/packages/teleport/src/TopBar/TopBar.test.tsx b/web/packages/teleport/src/TopBar/TopBar.test.tsx index ecd134c2324b5..da5d193a5d338 100644 --- a/web/packages/teleport/src/TopBar/TopBar.test.tsx +++ b/web/packages/teleport/src/TopBar/TopBar.test.tsx @@ -24,6 +24,7 @@ import { Router } from 'react-router'; import { createMemoryHistory } from 'history'; import { mockIntersectionObserver } from 'jsdom-testing-mocks'; +import session from 'teleport/services/websession'; import { LayoutContextProvider } from 'teleport/Main/LayoutContext'; import TeleportContextProvider from 'teleport/TeleportContextProvider'; import { FeaturesContextProvider } from 'teleport/FeaturesContext'; @@ -137,6 +138,37 @@ test('notification bell with notification', async () => { expect(screen.getByTestId('tb-notifications-dropdown')).toBeVisible(); }); +test('warning icon will show if session requires device trust and is not authorized', async () => { + setup(); + jest.spyOn(session, 'getDeviceTrustRequired').mockImplementation(() => true); + + render(getTopBar()); + + // the icon will show in the topbar and the usermenunav dropdown + expect(screen.getAllByTestId('device-trust-required-icon')).toHaveLength(2); +}); + +test('authorized icon will show if session is authorized', async () => { + setup(); + jest.spyOn(session, 'getDeviceTrustRequired').mockImplementation(() => true); + jest.spyOn(session, 'getIsDeviceTrusted').mockImplementation(() => true); + + render(getTopBar()); + + // the icon will show in the topbar and the usermenunav dropdown + expect(screen.getAllByTestId('device-trusted-icon')).toHaveLength(2); +}); + +test('icon will not show if device trust is not required', async () => { + setup(); + jest.spyOn(session, 'getDeviceTrustRequired').mockImplementation(() => false); + + render(getTopBar()); + + // no icons will be present + expect(screen.queryByTestId('device-trust-icon')).not.toBeInTheDocument(); +}); + const getTopBar = () => { return ( diff --git a/web/packages/teleport/src/TopBar/TopBar.tsx b/web/packages/teleport/src/TopBar/TopBar.tsx index 07c27722c8527..363b814879df5 100644 --- a/web/packages/teleport/src/TopBar/TopBar.tsx +++ b/web/packages/teleport/src/TopBar/TopBar.tsx @@ -203,10 +203,7 @@ export function TopBar({ CustomLogo }: TopBarProps) { {!feature?.logoOnlyTopbar && ( - + )} diff --git a/web/packages/teleport/src/components/Authenticated/Authenticated.tsx b/web/packages/teleport/src/components/Authenticated/Authenticated.tsx index e294af5d979f6..b0bd82f257424 100644 --- a/web/packages/teleport/src/components/Authenticated/Authenticated.tsx +++ b/web/packages/teleport/src/components/Authenticated/Authenticated.tsx @@ -27,6 +27,7 @@ import session from 'teleport/services/websession'; import { storageService } from 'teleport/services/storageService'; import { ApiError } from 'teleport/services/api/parseError'; import { StyledIndicator } from 'teleport/Main'; +import { TrustedDeviceRequirement } from 'teleport/DeviceTrust/types'; import { ErrorDialog } from './ErrorDialogue'; @@ -62,6 +63,9 @@ const Authenticated: React.FC = ({ children }) => { if (result.hasDeviceExtensions) { session.setIsDeviceTrusted(); } + if (result.requiresDeviceTrust === TrustedDeviceRequirement.REQUIRED) { + session.setDeviceTrustRequired(); + } setAttempt({ status: 'success' }); } catch (e) { if (e instanceof ApiError && e.response?.status == 403) { diff --git a/web/packages/teleport/src/components/UserMenuNav/UserMenuNav.test.tsx b/web/packages/teleport/src/components/UserMenuNav/UserMenuNav.test.tsx index 9bde1e72fa7a2..601f651a24bb6 100644 --- a/web/packages/teleport/src/components/UserMenuNav/UserMenuNav.test.tsx +++ b/web/packages/teleport/src/components/UserMenuNav/UserMenuNav.test.tsx @@ -99,7 +99,7 @@ function render(path: string) { - + diff --git a/web/packages/teleport/src/components/UserMenuNav/UserMenuNav.tsx b/web/packages/teleport/src/components/UserMenuNav/UserMenuNav.tsx index f59075f25f294..80f06c38029e7 100644 --- a/web/packages/teleport/src/components/UserMenuNav/UserMenuNav.tsx +++ b/web/packages/teleport/src/components/UserMenuNav/UserMenuNav.tsx @@ -20,7 +20,7 @@ import React, { useState } from 'react'; import styled, { useTheme } from 'styled-components'; import { Moon, Sun, ChevronDown, Logout as LogoutIcon } from 'design/Icon'; -import { Text } from 'design'; +import { Text, Box } from 'design'; import { useRefClickOutside } from 'shared/hooks/useRefClickOutside'; import { getCurrentTheme, getNextTheme } from 'design/ThemeProvider'; @@ -40,11 +40,10 @@ import { STARTING_TRANSITION_DELAY, INCREMENT_TRANSITION_DELAY, } from 'teleport/components/Dropdown'; -import { DeviceTrustIcon } from 'teleport/TopBar/DeviceTrustIcon'; +import { DeviceTrustStatus } from 'teleport/TopBar/DeviceTrustStatus'; interface UserMenuNavProps { username: string; - iconSize: number; } const Container = styled.div` @@ -101,7 +100,7 @@ const StyledAvatar = styled.div` const Arrow = styled.div` line-height: 0; - padding-left: 32px; + padding-left: ${p => p.theme.space[3]}px; svg { transform: ${p => (p.open ? 'rotate(-180deg)' : 'none')}; @@ -114,7 +113,7 @@ const Arrow = styled.div` } `; -export function UserMenuNav({ username, iconSize }: UserMenuNavProps) { +export function UserMenuNav({ username }: UserMenuNavProps) { const [open, setOpen] = useState(false); const theme = useTheme(); @@ -165,7 +164,9 @@ export function UserMenuNav({ username, iconSize }: UserMenuNavProps) { {initial} {username} - + + + @@ -173,6 +174,7 @@ export function UserMenuNav({ username, iconSize }: UserMenuNavProps) { + {items} diff --git a/web/packages/teleport/src/services/websession/websession.ts b/web/packages/teleport/src/services/websession/websession.ts index 8bff075d128a2..2d271fb25d9b4 100644 --- a/web/packages/teleport/src/services/websession/websession.ts +++ b/web/packages/teleport/src/services/websession/websession.ts @@ -176,6 +176,14 @@ const session = { return !!this._isRenewing; }, + setDeviceTrustRequired() { + this._isDeviceTrustRequired = true; + }, + + getDeviceTrustRequired() { + return !!this._isDeviceTrustRequired; + }, + getIsDeviceTrusted() { return !!this._isDeviceTrusted; }, From d8f2b63acd74f8d394800274b138ec4f1591108f Mon Sep 17 00:00:00 2001 From: Noah Stride Date: Tue, 6 Aug 2024 18:55:58 +0100 Subject: [PATCH 083/139] Bump e (#45145) --- e | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e b/e index 79f164550ca7d..7ba90e4948f06 160000 --- a/e +++ b/e @@ -1 +1 @@ -Subproject commit 79f164550ca7d8964677c87acf9b45c7c5540d77 +Subproject commit 7ba90e4948f06e9dd319bfed6f35fc983f6a24f5 From b778ff31735b9951e2ad7be1f5b0b5473ede1352 Mon Sep 17 00:00:00 2001 From: fheinecke <23390735+fheinecke@users.noreply.github.com> Date: Tue, 6 Aug 2024 13:47:01 -0500 Subject: [PATCH 084/139] Release 16.1.2 (#45156) --- CHANGELOG.md | 17 +++++ Makefile | 2 +- api/version.go | 2 +- .../macos/tsh/tsh.app/Contents/Info.plist | 4 +- .../macos/tshdev/tsh.app/Contents/Info.plist | 4 +- examples/chart/access/discord/Chart.yaml | 2 +- .../__snapshot__/configmap_test.yaml.snap | 4 +- .../__snapshot__/deployment_test.yaml.snap | 8 +-- examples/chart/access/email/Chart.yaml | 2 +- .../__snapshot__/configmap_test.yaml.snap | 24 +++---- .../__snapshot__/deployment_test.yaml.snap | 58 ++++++++-------- examples/chart/access/jira/Chart.yaml | 2 +- .../__snapshot__/configmap_test.yaml.snap | 4 +- .../__snapshot__/deployment_test.yaml.snap | 8 +-- examples/chart/access/mattermost/Chart.yaml | 2 +- .../__snapshot__/configmap_test.yaml.snap | 4 +- .../__snapshot__/deployment_test.yaml.snap | 28 ++++---- examples/chart/access/msteams/Chart.yaml | 2 +- .../__snapshot__/configmap_test.yaml.snap | 4 +- .../__snapshot__/deployment_test.yaml.snap | 8 +-- examples/chart/access/pagerduty/Chart.yaml | 2 +- .../__snapshot__/configmap_test.yaml.snap | 4 +- .../__snapshot__/deployment_test.yaml.snap | 8 +-- examples/chart/access/slack/Chart.yaml | 2 +- .../__snapshot__/configmap_test.yaml.snap | 4 +- .../__snapshot__/deployment_test.yaml.snap | 8 +-- examples/chart/event-handler/Chart.yaml | 2 +- .../__snapshot__/configmap_test.yaml.snap | 4 +- .../__snapshot__/deployment_test.yaml.snap | 6 +- examples/chart/teleport-cluster/Chart.yaml | 2 +- .../charts/teleport-operator/Chart.yaml | 2 +- .../auth_clusterrole_test.yaml.snap | 4 +- .../__snapshot__/auth_config_test.yaml.snap | 4 +- .../auth_deployment_test.yaml.snap | 8 +-- .../__snapshot__/proxy_config_test.yaml.snap | 4 +- .../proxy_deployment_test.yaml.snap | 36 +++++----- examples/chart/teleport-kube-agent/Chart.yaml | 2 +- .../__snapshot__/deployment_test.yaml.snap | 60 ++++++++--------- .../tests/__snapshot__/job_test.yaml.snap | 8 +-- .../__snapshot__/statefulset_test.yaml.snap | 66 +++++++++---------- .../updater_deployment_test.yaml.snap | 4 +- 41 files changed, 223 insertions(+), 206 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e83df372b946e..b0dbebb65e723 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,22 @@ # Changelog +## 16.1.2 (08/06/24) + +* Fixed regression that denied access to launch some Apps. [#45149](https://github.com/gravitational/teleport/pull/45149) +* Bot resources now honor their `metadata.expires` field. [#45130](https://github.com/gravitational/teleport/pull/45130) +* Teleport Connect now sets `TERM_PROGRAM: Teleport_Connect` and `TERM_PROGRAM_VERSION: ` environment variables in the integrated terminal. [#45063](https://github.com/gravitational/teleport/pull/45063) +* Fixed a panic in the Microsoft Teams plugin when it receives an error. [#45011](https://github.com/gravitational/teleport/pull/45011) +* Added a background item for VNet in Teleport Connect; VNet now prompts for a password only during the first launch. [#44994](https://github.com/gravitational/teleport/pull/44994) +* Added warning on `tbot` startup when the requested certificate TTL exceeds the maximum allowed value. [#44989](https://github.com/gravitational/teleport/pull/44989) +* Fixed a race condition between session recording uploads and session recording upload cleanup. [#44978](https://github.com/gravitational/teleport/pull/44978) +* Prevented Kubernetes per-Resource RBAC from blocking access to namespaces when denying access to a single resource kind in every namespace. [#44974](https://github.com/gravitational/teleport/pull/44974) +* SSO login flows can now authorize web sessions with Device Trust. [#44906](https://github.com/gravitational/teleport/pull/44906) +* Added support for Kubernetes Workload Attestation into Teleport Workload Identity to allow the authentication of pods running within Kubernetes without secrets. [#44883](https://github.com/gravitational/teleport/pull/44883) + +Enterprise: +* Fixed a redirection issue with the SAML IdP authentication middleware which prevented users from signing into the service provider when an SAML authentication request was made with an HTTP-POST binding protocol, and user's didn't already have an active session with Teleport. [#4806](https://github.com/gravitational/teleport.e/pull/4806) +* SAML applications can now be deleted from the Web UI. [#4778](https://github.com/gravitational/teleport.e/pull/4778) + ## 16.1.1 (07/31/24) * Added option to allow client redirects from IPs in specified CIDR ranges in SSO client logins. [#44846](https://github.com/gravitational/teleport/pull/44846) diff --git a/Makefile b/Makefile index 79d7ab7f399a9..53ca097012218 100644 --- a/Makefile +++ b/Makefile @@ -11,7 +11,7 @@ # Stable releases: "1.0.0" # Pre-releases: "1.0.0-alpha.1", "1.0.0-beta.2", "1.0.0-rc.3" # Master/dev branch: "1.0.0-dev" -VERSION=16.1.1 +VERSION=16.1.2 DOCKER_IMAGE ?= teleport diff --git a/api/version.go b/api/version.go index cce1000fe32e5..33b633f896a39 100644 --- a/api/version.go +++ b/api/version.go @@ -3,6 +3,6 @@ package api import "github.com/coreos/go-semver/semver" -const Version = "16.1.1" +const Version = "16.1.2" var SemVersion = semver.New(Version) diff --git a/build.assets/macos/tsh/tsh.app/Contents/Info.plist b/build.assets/macos/tsh/tsh.app/Contents/Info.plist index 2099b7d5b4dd0..4b25dfd8f2926 100644 --- a/build.assets/macos/tsh/tsh.app/Contents/Info.plist +++ b/build.assets/macos/tsh/tsh.app/Contents/Info.plist @@ -19,13 +19,13 @@ CFBundlePackageType APPL CFBundleShortVersionString - 16.1.1 + 16.1.2 CFBundleSupportedPlatforms MacOSX CFBundleVersion - 16.1.1 + 16.1.2 DTCompiler com.apple.compilers.llvm.clang.1_0 DTPlatformBuild diff --git a/build.assets/macos/tshdev/tsh.app/Contents/Info.plist b/build.assets/macos/tshdev/tsh.app/Contents/Info.plist index 395d865a43253..9fd43e2c58843 100644 --- a/build.assets/macos/tshdev/tsh.app/Contents/Info.plist +++ b/build.assets/macos/tshdev/tsh.app/Contents/Info.plist @@ -17,13 +17,13 @@ CFBundlePackageType APPL CFBundleShortVersionString - 16.1.1 + 16.1.2 CFBundleSupportedPlatforms MacOSX CFBundleVersion - 16.1.1 + 16.1.2 DTCompiler com.apple.compilers.llvm.clang.1_0 DTPlatformBuild diff --git a/examples/chart/access/discord/Chart.yaml b/examples/chart/access/discord/Chart.yaml index 05058430436c6..d525146d9415c 100644 --- a/examples/chart/access/discord/Chart.yaml +++ b/examples/chart/access/discord/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "16.1.1" +.version: &version "16.1.2" apiVersion: v2 name: teleport-plugin-discord diff --git a/examples/chart/access/discord/tests/__snapshot__/configmap_test.yaml.snap b/examples/chart/access/discord/tests/__snapshot__/configmap_test.yaml.snap index 6c8f40beb0f86..239939cc2084e 100644 --- a/examples/chart/access/discord/tests/__snapshot__/configmap_test.yaml.snap +++ b/examples/chart/access/discord/tests/__snapshot__/configmap_test.yaml.snap @@ -24,6 +24,6 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-discord - app.kubernetes.io/version: 16.1.1 - helm.sh/chart: teleport-plugin-discord-16.1.1 + app.kubernetes.io/version: 16.1.2 + helm.sh/chart: teleport-plugin-discord-16.1.2 name: RELEASE-NAME-teleport-plugin-discord diff --git a/examples/chart/access/discord/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/access/discord/tests/__snapshot__/deployment_test.yaml.snap index 6acb03d47c1ee..da15dee9085db 100644 --- a/examples/chart/access/discord/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/access/discord/tests/__snapshot__/deployment_test.yaml.snap @@ -7,8 +7,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-discord - app.kubernetes.io/version: 16.1.1 - helm.sh/chart: teleport-plugin-discord-16.1.1 + app.kubernetes.io/version: 16.1.2 + helm.sh/chart: teleport-plugin-discord-16.1.2 name: RELEASE-NAME-teleport-plugin-discord spec: replicas: 1 @@ -22,8 +22,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-discord - app.kubernetes.io/version: 16.1.1 - helm.sh/chart: teleport-plugin-discord-16.1.1 + app.kubernetes.io/version: 16.1.2 + helm.sh/chart: teleport-plugin-discord-16.1.2 spec: containers: - command: diff --git a/examples/chart/access/email/Chart.yaml b/examples/chart/access/email/Chart.yaml index 44f5e8ed15e72..991cc880092df 100644 --- a/examples/chart/access/email/Chart.yaml +++ b/examples/chart/access/email/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "16.1.1" +.version: &version "16.1.2" apiVersion: v2 name: teleport-plugin-email diff --git a/examples/chart/access/email/tests/__snapshot__/configmap_test.yaml.snap b/examples/chart/access/email/tests/__snapshot__/configmap_test.yaml.snap index 2255d5ab19371..8719bc7aa0dcc 100644 --- a/examples/chart/access/email/tests/__snapshot__/configmap_test.yaml.snap +++ b/examples/chart/access/email/tests/__snapshot__/configmap_test.yaml.snap @@ -26,8 +26,8 @@ should match the snapshot (mailgun on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.1 - helm.sh/chart: teleport-plugin-email-16.1.1 + app.kubernetes.io/version: 16.1.2 + helm.sh/chart: teleport-plugin-email-16.1.2 name: RELEASE-NAME-teleport-plugin-email should match the snapshot (smtp on): 1: | @@ -59,8 +59,8 @@ should match the snapshot (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.1 - helm.sh/chart: teleport-plugin-email-16.1.1 + app.kubernetes.io/version: 16.1.2 + helm.sh/chart: teleport-plugin-email-16.1.2 name: RELEASE-NAME-teleport-plugin-email should match the snapshot (smtp on, no starttls): 1: | @@ -92,8 +92,8 @@ should match the snapshot (smtp on, no starttls): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.1 - helm.sh/chart: teleport-plugin-email-16.1.1 + app.kubernetes.io/version: 16.1.2 + helm.sh/chart: teleport-plugin-email-16.1.2 name: RELEASE-NAME-teleport-plugin-email should match the snapshot (smtp on, password file): 1: | @@ -125,8 +125,8 @@ should match the snapshot (smtp on, password file): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.1 - helm.sh/chart: teleport-plugin-email-16.1.1 + app.kubernetes.io/version: 16.1.2 + helm.sh/chart: teleport-plugin-email-16.1.2 name: RELEASE-NAME-teleport-plugin-email should match the snapshot (smtp on, roleToRecipients set): 1: | @@ -161,8 +161,8 @@ should match the snapshot (smtp on, roleToRecipients set): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.1 - helm.sh/chart: teleport-plugin-email-16.1.1 + app.kubernetes.io/version: 16.1.2 + helm.sh/chart: teleport-plugin-email-16.1.2 name: RELEASE-NAME-teleport-plugin-email should match the snapshot (smtp on, starttls disabled): 1: | @@ -194,6 +194,6 @@ should match the snapshot (smtp on, starttls disabled): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.1 - helm.sh/chart: teleport-plugin-email-16.1.1 + app.kubernetes.io/version: 16.1.2 + helm.sh/chart: teleport-plugin-email-16.1.2 name: RELEASE-NAME-teleport-plugin-email diff --git a/examples/chart/access/email/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/access/email/tests/__snapshot__/deployment_test.yaml.snap index 456bdc296fb77..f88d10a8da20c 100644 --- a/examples/chart/access/email/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/access/email/tests/__snapshot__/deployment_test.yaml.snap @@ -7,8 +7,8 @@ should be possible to override volume name (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.1 - helm.sh/chart: teleport-plugin-email-16.1.1 + app.kubernetes.io/version: 16.1.2 + helm.sh/chart: teleport-plugin-email-16.1.2 name: RELEASE-NAME-teleport-plugin-email spec: replicas: 1 @@ -22,8 +22,8 @@ should be possible to override volume name (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.1 - helm.sh/chart: teleport-plugin-email-16.1.1 + app.kubernetes.io/version: 16.1.2 + helm.sh/chart: teleport-plugin-email-16.1.2 spec: containers: - command: @@ -34,7 +34,7 @@ should be possible to override volume name (smtp on): env: - name: TELEPORT_PLUGIN_FAIL_FAST value: "true" - image: public.ecr.aws/gravitational/teleport-plugin-email:16.1.1 + image: public.ecr.aws/gravitational/teleport-plugin-email:16.1.2 imagePullPolicy: IfNotPresent name: teleport-plugin-email ports: @@ -75,8 +75,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.1 - helm.sh/chart: teleport-plugin-email-16.1.1 + app.kubernetes.io/version: 16.1.2 + helm.sh/chart: teleport-plugin-email-16.1.2 name: RELEASE-NAME-teleport-plugin-email spec: replicas: 1 @@ -90,8 +90,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.1 - helm.sh/chart: teleport-plugin-email-16.1.1 + app.kubernetes.io/version: 16.1.2 + helm.sh/chart: teleport-plugin-email-16.1.2 spec: containers: - command: @@ -136,8 +136,8 @@ should match the snapshot (mailgun on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.1 - helm.sh/chart: teleport-plugin-email-16.1.1 + app.kubernetes.io/version: 16.1.2 + helm.sh/chart: teleport-plugin-email-16.1.2 name: RELEASE-NAME-teleport-plugin-email spec: replicas: 1 @@ -151,8 +151,8 @@ should match the snapshot (mailgun on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.1 - helm.sh/chart: teleport-plugin-email-16.1.1 + app.kubernetes.io/version: 16.1.2 + helm.sh/chart: teleport-plugin-email-16.1.2 spec: containers: - command: @@ -163,7 +163,7 @@ should match the snapshot (mailgun on): env: - name: TELEPORT_PLUGIN_FAIL_FAST value: "true" - image: public.ecr.aws/gravitational/teleport-plugin-email:16.1.1 + image: public.ecr.aws/gravitational/teleport-plugin-email:16.1.2 imagePullPolicy: IfNotPresent name: teleport-plugin-email ports: @@ -204,8 +204,8 @@ should match the snapshot (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.1 - helm.sh/chart: teleport-plugin-email-16.1.1 + app.kubernetes.io/version: 16.1.2 + helm.sh/chart: teleport-plugin-email-16.1.2 name: RELEASE-NAME-teleport-plugin-email spec: replicas: 1 @@ -219,8 +219,8 @@ should match the snapshot (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.1 - helm.sh/chart: teleport-plugin-email-16.1.1 + app.kubernetes.io/version: 16.1.2 + helm.sh/chart: teleport-plugin-email-16.1.2 spec: containers: - command: @@ -231,7 +231,7 @@ should match the snapshot (smtp on): env: - name: TELEPORT_PLUGIN_FAIL_FAST value: "true" - image: public.ecr.aws/gravitational/teleport-plugin-email:16.1.1 + image: public.ecr.aws/gravitational/teleport-plugin-email:16.1.2 imagePullPolicy: IfNotPresent name: teleport-plugin-email ports: @@ -272,8 +272,8 @@ should mount external secret (mailgun on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.1 - helm.sh/chart: teleport-plugin-email-16.1.1 + app.kubernetes.io/version: 16.1.2 + helm.sh/chart: teleport-plugin-email-16.1.2 name: RELEASE-NAME-teleport-plugin-email spec: replicas: 1 @@ -287,8 +287,8 @@ should mount external secret (mailgun on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.1 - helm.sh/chart: teleport-plugin-email-16.1.1 + app.kubernetes.io/version: 16.1.2 + helm.sh/chart: teleport-plugin-email-16.1.2 spec: containers: - command: @@ -299,7 +299,7 @@ should mount external secret (mailgun on): env: - name: TELEPORT_PLUGIN_FAIL_FAST value: "true" - image: public.ecr.aws/gravitational/teleport-plugin-email:16.1.1 + image: public.ecr.aws/gravitational/teleport-plugin-email:16.1.2 imagePullPolicy: IfNotPresent name: teleport-plugin-email ports: @@ -340,8 +340,8 @@ should mount external secret (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.1 - helm.sh/chart: teleport-plugin-email-16.1.1 + app.kubernetes.io/version: 16.1.2 + helm.sh/chart: teleport-plugin-email-16.1.2 name: RELEASE-NAME-teleport-plugin-email spec: replicas: 1 @@ -355,8 +355,8 @@ should mount external secret (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.1 - helm.sh/chart: teleport-plugin-email-16.1.1 + app.kubernetes.io/version: 16.1.2 + helm.sh/chart: teleport-plugin-email-16.1.2 spec: containers: - command: @@ -367,7 +367,7 @@ should mount external secret (smtp on): env: - name: TELEPORT_PLUGIN_FAIL_FAST value: "true" - image: public.ecr.aws/gravitational/teleport-plugin-email:16.1.1 + image: public.ecr.aws/gravitational/teleport-plugin-email:16.1.2 imagePullPolicy: IfNotPresent name: teleport-plugin-email ports: diff --git a/examples/chart/access/jira/Chart.yaml b/examples/chart/access/jira/Chart.yaml index 1debcdc55f5d1..698bb5abe6650 100644 --- a/examples/chart/access/jira/Chart.yaml +++ b/examples/chart/access/jira/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "16.1.1" +.version: &version "16.1.2" apiVersion: v2 name: teleport-plugin-jira diff --git a/examples/chart/access/jira/tests/__snapshot__/configmap_test.yaml.snap b/examples/chart/access/jira/tests/__snapshot__/configmap_test.yaml.snap index 0c4d0d8281932..760a80053601b 100644 --- a/examples/chart/access/jira/tests/__snapshot__/configmap_test.yaml.snap +++ b/examples/chart/access/jira/tests/__snapshot__/configmap_test.yaml.snap @@ -32,6 +32,6 @@ should match the snapshot (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-jira - app.kubernetes.io/version: 16.1.1 - helm.sh/chart: teleport-plugin-jira-16.1.1 + app.kubernetes.io/version: 16.1.2 + helm.sh/chart: teleport-plugin-jira-16.1.2 name: RELEASE-NAME-teleport-plugin-jira diff --git a/examples/chart/access/jira/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/access/jira/tests/__snapshot__/deployment_test.yaml.snap index 146d6625ad9e6..7db411eeaf210 100644 --- a/examples/chart/access/jira/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/access/jira/tests/__snapshot__/deployment_test.yaml.snap @@ -7,8 +7,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-jira - app.kubernetes.io/version: 16.1.1 - helm.sh/chart: teleport-plugin-jira-16.1.1 + app.kubernetes.io/version: 16.1.2 + helm.sh/chart: teleport-plugin-jira-16.1.2 name: RELEASE-NAME-teleport-plugin-jira spec: replicas: 1 @@ -22,8 +22,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-jira - app.kubernetes.io/version: 16.1.1 - helm.sh/chart: teleport-plugin-jira-16.1.1 + app.kubernetes.io/version: 16.1.2 + helm.sh/chart: teleport-plugin-jira-16.1.2 spec: containers: - command: diff --git a/examples/chart/access/mattermost/Chart.yaml b/examples/chart/access/mattermost/Chart.yaml index 34b55eba6d19d..0a7b66ec578d7 100644 --- a/examples/chart/access/mattermost/Chart.yaml +++ b/examples/chart/access/mattermost/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "16.1.1" +.version: &version "16.1.2" apiVersion: v2 name: teleport-plugin-mattermost diff --git a/examples/chart/access/mattermost/tests/__snapshot__/configmap_test.yaml.snap b/examples/chart/access/mattermost/tests/__snapshot__/configmap_test.yaml.snap index 4d578a3c23118..2175794a6b17c 100644 --- a/examples/chart/access/mattermost/tests/__snapshot__/configmap_test.yaml.snap +++ b/examples/chart/access/mattermost/tests/__snapshot__/configmap_test.yaml.snap @@ -22,6 +22,6 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-mattermost - app.kubernetes.io/version: 16.1.1 - helm.sh/chart: teleport-plugin-mattermost-16.1.1 + app.kubernetes.io/version: 16.1.2 + helm.sh/chart: teleport-plugin-mattermost-16.1.2 name: RELEASE-NAME-teleport-plugin-mattermost diff --git a/examples/chart/access/mattermost/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/access/mattermost/tests/__snapshot__/deployment_test.yaml.snap index afae0446f7406..7075756f9f50c 100644 --- a/examples/chart/access/mattermost/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/access/mattermost/tests/__snapshot__/deployment_test.yaml.snap @@ -7,8 +7,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-mattermost - app.kubernetes.io/version: 16.1.1 - helm.sh/chart: teleport-plugin-mattermost-16.1.1 + app.kubernetes.io/version: 16.1.2 + helm.sh/chart: teleport-plugin-mattermost-16.1.2 name: RELEASE-NAME-teleport-plugin-mattermost spec: replicas: 1 @@ -22,8 +22,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-mattermost - app.kubernetes.io/version: 16.1.1 - helm.sh/chart: teleport-plugin-mattermost-16.1.1 + app.kubernetes.io/version: 16.1.2 + helm.sh/chart: teleport-plugin-mattermost-16.1.2 spec: containers: - command: @@ -75,8 +75,8 @@ should mount external secret: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-mattermost - app.kubernetes.io/version: 16.1.1 - helm.sh/chart: teleport-plugin-mattermost-16.1.1 + app.kubernetes.io/version: 16.1.2 + helm.sh/chart: teleport-plugin-mattermost-16.1.2 name: RELEASE-NAME-teleport-plugin-mattermost spec: replicas: 1 @@ -90,8 +90,8 @@ should mount external secret: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-mattermost - app.kubernetes.io/version: 16.1.1 - helm.sh/chart: teleport-plugin-mattermost-16.1.1 + app.kubernetes.io/version: 16.1.2 + helm.sh/chart: teleport-plugin-mattermost-16.1.2 spec: containers: - command: @@ -102,7 +102,7 @@ should mount external secret: env: - name: TELEPORT_PLUGIN_FAIL_FAST value: "true" - image: public.ecr.aws/gravitational/teleport-plugin-mattermost:16.1.1 + image: public.ecr.aws/gravitational/teleport-plugin-mattermost:16.1.2 imagePullPolicy: IfNotPresent name: teleport-plugin-mattermost ports: @@ -143,8 +143,8 @@ should override volume name: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-mattermost - app.kubernetes.io/version: 16.1.1 - helm.sh/chart: teleport-plugin-mattermost-16.1.1 + app.kubernetes.io/version: 16.1.2 + helm.sh/chart: teleport-plugin-mattermost-16.1.2 name: RELEASE-NAME-teleport-plugin-mattermost spec: replicas: 1 @@ -158,8 +158,8 @@ should override volume name: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-mattermost - app.kubernetes.io/version: 16.1.1 - helm.sh/chart: teleport-plugin-mattermost-16.1.1 + app.kubernetes.io/version: 16.1.2 + helm.sh/chart: teleport-plugin-mattermost-16.1.2 spec: containers: - command: @@ -170,7 +170,7 @@ should override volume name: env: - name: TELEPORT_PLUGIN_FAIL_FAST value: "true" - image: public.ecr.aws/gravitational/teleport-plugin-mattermost:16.1.1 + image: public.ecr.aws/gravitational/teleport-plugin-mattermost:16.1.2 imagePullPolicy: IfNotPresent name: teleport-plugin-mattermost ports: diff --git a/examples/chart/access/msteams/Chart.yaml b/examples/chart/access/msteams/Chart.yaml index dea0aa109fef8..b355de85beccd 100644 --- a/examples/chart/access/msteams/Chart.yaml +++ b/examples/chart/access/msteams/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "16.1.1" +.version: &version "16.1.2" apiVersion: v2 name: teleport-plugin-msteams diff --git a/examples/chart/access/msteams/tests/__snapshot__/configmap_test.yaml.snap b/examples/chart/access/msteams/tests/__snapshot__/configmap_test.yaml.snap index 9b05ed49ff2be..e467976e80936 100644 --- a/examples/chart/access/msteams/tests/__snapshot__/configmap_test.yaml.snap +++ b/examples/chart/access/msteams/tests/__snapshot__/configmap_test.yaml.snap @@ -29,6 +29,6 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-msteams - app.kubernetes.io/version: 16.1.1 - helm.sh/chart: teleport-plugin-msteams-16.1.1 + app.kubernetes.io/version: 16.1.2 + helm.sh/chart: teleport-plugin-msteams-16.1.2 name: RELEASE-NAME-teleport-plugin-msteams diff --git a/examples/chart/access/msteams/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/access/msteams/tests/__snapshot__/deployment_test.yaml.snap index 0a6fde99b7e5c..142a28374a1f4 100644 --- a/examples/chart/access/msteams/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/access/msteams/tests/__snapshot__/deployment_test.yaml.snap @@ -7,8 +7,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-msteams - app.kubernetes.io/version: 16.1.1 - helm.sh/chart: teleport-plugin-msteams-16.1.1 + app.kubernetes.io/version: 16.1.2 + helm.sh/chart: teleport-plugin-msteams-16.1.2 name: RELEASE-NAME-teleport-plugin-msteams spec: replicas: 1 @@ -22,8 +22,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-msteams - app.kubernetes.io/version: 16.1.1 - helm.sh/chart: teleport-plugin-msteams-16.1.1 + app.kubernetes.io/version: 16.1.2 + helm.sh/chart: teleport-plugin-msteams-16.1.2 spec: containers: - command: diff --git a/examples/chart/access/pagerduty/Chart.yaml b/examples/chart/access/pagerduty/Chart.yaml index 43d7af164a115..f73c0f728f25e 100644 --- a/examples/chart/access/pagerduty/Chart.yaml +++ b/examples/chart/access/pagerduty/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "16.1.1" +.version: &version "16.1.2" apiVersion: v2 name: teleport-plugin-pagerduty diff --git a/examples/chart/access/pagerduty/tests/__snapshot__/configmap_test.yaml.snap b/examples/chart/access/pagerduty/tests/__snapshot__/configmap_test.yaml.snap index adeb1e63ba49e..1f7aa86e4ad84 100644 --- a/examples/chart/access/pagerduty/tests/__snapshot__/configmap_test.yaml.snap +++ b/examples/chart/access/pagerduty/tests/__snapshot__/configmap_test.yaml.snap @@ -21,6 +21,6 @@ should match the snapshot (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-pagerduty - app.kubernetes.io/version: 16.1.1 - helm.sh/chart: teleport-plugin-pagerduty-16.1.1 + app.kubernetes.io/version: 16.1.2 + helm.sh/chart: teleport-plugin-pagerduty-16.1.2 name: RELEASE-NAME-teleport-plugin-pagerduty diff --git a/examples/chart/access/pagerduty/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/access/pagerduty/tests/__snapshot__/deployment_test.yaml.snap index ee30ab1d3aa17..4b72a31adb51c 100644 --- a/examples/chart/access/pagerduty/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/access/pagerduty/tests/__snapshot__/deployment_test.yaml.snap @@ -7,8 +7,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-pagerduty - app.kubernetes.io/version: 16.1.1 - helm.sh/chart: teleport-plugin-pagerduty-16.1.1 + app.kubernetes.io/version: 16.1.2 + helm.sh/chart: teleport-plugin-pagerduty-16.1.2 name: RELEASE-NAME-teleport-plugin-pagerduty spec: replicas: 1 @@ -22,8 +22,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-pagerduty - app.kubernetes.io/version: 16.1.1 - helm.sh/chart: teleport-plugin-pagerduty-16.1.1 + app.kubernetes.io/version: 16.1.2 + helm.sh/chart: teleport-plugin-pagerduty-16.1.2 spec: containers: - command: diff --git a/examples/chart/access/slack/Chart.yaml b/examples/chart/access/slack/Chart.yaml index 3d9eb9aef6bc7..3b8e9c375b037 100644 --- a/examples/chart/access/slack/Chart.yaml +++ b/examples/chart/access/slack/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "16.1.1" +.version: &version "16.1.2" apiVersion: v2 name: teleport-plugin-slack diff --git a/examples/chart/access/slack/tests/__snapshot__/configmap_test.yaml.snap b/examples/chart/access/slack/tests/__snapshot__/configmap_test.yaml.snap index 626684bbf13a5..e227b7f6305b0 100644 --- a/examples/chart/access/slack/tests/__snapshot__/configmap_test.yaml.snap +++ b/examples/chart/access/slack/tests/__snapshot__/configmap_test.yaml.snap @@ -24,6 +24,6 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-slack - app.kubernetes.io/version: 16.1.1 - helm.sh/chart: teleport-plugin-slack-16.1.1 + app.kubernetes.io/version: 16.1.2 + helm.sh/chart: teleport-plugin-slack-16.1.2 name: RELEASE-NAME-teleport-plugin-slack diff --git a/examples/chart/access/slack/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/access/slack/tests/__snapshot__/deployment_test.yaml.snap index ba613731e18c8..8ed2f3cc52fa8 100644 --- a/examples/chart/access/slack/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/access/slack/tests/__snapshot__/deployment_test.yaml.snap @@ -7,8 +7,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-slack - app.kubernetes.io/version: 16.1.1 - helm.sh/chart: teleport-plugin-slack-16.1.1 + app.kubernetes.io/version: 16.1.2 + helm.sh/chart: teleport-plugin-slack-16.1.2 name: RELEASE-NAME-teleport-plugin-slack spec: replicas: 1 @@ -22,8 +22,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-slack - app.kubernetes.io/version: 16.1.1 - helm.sh/chart: teleport-plugin-slack-16.1.1 + app.kubernetes.io/version: 16.1.2 + helm.sh/chart: teleport-plugin-slack-16.1.2 spec: containers: - command: diff --git a/examples/chart/event-handler/Chart.yaml b/examples/chart/event-handler/Chart.yaml index 3f9dd0767b998..bd942675f3d9b 100644 --- a/examples/chart/event-handler/Chart.yaml +++ b/examples/chart/event-handler/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "16.1.1" +.version: &version "16.1.2" apiVersion: v2 name: teleport-plugin-event-handler diff --git a/examples/chart/event-handler/tests/__snapshot__/configmap_test.yaml.snap b/examples/chart/event-handler/tests/__snapshot__/configmap_test.yaml.snap index 5b7b6eb33784d..358b5d49b2672 100644 --- a/examples/chart/event-handler/tests/__snapshot__/configmap_test.yaml.snap +++ b/examples/chart/event-handler/tests/__snapshot__/configmap_test.yaml.snap @@ -26,6 +26,6 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-event-handler - app.kubernetes.io/version: 16.1.1 - helm.sh/chart: teleport-plugin-event-handler-16.1.1 + app.kubernetes.io/version: 16.1.2 + helm.sh/chart: teleport-plugin-event-handler-16.1.2 name: RELEASE-NAME-teleport-plugin-event-handler diff --git a/examples/chart/event-handler/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/event-handler/tests/__snapshot__/deployment_test.yaml.snap index 98f354d559861..9b292463cbd88 100644 --- a/examples/chart/event-handler/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/event-handler/tests/__snapshot__/deployment_test.yaml.snap @@ -7,8 +7,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-event-handler - app.kubernetes.io/version: 16.1.1 - helm.sh/chart: teleport-plugin-event-handler-16.1.1 + app.kubernetes.io/version: 16.1.2 + helm.sh/chart: teleport-plugin-event-handler-16.1.2 name: RELEASE-NAME-teleport-plugin-event-handler spec: replicas: 1 @@ -82,7 +82,7 @@ should mount tls.existingCASecretName and set environment when set in values: value: "true" - name: SSL_CERT_FILE value: /etc/teleport-tls-ca/ca.pem - image: public.ecr.aws/gravitational/teleport-plugin-event-handler:16.1.1 + image: public.ecr.aws/gravitational/teleport-plugin-event-handler:16.1.2 imagePullPolicy: IfNotPresent name: teleport-plugin-event-handler ports: diff --git a/examples/chart/teleport-cluster/Chart.yaml b/examples/chart/teleport-cluster/Chart.yaml index f7419298b64f0..6255c59b8e497 100644 --- a/examples/chart/teleport-cluster/Chart.yaml +++ b/examples/chart/teleport-cluster/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "16.1.1" +.version: &version "16.1.2" name: teleport-cluster apiVersion: v2 diff --git a/examples/chart/teleport-cluster/charts/teleport-operator/Chart.yaml b/examples/chart/teleport-cluster/charts/teleport-operator/Chart.yaml index 25ca728938e5d..19c7b58ebe9ff 100644 --- a/examples/chart/teleport-cluster/charts/teleport-operator/Chart.yaml +++ b/examples/chart/teleport-cluster/charts/teleport-operator/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "16.1.1" +.version: &version "16.1.2" name: teleport-operator apiVersion: v2 diff --git a/examples/chart/teleport-cluster/tests/__snapshot__/auth_clusterrole_test.yaml.snap b/examples/chart/teleport-cluster/tests/__snapshot__/auth_clusterrole_test.yaml.snap index fc18c16193d5d..4af862adf4f12 100644 --- a/examples/chart/teleport-cluster/tests/__snapshot__/auth_clusterrole_test.yaml.snap +++ b/examples/chart/teleport-cluster/tests/__snapshot__/auth_clusterrole_test.yaml.snap @@ -8,8 +8,8 @@ adds operator permissions to ClusterRole: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-cluster - app.kubernetes.io/version: 16.1.1 - helm.sh/chart: teleport-cluster-16.1.1 + app.kubernetes.io/version: 16.1.2 + helm.sh/chart: teleport-cluster-16.1.2 teleport.dev/majorVersion: "16" name: RELEASE-NAME rules: diff --git a/examples/chart/teleport-cluster/tests/__snapshot__/auth_config_test.yaml.snap b/examples/chart/teleport-cluster/tests/__snapshot__/auth_config_test.yaml.snap index b7f90528160db..810add5d46309 100644 --- a/examples/chart/teleport-cluster/tests/__snapshot__/auth_config_test.yaml.snap +++ b/examples/chart/teleport-cluster/tests/__snapshot__/auth_config_test.yaml.snap @@ -1848,8 +1848,8 @@ sets clusterDomain on Configmap: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-cluster - app.kubernetes.io/version: 16.1.1 - helm.sh/chart: teleport-cluster-16.1.1 + app.kubernetes.io/version: 16.1.2 + helm.sh/chart: teleport-cluster-16.1.2 teleport.dev/majorVersion: "16" name: RELEASE-NAME-auth namespace: NAMESPACE diff --git a/examples/chart/teleport-cluster/tests/__snapshot__/auth_deployment_test.yaml.snap b/examples/chart/teleport-cluster/tests/__snapshot__/auth_deployment_test.yaml.snap index c8f992f00efc2..1952a94a3f846 100644 --- a/examples/chart/teleport-cluster/tests/__snapshot__/auth_deployment_test.yaml.snap +++ b/examples/chart/teleport-cluster/tests/__snapshot__/auth_deployment_test.yaml.snap @@ -8,7 +8,7 @@ - args: - --diag-addr=0.0.0.0:3000 - --apply-on-startup=/etc/teleport/apply-on-startup.yaml - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -141,7 +141,7 @@ should set nodeSelector when set in values: - args: - --diag-addr=0.0.0.0:3000 - --apply-on-startup=/etc/teleport/apply-on-startup.yaml - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -238,7 +238,7 @@ should set resources when set in values: - args: - --diag-addr=0.0.0.0:3000 - --apply-on-startup=/etc/teleport/apply-on-startup.yaml - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -324,7 +324,7 @@ should set securityContext when set in values: - args: - --diag-addr=0.0.0.0:3000 - --apply-on-startup=/etc/teleport/apply-on-startup.yaml - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent lifecycle: preStop: diff --git a/examples/chart/teleport-cluster/tests/__snapshot__/proxy_config_test.yaml.snap b/examples/chart/teleport-cluster/tests/__snapshot__/proxy_config_test.yaml.snap index 88e8e05388267..d31f915b2fde3 100644 --- a/examples/chart/teleport-cluster/tests/__snapshot__/proxy_config_test.yaml.snap +++ b/examples/chart/teleport-cluster/tests/__snapshot__/proxy_config_test.yaml.snap @@ -567,8 +567,8 @@ sets clusterDomain on Configmap: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-cluster - app.kubernetes.io/version: 16.1.1 - helm.sh/chart: teleport-cluster-16.1.1 + app.kubernetes.io/version: 16.1.2 + helm.sh/chart: teleport-cluster-16.1.2 teleport.dev/majorVersion: "16" name: RELEASE-NAME-proxy namespace: NAMESPACE diff --git a/examples/chart/teleport-cluster/tests/__snapshot__/proxy_deployment_test.yaml.snap b/examples/chart/teleport-cluster/tests/__snapshot__/proxy_deployment_test.yaml.snap index 14a2c8810b43f..cb7268ea16d44 100644 --- a/examples/chart/teleport-cluster/tests/__snapshot__/proxy_deployment_test.yaml.snap +++ b/examples/chart/teleport-cluster/tests/__snapshot__/proxy_deployment_test.yaml.snap @@ -11,8 +11,8 @@ sets clusterDomain on Deployment Pods: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-cluster - app.kubernetes.io/version: 16.1.1 - helm.sh/chart: teleport-cluster-16.1.1 + app.kubernetes.io/version: 16.1.2 + helm.sh/chart: teleport-cluster-16.1.2 teleport.dev/majorVersion: "16" name: RELEASE-NAME-proxy namespace: NAMESPACE @@ -26,7 +26,7 @@ sets clusterDomain on Deployment Pods: template: metadata: annotations: - checksum/config: 0fec9cfed507aff767a06b7d89d9dad9b3b1f85d0f23ce0e9e7abb84c1cd4f09 + checksum/config: a8bb2cc565a16c17a5ac388f49043bd6c6a3596251c3a03e0372efc969dae1b8 kubernetes.io/pod: test-annotation kubernetes.io/pod-different: 4 labels: @@ -34,8 +34,8 @@ sets clusterDomain on Deployment Pods: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-cluster - app.kubernetes.io/version: 16.1.1 - helm.sh/chart: teleport-cluster-16.1.1 + app.kubernetes.io/version: 16.1.2 + helm.sh/chart: teleport-cluster-16.1.2 teleport.dev/majorVersion: "16" spec: affinity: @@ -44,7 +44,7 @@ sets clusterDomain on Deployment Pods: containers: - args: - --diag-addr=0.0.0.0:3000 - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -105,7 +105,7 @@ sets clusterDomain on Deployment Pods: - wait - no-resolve - RELEASE-NAME-auth-v15.NAMESPACE.svc.test.com - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 name: wait-auth-update serviceAccountName: RELEASE-NAME-proxy terminationGracePeriodSeconds: 60 @@ -137,7 +137,7 @@ should provision initContainer correctly when set in values: - wait - no-resolve - RELEASE-NAME-auth-v15.NAMESPACE.svc.cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 name: wait-auth-update resources: limits: @@ -201,7 +201,7 @@ should set nodeSelector when set in values: containers: - args: - --diag-addr=0.0.0.0:3000 - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -262,7 +262,7 @@ should set nodeSelector when set in values: - wait - no-resolve - RELEASE-NAME-auth-v15.NAMESPACE.svc.cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 name: wait-auth-update nodeSelector: environment: security @@ -313,7 +313,7 @@ should set resources for wait-auth-update initContainer when set in values: containers: - args: - --diag-addr=0.0.0.0:3000 - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -381,7 +381,7 @@ should set resources for wait-auth-update initContainer when set in values: - wait - no-resolve - RELEASE-NAME-auth-v15.NAMESPACE.svc.cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 name: wait-auth-update resources: limits: @@ -421,7 +421,7 @@ should set resources when set in values: containers: - args: - --diag-addr=0.0.0.0:3000 - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -489,7 +489,7 @@ should set resources when set in values: - wait - no-resolve - RELEASE-NAME-auth-v15.NAMESPACE.svc.cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 name: wait-auth-update resources: limits: @@ -529,7 +529,7 @@ should set securityContext for initContainers when set in values: containers: - args: - --diag-addr=0.0.0.0:3000 - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -597,7 +597,7 @@ should set securityContext for initContainers when set in values: - wait - no-resolve - RELEASE-NAME-auth-v15.NAMESPACE.svc.cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 name: wait-auth-update securityContext: allowPrivilegeEscalation: false @@ -637,7 +637,7 @@ should set securityContext when set in values: containers: - args: - --diag-addr=0.0.0.0:3000 - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -705,7 +705,7 @@ should set securityContext when set in values: - wait - no-resolve - RELEASE-NAME-auth-v15.NAMESPACE.svc.cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 name: wait-auth-update securityContext: allowPrivilegeEscalation: false diff --git a/examples/chart/teleport-kube-agent/Chart.yaml b/examples/chart/teleport-kube-agent/Chart.yaml index ec2c593ec97a4..2deb546cc1ebb 100644 --- a/examples/chart/teleport-kube-agent/Chart.yaml +++ b/examples/chart/teleport-kube-agent/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "16.1.1" +.version: &version "16.1.2" name: teleport-kube-agent apiVersion: v2 diff --git a/examples/chart/teleport-kube-agent/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/teleport-kube-agent/tests/__snapshot__/deployment_test.yaml.snap index e0657f4222605..60af46e6e4649 100644 --- a/examples/chart/teleport-kube-agent/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/teleport-kube-agent/tests/__snapshot__/deployment_test.yaml.snap @@ -32,7 +32,7 @@ sets Deployment annotations when specified if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -109,7 +109,7 @@ sets Deployment labels when specified if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -173,7 +173,7 @@ sets Pod annotations when specified if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -237,7 +237,7 @@ sets Pod labels when specified if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -322,7 +322,7 @@ should add emptyDir for data when existingDataVolume is not set if action is Upg value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -387,7 +387,7 @@ should add insecureSkipProxyTLSVerify to args when set in values if action is Up value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -451,7 +451,7 @@ should correctly configure existingDataVolume when set if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -513,7 +513,7 @@ should expose diag port if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -589,7 +589,7 @@ should have multiple replicas when replicaCount is set (using .replicaCount, dep value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -665,7 +665,7 @@ should have multiple replicas when replicaCount is set (using highAvailability.r value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -729,7 +729,7 @@ should have one replica when replicaCount is not set if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -793,7 +793,7 @@ should mount extraVolumes and extraVolumeMounts if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -862,7 +862,7 @@ should mount jamfCredentialsSecret if it already exists and when role is jamf an value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -932,7 +932,7 @@ should mount jamfCredentialsSecret.name when role is jamf and action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1004,7 +1004,7 @@ should mount tls.existingCASecretName and set environment when set in values if value: cluster.local - name: SSL_CERT_FILE value: /etc/teleport-tls-ca/ca.pem - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1078,7 +1078,7 @@ should mount tls.existingCASecretName and set extra environment when set in valu value: http://username:password@my.proxy.host:3128 - name: SSL_CERT_FILE value: /etc/teleport-tls-ca/ca.pem - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1148,7 +1148,7 @@ should provision initContainer correctly when set in values if action is Upgrade value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1270,7 +1270,7 @@ should set affinity when set in values if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1334,7 +1334,7 @@ should set default serviceAccountName when not set in values if action is Upgrad value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1411,7 +1411,7 @@ should set environment when extraEnv set in values if action is Upgrade: value: cluster.local - name: HTTPS_PROXY value: http://username:password@my.proxy.host:3128 - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1539,7 +1539,7 @@ should set imagePullPolicy when set in values if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: Always livenessProbe: failureThreshold: 6 @@ -1603,7 +1603,7 @@ should set nodeSelector if set in values if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1669,7 +1669,7 @@ should set not set priorityClassName when not set in values if action is Upgrade value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1745,7 +1745,7 @@ should set preferred affinity when more than one replica is used if action is Up value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1809,7 +1809,7 @@ should set priorityClassName when set in values if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1874,7 +1874,7 @@ should set probeTimeoutSeconds when set in values if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1948,7 +1948,7 @@ should set required affinity when highAvailability.requireAntiAffinity is set if value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2012,7 +2012,7 @@ should set resources when set in values if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2083,7 +2083,7 @@ should set serviceAccountName when set in values if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2147,7 +2147,7 @@ should set tolerations when set in values if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 diff --git a/examples/chart/teleport-kube-agent/tests/__snapshot__/job_test.yaml.snap b/examples/chart/teleport-kube-agent/tests/__snapshot__/job_test.yaml.snap index eca9f070bba23..0d0e0ff8e7c25 100644 --- a/examples/chart/teleport-kube-agent/tests/__snapshot__/job_test.yaml.snap +++ b/examples/chart/teleport-kube-agent/tests/__snapshot__/job_test.yaml.snap @@ -25,7 +25,7 @@ should create ServiceAccount for post-delete hook by default: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent name: post-delete-job securityContext: @@ -106,7 +106,7 @@ should not create ServiceAccount for post-delete hook if serviceAccount.create i fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent name: post-delete-job securityContext: @@ -136,7 +136,7 @@ should not create ServiceAccount, Role or RoleBinding for post-delete hook if se fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent name: post-delete-job securityContext: @@ -166,7 +166,7 @@ should set nodeSelector in post-delete hook: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent name: post-delete-job securityContext: diff --git a/examples/chart/teleport-kube-agent/tests/__snapshot__/statefulset_test.yaml.snap b/examples/chart/teleport-kube-agent/tests/__snapshot__/statefulset_test.yaml.snap index 07870c7aab89d..7ace953952179 100644 --- a/examples/chart/teleport-kube-agent/tests/__snapshot__/statefulset_test.yaml.snap +++ b/examples/chart/teleport-kube-agent/tests/__snapshot__/statefulset_test.yaml.snap @@ -16,7 +16,7 @@ sets Pod annotations when specified: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -86,7 +86,7 @@ sets Pod labels when specified: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -180,7 +180,7 @@ sets StatefulSet labels when specified: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -282,7 +282,7 @@ should add insecureSkipProxyTLSVerify to args when set in values: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -352,7 +352,7 @@ should add volumeClaimTemplate for data volume when using StatefulSet and action fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -442,7 +442,7 @@ should add volumeClaimTemplate for data volume when using StatefulSet and is Fre fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -522,7 +522,7 @@ should add volumeMount for data volume when using StatefulSet: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -592,7 +592,7 @@ should expose diag port: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -662,7 +662,7 @@ should generate Statefulset when storage is disabled and mode is a Upgrade: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -746,7 +746,7 @@ should have multiple replicas when replicaCount is set (using .replicaCount, dep fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -828,7 +828,7 @@ should have multiple replicas when replicaCount is set (using highAvailability.r fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -898,7 +898,7 @@ should have one replica when replicaCount is not set: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -968,7 +968,7 @@ should install Statefulset when storage is disabled and mode is a Fresh Install: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1040,7 +1040,7 @@ should mount extraVolumes and extraVolumeMounts: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1115,7 +1115,7 @@ should mount jamfCredentialsSecret if it already exists and when role is jamf: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1193,7 +1193,7 @@ should mount jamfCredentialsSecret.name when role is jamf: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1273,7 +1273,7 @@ should mount tls.existingCASecretName and set environment when set in values: value: RELEASE-NAME - name: SSL_CERT_FILE value: /etc/teleport-tls-ca/ca.pem - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1355,7 +1355,7 @@ should mount tls.existingCASecretName and set extra environment when set in valu value: /etc/teleport-tls-ca/ca.pem - name: HTTPS_PROXY value: http://username:password@my.proxy.host:3128 - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1433,7 +1433,7 @@ should not add emptyDir for data when using StatefulSet: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1503,7 +1503,7 @@ should provision initContainer correctly when set in values: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1631,7 +1631,7 @@ should set affinity when set in values: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1701,7 +1701,7 @@ should set default serviceAccountName when not set in values: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1784,7 +1784,7 @@ should set environment when extraEnv set in values: value: RELEASE-NAME - name: HTTPS_PROXY value: http://username:password@my.proxy.host:3128 - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1924,7 +1924,7 @@ should set imagePullPolicy when set in values: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: Always livenessProbe: failureThreshold: 6 @@ -1994,7 +1994,7 @@ should set nodeSelector if set in values: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2078,7 +2078,7 @@ should set preferred affinity when more than one replica is used: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2148,7 +2148,7 @@ should set probeTimeoutSeconds when set in values: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2228,7 +2228,7 @@ should set required affinity when highAvailability.requireAntiAffinity is set: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2298,7 +2298,7 @@ should set resources when set in values: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2375,7 +2375,7 @@ should set serviceAccountName when set in values: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2445,7 +2445,7 @@ should set storage.requests when set in values and action is an Upgrade: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2515,7 +2515,7 @@ should set storage.storageClassName when set in values and action is an Upgrade: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2585,7 +2585,7 @@ should set tolerations when set in values: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.1 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 diff --git a/examples/chart/teleport-kube-agent/tests/__snapshot__/updater_deployment_test.yaml.snap b/examples/chart/teleport-kube-agent/tests/__snapshot__/updater_deployment_test.yaml.snap index b7b90b241bc87..540492c9b1bbe 100644 --- a/examples/chart/teleport-kube-agent/tests/__snapshot__/updater_deployment_test.yaml.snap +++ b/examples/chart/teleport-kube-agent/tests/__snapshot__/updater_deployment_test.yaml.snap @@ -27,7 +27,7 @@ sets the affinity: - --base-image=public.ecr.aws/gravitational/teleport-distroless - --version-server=https://my-custom-version-server/v1 - --version-channel=custom/preview - image: public.ecr.aws/gravitational/teleport-kube-agent-updater:16.1.1 + image: public.ecr.aws/gravitational/teleport-kube-agent-updater:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -73,7 +73,7 @@ sets the tolerations: - --base-image=public.ecr.aws/gravitational/teleport-distroless - --version-server=https://my-custom-version-server/v1 - --version-channel=custom/preview - image: public.ecr.aws/gravitational/teleport-kube-agent-updater:16.1.1 + image: public.ecr.aws/gravitational/teleport-kube-agent-updater:16.1.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 From 9073de96a005e0c96147a005b59a54265f9c7ab1 Mon Sep 17 00:00:00 2001 From: fheinecke <23390735+fheinecke@users.noreply.github.com> Date: Tue, 6 Aug 2024 15:18:22 -0500 Subject: [PATCH 085/139] Add missing `entitlements` directory to container image builds (#45169) --- integrations/operator/Dockerfile | 1 + integrations/operator/Dockerfile.gha | 1 + integrations/teleport-spacelift-runner/Dockerfile | 1 + 3 files changed, 3 insertions(+) diff --git a/integrations/operator/Dockerfile b/integrations/operator/Dockerfile index 7b3177df67613..9c7652003b75e 100644 --- a/integrations/operator/Dockerfile +++ b/integrations/operator/Dockerfile @@ -58,6 +58,7 @@ RUN go mod download COPY *.go ./ COPY lib/ lib/ COPY gen/ gen/ +COPY entitlements/ entitlements/ COPY integrations/lib/embeddedtbot/ integrations/lib/embeddedtbot/ COPY integrations/operator/apis/ integrations/operator/apis/ COPY integrations/operator/controllers/ integrations/operator/controllers/ diff --git a/integrations/operator/Dockerfile.gha b/integrations/operator/Dockerfile.gha index e3810c4232f5b..dba764f0beed3 100644 --- a/integrations/operator/Dockerfile.gha +++ b/integrations/operator/Dockerfile.gha @@ -75,6 +75,7 @@ RUN go mod download COPY *.go ./ COPY lib/ lib/ COPY gen/ gen/ +COPY entitlements/ entitlements/ COPY integrations/lib/embeddedtbot/ integrations/lib/embeddedtbot/ COPY integrations/operator/apis/ integrations/operator/apis/ COPY integrations/operator/controllers/ integrations/operator/controllers/ diff --git a/integrations/teleport-spacelift-runner/Dockerfile b/integrations/teleport-spacelift-runner/Dockerfile index 6482e96742079..54624ab280e8e 100644 --- a/integrations/teleport-spacelift-runner/Dockerfile +++ b/integrations/teleport-spacelift-runner/Dockerfile @@ -20,6 +20,7 @@ COPY lib/ lib/ COPY api/ api/ COPY gen/ gen/ COPY build.assets/ build.assets/ +COPY entitlements/ entitlements/ COPY *.go ./ COPY Makefile Makefile COPY darwin-signing.mk darwin-signing.mk From 0919a6ddcdf9ba9c435fffc4a156bfb64d836c9a Mon Sep 17 00:00:00 2001 From: "STeve (Xin) Huang" Date: Tue, 6 Aug 2024 17:02:37 -0400 Subject: [PATCH 086/139] Remove hint from `tsh aws` (#45168) --- tool/tsh/common/app_local_proxy.go | 18 ++++-------------- tool/tsh/common/proxy.go | 5 +++++ 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/tool/tsh/common/app_local_proxy.go b/tool/tsh/common/app_local_proxy.go index ab7fba8de5a86..619a39859e608 100644 --- a/tool/tsh/common/app_local_proxy.go +++ b/tool/tsh/common/app_local_proxy.go @@ -60,10 +60,6 @@ func (a *localProxyApp) StartLocalProxy(ctx context.Context, opts ...alpnproxy.L if err := a.startLocalALPNProxy(ctx, a.port, false /*withTLS*/, opts...); err != nil { return trace.Wrap(err) } - - if a.port == "" { - fmt.Println("To avoid port randomization, you can choose the listening port using the --port flag.") - } return nil } @@ -72,10 +68,6 @@ func (a *localProxyApp) StartLocalProxyWithTLS(ctx context.Context, opts ...alpn if err := a.startLocalALPNProxy(ctx, a.port, true /*withTLS*/, opts...); err != nil { return trace.Wrap(err) } - - if a.port == "" { - fmt.Println("To avoid port randomization, you can choose the listening port using the --port flag.") - } return nil } @@ -88,10 +80,6 @@ func (a *localProxyApp) StartLocalProxyWithForwarder(ctx context.Context, forwar if err := a.startLocalForwardProxy(ctx, a.port, forwardMatcher); err != nil { return trace.Wrap(err) } - - if a.port == "" { - fmt.Println("To avoid port randomization, you can choose the listening port using the --port flag.") - } return nil } @@ -154,8 +142,6 @@ func (a *localProxyApp) startLocalALPNProxy(ctx context.Context, port string, wi return trace.Wrap(err) } - fmt.Printf("Proxying connections to %s on %v\n", a.appInfo.RouteToApp.Name, a.localALPNProxy.GetAddr()) - go func() { if err = a.localALPNProxy.Start(ctx); err != nil { log.WithError(err).Errorf("Failed to start local ALPN proxy.") @@ -206,3 +192,7 @@ func (a *localProxyApp) startLocalForwardProxy(ctx context.Context, port string, }() return nil } + +func (a *localProxyApp) GetAddr() string { + return a.localALPNProxy.GetAddr() +} diff --git a/tool/tsh/common/proxy.go b/tool/tsh/common/proxy.go index 53866dede32ec..fca65feafb46d 100644 --- a/tool/tsh/common/proxy.go +++ b/tool/tsh/common/proxy.go @@ -396,6 +396,11 @@ func onProxyCommandApp(cf *CLIConf) error { return trace.Wrap(err) } + fmt.Printf("Proxying connections to %s on %v\n", cf.AppName, proxyApp.GetAddr()) + if cf.LocalProxyPort == "" { + fmt.Println("To avoid port randomization, you can choose the listening port using the --port flag.") + } + defer func() { if err := proxyApp.Close(); err != nil { log.WithError(err).Error("Failed to close app proxy.") From a7847e5e01e7a9e184d5c51bad58202a779a5715 Mon Sep 17 00:00:00 2001 From: Zac Bergquist Date: Tue, 6 Aug 2024 15:03:21 -0600 Subject: [PATCH 087/139] integrations: build with -trimpath option (#45092) --- integrations/access/common.mk | 2 +- integrations/event-handler/Makefile | 6 +++--- integrations/operator/Makefile | 2 +- integrations/terraform/Makefile | 5 +++-- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/integrations/access/common.mk b/integrations/access/common.mk index ac3f39f158219..ee77ce7fa380a 100644 --- a/integrations/access/common.mk +++ b/integrations/access/common.mk @@ -6,7 +6,7 @@ VERSION ?= $(shell go run ../../hack/get-version/get-version.go) BUILDDIR ?= build BINARY = $(BUILDDIR)/teleport-$(ACCESS_PLUGIN) ADDFLAGS ?= -BUILDFLAGS ?= $(ADDFLAGS) -ldflags "-w -s" +BUILDFLAGS ?= $(ADDFLAGS) -trimpath -ldflags "-w -s" CGOFLAG ?= CGO_ENABLED=0 OS ?= $(shell go env GOOS) diff --git a/integrations/event-handler/Makefile b/integrations/event-handler/Makefile index 1cb18389d8002..f4fd8850d1a1e 100644 --- a/integrations/event-handler/Makefile +++ b/integrations/event-handler/Makefile @@ -17,7 +17,7 @@ BINARY = $(BUILDDIR)/teleport-event-handler GITREF ?= $(shell git describe --dirty --long --tags --match '$(VERSION)') ADDFLAGS ?= -BUILDFLAGS ?= $(ADDFLAGS) -ldflags "-w -s -X main.Gitref=$(GITREF) -X main.Version=$(VERSION)" +BUILDFLAGS ?= $(ADDFLAGS) -trimpath -ldflags "-w -s -X main.Gitref=$(GITREF) -X main.Version=$(VERSION)" CGOFLAG ?= CGO_ENABLED=0 PASS ?= 1234 @@ -58,7 +58,7 @@ release: build tar -czf $(RELEASE).tar.gz $(RELEASE_NAME) rm -rf $(RELEASE_NAME)/ @echo "---> Created $(RELEASE).tar.gz." - + .PHONY: clean clean: @@ -96,7 +96,7 @@ configure: build .PHONY: fluentd fluentd: - docker run -p 8888:8888 -v $(LOCALDIR)tmp:/keys -v $(LOCALDIR)tmp/fluent.conf:/fluentd/etc/fluent.conf fluent/fluentd:edge + docker run -p 8888:8888 -v $(LOCALDIR)tmp:/keys -v $(LOCALDIR)tmp/fluent.conf:/fluentd/etc/fluent.conf fluent/fluentd:edge .PHONY: example example: build diff --git a/integrations/operator/Makefile b/integrations/operator/Makefile index cfecfdf34410a..c27a2ac19ac85 100644 --- a/integrations/operator/Makefile +++ b/integrations/operator/Makefile @@ -127,7 +127,7 @@ crdgen-test: ## Run crdgen tests. .PHONY: build build: generate fmt vet ## Build manager binary. - go build -o bin/manager main.go namespace.go config.go + go build -trimpath -o bin/manager main.go namespace.go config.go .PHONY: run run: manifests generate fmt vet ## Run a controller from your host. diff --git a/integrations/terraform/Makefile b/integrations/terraform/Makefile index d835003c1afc9..6e4a7ef7f7ac5 100644 --- a/integrations/terraform/Makefile +++ b/integrations/terraform/Makefile @@ -7,7 +7,8 @@ BUILDDIR ?= build TFDIR ?= example ADDFLAGS ?= -BUILDFLAGS ?= $(ADDFLAGS) -ldflags '-w -s' +BUILDFLAGS ?= $(ADDFLAGS) -trimpath -ldflags '-w -s' +# CGO must NOT be enabled as hashicorp cloud does not support running providers using on CGO. CGOFLAG ?= CGO_ENABLED=0 RELEASE = terraform-provider-teleport-v$(VERSION)-$(OS)-$(ARCH)-bin @@ -166,4 +167,4 @@ $(LOCALBIN): bin/tfplugindocs: go.mod $(LOCALBIN) mkdir -p bin - GOBIN=$(LOCALBIN) go install github.com/hashicorp/terraform-plugin-docs/cmd/tfplugindocs \ No newline at end of file + GOBIN=$(LOCALBIN) go install github.com/hashicorp/terraform-plugin-docs/cmd/tfplugindocs From b7b867588808879c7e066572691688990e76bf25 Mon Sep 17 00:00:00 2001 From: fheinecke <23390735+fheinecke@users.noreply.github.com> Date: Tue, 6 Aug 2024 17:14:55 -0500 Subject: [PATCH 088/139] Release 16.1.3 (#45173) --- CHANGELOG.md | 3 +- Makefile | 2 +- api/version.go | 2 +- .../macos/tsh/tsh.app/Contents/Info.plist | 4 +- .../macos/tshdev/tsh.app/Contents/Info.plist | 4 +- examples/chart/access/discord/Chart.yaml | 2 +- .../__snapshot__/configmap_test.yaml.snap | 4 +- .../__snapshot__/deployment_test.yaml.snap | 8 +-- examples/chart/access/email/Chart.yaml | 2 +- .../__snapshot__/configmap_test.yaml.snap | 24 +++---- .../__snapshot__/deployment_test.yaml.snap | 58 ++++++++-------- examples/chart/access/jira/Chart.yaml | 2 +- .../__snapshot__/configmap_test.yaml.snap | 4 +- .../__snapshot__/deployment_test.yaml.snap | 8 +-- examples/chart/access/mattermost/Chart.yaml | 2 +- .../__snapshot__/configmap_test.yaml.snap | 4 +- .../__snapshot__/deployment_test.yaml.snap | 28 ++++---- examples/chart/access/msteams/Chart.yaml | 2 +- .../__snapshot__/configmap_test.yaml.snap | 4 +- .../__snapshot__/deployment_test.yaml.snap | 8 +-- examples/chart/access/pagerduty/Chart.yaml | 2 +- .../__snapshot__/configmap_test.yaml.snap | 4 +- .../__snapshot__/deployment_test.yaml.snap | 8 +-- examples/chart/access/slack/Chart.yaml | 2 +- .../__snapshot__/configmap_test.yaml.snap | 4 +- .../__snapshot__/deployment_test.yaml.snap | 8 +-- examples/chart/event-handler/Chart.yaml | 2 +- .../__snapshot__/configmap_test.yaml.snap | 4 +- .../__snapshot__/deployment_test.yaml.snap | 6 +- examples/chart/teleport-cluster/Chart.yaml | 2 +- .../charts/teleport-operator/Chart.yaml | 2 +- .../auth_clusterrole_test.yaml.snap | 4 +- .../__snapshot__/auth_config_test.yaml.snap | 4 +- .../auth_deployment_test.yaml.snap | 8 +-- .../__snapshot__/proxy_config_test.yaml.snap | 4 +- .../proxy_deployment_test.yaml.snap | 36 +++++----- examples/chart/teleport-kube-agent/Chart.yaml | 2 +- .../__snapshot__/deployment_test.yaml.snap | 60 ++++++++--------- .../tests/__snapshot__/job_test.yaml.snap | 8 +-- .../__snapshot__/statefulset_test.yaml.snap | 66 +++++++++---------- .../updater_deployment_test.yaml.snap | 4 +- 41 files changed, 208 insertions(+), 207 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b0dbebb65e723..839c7dbd556ab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,8 @@ # Changelog -## 16.1.2 (08/06/24) +## 16.1.3 (08/06/24) +* Fixed an issue where `tsh aws` may display extra text in addition to the original command output. [#45168](https://github.com/gravitational/teleport/pull/45168) * Fixed regression that denied access to launch some Apps. [#45149](https://github.com/gravitational/teleport/pull/45149) * Bot resources now honor their `metadata.expires` field. [#45130](https://github.com/gravitational/teleport/pull/45130) * Teleport Connect now sets `TERM_PROGRAM: Teleport_Connect` and `TERM_PROGRAM_VERSION: ` environment variables in the integrated terminal. [#45063](https://github.com/gravitational/teleport/pull/45063) diff --git a/Makefile b/Makefile index 53ca097012218..82fc23fd6cda3 100644 --- a/Makefile +++ b/Makefile @@ -11,7 +11,7 @@ # Stable releases: "1.0.0" # Pre-releases: "1.0.0-alpha.1", "1.0.0-beta.2", "1.0.0-rc.3" # Master/dev branch: "1.0.0-dev" -VERSION=16.1.2 +VERSION=16.1.3 DOCKER_IMAGE ?= teleport diff --git a/api/version.go b/api/version.go index 33b633f896a39..eb819d19e100f 100644 --- a/api/version.go +++ b/api/version.go @@ -3,6 +3,6 @@ package api import "github.com/coreos/go-semver/semver" -const Version = "16.1.2" +const Version = "16.1.3" var SemVersion = semver.New(Version) diff --git a/build.assets/macos/tsh/tsh.app/Contents/Info.plist b/build.assets/macos/tsh/tsh.app/Contents/Info.plist index 4b25dfd8f2926..e15dc0f763b56 100644 --- a/build.assets/macos/tsh/tsh.app/Contents/Info.plist +++ b/build.assets/macos/tsh/tsh.app/Contents/Info.plist @@ -19,13 +19,13 @@ CFBundlePackageType APPL CFBundleShortVersionString - 16.1.2 + 16.1.3 CFBundleSupportedPlatforms MacOSX CFBundleVersion - 16.1.2 + 16.1.3 DTCompiler com.apple.compilers.llvm.clang.1_0 DTPlatformBuild diff --git a/build.assets/macos/tshdev/tsh.app/Contents/Info.plist b/build.assets/macos/tshdev/tsh.app/Contents/Info.plist index 9fd43e2c58843..74ecc83d7d76d 100644 --- a/build.assets/macos/tshdev/tsh.app/Contents/Info.plist +++ b/build.assets/macos/tshdev/tsh.app/Contents/Info.plist @@ -17,13 +17,13 @@ CFBundlePackageType APPL CFBundleShortVersionString - 16.1.2 + 16.1.3 CFBundleSupportedPlatforms MacOSX CFBundleVersion - 16.1.2 + 16.1.3 DTCompiler com.apple.compilers.llvm.clang.1_0 DTPlatformBuild diff --git a/examples/chart/access/discord/Chart.yaml b/examples/chart/access/discord/Chart.yaml index d525146d9415c..de05448997fff 100644 --- a/examples/chart/access/discord/Chart.yaml +++ b/examples/chart/access/discord/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "16.1.2" +.version: &version "16.1.3" apiVersion: v2 name: teleport-plugin-discord diff --git a/examples/chart/access/discord/tests/__snapshot__/configmap_test.yaml.snap b/examples/chart/access/discord/tests/__snapshot__/configmap_test.yaml.snap index 239939cc2084e..fc0ed497fb876 100644 --- a/examples/chart/access/discord/tests/__snapshot__/configmap_test.yaml.snap +++ b/examples/chart/access/discord/tests/__snapshot__/configmap_test.yaml.snap @@ -24,6 +24,6 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-discord - app.kubernetes.io/version: 16.1.2 - helm.sh/chart: teleport-plugin-discord-16.1.2 + app.kubernetes.io/version: 16.1.3 + helm.sh/chart: teleport-plugin-discord-16.1.3 name: RELEASE-NAME-teleport-plugin-discord diff --git a/examples/chart/access/discord/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/access/discord/tests/__snapshot__/deployment_test.yaml.snap index da15dee9085db..935608ea166e5 100644 --- a/examples/chart/access/discord/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/access/discord/tests/__snapshot__/deployment_test.yaml.snap @@ -7,8 +7,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-discord - app.kubernetes.io/version: 16.1.2 - helm.sh/chart: teleport-plugin-discord-16.1.2 + app.kubernetes.io/version: 16.1.3 + helm.sh/chart: teleport-plugin-discord-16.1.3 name: RELEASE-NAME-teleport-plugin-discord spec: replicas: 1 @@ -22,8 +22,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-discord - app.kubernetes.io/version: 16.1.2 - helm.sh/chart: teleport-plugin-discord-16.1.2 + app.kubernetes.io/version: 16.1.3 + helm.sh/chart: teleport-plugin-discord-16.1.3 spec: containers: - command: diff --git a/examples/chart/access/email/Chart.yaml b/examples/chart/access/email/Chart.yaml index 991cc880092df..66a3d2b868999 100644 --- a/examples/chart/access/email/Chart.yaml +++ b/examples/chart/access/email/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "16.1.2" +.version: &version "16.1.3" apiVersion: v2 name: teleport-plugin-email diff --git a/examples/chart/access/email/tests/__snapshot__/configmap_test.yaml.snap b/examples/chart/access/email/tests/__snapshot__/configmap_test.yaml.snap index 8719bc7aa0dcc..401f23015d490 100644 --- a/examples/chart/access/email/tests/__snapshot__/configmap_test.yaml.snap +++ b/examples/chart/access/email/tests/__snapshot__/configmap_test.yaml.snap @@ -26,8 +26,8 @@ should match the snapshot (mailgun on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.2 - helm.sh/chart: teleport-plugin-email-16.1.2 + app.kubernetes.io/version: 16.1.3 + helm.sh/chart: teleport-plugin-email-16.1.3 name: RELEASE-NAME-teleport-plugin-email should match the snapshot (smtp on): 1: | @@ -59,8 +59,8 @@ should match the snapshot (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.2 - helm.sh/chart: teleport-plugin-email-16.1.2 + app.kubernetes.io/version: 16.1.3 + helm.sh/chart: teleport-plugin-email-16.1.3 name: RELEASE-NAME-teleport-plugin-email should match the snapshot (smtp on, no starttls): 1: | @@ -92,8 +92,8 @@ should match the snapshot (smtp on, no starttls): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.2 - helm.sh/chart: teleport-plugin-email-16.1.2 + app.kubernetes.io/version: 16.1.3 + helm.sh/chart: teleport-plugin-email-16.1.3 name: RELEASE-NAME-teleport-plugin-email should match the snapshot (smtp on, password file): 1: | @@ -125,8 +125,8 @@ should match the snapshot (smtp on, password file): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.2 - helm.sh/chart: teleport-plugin-email-16.1.2 + app.kubernetes.io/version: 16.1.3 + helm.sh/chart: teleport-plugin-email-16.1.3 name: RELEASE-NAME-teleport-plugin-email should match the snapshot (smtp on, roleToRecipients set): 1: | @@ -161,8 +161,8 @@ should match the snapshot (smtp on, roleToRecipients set): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.2 - helm.sh/chart: teleport-plugin-email-16.1.2 + app.kubernetes.io/version: 16.1.3 + helm.sh/chart: teleport-plugin-email-16.1.3 name: RELEASE-NAME-teleport-plugin-email should match the snapshot (smtp on, starttls disabled): 1: | @@ -194,6 +194,6 @@ should match the snapshot (smtp on, starttls disabled): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.2 - helm.sh/chart: teleport-plugin-email-16.1.2 + app.kubernetes.io/version: 16.1.3 + helm.sh/chart: teleport-plugin-email-16.1.3 name: RELEASE-NAME-teleport-plugin-email diff --git a/examples/chart/access/email/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/access/email/tests/__snapshot__/deployment_test.yaml.snap index f88d10a8da20c..dd02098718242 100644 --- a/examples/chart/access/email/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/access/email/tests/__snapshot__/deployment_test.yaml.snap @@ -7,8 +7,8 @@ should be possible to override volume name (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.2 - helm.sh/chart: teleport-plugin-email-16.1.2 + app.kubernetes.io/version: 16.1.3 + helm.sh/chart: teleport-plugin-email-16.1.3 name: RELEASE-NAME-teleport-plugin-email spec: replicas: 1 @@ -22,8 +22,8 @@ should be possible to override volume name (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.2 - helm.sh/chart: teleport-plugin-email-16.1.2 + app.kubernetes.io/version: 16.1.3 + helm.sh/chart: teleport-plugin-email-16.1.3 spec: containers: - command: @@ -34,7 +34,7 @@ should be possible to override volume name (smtp on): env: - name: TELEPORT_PLUGIN_FAIL_FAST value: "true" - image: public.ecr.aws/gravitational/teleport-plugin-email:16.1.2 + image: public.ecr.aws/gravitational/teleport-plugin-email:16.1.3 imagePullPolicy: IfNotPresent name: teleport-plugin-email ports: @@ -75,8 +75,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.2 - helm.sh/chart: teleport-plugin-email-16.1.2 + app.kubernetes.io/version: 16.1.3 + helm.sh/chart: teleport-plugin-email-16.1.3 name: RELEASE-NAME-teleport-plugin-email spec: replicas: 1 @@ -90,8 +90,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.2 - helm.sh/chart: teleport-plugin-email-16.1.2 + app.kubernetes.io/version: 16.1.3 + helm.sh/chart: teleport-plugin-email-16.1.3 spec: containers: - command: @@ -136,8 +136,8 @@ should match the snapshot (mailgun on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.2 - helm.sh/chart: teleport-plugin-email-16.1.2 + app.kubernetes.io/version: 16.1.3 + helm.sh/chart: teleport-plugin-email-16.1.3 name: RELEASE-NAME-teleport-plugin-email spec: replicas: 1 @@ -151,8 +151,8 @@ should match the snapshot (mailgun on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.2 - helm.sh/chart: teleport-plugin-email-16.1.2 + app.kubernetes.io/version: 16.1.3 + helm.sh/chart: teleport-plugin-email-16.1.3 spec: containers: - command: @@ -163,7 +163,7 @@ should match the snapshot (mailgun on): env: - name: TELEPORT_PLUGIN_FAIL_FAST value: "true" - image: public.ecr.aws/gravitational/teleport-plugin-email:16.1.2 + image: public.ecr.aws/gravitational/teleport-plugin-email:16.1.3 imagePullPolicy: IfNotPresent name: teleport-plugin-email ports: @@ -204,8 +204,8 @@ should match the snapshot (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.2 - helm.sh/chart: teleport-plugin-email-16.1.2 + app.kubernetes.io/version: 16.1.3 + helm.sh/chart: teleport-plugin-email-16.1.3 name: RELEASE-NAME-teleport-plugin-email spec: replicas: 1 @@ -219,8 +219,8 @@ should match the snapshot (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.2 - helm.sh/chart: teleport-plugin-email-16.1.2 + app.kubernetes.io/version: 16.1.3 + helm.sh/chart: teleport-plugin-email-16.1.3 spec: containers: - command: @@ -231,7 +231,7 @@ should match the snapshot (smtp on): env: - name: TELEPORT_PLUGIN_FAIL_FAST value: "true" - image: public.ecr.aws/gravitational/teleport-plugin-email:16.1.2 + image: public.ecr.aws/gravitational/teleport-plugin-email:16.1.3 imagePullPolicy: IfNotPresent name: teleport-plugin-email ports: @@ -272,8 +272,8 @@ should mount external secret (mailgun on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.2 - helm.sh/chart: teleport-plugin-email-16.1.2 + app.kubernetes.io/version: 16.1.3 + helm.sh/chart: teleport-plugin-email-16.1.3 name: RELEASE-NAME-teleport-plugin-email spec: replicas: 1 @@ -287,8 +287,8 @@ should mount external secret (mailgun on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.2 - helm.sh/chart: teleport-plugin-email-16.1.2 + app.kubernetes.io/version: 16.1.3 + helm.sh/chart: teleport-plugin-email-16.1.3 spec: containers: - command: @@ -299,7 +299,7 @@ should mount external secret (mailgun on): env: - name: TELEPORT_PLUGIN_FAIL_FAST value: "true" - image: public.ecr.aws/gravitational/teleport-plugin-email:16.1.2 + image: public.ecr.aws/gravitational/teleport-plugin-email:16.1.3 imagePullPolicy: IfNotPresent name: teleport-plugin-email ports: @@ -340,8 +340,8 @@ should mount external secret (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.2 - helm.sh/chart: teleport-plugin-email-16.1.2 + app.kubernetes.io/version: 16.1.3 + helm.sh/chart: teleport-plugin-email-16.1.3 name: RELEASE-NAME-teleport-plugin-email spec: replicas: 1 @@ -355,8 +355,8 @@ should mount external secret (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.2 - helm.sh/chart: teleport-plugin-email-16.1.2 + app.kubernetes.io/version: 16.1.3 + helm.sh/chart: teleport-plugin-email-16.1.3 spec: containers: - command: @@ -367,7 +367,7 @@ should mount external secret (smtp on): env: - name: TELEPORT_PLUGIN_FAIL_FAST value: "true" - image: public.ecr.aws/gravitational/teleport-plugin-email:16.1.2 + image: public.ecr.aws/gravitational/teleport-plugin-email:16.1.3 imagePullPolicy: IfNotPresent name: teleport-plugin-email ports: diff --git a/examples/chart/access/jira/Chart.yaml b/examples/chart/access/jira/Chart.yaml index 698bb5abe6650..b5c5393646f31 100644 --- a/examples/chart/access/jira/Chart.yaml +++ b/examples/chart/access/jira/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "16.1.2" +.version: &version "16.1.3" apiVersion: v2 name: teleport-plugin-jira diff --git a/examples/chart/access/jira/tests/__snapshot__/configmap_test.yaml.snap b/examples/chart/access/jira/tests/__snapshot__/configmap_test.yaml.snap index 760a80053601b..e040a2385d065 100644 --- a/examples/chart/access/jira/tests/__snapshot__/configmap_test.yaml.snap +++ b/examples/chart/access/jira/tests/__snapshot__/configmap_test.yaml.snap @@ -32,6 +32,6 @@ should match the snapshot (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-jira - app.kubernetes.io/version: 16.1.2 - helm.sh/chart: teleport-plugin-jira-16.1.2 + app.kubernetes.io/version: 16.1.3 + helm.sh/chart: teleport-plugin-jira-16.1.3 name: RELEASE-NAME-teleport-plugin-jira diff --git a/examples/chart/access/jira/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/access/jira/tests/__snapshot__/deployment_test.yaml.snap index 7db411eeaf210..98e35425f302a 100644 --- a/examples/chart/access/jira/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/access/jira/tests/__snapshot__/deployment_test.yaml.snap @@ -7,8 +7,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-jira - app.kubernetes.io/version: 16.1.2 - helm.sh/chart: teleport-plugin-jira-16.1.2 + app.kubernetes.io/version: 16.1.3 + helm.sh/chart: teleport-plugin-jira-16.1.3 name: RELEASE-NAME-teleport-plugin-jira spec: replicas: 1 @@ -22,8 +22,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-jira - app.kubernetes.io/version: 16.1.2 - helm.sh/chart: teleport-plugin-jira-16.1.2 + app.kubernetes.io/version: 16.1.3 + helm.sh/chart: teleport-plugin-jira-16.1.3 spec: containers: - command: diff --git a/examples/chart/access/mattermost/Chart.yaml b/examples/chart/access/mattermost/Chart.yaml index 0a7b66ec578d7..831c4364e4f26 100644 --- a/examples/chart/access/mattermost/Chart.yaml +++ b/examples/chart/access/mattermost/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "16.1.2" +.version: &version "16.1.3" apiVersion: v2 name: teleport-plugin-mattermost diff --git a/examples/chart/access/mattermost/tests/__snapshot__/configmap_test.yaml.snap b/examples/chart/access/mattermost/tests/__snapshot__/configmap_test.yaml.snap index 2175794a6b17c..37e7abd61a8de 100644 --- a/examples/chart/access/mattermost/tests/__snapshot__/configmap_test.yaml.snap +++ b/examples/chart/access/mattermost/tests/__snapshot__/configmap_test.yaml.snap @@ -22,6 +22,6 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-mattermost - app.kubernetes.io/version: 16.1.2 - helm.sh/chart: teleport-plugin-mattermost-16.1.2 + app.kubernetes.io/version: 16.1.3 + helm.sh/chart: teleport-plugin-mattermost-16.1.3 name: RELEASE-NAME-teleport-plugin-mattermost diff --git a/examples/chart/access/mattermost/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/access/mattermost/tests/__snapshot__/deployment_test.yaml.snap index 7075756f9f50c..bdfece8c6cccb 100644 --- a/examples/chart/access/mattermost/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/access/mattermost/tests/__snapshot__/deployment_test.yaml.snap @@ -7,8 +7,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-mattermost - app.kubernetes.io/version: 16.1.2 - helm.sh/chart: teleport-plugin-mattermost-16.1.2 + app.kubernetes.io/version: 16.1.3 + helm.sh/chart: teleport-plugin-mattermost-16.1.3 name: RELEASE-NAME-teleport-plugin-mattermost spec: replicas: 1 @@ -22,8 +22,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-mattermost - app.kubernetes.io/version: 16.1.2 - helm.sh/chart: teleport-plugin-mattermost-16.1.2 + app.kubernetes.io/version: 16.1.3 + helm.sh/chart: teleport-plugin-mattermost-16.1.3 spec: containers: - command: @@ -75,8 +75,8 @@ should mount external secret: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-mattermost - app.kubernetes.io/version: 16.1.2 - helm.sh/chart: teleport-plugin-mattermost-16.1.2 + app.kubernetes.io/version: 16.1.3 + helm.sh/chart: teleport-plugin-mattermost-16.1.3 name: RELEASE-NAME-teleport-plugin-mattermost spec: replicas: 1 @@ -90,8 +90,8 @@ should mount external secret: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-mattermost - app.kubernetes.io/version: 16.1.2 - helm.sh/chart: teleport-plugin-mattermost-16.1.2 + app.kubernetes.io/version: 16.1.3 + helm.sh/chart: teleport-plugin-mattermost-16.1.3 spec: containers: - command: @@ -102,7 +102,7 @@ should mount external secret: env: - name: TELEPORT_PLUGIN_FAIL_FAST value: "true" - image: public.ecr.aws/gravitational/teleport-plugin-mattermost:16.1.2 + image: public.ecr.aws/gravitational/teleport-plugin-mattermost:16.1.3 imagePullPolicy: IfNotPresent name: teleport-plugin-mattermost ports: @@ -143,8 +143,8 @@ should override volume name: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-mattermost - app.kubernetes.io/version: 16.1.2 - helm.sh/chart: teleport-plugin-mattermost-16.1.2 + app.kubernetes.io/version: 16.1.3 + helm.sh/chart: teleport-plugin-mattermost-16.1.3 name: RELEASE-NAME-teleport-plugin-mattermost spec: replicas: 1 @@ -158,8 +158,8 @@ should override volume name: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-mattermost - app.kubernetes.io/version: 16.1.2 - helm.sh/chart: teleport-plugin-mattermost-16.1.2 + app.kubernetes.io/version: 16.1.3 + helm.sh/chart: teleport-plugin-mattermost-16.1.3 spec: containers: - command: @@ -170,7 +170,7 @@ should override volume name: env: - name: TELEPORT_PLUGIN_FAIL_FAST value: "true" - image: public.ecr.aws/gravitational/teleport-plugin-mattermost:16.1.2 + image: public.ecr.aws/gravitational/teleport-plugin-mattermost:16.1.3 imagePullPolicy: IfNotPresent name: teleport-plugin-mattermost ports: diff --git a/examples/chart/access/msteams/Chart.yaml b/examples/chart/access/msteams/Chart.yaml index b355de85beccd..4c6bad6a80354 100644 --- a/examples/chart/access/msteams/Chart.yaml +++ b/examples/chart/access/msteams/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "16.1.2" +.version: &version "16.1.3" apiVersion: v2 name: teleport-plugin-msteams diff --git a/examples/chart/access/msteams/tests/__snapshot__/configmap_test.yaml.snap b/examples/chart/access/msteams/tests/__snapshot__/configmap_test.yaml.snap index e467976e80936..004281e21abb3 100644 --- a/examples/chart/access/msteams/tests/__snapshot__/configmap_test.yaml.snap +++ b/examples/chart/access/msteams/tests/__snapshot__/configmap_test.yaml.snap @@ -29,6 +29,6 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-msteams - app.kubernetes.io/version: 16.1.2 - helm.sh/chart: teleport-plugin-msteams-16.1.2 + app.kubernetes.io/version: 16.1.3 + helm.sh/chart: teleport-plugin-msteams-16.1.3 name: RELEASE-NAME-teleport-plugin-msteams diff --git a/examples/chart/access/msteams/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/access/msteams/tests/__snapshot__/deployment_test.yaml.snap index 142a28374a1f4..74eabf138da4c 100644 --- a/examples/chart/access/msteams/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/access/msteams/tests/__snapshot__/deployment_test.yaml.snap @@ -7,8 +7,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-msteams - app.kubernetes.io/version: 16.1.2 - helm.sh/chart: teleport-plugin-msteams-16.1.2 + app.kubernetes.io/version: 16.1.3 + helm.sh/chart: teleport-plugin-msteams-16.1.3 name: RELEASE-NAME-teleport-plugin-msteams spec: replicas: 1 @@ -22,8 +22,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-msteams - app.kubernetes.io/version: 16.1.2 - helm.sh/chart: teleport-plugin-msteams-16.1.2 + app.kubernetes.io/version: 16.1.3 + helm.sh/chart: teleport-plugin-msteams-16.1.3 spec: containers: - command: diff --git a/examples/chart/access/pagerduty/Chart.yaml b/examples/chart/access/pagerduty/Chart.yaml index f73c0f728f25e..8d1b8167a4e03 100644 --- a/examples/chart/access/pagerduty/Chart.yaml +++ b/examples/chart/access/pagerduty/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "16.1.2" +.version: &version "16.1.3" apiVersion: v2 name: teleport-plugin-pagerduty diff --git a/examples/chart/access/pagerduty/tests/__snapshot__/configmap_test.yaml.snap b/examples/chart/access/pagerduty/tests/__snapshot__/configmap_test.yaml.snap index 1f7aa86e4ad84..1aba2798e7659 100644 --- a/examples/chart/access/pagerduty/tests/__snapshot__/configmap_test.yaml.snap +++ b/examples/chart/access/pagerduty/tests/__snapshot__/configmap_test.yaml.snap @@ -21,6 +21,6 @@ should match the snapshot (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-pagerduty - app.kubernetes.io/version: 16.1.2 - helm.sh/chart: teleport-plugin-pagerduty-16.1.2 + app.kubernetes.io/version: 16.1.3 + helm.sh/chart: teleport-plugin-pagerduty-16.1.3 name: RELEASE-NAME-teleport-plugin-pagerduty diff --git a/examples/chart/access/pagerduty/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/access/pagerduty/tests/__snapshot__/deployment_test.yaml.snap index 4b72a31adb51c..7c119794511b7 100644 --- a/examples/chart/access/pagerduty/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/access/pagerduty/tests/__snapshot__/deployment_test.yaml.snap @@ -7,8 +7,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-pagerduty - app.kubernetes.io/version: 16.1.2 - helm.sh/chart: teleport-plugin-pagerduty-16.1.2 + app.kubernetes.io/version: 16.1.3 + helm.sh/chart: teleport-plugin-pagerduty-16.1.3 name: RELEASE-NAME-teleport-plugin-pagerduty spec: replicas: 1 @@ -22,8 +22,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-pagerduty - app.kubernetes.io/version: 16.1.2 - helm.sh/chart: teleport-plugin-pagerduty-16.1.2 + app.kubernetes.io/version: 16.1.3 + helm.sh/chart: teleport-plugin-pagerduty-16.1.3 spec: containers: - command: diff --git a/examples/chart/access/slack/Chart.yaml b/examples/chart/access/slack/Chart.yaml index 3b8e9c375b037..6b18646958d38 100644 --- a/examples/chart/access/slack/Chart.yaml +++ b/examples/chart/access/slack/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "16.1.2" +.version: &version "16.1.3" apiVersion: v2 name: teleport-plugin-slack diff --git a/examples/chart/access/slack/tests/__snapshot__/configmap_test.yaml.snap b/examples/chart/access/slack/tests/__snapshot__/configmap_test.yaml.snap index e227b7f6305b0..8be48392122fa 100644 --- a/examples/chart/access/slack/tests/__snapshot__/configmap_test.yaml.snap +++ b/examples/chart/access/slack/tests/__snapshot__/configmap_test.yaml.snap @@ -24,6 +24,6 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-slack - app.kubernetes.io/version: 16.1.2 - helm.sh/chart: teleport-plugin-slack-16.1.2 + app.kubernetes.io/version: 16.1.3 + helm.sh/chart: teleport-plugin-slack-16.1.3 name: RELEASE-NAME-teleport-plugin-slack diff --git a/examples/chart/access/slack/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/access/slack/tests/__snapshot__/deployment_test.yaml.snap index 8ed2f3cc52fa8..78dfb05a609f5 100644 --- a/examples/chart/access/slack/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/access/slack/tests/__snapshot__/deployment_test.yaml.snap @@ -7,8 +7,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-slack - app.kubernetes.io/version: 16.1.2 - helm.sh/chart: teleport-plugin-slack-16.1.2 + app.kubernetes.io/version: 16.1.3 + helm.sh/chart: teleport-plugin-slack-16.1.3 name: RELEASE-NAME-teleport-plugin-slack spec: replicas: 1 @@ -22,8 +22,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-slack - app.kubernetes.io/version: 16.1.2 - helm.sh/chart: teleport-plugin-slack-16.1.2 + app.kubernetes.io/version: 16.1.3 + helm.sh/chart: teleport-plugin-slack-16.1.3 spec: containers: - command: diff --git a/examples/chart/event-handler/Chart.yaml b/examples/chart/event-handler/Chart.yaml index bd942675f3d9b..8d31a13d2a770 100644 --- a/examples/chart/event-handler/Chart.yaml +++ b/examples/chart/event-handler/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "16.1.2" +.version: &version "16.1.3" apiVersion: v2 name: teleport-plugin-event-handler diff --git a/examples/chart/event-handler/tests/__snapshot__/configmap_test.yaml.snap b/examples/chart/event-handler/tests/__snapshot__/configmap_test.yaml.snap index 358b5d49b2672..4f27386980baf 100644 --- a/examples/chart/event-handler/tests/__snapshot__/configmap_test.yaml.snap +++ b/examples/chart/event-handler/tests/__snapshot__/configmap_test.yaml.snap @@ -26,6 +26,6 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-event-handler - app.kubernetes.io/version: 16.1.2 - helm.sh/chart: teleport-plugin-event-handler-16.1.2 + app.kubernetes.io/version: 16.1.3 + helm.sh/chart: teleport-plugin-event-handler-16.1.3 name: RELEASE-NAME-teleport-plugin-event-handler diff --git a/examples/chart/event-handler/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/event-handler/tests/__snapshot__/deployment_test.yaml.snap index 9b292463cbd88..1704858d75c76 100644 --- a/examples/chart/event-handler/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/event-handler/tests/__snapshot__/deployment_test.yaml.snap @@ -7,8 +7,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-event-handler - app.kubernetes.io/version: 16.1.2 - helm.sh/chart: teleport-plugin-event-handler-16.1.2 + app.kubernetes.io/version: 16.1.3 + helm.sh/chart: teleport-plugin-event-handler-16.1.3 name: RELEASE-NAME-teleport-plugin-event-handler spec: replicas: 1 @@ -82,7 +82,7 @@ should mount tls.existingCASecretName and set environment when set in values: value: "true" - name: SSL_CERT_FILE value: /etc/teleport-tls-ca/ca.pem - image: public.ecr.aws/gravitational/teleport-plugin-event-handler:16.1.2 + image: public.ecr.aws/gravitational/teleport-plugin-event-handler:16.1.3 imagePullPolicy: IfNotPresent name: teleport-plugin-event-handler ports: diff --git a/examples/chart/teleport-cluster/Chart.yaml b/examples/chart/teleport-cluster/Chart.yaml index 6255c59b8e497..228bfe689442a 100644 --- a/examples/chart/teleport-cluster/Chart.yaml +++ b/examples/chart/teleport-cluster/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "16.1.2" +.version: &version "16.1.3" name: teleport-cluster apiVersion: v2 diff --git a/examples/chart/teleport-cluster/charts/teleport-operator/Chart.yaml b/examples/chart/teleport-cluster/charts/teleport-operator/Chart.yaml index 19c7b58ebe9ff..9be5168385b9b 100644 --- a/examples/chart/teleport-cluster/charts/teleport-operator/Chart.yaml +++ b/examples/chart/teleport-cluster/charts/teleport-operator/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "16.1.2" +.version: &version "16.1.3" name: teleport-operator apiVersion: v2 diff --git a/examples/chart/teleport-cluster/tests/__snapshot__/auth_clusterrole_test.yaml.snap b/examples/chart/teleport-cluster/tests/__snapshot__/auth_clusterrole_test.yaml.snap index 4af862adf4f12..7d3a8e45adeec 100644 --- a/examples/chart/teleport-cluster/tests/__snapshot__/auth_clusterrole_test.yaml.snap +++ b/examples/chart/teleport-cluster/tests/__snapshot__/auth_clusterrole_test.yaml.snap @@ -8,8 +8,8 @@ adds operator permissions to ClusterRole: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-cluster - app.kubernetes.io/version: 16.1.2 - helm.sh/chart: teleport-cluster-16.1.2 + app.kubernetes.io/version: 16.1.3 + helm.sh/chart: teleport-cluster-16.1.3 teleport.dev/majorVersion: "16" name: RELEASE-NAME rules: diff --git a/examples/chart/teleport-cluster/tests/__snapshot__/auth_config_test.yaml.snap b/examples/chart/teleport-cluster/tests/__snapshot__/auth_config_test.yaml.snap index 810add5d46309..d7f36ddd1a261 100644 --- a/examples/chart/teleport-cluster/tests/__snapshot__/auth_config_test.yaml.snap +++ b/examples/chart/teleport-cluster/tests/__snapshot__/auth_config_test.yaml.snap @@ -1848,8 +1848,8 @@ sets clusterDomain on Configmap: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-cluster - app.kubernetes.io/version: 16.1.2 - helm.sh/chart: teleport-cluster-16.1.2 + app.kubernetes.io/version: 16.1.3 + helm.sh/chart: teleport-cluster-16.1.3 teleport.dev/majorVersion: "16" name: RELEASE-NAME-auth namespace: NAMESPACE diff --git a/examples/chart/teleport-cluster/tests/__snapshot__/auth_deployment_test.yaml.snap b/examples/chart/teleport-cluster/tests/__snapshot__/auth_deployment_test.yaml.snap index 1952a94a3f846..488acb7aac065 100644 --- a/examples/chart/teleport-cluster/tests/__snapshot__/auth_deployment_test.yaml.snap +++ b/examples/chart/teleport-cluster/tests/__snapshot__/auth_deployment_test.yaml.snap @@ -8,7 +8,7 @@ - args: - --diag-addr=0.0.0.0:3000 - --apply-on-startup=/etc/teleport/apply-on-startup.yaml - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -141,7 +141,7 @@ should set nodeSelector when set in values: - args: - --diag-addr=0.0.0.0:3000 - --apply-on-startup=/etc/teleport/apply-on-startup.yaml - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -238,7 +238,7 @@ should set resources when set in values: - args: - --diag-addr=0.0.0.0:3000 - --apply-on-startup=/etc/teleport/apply-on-startup.yaml - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -324,7 +324,7 @@ should set securityContext when set in values: - args: - --diag-addr=0.0.0.0:3000 - --apply-on-startup=/etc/teleport/apply-on-startup.yaml - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent lifecycle: preStop: diff --git a/examples/chart/teleport-cluster/tests/__snapshot__/proxy_config_test.yaml.snap b/examples/chart/teleport-cluster/tests/__snapshot__/proxy_config_test.yaml.snap index d31f915b2fde3..03c53484e0ea7 100644 --- a/examples/chart/teleport-cluster/tests/__snapshot__/proxy_config_test.yaml.snap +++ b/examples/chart/teleport-cluster/tests/__snapshot__/proxy_config_test.yaml.snap @@ -567,8 +567,8 @@ sets clusterDomain on Configmap: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-cluster - app.kubernetes.io/version: 16.1.2 - helm.sh/chart: teleport-cluster-16.1.2 + app.kubernetes.io/version: 16.1.3 + helm.sh/chart: teleport-cluster-16.1.3 teleport.dev/majorVersion: "16" name: RELEASE-NAME-proxy namespace: NAMESPACE diff --git a/examples/chart/teleport-cluster/tests/__snapshot__/proxy_deployment_test.yaml.snap b/examples/chart/teleport-cluster/tests/__snapshot__/proxy_deployment_test.yaml.snap index cb7268ea16d44..ba1aa765db91b 100644 --- a/examples/chart/teleport-cluster/tests/__snapshot__/proxy_deployment_test.yaml.snap +++ b/examples/chart/teleport-cluster/tests/__snapshot__/proxy_deployment_test.yaml.snap @@ -11,8 +11,8 @@ sets clusterDomain on Deployment Pods: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-cluster - app.kubernetes.io/version: 16.1.2 - helm.sh/chart: teleport-cluster-16.1.2 + app.kubernetes.io/version: 16.1.3 + helm.sh/chart: teleport-cluster-16.1.3 teleport.dev/majorVersion: "16" name: RELEASE-NAME-proxy namespace: NAMESPACE @@ -26,7 +26,7 @@ sets clusterDomain on Deployment Pods: template: metadata: annotations: - checksum/config: a8bb2cc565a16c17a5ac388f49043bd6c6a3596251c3a03e0372efc969dae1b8 + checksum/config: 27f3e0c146b5a67ee8e4dce0e1e3c2dba3bb77b96a19d2f9db4cf9ebdb9687ac kubernetes.io/pod: test-annotation kubernetes.io/pod-different: 4 labels: @@ -34,8 +34,8 @@ sets clusterDomain on Deployment Pods: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-cluster - app.kubernetes.io/version: 16.1.2 - helm.sh/chart: teleport-cluster-16.1.2 + app.kubernetes.io/version: 16.1.3 + helm.sh/chart: teleport-cluster-16.1.3 teleport.dev/majorVersion: "16" spec: affinity: @@ -44,7 +44,7 @@ sets clusterDomain on Deployment Pods: containers: - args: - --diag-addr=0.0.0.0:3000 - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -105,7 +105,7 @@ sets clusterDomain on Deployment Pods: - wait - no-resolve - RELEASE-NAME-auth-v15.NAMESPACE.svc.test.com - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 name: wait-auth-update serviceAccountName: RELEASE-NAME-proxy terminationGracePeriodSeconds: 60 @@ -137,7 +137,7 @@ should provision initContainer correctly when set in values: - wait - no-resolve - RELEASE-NAME-auth-v15.NAMESPACE.svc.cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 name: wait-auth-update resources: limits: @@ -201,7 +201,7 @@ should set nodeSelector when set in values: containers: - args: - --diag-addr=0.0.0.0:3000 - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -262,7 +262,7 @@ should set nodeSelector when set in values: - wait - no-resolve - RELEASE-NAME-auth-v15.NAMESPACE.svc.cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 name: wait-auth-update nodeSelector: environment: security @@ -313,7 +313,7 @@ should set resources for wait-auth-update initContainer when set in values: containers: - args: - --diag-addr=0.0.0.0:3000 - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -381,7 +381,7 @@ should set resources for wait-auth-update initContainer when set in values: - wait - no-resolve - RELEASE-NAME-auth-v15.NAMESPACE.svc.cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 name: wait-auth-update resources: limits: @@ -421,7 +421,7 @@ should set resources when set in values: containers: - args: - --diag-addr=0.0.0.0:3000 - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -489,7 +489,7 @@ should set resources when set in values: - wait - no-resolve - RELEASE-NAME-auth-v15.NAMESPACE.svc.cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 name: wait-auth-update resources: limits: @@ -529,7 +529,7 @@ should set securityContext for initContainers when set in values: containers: - args: - --diag-addr=0.0.0.0:3000 - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -597,7 +597,7 @@ should set securityContext for initContainers when set in values: - wait - no-resolve - RELEASE-NAME-auth-v15.NAMESPACE.svc.cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 name: wait-auth-update securityContext: allowPrivilegeEscalation: false @@ -637,7 +637,7 @@ should set securityContext when set in values: containers: - args: - --diag-addr=0.0.0.0:3000 - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -705,7 +705,7 @@ should set securityContext when set in values: - wait - no-resolve - RELEASE-NAME-auth-v15.NAMESPACE.svc.cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 name: wait-auth-update securityContext: allowPrivilegeEscalation: false diff --git a/examples/chart/teleport-kube-agent/Chart.yaml b/examples/chart/teleport-kube-agent/Chart.yaml index 2deb546cc1ebb..15ef43977f851 100644 --- a/examples/chart/teleport-kube-agent/Chart.yaml +++ b/examples/chart/teleport-kube-agent/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "16.1.2" +.version: &version "16.1.3" name: teleport-kube-agent apiVersion: v2 diff --git a/examples/chart/teleport-kube-agent/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/teleport-kube-agent/tests/__snapshot__/deployment_test.yaml.snap index 60af46e6e4649..3e5d7feddac61 100644 --- a/examples/chart/teleport-kube-agent/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/teleport-kube-agent/tests/__snapshot__/deployment_test.yaml.snap @@ -32,7 +32,7 @@ sets Deployment annotations when specified if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -109,7 +109,7 @@ sets Deployment labels when specified if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -173,7 +173,7 @@ sets Pod annotations when specified if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -237,7 +237,7 @@ sets Pod labels when specified if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -322,7 +322,7 @@ should add emptyDir for data when existingDataVolume is not set if action is Upg value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -387,7 +387,7 @@ should add insecureSkipProxyTLSVerify to args when set in values if action is Up value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -451,7 +451,7 @@ should correctly configure existingDataVolume when set if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -513,7 +513,7 @@ should expose diag port if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -589,7 +589,7 @@ should have multiple replicas when replicaCount is set (using .replicaCount, dep value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -665,7 +665,7 @@ should have multiple replicas when replicaCount is set (using highAvailability.r value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -729,7 +729,7 @@ should have one replica when replicaCount is not set if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -793,7 +793,7 @@ should mount extraVolumes and extraVolumeMounts if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -862,7 +862,7 @@ should mount jamfCredentialsSecret if it already exists and when role is jamf an value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -932,7 +932,7 @@ should mount jamfCredentialsSecret.name when role is jamf and action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1004,7 +1004,7 @@ should mount tls.existingCASecretName and set environment when set in values if value: cluster.local - name: SSL_CERT_FILE value: /etc/teleport-tls-ca/ca.pem - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1078,7 +1078,7 @@ should mount tls.existingCASecretName and set extra environment when set in valu value: http://username:password@my.proxy.host:3128 - name: SSL_CERT_FILE value: /etc/teleport-tls-ca/ca.pem - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1148,7 +1148,7 @@ should provision initContainer correctly when set in values if action is Upgrade value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1270,7 +1270,7 @@ should set affinity when set in values if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1334,7 +1334,7 @@ should set default serviceAccountName when not set in values if action is Upgrad value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1411,7 +1411,7 @@ should set environment when extraEnv set in values if action is Upgrade: value: cluster.local - name: HTTPS_PROXY value: http://username:password@my.proxy.host:3128 - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1539,7 +1539,7 @@ should set imagePullPolicy when set in values if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: Always livenessProbe: failureThreshold: 6 @@ -1603,7 +1603,7 @@ should set nodeSelector if set in values if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1669,7 +1669,7 @@ should set not set priorityClassName when not set in values if action is Upgrade value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1745,7 +1745,7 @@ should set preferred affinity when more than one replica is used if action is Up value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1809,7 +1809,7 @@ should set priorityClassName when set in values if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1874,7 +1874,7 @@ should set probeTimeoutSeconds when set in values if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1948,7 +1948,7 @@ should set required affinity when highAvailability.requireAntiAffinity is set if value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2012,7 +2012,7 @@ should set resources when set in values if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2083,7 +2083,7 @@ should set serviceAccountName when set in values if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2147,7 +2147,7 @@ should set tolerations when set in values if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 diff --git a/examples/chart/teleport-kube-agent/tests/__snapshot__/job_test.yaml.snap b/examples/chart/teleport-kube-agent/tests/__snapshot__/job_test.yaml.snap index 0d0e0ff8e7c25..b5b9953db5995 100644 --- a/examples/chart/teleport-kube-agent/tests/__snapshot__/job_test.yaml.snap +++ b/examples/chart/teleport-kube-agent/tests/__snapshot__/job_test.yaml.snap @@ -25,7 +25,7 @@ should create ServiceAccount for post-delete hook by default: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent name: post-delete-job securityContext: @@ -106,7 +106,7 @@ should not create ServiceAccount for post-delete hook if serviceAccount.create i fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent name: post-delete-job securityContext: @@ -136,7 +136,7 @@ should not create ServiceAccount, Role or RoleBinding for post-delete hook if se fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent name: post-delete-job securityContext: @@ -166,7 +166,7 @@ should set nodeSelector in post-delete hook: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent name: post-delete-job securityContext: diff --git a/examples/chart/teleport-kube-agent/tests/__snapshot__/statefulset_test.yaml.snap b/examples/chart/teleport-kube-agent/tests/__snapshot__/statefulset_test.yaml.snap index 7ace953952179..24beaf8c94a6a 100644 --- a/examples/chart/teleport-kube-agent/tests/__snapshot__/statefulset_test.yaml.snap +++ b/examples/chart/teleport-kube-agent/tests/__snapshot__/statefulset_test.yaml.snap @@ -16,7 +16,7 @@ sets Pod annotations when specified: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -86,7 +86,7 @@ sets Pod labels when specified: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -180,7 +180,7 @@ sets StatefulSet labels when specified: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -282,7 +282,7 @@ should add insecureSkipProxyTLSVerify to args when set in values: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -352,7 +352,7 @@ should add volumeClaimTemplate for data volume when using StatefulSet and action fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -442,7 +442,7 @@ should add volumeClaimTemplate for data volume when using StatefulSet and is Fre fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -522,7 +522,7 @@ should add volumeMount for data volume when using StatefulSet: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -592,7 +592,7 @@ should expose diag port: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -662,7 +662,7 @@ should generate Statefulset when storage is disabled and mode is a Upgrade: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -746,7 +746,7 @@ should have multiple replicas when replicaCount is set (using .replicaCount, dep fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -828,7 +828,7 @@ should have multiple replicas when replicaCount is set (using highAvailability.r fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -898,7 +898,7 @@ should have one replica when replicaCount is not set: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -968,7 +968,7 @@ should install Statefulset when storage is disabled and mode is a Fresh Install: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1040,7 +1040,7 @@ should mount extraVolumes and extraVolumeMounts: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1115,7 +1115,7 @@ should mount jamfCredentialsSecret if it already exists and when role is jamf: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1193,7 +1193,7 @@ should mount jamfCredentialsSecret.name when role is jamf: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1273,7 +1273,7 @@ should mount tls.existingCASecretName and set environment when set in values: value: RELEASE-NAME - name: SSL_CERT_FILE value: /etc/teleport-tls-ca/ca.pem - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1355,7 +1355,7 @@ should mount tls.existingCASecretName and set extra environment when set in valu value: /etc/teleport-tls-ca/ca.pem - name: HTTPS_PROXY value: http://username:password@my.proxy.host:3128 - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1433,7 +1433,7 @@ should not add emptyDir for data when using StatefulSet: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1503,7 +1503,7 @@ should provision initContainer correctly when set in values: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1631,7 +1631,7 @@ should set affinity when set in values: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1701,7 +1701,7 @@ should set default serviceAccountName when not set in values: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1784,7 +1784,7 @@ should set environment when extraEnv set in values: value: RELEASE-NAME - name: HTTPS_PROXY value: http://username:password@my.proxy.host:3128 - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1924,7 +1924,7 @@ should set imagePullPolicy when set in values: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: Always livenessProbe: failureThreshold: 6 @@ -1994,7 +1994,7 @@ should set nodeSelector if set in values: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2078,7 +2078,7 @@ should set preferred affinity when more than one replica is used: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2148,7 +2148,7 @@ should set probeTimeoutSeconds when set in values: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2228,7 +2228,7 @@ should set required affinity when highAvailability.requireAntiAffinity is set: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2298,7 +2298,7 @@ should set resources when set in values: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2375,7 +2375,7 @@ should set serviceAccountName when set in values: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2445,7 +2445,7 @@ should set storage.requests when set in values and action is an Upgrade: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2515,7 +2515,7 @@ should set storage.storageClassName when set in values and action is an Upgrade: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2585,7 +2585,7 @@ should set tolerations when set in values: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.2 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 diff --git a/examples/chart/teleport-kube-agent/tests/__snapshot__/updater_deployment_test.yaml.snap b/examples/chart/teleport-kube-agent/tests/__snapshot__/updater_deployment_test.yaml.snap index 540492c9b1bbe..9d428347464c3 100644 --- a/examples/chart/teleport-kube-agent/tests/__snapshot__/updater_deployment_test.yaml.snap +++ b/examples/chart/teleport-kube-agent/tests/__snapshot__/updater_deployment_test.yaml.snap @@ -27,7 +27,7 @@ sets the affinity: - --base-image=public.ecr.aws/gravitational/teleport-distroless - --version-server=https://my-custom-version-server/v1 - --version-channel=custom/preview - image: public.ecr.aws/gravitational/teleport-kube-agent-updater:16.1.2 + image: public.ecr.aws/gravitational/teleport-kube-agent-updater:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -73,7 +73,7 @@ sets the tolerations: - --base-image=public.ecr.aws/gravitational/teleport-distroless - --version-server=https://my-custom-version-server/v1 - --version-channel=custom/preview - image: public.ecr.aws/gravitational/teleport-kube-agent-updater:16.1.2 + image: public.ecr.aws/gravitational/teleport-kube-agent-updater:16.1.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 From dcb09753bc98871c4e740df903e0dc06b84b2ce7 Mon Sep 17 00:00:00 2001 From: "teleport-post-release-automation[bot]" <128860004+teleport-post-release-automation[bot]@users.noreply.github.com> Date: Wed, 7 Aug 2024 03:59:12 +0000 Subject: [PATCH 089/139] [auto] docs: Update version to v16.1.3 (#45184) Co-authored-by: GitHub --- docs/config.json | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/config.json b/docs/config.json index 627c021c6fd3b..2b980ff9ef6cf 100644 --- a/docs/config.json +++ b/docs/config.json @@ -1614,18 +1614,18 @@ "teleport": { "git": "api/14.0.0-gd1e081e", "major_version": "16", - "version": "16.1.1", + "version": "16.1.3", "url": "teleport.example.com", "golang": "1.22", "plugin": { - "version": "16.1.1" + "version": "16.1.3" }, "helm_repo_url": "https://charts.releases.teleport.dev", - "latest_oss_docker_image": "public.ecr.aws/gravitational/teleport-distroless:16.1.1", - "latest_oss_debug_docker_image": "public.ecr.aws/gravitational/teleport-distroless-debug:16.1.1", - "latest_ent_docker_image": "public.ecr.aws/gravitational/teleport-ent-distroless:16.1.1", - "latest_ent_debug_docker_image": "public.ecr.aws/gravitational/teleport-ent-distroless-debug:16.1.1", - "teleport_install_script_url": "https://cdn.teleport.dev/install-v16.1.1.sh" + "latest_oss_docker_image": "public.ecr.aws/gravitational/teleport-distroless:16.1.3", + "latest_oss_debug_docker_image": "public.ecr.aws/gravitational/teleport-distroless-debug:16.1.3", + "latest_ent_docker_image": "public.ecr.aws/gravitational/teleport-ent-distroless:16.1.3", + "latest_ent_debug_docker_image": "public.ecr.aws/gravitational/teleport-ent-distroless-debug:16.1.3", + "teleport_install_script_url": "https://cdn.teleport.dev/install-v16.1.3.sh" }, "terraform": { "version": "1.0.0" @@ -2823,9 +2823,9 @@ "permanent": true }, { - "source": "/getting-started/", - "destination": "/deploy-a-cluster/linux-demo/", - "permanent": true + "source": "/getting-started/", + "destination": "/deploy-a-cluster/linux-demo/", + "permanent": true }, { "source": "/database-access/guides/snowflake/", From fbb7352a2cb7ff29d2c37103b1a510eb145b525d Mon Sep 17 00:00:00 2001 From: Steven Martin Date: Wed, 7 Aug 2024 09:08:04 -0400 Subject: [PATCH 090/139] docs: update device trust macos tsh version (#45177) Co-authored-by: Steven Martin --- docs/pages/includes/device-trust/prereqs.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/pages/includes/device-trust/prereqs.mdx b/docs/pages/includes/device-trust/prereqs.mdx index 3eab789b4cdf9..046cfd9fbcc1d 100644 --- a/docs/pages/includes/device-trust/prereqs.mdx +++ b/docs/pages/includes/device-trust/prereqs.mdx @@ -1,5 +1,5 @@ - To enroll a macOS device, you need: - - A signed and notarized `tsh` binary, v12.0.0 or newer. + - A signed and notarized `tsh` binary. [Download the macOS tsh installer](../../installation.mdx#macos). - To enroll a Windows device, you need: - A device with TPM 2.0. From 8ef8219cbbe53bc21a91a81c100208cbd61889cb Mon Sep 17 00:00:00 2001 From: Tiago Silva Date: Wed, 7 Aug 2024 14:22:01 +0100 Subject: [PATCH 091/139] [aws_matchers] validate aws regions (#45136) This PR introduces validation to AWS regions in Access Graph Matchers. It will prevent creating or updating discovery_configs with incorrect regions. Signed-off-by: Tiago Silva --- .../discoveryconfig/discoveryconfig_test.go | 63 +++++++++++++++++++ api/types/matchers_accessgraph.go | 8 +++ 2 files changed, 71 insertions(+) diff --git a/api/types/discoveryconfig/discoveryconfig_test.go b/api/types/discoveryconfig/discoveryconfig_test.go index f9f0d252ac994..1f963a8fc21ab 100644 --- a/api/types/discoveryconfig/discoveryconfig_test.go +++ b/api/types/discoveryconfig/discoveryconfig_test.go @@ -245,6 +245,69 @@ func TestNewDiscoveryConfig(t *testing.T) { }, errCheck: require.NoError, }, + { + name: "tag aws sync with invalid region", + inMetadata: header.Metadata{ + Name: "my-first-dc", + }, + inSpec: Spec{ + DiscoveryGroup: "dg1", + AccessGraph: &types.AccessGraphSync{ + AWS: []*types.AccessGraphAWSSync{ + { + Integration: "1234", + AssumeRole: &types.AssumeRole{ + RoleARN: "arn:aws:iam::123456789012:role/teleport", + }, + Regions: []string{"us&-west-2"}, + }, + }, + }, + }, + errCheck: require.Error, + }, + { + name: "tag aws sync with empty region", + inMetadata: header.Metadata{ + Name: "my-first-dc", + }, + inSpec: Spec{ + DiscoveryGroup: "dg1", + AccessGraph: &types.AccessGraphSync{ + AWS: []*types.AccessGraphAWSSync{ + { + Integration: "1234", + AssumeRole: &types.AssumeRole{ + RoleARN: "arn:aws:iam::123456789012:role/teleport", + }, + Regions: []string{""}, + }, + }, + }, + }, + errCheck: require.Error, + }, + { + name: "tag aws sync with region not set", + inMetadata: header.Metadata{ + Name: "my-first-dc", + }, + inSpec: Spec{ + DiscoveryGroup: "dg1", + AccessGraph: &types.AccessGraphSync{ + AWS: []*types.AccessGraphAWSSync{ + { + Integration: "1234", + AssumeRole: &types.AssumeRole{ + RoleARN: "arn:aws:iam::123456789012:role/teleport", + }, + Regions: nil, + }, + }, + }, + }, + errCheck: require.Error, + }, { name: "fills in kube matcher default values", inMetadata: header.Metadata{ diff --git a/api/types/matchers_accessgraph.go b/api/types/matchers_accessgraph.go index b76e8bc494eda..2ba6961c88680 100644 --- a/api/types/matchers_accessgraph.go +++ b/api/types/matchers_accessgraph.go @@ -18,6 +18,8 @@ package types import ( "github.com/gravitational/trace" + + awsapiutils "github.com/gravitational/teleport/api/utils/aws" ) // CheckAndSetDefaults that the matcher is correct and adds default values. @@ -34,5 +36,11 @@ func (a *AccessGraphAWSSync) CheckAndSetDefaults() error { if len(a.Regions) == 0 { return trace.BadParameter("discovery service requires at least one region") } + + for _, region := range a.Regions { + if err := awsapiutils.IsValidRegion(region); err != nil { + return trace.BadParameter("discovery service does not support region %q", region) + } + } return nil } From c64b7abb4414a1e747e81a66ab73f8b174167915 Mon Sep 17 00:00:00 2001 From: Alan Parra Date: Wed, 7 Aug 2024 11:12:39 -0300 Subject: [PATCH 092/139] chore: Bump Go to 1.22.6 (#45194) --- build.assets/tooling/go.mod | 4 +--- build.assets/versions.mk | 2 +- go.mod | 4 +--- integrations/event-handler/go.mod | 4 +--- integrations/terraform/go.mod | 4 +--- 5 files changed, 5 insertions(+), 13 deletions(-) diff --git a/build.assets/tooling/go.mod b/build.assets/tooling/go.mod index 9fd458855809e..a87982eff201a 100644 --- a/build.assets/tooling/go.mod +++ b/build.assets/tooling/go.mod @@ -1,8 +1,6 @@ module github.com/gravitational/teleport/build.assets/tooling -go 1.22.0 - -toolchain go1.22.5 +go 1.22.6 require ( github.com/Masterminds/sprig/v3 v3.2.3 diff --git a/build.assets/versions.mk b/build.assets/versions.mk index 97ed484afcb20..4fe1e22612231 100644 --- a/build.assets/versions.mk +++ b/build.assets/versions.mk @@ -3,7 +3,7 @@ # Keep versions in sync with devbox.json, when applicable. # Sync with devbox.json. -GOLANG_VERSION ?= go1.22.5 +GOLANG_VERSION ?= go1.22.6 GOLANGCI_LINT_VERSION ?= v1.59.1 NODE_VERSION ?= 20.14.0 diff --git a/go.mod b/go.mod index 6f440c82ea5f5..82db07045e7fd 100644 --- a/go.mod +++ b/go.mod @@ -1,8 +1,6 @@ module github.com/gravitational/teleport -go 1.22.0 - -toolchain go1.22.5 +go 1.22.6 require ( cloud.google.com/go/cloudsqlconn v1.9.0 diff --git a/integrations/event-handler/go.mod b/integrations/event-handler/go.mod index fb652fab3ad3e..4da0cb1e93f6a 100644 --- a/integrations/event-handler/go.mod +++ b/integrations/event-handler/go.mod @@ -1,8 +1,6 @@ module github.com/gravitational/teleport/integrations/event-handler -go 1.22.0 - -toolchain go1.22.5 +go 1.22.6 require ( github.com/alecthomas/kong v0.9.0 diff --git a/integrations/terraform/go.mod b/integrations/terraform/go.mod index 3f039a0a084c1..a9dd05a4748b9 100644 --- a/integrations/terraform/go.mod +++ b/integrations/terraform/go.mod @@ -1,8 +1,6 @@ module github.com/gravitational/teleport/integrations/terraform -go 1.22.0 - -toolchain go1.22.5 +go 1.22.6 // Doc generation tooling require github.com/hashicorp/terraform-plugin-docs v0.0.0 // replaced From 929a5c5407638dbc3c65464ec0b0d317403f8947 Mon Sep 17 00:00:00 2001 From: Andrew LeFevre Date: Wed, 7 Aug 2024 10:16:38 -0400 Subject: [PATCH 093/139] [v16] fix some events not getting converted to AuditEvents correctly (#45066) * fix some events not getting converted to AuditEvents correctly * test converting events --------- Co-authored-by: Andrew LeFevre --- lib/events/api.go | 3 + lib/events/codes.go | 3 +- lib/events/dynamic.go | 23 +++-- lib/events/events_test.go | 205 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 225 insertions(+), 9 deletions(-) diff --git a/lib/events/api.go b/lib/events/api.go index 7998ada4c120a..46b58ad844828 100644 --- a/lib/events/api.go +++ b/lib/events/api.go @@ -788,6 +788,9 @@ const ( IntegrationDeleteEvent = "integration.delete" ) +// Add an entry to eventsMap in lib/events/events_test.go when you add +// a new event name here. + const ( // MaxChunkBytes defines the maximum size of a session stream chunk that // can be requested via AuditLog.GetSessionChunk(). Set to 5MB diff --git a/lib/events/codes.go b/lib/events/codes.go index dd804ed38f749..425be76b3406f 100644 --- a/lib/events/codes.go +++ b/lib/events/codes.go @@ -39,7 +39,8 @@ type Event struct { // - Suffix code with one of these letters: I (info), W (warn), E (error). // // After defining an event code, make sure to keep -// `web/packages/teleport/src/services/audit/types.ts` in sync. +// `web/packages/teleport/src/services/audit/types.ts` in sync and add an +// entry in the `eventsMap` in `lib/events/events_test.go`. const ( // UserLocalLoginCode is the successful local user login event code. UserLocalLoginCode = "T1000I" diff --git a/lib/events/dynamic.go b/lib/events/dynamic.go index c23bf5527568f..29787eff14067 100644 --- a/lib/events/dynamic.go +++ b/lib/events/dynamic.go @@ -383,24 +383,31 @@ func FromEventFields(fields EventFields) (events.AuditEvent, error) { case UnknownEvent: e = &events.Unknown{} - case CassandraBatchEventCode: + case DatabaseSessionCassandraBatchEvent: e = &events.CassandraBatch{} - case CassandraRegisterEventCode: + case DatabaseSessionCassandraRegisterEvent: e = &events.CassandraRegister{} - case CassandraPrepareEventCode: + case DatabaseSessionCassandraPrepareEvent: e = &events.CassandraPrepare{} - case CassandraExecuteEventCode: + case DatabaseSessionCassandraExecuteEvent: e = &events.CassandraExecute{} - case DiscoveryConfigCreateCode: + case DiscoveryConfigCreateEvent: e = &events.DiscoveryConfigCreate{} - case DiscoveryConfigUpdateCode: + case DiscoveryConfigUpdateEvent: e = &events.DiscoveryConfigUpdate{} - case DiscoveryConfigDeleteCode: + case DiscoveryConfigDeleteEvent: e = &events.DiscoveryConfigDelete{} - case DiscoveryConfigDeleteAllCode: + case DiscoveryConfigDeleteAllEvent: e = &events.DiscoveryConfigDeleteAll{} + case IntegrationCreateEvent: + e = &events.IntegrationCreate{} + case IntegrationUpdateEvent: + e = &events.IntegrationUpdate{} + case IntegrationDeleteEvent: + e = &events.IntegrationDelete{} + default: log.Errorf("Attempted to convert dynamic event of unknown type %q into protobuf event.", eventType) unknown := &events.Unknown{} diff --git a/lib/events/events_test.go b/lib/events/events_test.go index 4f8a9817a1dbd..afc82ac1f415b 100644 --- a/lib/events/events_test.go +++ b/lib/events/events_test.go @@ -20,6 +20,7 @@ package events import ( "encoding/json" + "fmt" "reflect" "testing" "time" @@ -30,6 +31,189 @@ import ( "github.com/gravitational/teleport/lib/utils" ) +// eventsMap maps event names to event types for testing. Be sure to update +// this map if you add a new event type. +var eventsMap = map[string]apievents.AuditEvent{ + SessionPrintEvent: &apievents.SessionPrint{}, + SessionStartEvent: &apievents.SessionStart{}, + SessionEndEvent: &apievents.SessionEnd{}, + SessionUploadEvent: &apievents.SessionUpload{}, + SessionJoinEvent: &apievents.SessionJoin{}, + SessionLeaveEvent: &apievents.SessionLeave{}, + SessionDataEvent: &apievents.SessionData{}, + ClientDisconnectEvent: &apievents.ClientDisconnect{}, + UserLoginEvent: &apievents.UserLogin{}, + UserDeleteEvent: &apievents.UserDelete{}, + UserCreateEvent: &apievents.UserCreate{}, + UserUpdatedEvent: &apievents.UserUpdate{}, + UserPasswordChangeEvent: &apievents.UserPasswordChange{}, + AccessRequestCreateEvent: &apievents.AccessRequestCreate{}, + AccessRequestReviewEvent: &apievents.AccessRequestCreate{}, + AccessRequestUpdateEvent: &apievents.AccessRequestCreate{}, + AccessRequestResourceSearch: &apievents.AccessRequestResourceSearch{}, + BillingCardCreateEvent: &apievents.BillingCardCreate{}, + BillingCardUpdateEvent: &apievents.BillingCardCreate{}, + BillingCardDeleteEvent: &apievents.BillingCardDelete{}, + BillingInformationUpdateEvent: &apievents.BillingInformationUpdate{}, + ResetPasswordTokenCreateEvent: &apievents.UserTokenCreate{}, + ExecEvent: &apievents.Exec{}, + SubsystemEvent: &apievents.Subsystem{}, + X11ForwardEvent: &apievents.X11Forward{}, + PortForwardEvent: &apievents.PortForward{}, + AuthAttemptEvent: &apievents.AuthAttempt{}, + SCPEvent: &apievents.SCP{}, + ResizeEvent: &apievents.Resize{}, + SessionCommandEvent: &apievents.SessionCommand{}, + SessionDiskEvent: &apievents.SessionDisk{}, + SessionNetworkEvent: &apievents.SessionNetwork{}, + RoleCreatedEvent: &apievents.RoleCreate{}, + RoleUpdatedEvent: &apievents.RoleUpdate{}, + RoleDeletedEvent: &apievents.RoleDelete{}, + TrustedClusterCreateEvent: &apievents.TrustedClusterCreate{}, + TrustedClusterDeleteEvent: &apievents.TrustedClusterDelete{}, + TrustedClusterTokenCreateEvent: &apievents.TrustedClusterTokenCreate{}, //nolint:staticcheck // SA1019. We want to test every event type, even if they're deprecated. + ProvisionTokenCreateEvent: &apievents.ProvisionTokenCreate{}, + GithubConnectorCreatedEvent: &apievents.GithubConnectorCreate{}, + GithubConnectorUpdatedEvent: &apievents.GithubConnectorUpdate{}, + GithubConnectorDeletedEvent: &apievents.GithubConnectorDelete{}, + OIDCConnectorCreatedEvent: &apievents.OIDCConnectorCreate{}, + OIDCConnectorUpdatedEvent: &apievents.OIDCConnectorUpdate{}, + OIDCConnectorDeletedEvent: &apievents.OIDCConnectorDelete{}, + SAMLConnectorCreatedEvent: &apievents.SAMLConnectorCreate{}, + SAMLConnectorUpdatedEvent: &apievents.SAMLConnectorUpdate{}, + SAMLConnectorDeletedEvent: &apievents.SAMLConnectorDelete{}, + SessionRejectedEvent: &apievents.SessionReject{}, + AppSessionStartEvent: &apievents.AppSessionStart{}, + AppSessionEndEvent: &apievents.AppSessionEnd{}, + AppSessionChunkEvent: &apievents.AppSessionChunk{}, + AppSessionRequestEvent: &apievents.AppSessionRequest{}, + AppSessionDynamoDBRequestEvent: &apievents.AppSessionDynamoDBRequest{}, + AppCreateEvent: &apievents.AppCreate{}, + AppUpdateEvent: &apievents.AppUpdate{}, + AppDeleteEvent: &apievents.AppDelete{}, + DatabaseCreateEvent: &apievents.DatabaseCreate{}, + DatabaseUpdateEvent: &apievents.DatabaseUpdate{}, + DatabaseDeleteEvent: &apievents.DatabaseDelete{}, + DatabaseSessionStartEvent: &apievents.DatabaseSessionStart{}, + DatabaseSessionEndEvent: &apievents.DatabaseSessionEnd{}, + DatabaseSessionQueryEvent: &apievents.DatabaseSessionQuery{}, + DatabaseSessionQueryFailedEvent: &apievents.DatabaseSessionQuery{}, + DatabaseSessionMalformedPacketEvent: &apievents.DatabaseSessionMalformedPacket{}, + DatabaseSessionPermissionsUpdateEvent: &apievents.DatabasePermissionUpdate{}, + DatabaseSessionUserCreateEvent: &apievents.DatabaseUserCreate{}, + DatabaseSessionUserDeactivateEvent: &apievents.DatabaseUserDeactivate{}, + DatabaseSessionPostgresParseEvent: &apievents.PostgresParse{}, + DatabaseSessionPostgresBindEvent: &apievents.PostgresBind{}, + DatabaseSessionPostgresExecuteEvent: &apievents.PostgresExecute{}, + DatabaseSessionPostgresCloseEvent: &apievents.PostgresClose{}, + DatabaseSessionPostgresFunctionEvent: &apievents.PostgresFunctionCall{}, + DatabaseSessionMySQLStatementPrepareEvent: &apievents.MySQLStatementPrepare{}, + DatabaseSessionMySQLStatementExecuteEvent: &apievents.MySQLStatementExecute{}, + DatabaseSessionMySQLStatementSendLongDataEvent: &apievents.MySQLStatementSendLongData{}, + DatabaseSessionMySQLStatementCloseEvent: &apievents.MySQLStatementClose{}, + DatabaseSessionMySQLStatementResetEvent: &apievents.MySQLStatementReset{}, + DatabaseSessionMySQLStatementFetchEvent: &apievents.MySQLStatementFetch{}, + DatabaseSessionMySQLStatementBulkExecuteEvent: &apievents.MySQLStatementBulkExecute{}, + DatabaseSessionMySQLInitDBEvent: &apievents.MySQLInitDB{}, + DatabaseSessionMySQLCreateDBEvent: &apievents.MySQLCreateDB{}, + DatabaseSessionMySQLDropDBEvent: &apievents.MySQLDropDB{}, + DatabaseSessionMySQLShutDownEvent: &apievents.MySQLShutDown{}, + DatabaseSessionMySQLProcessKillEvent: &apievents.MySQLProcessKill{}, + DatabaseSessionMySQLDebugEvent: &apievents.MySQLDebug{}, + DatabaseSessionMySQLRefreshEvent: &apievents.MySQLRefresh{}, + DatabaseSessionSQLServerRPCRequestEvent: &apievents.SQLServerRPCRequest{}, + DatabaseSessionElasticsearchRequestEvent: &apievents.ElasticsearchRequest{}, + DatabaseSessionOpenSearchRequestEvent: &apievents.OpenSearchRequest{}, + DatabaseSessionDynamoDBRequestEvent: &apievents.DynamoDBRequest{}, + KubeRequestEvent: &apievents.KubeRequest{}, + MFADeviceAddEvent: &apievents.MFADeviceAdd{}, + MFADeviceDeleteEvent: &apievents.MFADeviceDelete{}, + DeviceEvent: &apievents.DeviceEvent{}, + DeviceCreateEvent: &apievents.DeviceEvent2{}, + DeviceDeleteEvent: &apievents.DeviceEvent2{}, + DeviceUpdateEvent: &apievents.DeviceEvent2{}, + DeviceEnrollEvent: &apievents.DeviceEvent2{}, + DeviceAuthenticateEvent: &apievents.DeviceEvent2{}, + DeviceEnrollTokenCreateEvent: &apievents.DeviceEvent2{}, + DeviceWebTokenCreateEvent: &apievents.DeviceEvent2{}, + DeviceAuthenticateConfirmEvent: &apievents.DeviceEvent2{}, + LockCreatedEvent: &apievents.LockCreate{}, + LockDeletedEvent: &apievents.LockDelete{}, + RecoveryCodeGeneratedEvent: &apievents.RecoveryCodeGenerate{}, + RecoveryCodeUsedEvent: &apievents.RecoveryCodeUsed{}, + RecoveryTokenCreateEvent: &apievents.UserTokenCreate{}, + PrivilegeTokenCreateEvent: &apievents.UserTokenCreate{}, + WindowsDesktopSessionStartEvent: &apievents.WindowsDesktopSessionStart{}, + WindowsDesktopSessionEndEvent: &apievents.WindowsDesktopSessionEnd{}, + DesktopClipboardSendEvent: &apievents.DesktopClipboardSend{}, + DesktopClipboardReceiveEvent: &apievents.DesktopClipboardReceive{}, + SessionConnectEvent: &apievents.SessionConnect{}, + AccessRequestDeleteEvent: &apievents.AccessRequestDelete{}, + CertificateCreateEvent: &apievents.CertificateCreate{}, + RenewableCertificateGenerationMismatchEvent: &apievents.RenewableCertificateGenerationMismatch{}, + SFTPEvent: &apievents.SFTP{}, + UpgradeWindowStartUpdateEvent: &apievents.UpgradeWindowStartUpdate{}, + SessionRecordingAccessEvent: &apievents.SessionRecordingAccess{}, + SSMRunEvent: &apievents.SSMRun{}, + KubernetesClusterCreateEvent: &apievents.KubernetesClusterCreate{}, + KubernetesClusterUpdateEvent: &apievents.KubernetesClusterUpdate{}, + KubernetesClusterDeleteEvent: &apievents.KubernetesClusterDelete{}, + DesktopSharedDirectoryStartEvent: &apievents.DesktopSharedDirectoryStart{}, + DesktopSharedDirectoryReadEvent: &apievents.DesktopSharedDirectoryRead{}, + DesktopSharedDirectoryWriteEvent: &apievents.DesktopSharedDirectoryWrite{}, + BotJoinEvent: &apievents.BotJoin{}, + InstanceJoinEvent: &apievents.InstanceJoin{}, + BotCreateEvent: &apievents.BotCreate{}, + BotUpdateEvent: &apievents.BotUpdate{}, + BotDeleteEvent: &apievents.BotDelete{}, + LoginRuleCreateEvent: &apievents.LoginRuleCreate{}, + LoginRuleDeleteEvent: &apievents.LoginRuleDelete{}, + SAMLIdPAuthAttemptEvent: &apievents.SAMLIdPAuthAttempt{}, + SAMLIdPServiceProviderCreateEvent: &apievents.SAMLIdPServiceProviderCreate{}, + SAMLIdPServiceProviderUpdateEvent: &apievents.SAMLIdPServiceProviderUpdate{}, + SAMLIdPServiceProviderDeleteEvent: &apievents.SAMLIdPServiceProviderDelete{}, + SAMLIdPServiceProviderDeleteAllEvent: &apievents.SAMLIdPServiceProviderDeleteAll{}, + OktaGroupsUpdateEvent: &apievents.OktaResourcesUpdate{}, + OktaApplicationsUpdateEvent: &apievents.OktaResourcesUpdate{}, + OktaSyncFailureEvent: &apievents.OktaSyncFailure{}, + OktaAssignmentProcessEvent: &apievents.OktaAssignmentResult{}, + OktaAssignmentCleanupEvent: &apievents.OktaAssignmentResult{}, + OktaUserSyncEvent: &apievents.OktaUserSync{}, + OktaAccessListSyncEvent: &apievents.OktaAccessListSync{}, + AccessGraphAccessPathChangedEvent: &apievents.AccessPathChanged{}, + AccessListCreateEvent: &apievents.AccessListCreate{}, + AccessListUpdateEvent: &apievents.AccessListUpdate{}, + AccessListDeleteEvent: &apievents.AccessListDelete{}, + AccessListReviewEvent: &apievents.AccessListReview{}, + AccessListMemberCreateEvent: &apievents.AccessListMemberCreate{}, + AccessListMemberUpdateEvent: &apievents.AccessListMemberUpdate{}, + AccessListMemberDeleteEvent: &apievents.AccessListMemberDelete{}, + AccessListMemberDeleteAllForAccessListEvent: &apievents.AccessListMemberDeleteAllForAccessList{}, + SecReportsAuditQueryRunEvent: &apievents.AuditQueryRun{}, + SecReportsReportRunEvent: &apievents.SecurityReportRun{}, + ExternalAuditStorageEnableEvent: &apievents.ExternalAuditStorageEnable{}, + ExternalAuditStorageDisableEvent: &apievents.ExternalAuditStorageDisable{}, + CreateMFAAuthChallengeEvent: &apievents.CreateMFAAuthChallenge{}, + ValidateMFAAuthResponseEvent: &apievents.ValidateMFAAuthResponse{}, + SPIFFESVIDIssuedEvent: &apievents.SPIFFESVIDIssued{}, + AuthPreferenceUpdateEvent: &apievents.AuthPreferenceUpdate{}, + ClusterNetworkingConfigUpdateEvent: &apievents.ClusterNetworkingConfigUpdate{}, + SessionRecordingConfigUpdateEvent: &apievents.SessionRecordingConfigUpdate{}, + DatabaseSessionSpannerRPCEvent: &apievents.SpannerRPC{}, + UnknownEvent: &apievents.Unknown{}, + DatabaseSessionCassandraBatchEvent: &apievents.CassandraBatch{}, + DatabaseSessionCassandraRegisterEvent: &apievents.CassandraRegister{}, + DatabaseSessionCassandraPrepareEvent: &apievents.CassandraPrepare{}, + DatabaseSessionCassandraExecuteEvent: &apievents.CassandraExecute{}, + DiscoveryConfigCreateEvent: &apievents.DiscoveryConfigCreate{}, + DiscoveryConfigUpdateEvent: &apievents.DiscoveryConfigUpdate{}, + DiscoveryConfigDeleteEvent: &apievents.DiscoveryConfigDelete{}, + DiscoveryConfigDeleteAllEvent: &apievents.DiscoveryConfigDeleteAll{}, + IntegrationCreateEvent: &apievents.IntegrationCreate{}, + IntegrationUpdateEvent: &apievents.IntegrationUpdate{}, + IntegrationDeleteEvent: &apievents.IntegrationDelete{}, +} + // TestJSON tests JSON marshal events func TestJSON(t *testing.T) { type testCase struct { @@ -776,3 +960,24 @@ func TestJSON(t *testing.T) { }) } } + +// TestEvents tests that all events can be converted and processed correctly. +func TestEvents(t *testing.T) { + t.Parallel() + + for eventName, eventType := range eventsMap { + t.Run(fmt.Sprintf("%s OneOf", eventName), func(t *testing.T) { + converted, err := apievents.ToOneOf(eventType) + require.NoError(t, err, "failed to convert event type to OneOf, is the event type added to api/types/events/oneof.go?") + auditEvent, err := apievents.FromOneOf(*converted) + require.NoError(t, err, "failed to convert OneOf back to an Audit event") + require.IsType(t, eventType, auditEvent, "FromOneOf did not convert the event type correctly") + }) + + t.Run(fmt.Sprintf("%s EventFields", eventName), func(t *testing.T) { + auditEvent, err := FromEventFields(EventFields{EventType: eventName}) + require.NoError(t, err, "failed to convert EventFields to an Audit event, is the event type added to lib/events/dynamic.go?") + require.IsType(t, eventType, auditEvent, "FromEventFields did not convert the event type correctly") + }) + } +} From 7a7a5b594f493c666a53ba0e6716af67a65d2a41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Cie=C5=9Blak?= Date: Wed, 7 Aug 2024 17:38:09 +0200 Subject: [PATCH 094/139] Make sure ConfigService works in the browser (#45201) --- web/packages/teleterm/src/mainProcess/types.ts | 1 + .../teleterm/src/services/config/configService.ts | 7 ++++--- .../src/services/fileStorage/fileStorage.ts | 12 ++++++++++++ .../src/services/fileStorage/fileStorageClient.ts | 14 ++++++++++++++ .../src/services/fileStorage/fixtures/mocks.ts | 6 +++++- 5 files changed, 36 insertions(+), 4 deletions(-) diff --git a/web/packages/teleterm/src/mainProcess/types.ts b/web/packages/teleterm/src/mainProcess/types.ts index be48373f056c2..78683cd1067d6 100644 --- a/web/packages/teleterm/src/mainProcess/types.ts +++ b/web/packages/teleterm/src/mainProcess/types.ts @@ -243,6 +243,7 @@ export enum FileStorageEventType { Write = 'Write', Replace = 'Replace', GetFilePath = 'GetFilePath', + GetFileName = 'GetFileName', GetFileLoadingError = 'GetFileLoadingError', } diff --git a/web/packages/teleterm/src/services/config/configService.ts b/web/packages/teleterm/src/services/config/configService.ts index 986f75747fac0..56310749bd237 100644 --- a/web/packages/teleterm/src/services/config/configService.ts +++ b/web/packages/teleterm/src/services/config/configService.ts @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -import path from 'path'; - import { z, ZodIssue } from 'zod'; import zodToJsonSchema from 'zod-to-json-schema'; @@ -64,6 +62,9 @@ export interface ConfigService { getConfigError(): ConfigError | undefined; } +// createConfigService must return a client that works both in the browser and in Node.js, as the +// returned service is used both in the main process and in Storybook to provide a fake +// implementation of config service. export function createConfigService({ configFile, jsonSchemaFile, @@ -124,7 +125,7 @@ function updateJsonSchema({ schema.extend({ $schema: z.string() }), { $refStrategy: 'none' } ); - const jsonSchemaFileName = path.basename(jsonSchemaFile.getFilePath()); + const jsonSchemaFileName = jsonSchemaFile.getFileName(); const jsonSchemaFileNameInConfig = configFile.get('$schema'); jsonSchemaFile.replace(jsonSchema); diff --git a/web/packages/teleterm/src/services/fileStorage/fileStorage.ts b/web/packages/teleterm/src/services/fileStorage/fileStorage.ts index 350de5edbd973..994db45a0e610 100644 --- a/web/packages/teleterm/src/services/fileStorage/fileStorage.ts +++ b/web/packages/teleterm/src/services/fileStorage/fileStorage.ts @@ -19,6 +19,7 @@ // Both versions are imported because some operations need to be sync. import fsAsync from 'node:fs/promises'; import fs from 'node:fs'; +import path from 'node:path'; import { debounce } from 'shared/utils/highbar'; @@ -44,6 +45,12 @@ export interface FileStorage { /** Returns the file path used to create the storage. */ getFilePath(): string; + /** Returns the file name used to create the storage. + * + * Added so that ConfigService itself doesn't need to import node:path and can remain universal. + */ + getFileName(): string; + /** Returns the error that could occur while reading and parsing the file. */ getFileLoadingError(): Error | undefined; } @@ -116,6 +123,10 @@ export function createFileStorage(opts: { return opts.filePath; } + function getFileName(): string { + return path.basename(opts.filePath); + } + function getFileLoadingError(): Error | undefined { return error; } @@ -134,6 +145,7 @@ export function createFileStorage(opts: { get, replace, getFilePath, + getFileName, getFileLoadingError, }; } diff --git a/web/packages/teleterm/src/services/fileStorage/fileStorageClient.ts b/web/packages/teleterm/src/services/fileStorage/fileStorageClient.ts index 2f38e5d0cfc92..a639dcd949443 100644 --- a/web/packages/teleterm/src/services/fileStorage/fileStorageClient.ts +++ b/web/packages/teleterm/src/services/fileStorage/fileStorageClient.ts @@ -25,6 +25,10 @@ import { import { FileStorage } from './fileStorage'; +// TODO(ravicious): The main process should not expose the whole interface of FileStorage to the +// renderer, only what's absolutely needed by the renderer. FileStorage at the moment includes a +// bunch of functions that are used only in the main process (and should be used only there). +// https://github.com/gravitational/teleport/issues/24380 export function subscribeToFileStorageEvents(configService: FileStorage): void { ipcMain.on( FileStorageEventChannel, @@ -40,8 +44,12 @@ export function subscribeToFileStorageEvents(configService: FileStorage): void { return configService.replace(item.json); case FileStorageEventType.GetFilePath: return configService.getFilePath(); + case FileStorageEventType.GetFileName: + return configService.getFileName(); case FileStorageEventType.GetFileLoadingError: return configService.getFileLoadingError(); + default: + eventType satisfies never; } } ); @@ -74,6 +82,12 @@ export function createFileStorageClient(): FileStorage { FileStorageEventType.GetFilePath, {} ), + getFileName: () => + ipcRenderer.sendSync( + FileStorageEventChannel, + FileStorageEventType.GetFileName, + {} + ), getFileLoadingError: () => ipcRenderer.sendSync( FileStorageEventChannel, diff --git a/web/packages/teleterm/src/services/fileStorage/fixtures/mocks.ts b/web/packages/teleterm/src/services/fileStorage/fixtures/mocks.ts index 06260d28d14d9..af2e850b5cbb2 100644 --- a/web/packages/teleterm/src/services/fileStorage/fixtures/mocks.ts +++ b/web/packages/teleterm/src/services/fileStorage/fixtures/mocks.ts @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -import { FileStorage } from 'teleterm/services/fileStorage'; +import type { FileStorage } from 'teleterm/services/fileStorage'; export function createMockFileStorage(opts?: { filePath: string; @@ -41,6 +41,10 @@ export function createMockFileStorage(opts?: { return opts?.filePath || ''; }, + getFileName() { + return opts?.filePath.split('/').at(-1) || ''; + }, + getFileLoadingError() { return undefined; }, From e780095c74395c14fb44bc036d17d835bed34a2f Mon Sep 17 00:00:00 2001 From: Noah Stride Date: Wed, 7 Aug 2024 17:31:28 +0100 Subject: [PATCH 095/139] Eliminate `services.Services` interface and `XXXClient()` methods on `auth.Services` (#45058) (#45187) * Simplify cache setup * Remove client methods from auth.Services * Update godoc comments * Move accesspoint creation back * Rename AccessCache -> Cache * Small naming tweaks/signature tweaks suggested by Alan * Add licensing header * Try making configuration of services explicit --- lib/auth/access.go | 2 +- lib/auth/accesspoint/accesspoint.go | 148 +++++++++++------- lib/auth/auth.go | 61 +------- lib/auth/helpers.go | 47 +++++- lib/service/service.go | 117 ++++++++++---- lib/services/services.go | 38 ----- lib/srv/discovery/discovery_test.go | 14 +- .../kube_integration_watcher_test.go | 2 +- 8 files changed, 231 insertions(+), 198 deletions(-) diff --git a/lib/auth/access.go b/lib/auth/access.go index 02551de0ecbeb..7284c82ed7586 100644 --- a/lib/auth/access.go +++ b/lib/auth/access.go @@ -142,7 +142,7 @@ func (a *Server) DeleteRole(ctx context.Context, name string) error { for { var accessLists []*accesslist.AccessList var err error - accessLists, nextToken, err = a.Services.AccessListClient().ListAccessLists(ctx, 0 /* default page size */, nextToken) + accessLists, nextToken, err = a.Services.AccessLists.ListAccessLists(ctx, 0 /* default page size */, nextToken) if err != nil { return trace.Wrap(err) } diff --git a/lib/auth/accesspoint/accesspoint.go b/lib/auth/accesspoint/accesspoint.go index 9ed7fb66097c4..a526a239802f4 100644 --- a/lib/auth/accesspoint/accesspoint.go +++ b/lib/auth/accesspoint/accesspoint.go @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -// package accesspoint provides helpers for configuring caches in the context of +// Package accesspoint provides helpers for configuring caches in the context of // setting up service-level auth access points. this logic has been moved out of // lib/service in order to facilitate better testing practices. package accesspoint @@ -31,6 +31,7 @@ import ( oteltrace "go.opentelemetry.io/otel/trace" "github.com/gravitational/teleport" + "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/lib/backend" "github.com/gravitational/teleport/lib/backend/memory" "github.com/gravitational/teleport/lib/cache" @@ -38,22 +39,19 @@ import ( "github.com/gravitational/teleport/lib/services" ) -// AccessCacheConfig holds parameters used to confiure a cache to +// Config holds parameters used to configure a cache to // serve as an auth access point for a teleport service. -type AccessCacheConfig struct { +type Config struct { // Context is the base context used to propagate closure to // cache components. Context context.Context - // Services is a collection of upstream services from which - // the access cache will derive its state. - Services services.Services // Setup is a function that takes cache configuration and // modifies it to support a specific teleport service. Setup cache.SetupConfigFn // CacheName identifies the cache in logs. CacheName []string - // Events is true if cache should have the events system enabled. - Events bool + // EventsSystem is true if cache should have the events system enabled. + EventsSystem bool // Unstarted is true if the cache should not be started. Unstarted bool // MaxRetryPeriod is the max retry period between connection attempts @@ -65,12 +63,47 @@ type AccessCacheConfig struct { // TracingProvider is the provider to be used for exporting // traces. No-op tracers will be used if no provider is set. TracingProvider *tracing.Provider + + // The following services are provided to the Cache to allow it to + // populate its resource collections. They will either be the local service + // directly or a client that can be used to fetch the resources from the + // remote service. + + Access services.Access + AccessLists services.AccessLists + AccessMonitoringRules services.AccessMonitoringRules + AppSession services.AppSession + Apps services.Apps + ClusterConfig services.ClusterConfiguration + CrownJewels services.CrownJewels + DatabaseObjects services.DatabaseObjects + DatabaseServices services.DatabaseServices + Databases services.Databases + DiscoveryConfigs services.DiscoveryConfigs + DynamicAccess services.DynamicAccessCore + Events types.Events + Integrations services.Integrations + KubeWaitingContainers services.KubeWaitingContainer + Kubernetes services.Kubernetes + Notifications services.Notifications + Okta services.Okta + Presence services.Presence + Provisioner services.Provisioner + Restrictions services.Restrictions + SAMLIdPServiceProviders services.SAMLIdPServiceProviders + SAMLIdPSession services.SAMLIdPSession + SecReports services.SecReports + SnowflakeSession services.SnowflakeSession + Trust services.Trust + UserGroups services.UserGroups + UserLoginStates services.UserLoginStates + Users services.UsersService + WebSession types.WebSessionInterface + WebToken types.WebTokenInterface + WindowsDesktops services.WindowsDesktops } -func (c *AccessCacheConfig) CheckAndSetDefaults() error { - if c.Services == nil { - return trace.BadParameter("missing parameter Services") - } +func (c *Config) CheckAndSetDefaults() error { if c.Setup == nil { return trace.BadParameter("missing parameter Setup") } @@ -83,16 +116,14 @@ func (c *AccessCacheConfig) CheckAndSetDefaults() error { return nil } -// NewAccessCache builds a cache.Cache instance for a teleport service. This logic has been -// broken out of lib/service in order to support easier unit testing of process components. -func NewAccessCache(cfg AccessCacheConfig) (*cache.Cache, error) { +func NewCache(cfg Config) (*cache.Cache, error) { if err := cfg.CheckAndSetDefaults(); err != nil { return nil, trace.Wrap(err) } log.Debugf("Creating in-memory backend for %v.", cfg.CacheName) mem, err := memory.New(memory.Config{ Context: cfg.Context, - EventsOff: !cfg.Events, + EventsOff: !cfg.EventsSystem, Mirror: true, }) if err != nil { @@ -119,45 +150,48 @@ func NewAccessCache(cfg AccessCacheConfig) (*cache.Cache, error) { component = append(component, teleport.ComponentCache) metricComponent := append(slices.Clone(cfg.CacheName), teleport.ComponentCache) - return cache.New(cfg.Setup(cache.Config{ - Context: cfg.Context, - Backend: reporter, - Events: cfg.Services, - ClusterConfig: cfg.Services, - Provisioner: cfg.Services, - Trust: cfg.Services, - Users: cfg.Services, - Access: cfg.Services, - DynamicAccess: cfg.Services, - Presence: cfg.Services, - Restrictions: cfg.Services, - Apps: cfg.Services, - Kubernetes: cfg.Services, - CrownJewels: cfg.Services.CrownJewelClient(), - DatabaseServices: cfg.Services, - Databases: cfg.Services, - DatabaseObjects: cfg.Services.DatabaseObjectsClient(), - AppSession: cfg.Services, - SnowflakeSession: cfg.Services, - SAMLIdPSession: cfg.Services, - WindowsDesktops: cfg.Services, - SAMLIdPServiceProviders: cfg.Services, - UserGroups: cfg.Services, - Notifications: cfg.Services, - Okta: cfg.Services.OktaClient(), - AccessLists: cfg.Services.AccessListClient(), - AccessMonitoringRules: cfg.Services.AccessMonitoringRuleClient(), - SecReports: cfg.Services.SecReportsClient(), - UserLoginStates: cfg.Services.UserLoginStateClient(), - Integrations: cfg.Services, - DiscoveryConfigs: cfg.Services.DiscoveryConfigClient(), - WebSession: cfg.Services.WebSessions(), - WebToken: cfg.Services.WebTokens(), - KubeWaitingContainers: cfg.Services, - Component: teleport.Component(component...), - MetricComponent: teleport.Component(metricComponent...), - Tracer: tracer, - MaxRetryPeriod: cfg.MaxRetryPeriod, - Unstarted: cfg.Unstarted, - })) + cacheCfg := &cache.Config{ + Context: cfg.Context, + Backend: reporter, + Component: teleport.Component(component...), + MetricComponent: teleport.Component(metricComponent...), + Tracer: tracer, + MaxRetryPeriod: cfg.MaxRetryPeriod, + Unstarted: cfg.Unstarted, + + Access: cfg.Access, + AccessLists: cfg.AccessLists, + AccessMonitoringRules: cfg.AccessMonitoringRules, + AppSession: cfg.AppSession, + Apps: cfg.Apps, + ClusterConfig: cfg.ClusterConfig, + CrownJewels: cfg.CrownJewels, + DatabaseObjects: cfg.DatabaseObjects, + DatabaseServices: cfg.DatabaseServices, + Databases: cfg.Databases, + DiscoveryConfigs: cfg.DiscoveryConfigs, + DynamicAccess: cfg.DynamicAccess, + Events: cfg.Events, + Integrations: cfg.Integrations, + KubeWaitingContainers: cfg.KubeWaitingContainers, + Kubernetes: cfg.Kubernetes, + Notifications: cfg.Notifications, + Okta: cfg.Okta, + Presence: cfg.Presence, + Provisioner: cfg.Provisioner, + Restrictions: cfg.Restrictions, + SAMLIdPServiceProviders: cfg.SAMLIdPServiceProviders, + SAMLIdPSession: cfg.SAMLIdPSession, + SecReports: cfg.SecReports, + SnowflakeSession: cfg.SnowflakeSession, + Trust: cfg.Trust, + UserGroups: cfg.UserGroups, + UserLoginStates: cfg.UserLoginStates, + Users: cfg.Users, + WebSession: cfg.WebSession, + WebToken: cfg.WebToken, + WindowsDesktops: cfg.WindowsDesktops, + } + + return cache.New(cfg.Setup(*cacheCfg)) } diff --git a/lib/auth/auth.go b/lib/auth/auth.go index 01efc253bb34a..d3246d129ddc4 100644 --- a/lib/auth/auth.go +++ b/lib/auth/auth.go @@ -62,7 +62,6 @@ import ( "github.com/gravitational/teleport" "github.com/gravitational/teleport/api/client" "github.com/gravitational/teleport/api/client/proto" - "github.com/gravitational/teleport/api/client/secreport" "github.com/gravitational/teleport/api/constants" apidefaults "github.com/gravitational/teleport/api/defaults" devicepb "github.com/gravitational/teleport/api/gen/proto/go/teleport/devicetrust/v1" @@ -566,6 +565,11 @@ func NewServer(cfg *InitConfig, opts ...ServerOption) (*Server, error) { return &as, nil } +// Services is a collection of services that are used by the auth server. +// Avoid using this type as a dependency and instead depend on the actual +// methods/services you need. It should really only be necessary to directly +// reference this type on auth.Server itself and on code that manages +// the lifecycle of the auth server. type Services struct { services.TrustInternal services.PresenceInternal @@ -606,11 +610,6 @@ type Services struct { services.CrownJewels } -// SecReportsClient returns the security reports client. -func (r *Services) SecReportsClient() *secreport.Client { - return nil -} - // GetWebSession returns existing web session described by req. // Implements ReadAccessPoint func (r *Services) GetWebSession(ctx context.Context, req types.GetWebSessionRequest) (types.WebSession, error) { @@ -628,54 +627,6 @@ func (r *Services) GenerateAWSOIDCToken(ctx context.Context, integration string) return r.IntegrationsTokenGenerator.GenerateAWSOIDCToken(ctx, integration) } -// OktaClient returns the okta client. -func (r *Services) OktaClient() services.Okta { - return r -} - -// SCIMClient returns a client for the SCIM service. Note that in an OSS -// Teleport cluster, or an Enterprise cluster with IGS disabled, the SCIM -// service on the other end will return "NotImplemented" for every call. -func (r *Services) SCIMClient() services.SCIM { - return r.SCIM -} - -// AccessListClient returns the access list client. -func (r *Services) AccessListClient() services.AccessLists { - return r -} - -// AccessMonitoringRuleClient returns the access monitoring rules client. -func (r *Services) AccessMonitoringRuleClient() services.AccessMonitoringRules { - return r -} - -// DiscoveryConfigClient returns the DiscoveryConfig client. -func (r *Services) DiscoveryConfigClient() services.DiscoveryConfigs { - return r -} - -// CrownJewelClient returns the CrownJewels client. -func (r *Services) CrownJewelClient() services.CrownJewels { - return r -} - -// UserLoginStateClient returns the user login state client. -func (r *Services) UserLoginStateClient() services.UserLoginStates { - return r -} - -// KubernetesWaitingContainerClient returns the Kubernetes waiting -// container client. -func (r *Services) KubernetesWaitingContainerClient() services.KubeWaitingContainer { - return r -} - -// DatabaseObjectsClient returns the database objects client. -func (r *Services) DatabaseObjectsClient() services.DatabaseObjects { - return r -} - var ( generateRequestsCount = prometheus.NewCounter( prometheus.CounterOpts{ @@ -4912,7 +4863,7 @@ func (a *Server) CreateAccessRequestV2(ctx context.Context, req types.AccessRequ if req.GetDryRun() { _, promotions := a.generateAccessRequestPromotions(ctx, req) // update the request with additional reviewers if possible. - updateAccessRequestWithAdditionalReviewers(ctx, req, a.AccessListClient(), promotions) + updateAccessRequestWithAdditionalReviewers(ctx, req, a.AccessLists, promotions) // Made it this far with no errors, return before creating the request // if this is a dry run. return req, nil diff --git a/lib/auth/helpers.go b/lib/auth/helpers.go index f4410a22eddd1..424493da2ab0d 100644 --- a/lib/auth/helpers.go +++ b/lib/auth/helpers.go @@ -309,13 +309,46 @@ func NewTestAuthServer(cfg TestAuthServerConfig) (*TestAuthServer, error) { srv.AuthServer.bcryptCostOverride = &minCost if cfg.CacheEnabled { - srv.AuthServer.Cache, err = accesspoint.NewAccessCache(accesspoint.AccessCacheConfig{ - Context: srv.AuthServer.CloseContext(), - Services: srv.AuthServer.Services, - Setup: cache.ForAuth, - CacheName: []string{teleport.ComponentAuth}, - Events: true, - Unstarted: true, + svces := srv.AuthServer.Services + srv.AuthServer.Cache, err = accesspoint.NewCache(accesspoint.Config{ + Context: srv.AuthServer.CloseContext(), + Setup: cache.ForAuth, + CacheName: []string{teleport.ComponentAuth}, + EventsSystem: true, + Unstarted: true, + + Access: svces.Access, + AccessLists: svces.AccessLists, + AccessMonitoringRules: svces.AccessMonitoringRules, + AppSession: svces.Identity, + Apps: svces.Apps, + ClusterConfig: svces.ClusterConfiguration, + CrownJewels: svces.CrownJewels, + DatabaseObjects: svces.DatabaseObjects, + DatabaseServices: svces.DatabaseServices, + Databases: svces.Databases, + DiscoveryConfigs: svces.DiscoveryConfigs, + DynamicAccess: svces.DynamicAccessExt, + Events: svces.Events, + Integrations: svces.Integrations, + KubeWaitingContainers: svces.KubeWaitingContainer, + Kubernetes: svces.Kubernetes, + Notifications: svces.Notifications, + Okta: svces.Okta, + Presence: svces.PresenceInternal, + Provisioner: svces.Provisioner, + Restrictions: svces.Restrictions, + SAMLIdPServiceProviders: svces.SAMLIdPServiceProviders, + SAMLIdPSession: svces.Identity, + SecReports: svces.SecReports, + SnowflakeSession: svces.Identity, + Trust: svces.TrustInternal, + UserGroups: svces.UserGroups, + UserLoginStates: svces.UserLoginStates, + Users: svces.Identity, + WebSession: svces.Identity.WebSessions(), + WebToken: svces.WebTokens(), + WindowsDesktops: svces.WindowsDesktops, }) if err != nil { return nil, trace.Wrap(err) diff --git a/lib/service/service.go b/lib/service/service.go index aa17b12ab6639..b408d1655480c 100644 --- a/lib/service/service.go +++ b/lib/service/service.go @@ -1987,13 +1987,12 @@ func (process *TeleportProcess) initAuthService() error { return nil } - cache, err := process.newAccessCache(accesspoint.AccessCacheConfig{ - Services: as.Services, - Setup: cache.ForAuth, - CacheName: []string{teleport.ComponentAuth}, - Events: true, - Unstarted: true, - }) + cache, err := process.newAccessCacheForServices(accesspoint.Config{ + Setup: cache.ForAuth, + CacheName: []string{teleport.ComponentAuth}, + EventsSystem: true, + Unstarted: true, + }, as.Services) if err != nil { return trace.Wrap(err) } @@ -2373,13 +2372,88 @@ func (process *TeleportProcess) OnExit(serviceName string, callback func(interfa } // newAccessCache returns new local cache access point -func (process *TeleportProcess) newAccessCache(cfg accesspoint.AccessCacheConfig) (*cache.Cache, error) { +func (process *TeleportProcess) newAccessCacheForServices(cfg accesspoint.Config, services *auth.Services) (*cache.Cache, error) { + cfg.Context = process.ExitContext() + cfg.ProcessID = process.id + cfg.TracingProvider = process.TracingProvider + cfg.MaxRetryPeriod = process.Config.CachePolicy.MaxRetryPeriod + + cfg.Access = services.Access + cfg.AccessLists = services.AccessLists + cfg.AccessMonitoringRules = services.AccessMonitoringRules + cfg.AppSession = services.Identity + cfg.Apps = services.Apps + cfg.ClusterConfig = services.ClusterConfiguration + cfg.CrownJewels = services.CrownJewels + cfg.DatabaseObjects = services.DatabaseObjects + cfg.DatabaseServices = services.DatabaseServices + cfg.Databases = services.Databases + cfg.DiscoveryConfigs = services.DiscoveryConfigs + cfg.DynamicAccess = services.DynamicAccessExt + cfg.Events = services.Events + cfg.Integrations = services.Integrations + cfg.KubeWaitingContainers = services.KubeWaitingContainer + cfg.Kubernetes = services.Kubernetes + cfg.Notifications = services.Notifications + cfg.Okta = services.Okta + cfg.Presence = services.PresenceInternal + cfg.Provisioner = services.Provisioner + cfg.Restrictions = services.Restrictions + cfg.SAMLIdPServiceProviders = services.SAMLIdPServiceProviders + cfg.SAMLIdPSession = services.Identity + cfg.SecReports = services.SecReports + cfg.SnowflakeSession = services.Identity + cfg.Trust = services.TrustInternal + cfg.UserGroups = services.UserGroups + cfg.UserLoginStates = services.UserLoginStates + cfg.Users = services.Identity + cfg.WebSession = services.Identity.WebSessions() + cfg.WebToken = services.Identity.WebTokens() + cfg.WindowsDesktops = services.WindowsDesktops + + return accesspoint.NewCache(cfg) +} + +func (process *TeleportProcess) newAccessCacheForClient(cfg accesspoint.Config, client authclient.ClientI) (*cache.Cache, error) { cfg.Context = process.ExitContext() cfg.ProcessID = process.id cfg.TracingProvider = process.TracingProvider cfg.MaxRetryPeriod = process.Config.CachePolicy.MaxRetryPeriod - return accesspoint.NewAccessCache(cfg) + cfg.Access = client + cfg.AccessLists = client.AccessListClient() + cfg.AccessMonitoringRules = client.AccessMonitoringRuleClient() + cfg.AppSession = client + cfg.Apps = client + cfg.ClusterConfig = client + cfg.CrownJewels = client.CrownJewelServiceClient() + cfg.DatabaseObjects = client.DatabaseObjectsClient() + cfg.DatabaseServices = client + cfg.Databases = client + cfg.DiscoveryConfigs = client.DiscoveryConfigClient() + cfg.DynamicAccess = client + cfg.Events = client + cfg.Integrations = client + cfg.KubeWaitingContainers = client + cfg.Kubernetes = client + cfg.Notifications = client + cfg.Okta = client.OktaClient() + cfg.Presence = client + cfg.Provisioner = client + cfg.Restrictions = client + cfg.SAMLIdPServiceProviders = client + cfg.SAMLIdPSession = client + cfg.SecReports = client.SecReportsClient() + cfg.SnowflakeSession = client + cfg.Trust = client + cfg.UserGroups = client + cfg.UserLoginStates = client.UserLoginStateClient() + cfg.Users = client + cfg.WebSession = client.WebSessions() + cfg.WebToken = client.WebTokens() + cfg.WindowsDesktops = client + + return accesspoint.NewCache(cfg) } // newLocalCacheForNode returns new instance of access point configured for a local proxy. @@ -2522,33 +2596,12 @@ func (process *TeleportProcess) newLocalCacheForWindowsDesktop(clt authclient.Cl return authclient.NewWindowsDesktopWrapper(clt, cache), nil } -// accessPointWrapper is a wrapper around [authclient.ClientI] that reduces the surface area of the -// auth.ClientI.DiscoveryConfigClient interface to services.DiscoveryConfigs. -// Cache doesn't implement the full [authclient.ClientI] interface, so we need to wrap [authclient.ClientI] -// to make it compatible with the services.DiscoveryConfigs interface. -type accessPointWrapper struct { - authclient.ClientI -} - -func (a accessPointWrapper) CrownJewelClient() services.CrownJewels { - return a.ClientI.CrownJewelServiceClient() -} - -func (a accessPointWrapper) DatabaseObjectsClient() services.DatabaseObjects { - return a.ClientI.DatabaseObjectsClient() -} - -func (a accessPointWrapper) DiscoveryConfigClient() services.DiscoveryConfigs { - return a.ClientI.DiscoveryConfigClient() -} - // NewLocalCache returns new instance of access point func (process *TeleportProcess) NewLocalCache(clt authclient.ClientI, setupConfig cache.SetupConfigFn, cacheName []string) (*cache.Cache, error) { - return process.newAccessCache(accesspoint.AccessCacheConfig{ - Services: &accessPointWrapper{ClientI: clt}, + return process.newAccessCacheForClient(accesspoint.Config{ Setup: setupConfig, CacheName: cacheName, - }) + }, clt) } // GetRotation returns the process rotation. diff --git a/lib/services/services.go b/lib/services/services.go index c3719e5eecc4d..9a566fc8f9450 100644 --- a/lib/services/services.go +++ b/lib/services/services.go @@ -19,46 +19,8 @@ package services import ( - "github.com/gravitational/teleport/api/client/secreport" "github.com/gravitational/teleport/api/types" ) -// Services collects all services -type Services interface { - UsersService - Provisioner - Trust - types.Events - ClusterConfiguration - Access - DynamicAccessCore - Presence - Restrictions - Apps - Databases - DatabaseServices - Kubernetes - AppSession - SnowflakeSession - SAMLIdPSession - types.WebSessionsGetter - types.WebTokensGetter - WindowsDesktops - SAMLIdPServiceProviders - UserGroups - Integrations - KubeWaitingContainer - Notifications - - OktaClient() Okta - AccessListClient() AccessLists - AccessMonitoringRuleClient() AccessMonitoringRules - UserLoginStateClient() UserLoginStates - DiscoveryConfigClient() DiscoveryConfigs - SecReportsClient() *secreport.Client - CrownJewelClient() CrownJewels - DatabaseObjectsClient() DatabaseObjects -} - // RotationGetter returns the rotation state. type RotationGetter func(role types.SystemRole) (*types.Rotation, error) diff --git a/lib/srv/discovery/discovery_test.go b/lib/srv/discovery/discovery_test.go index ce0e18db784a2..893afc43ae479 100644 --- a/lib/srv/discovery/discovery_test.go +++ b/lib/srv/discovery/discovery_test.go @@ -585,7 +585,7 @@ func TestDiscoveryServer(t *testing.T) { tc.emitter.t = t if tc.discoveryConfig != nil { - _, err := tlsServer.Auth().DiscoveryConfigClient().CreateDiscoveryConfig(ctx, tc.discoveryConfig) + _, err := tlsServer.Auth().DiscoveryConfigs.CreateDiscoveryConfig(ctx, tc.discoveryConfig) require.NoError(t, err) } @@ -1963,7 +1963,7 @@ func TestDiscoveryDatabase(t *testing.T) { // Add Dynamic Matchers and wait for reconcile again if tc.discoveryConfigs != nil { for _, dc := range tc.discoveryConfigs(t) { - _, err := tlsServer.Auth().DiscoveryConfigClient().CreateDiscoveryConfig(ctx, dc) + _, err := tlsServer.Auth().DiscoveryConfigs.CreateDiscoveryConfig(ctx, dc) require.NoError(t, err) } @@ -2088,7 +2088,7 @@ func TestDiscoveryDatabaseRemovingDiscoveryConfigs(t *testing.T) { ) require.NoError(t, err) - _, err = tlsServer.Auth().DiscoveryConfigClient().CreateDiscoveryConfig(ctx, dc1) + _, err = tlsServer.Auth().DiscoveryConfigs.CreateDiscoveryConfig(ctx, dc1) require.NoError(t, err) actualDatabases, err := tlsServer.Auth().GetDatabases(ctx) @@ -2114,7 +2114,7 @@ func TestDiscoveryDatabaseRemovingDiscoveryConfigs(t *testing.T) { require.NoError(t, err) require.Zero(t, reporter.DiscoveryFetchEventCount()) - _, err = tlsServer.Auth().DiscoveryConfigClient().CreateDiscoveryConfig(ctx, dc1) + _, err = tlsServer.Auth().DiscoveryConfigs.CreateDiscoveryConfig(ctx, dc1) require.NoError(t, err) // Check for new resource in reconciler @@ -2144,7 +2144,7 @@ func TestDiscoveryDatabaseRemovingDiscoveryConfigs(t *testing.T) { t.Run("removing the DiscoveryConfig: fetcher is removed and database is removed", func(t *testing.T) { // Remove DiscoveryConfig - err = tlsServer.Auth().DiscoveryConfigClient().DeleteDiscoveryConfig(ctx, dc1.GetName()) + err = tlsServer.Auth().DiscoveryConfigs.DeleteDiscoveryConfig(ctx, dc1.GetName()) require.NoError(t, err) currentEmittedEvents := reporter.DiscoveryFetchEventCount() @@ -2496,7 +2496,7 @@ func TestAzureVMDiscovery(t *testing.T) { emitter.t = t if tc.discoveryConfig != nil { - _, err := tlsServer.Auth().DiscoveryConfigClient().CreateDiscoveryConfig(ctx, tc.discoveryConfig) + _, err := tlsServer.Auth().DiscoveryConfigs.CreateDiscoveryConfig(ctx, tc.discoveryConfig) require.NoError(t, err) // Wait for the DiscoveryConfig to be added to the dynamic matchers @@ -2761,7 +2761,7 @@ func TestGCPVMDiscovery(t *testing.T) { emitter.t = t if tc.discoveryConfig != nil { - _, err := tlsServer.Auth().DiscoveryConfigClient().CreateDiscoveryConfig(ctx, tc.discoveryConfig) + _, err := tlsServer.Auth().DiscoveryConfigs.CreateDiscoveryConfig(ctx, tc.discoveryConfig) require.NoError(t, err) // Wait for the DiscoveryConfig to be added to the dynamic matchers diff --git a/lib/srv/discovery/kube_integration_watcher_test.go b/lib/srv/discovery/kube_integration_watcher_test.go index 738ad09c067a4..5075da163d392 100644 --- a/lib/srv/discovery/kube_integration_watcher_test.go +++ b/lib/srv/discovery/kube_integration_watcher_test.go @@ -458,7 +458,7 @@ func TestDiscoveryKubeIntegrationEKS(t *testing.T) { if tc.discoveryConfig != nil { dc := tc.discoveryConfig(t) - _, err := tlsServer.Auth().DiscoveryConfigClient().CreateDiscoveryConfig(ctx, dc) + _, err := tlsServer.Auth().DiscoveryConfigs.CreateDiscoveryConfig(ctx, dc) require.NoError(t, err) // Wait for the DiscoveryConfig to be added to the dynamic fetchers From 6904d9eee2dbf2055bb62a549ee7589caec2f5fc Mon Sep 17 00:00:00 2001 From: Andrew Burke <31974658+atburke@users.noreply.github.com> Date: Wed, 7 Aug 2024 10:26:35 -0700 Subject: [PATCH 096/139] [v16] Host user creation - Only update groups if needed (#45162) * Only update groups when needed * Update test * Rename groups --- lib/srv/usermgmt.go | 54 +++++++++++++++++++----- lib/srv/usermgmt_test.go | 88 ++++++++++++++++++++++++++++++++++++---- 2 files changed, 123 insertions(+), 19 deletions(-) diff --git a/lib/srv/usermgmt.go b/lib/srv/usermgmt.go index 8a1a7bc697f9d..9ae82f186ca80 100644 --- a/lib/srv/usermgmt.go +++ b/lib/srv/usermgmt.go @@ -23,6 +23,7 @@ import ( "errors" "fmt" "io" + "maps" "os/user" "regexp" "strings" @@ -229,20 +230,20 @@ func (u *HostUserManagement) UpsertUser(name string, ui *services.HostUsersInfo) return nil, trace.BadParameter("Mode is a required argument to CreateUser") } - groups := make([]string, 0, len(ui.Groups)) + groupsToAdd := make([]string, 0, len(ui.Groups)) for _, group := range ui.Groups { if group == name { // this causes an error as useradd expects the group with the same name as the user to be available log.Debugf("Skipping group creation with name the same as login user (%q, %q).", name, group) continue } - groups = append(groups, group) + groupsToAdd = append(groupsToAdd, group) } if ui.Mode == types.CreateHostUserMode_HOST_USER_MODE_INSECURE_DROP { - groups = append(groups, types.TeleportServiceGroup) + groupsToAdd = append(groupsToAdd, types.TeleportServiceGroup) } var errs []error - for _, group := range groups { + for _, group := range groupsToAdd { if err := u.createGroupIfNotExist(group); err != nil { errs = append(errs, err) continue @@ -259,13 +260,12 @@ func (u *HostUserManagement) UpsertUser(name string, ui *services.HostUsersInfo) if tempUser != nil { // Collect actions that need to be done together under a lock on the user. - actionsUnderLock := []func() error{ - func() error { - // If the user exists, set user groups again as they might have changed. - return trace.Wrap(u.backend.SetUserGroups(name, groups)) - }, - } + actionsUnderLock := make([]func() error, 0, 2) doWithUserLock := func() error { + if len(actionsUnderLock) == 0 { + return nil + } + return trace.Wrap(u.doWithUserLock(func(_ types.SemaphoreLease) error { for _, action := range actionsUnderLock { if err := action(); err != nil { @@ -276,6 +276,38 @@ func (u *HostUserManagement) UpsertUser(name string, ui *services.HostUsersInfo) })) } + // Get the user's current groups. + currentGroups := make(map[string]struct{}, len(groupsToAdd)) + groupIds, err := u.backend.UserGIDs(tempUser) + if err != nil { + return nil, trace.Wrap(err) + } + for _, groupId := range groupIds { + group, err := u.backend.LookupGroupByID(groupId) + if err != nil { + return nil, trace.Wrap(err) + } + currentGroups[group.Name] = struct{}{} + } + + // Get the groups that the user should end up with, including the primary group. + finalGroups := make(map[string]struct{}, len(groupsToAdd)+1) + for _, group := range groupsToAdd { + finalGroups[group] = struct{}{} + } + primaryGroup, err := u.backend.LookupGroupByID(tempUser.Gid) + if err != nil { + return nil, trace.Wrap(err) + } + finalGroups[primaryGroup.Name] = struct{}{} + + // Check if the user's groups need to be updated. + if !maps.Equal(currentGroups, finalGroups) { + actionsUnderLock = append(actionsUnderLock, func() error { + return trace.Wrap(u.backend.SetUserGroups(name, groupsToAdd)) + }) + } + systemGroup, err := u.backend.LookupGroup(types.TeleportServiceGroup) if err != nil { if isUnknownGroupError(err, types.TeleportServiceGroup) { @@ -339,7 +371,7 @@ func (u *HostUserManagement) UpsertUser(name string, ui *services.HostUsersInfo) } } - err = u.backend.CreateUser(name, groups, home, ui.UID, ui.GID) + err = u.backend.CreateUser(name, groupsToAdd, home, ui.UID, ui.GID) if err != nil && !trace.IsAlreadyExists(err) { return trace.WrapWithMessage(err, "error while creating user") } diff --git a/lib/srv/usermgmt_test.go b/lib/srv/usermgmt_test.go index 7003237105e2a..4725a9acc9070 100644 --- a/lib/srv/usermgmt_test.go +++ b/lib/srv/usermgmt_test.go @@ -27,6 +27,7 @@ import ( "testing" "github.com/gravitational/trace" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/gravitational/teleport/api/types" @@ -46,6 +47,8 @@ type testHostUserBackend struct { userUID map[string]string // userGID: user -> gid userGID map[string]string + + setUserGroupsCalls int } func newTestUserMgmt() *testHostUserBackend { @@ -68,28 +71,40 @@ func (tm *testHostUserBackend) GetAllUsers() ([]string, error) { func (tm *testHostUserBackend) Lookup(username string) (*user.User, error) { if _, ok := tm.users[username]; !ok { - return nil, nil + return nil, user.UnknownUserError(username) } return &user.User{ Username: username, + Uid: tm.userUID[username], + Gid: tm.userGID[username], }, nil } func (tm *testHostUserBackend) LookupGroup(groupname string) (*user.Group, error) { + gid, ok := tm.groups[groupname] + if !ok { + return nil, user.UnknownGroupError(groupname) + } return &user.Group{ - Gid: tm.groups[groupname], + Gid: gid, Name: groupname, }, nil } func (tm *testHostUserBackend) LookupGroupByID(gid string) (*user.Group, error) { - return &user.Group{ - Gid: tm.groups[gid], - Name: gid, - }, nil + for groupName, groupGid := range tm.groups { + if groupGid == gid { + return &user.Group{ + Gid: gid, + Name: groupName, + }, nil + } + } + return nil, user.UnknownGroupIdError(gid) } func (tm *testHostUserBackend) SetUserGroups(name string, groups []string) error { + tm.setUserGroupsCalls++ if _, ok := tm.users[name]; !ok { return trace.NotFound("User %q doesn't exist", name) } @@ -98,10 +113,12 @@ func (tm *testHostUserBackend) SetUserGroups(name string, groups []string) error } func (tm *testHostUserBackend) UserGIDs(u *user.User) ([]string, error) { - ids := make([]string, 0, len(tm.users[u.Username])) + ids := make([]string, 0, len(tm.users[u.Username])+1) for _, id := range tm.users[u.Username] { ids = append(ids, tm.groups[id]) } + // Include primary group. + ids = append(ids, u.Gid) return ids, nil } @@ -110,7 +127,10 @@ func (tm *testHostUserBackend) CreateGroup(group, gid string) error { if ok { return trace.AlreadyExists("Group %q, already exists", group) } - tm.groups[group] = fmt.Sprint(len(tm.groups) + 1) + if gid == "" { + gid = fmt.Sprint(len(tm.groups) + 1) + } + tm.groups[group] = gid return nil } @@ -119,6 +139,14 @@ func (tm *testHostUserBackend) CreateUser(user string, groups []string, home, ui if ok { return trace.AlreadyExists("Group %q, already exists", user) } + if uid == "" { + uid = fmt.Sprint(len(tm.users) + 1) + } + if gid == "" { + gid = fmt.Sprint(len(tm.groups) + 1) + } + // Ensure that the user has a primary group. It's OK if it already exists. + _ = tm.CreateGroup(user, gid) tm.users[user] = groups tm.userUID[user] = uid tm.userGID[user] = gid @@ -358,3 +386,47 @@ func TestIsUnknownGroupError(t *testing.T) { require.Equal(t, tc.isUnknownGroupError, isUnknownGroupError(tc.err, unknownGroupName)) } } + +func TestUpdateUserGroups(t *testing.T) { + t.Parallel() + + backend := newTestUserMgmt() + bk, err := memory.New(memory.Config{}) + require.NoError(t, err) + pres := local.NewPresenceService(bk) + users := HostUserManagement{ + backend: backend, + storage: pres, + } + + allGroups := []string{"foo", "bar", "baz", "quux"} + for _, group := range allGroups { + require.NoError(t, backend.CreateGroup(group, "")) + } + + userinfo := &services.HostUsersInfo{ + Groups: allGroups[:2], + Mode: types.CreateHostUserMode_HOST_USER_MODE_KEEP, + } + // Create a user with some groups. + closer, err := users.UpsertUser("alice", userinfo) + assert.NoError(t, err) + assert.Nil(t, closer) + assert.Zero(t, backend.setUserGroupsCalls) + assert.ElementsMatch(t, userinfo.Groups, backend.users["alice"]) + + // Update user with new groups. + userinfo.Groups = allGroups[2:] + closer, err = users.UpsertUser("alice", userinfo) + assert.NoError(t, err) + assert.Nil(t, closer) + assert.Equal(t, 1, backend.setUserGroupsCalls) + assert.ElementsMatch(t, userinfo.Groups, backend.users["alice"]) + + // Upsert again with same groups should not call SetUserGroups. + closer, err = users.UpsertUser("alice", userinfo) + assert.NoError(t, err) + assert.Nil(t, closer) + assert.Equal(t, 1, backend.setUserGroupsCalls) + assert.ElementsMatch(t, userinfo.Groups, backend.users["alice"]) +} From 87970ea9c1dd797788b9bb6c306d912483957714 Mon Sep 17 00:00:00 2001 From: Michelle Bergquist <11967646+michellescripts@users.noreply.github.com> Date: Wed, 7 Aug 2024 13:22:01 -0600 Subject: [PATCH 097/139] Set entitlements when unsupported by auth (#45226) --- lib/service/connect.go | 71 ++++++++- lib/service/connect_test.go | 283 ++++++++++++++++++++++++++++++++++++ 2 files changed, 353 insertions(+), 1 deletion(-) create mode 100644 lib/service/connect_test.go diff --git a/lib/service/connect.go b/lib/service/connect.go index 8d1edfde555ae..ce377b68c78e7 100644 --- a/lib/service/connect.go +++ b/lib/service/connect.go @@ -43,7 +43,9 @@ import ( "github.com/gravitational/teleport/api/client/proto" apidefaults "github.com/gravitational/teleport/api/defaults" "github.com/gravitational/teleport/api/types" + apiutils "github.com/gravitational/teleport/api/utils" "github.com/gravitational/teleport/api/utils/retryutils" + "github.com/gravitational/teleport/entitlements" "github.com/gravitational/teleport/lib" "github.com/gravitational/teleport/lib/auth" "github.com/gravitational/teleport/lib/auth/authclient" @@ -1135,7 +1137,10 @@ func (process *TeleportProcess) getConnector(clientIdentity, serverIdentity *sta } // Set cluster features and return successfully with a working connector. - process.setClusterFeatures(pingResponse.GetServerFeatures()) + // TODO(michellescripts) remove clone & compatibility check in v18 + cloned := apiutils.CloneProtoMsg(pingResponse.GetServerFeatures()) + supportEntitlementsCompatibility(cloned) + process.setClusterFeatures(cloned) process.setAuthSubjectiveAddr(pingResponse.RemoteAddr) process.logger.InfoContext(process.ExitContext(), "features loaded from auth server", "identity", clientIdentity.ID.Role, "features", pingResponse.GetServerFeatures()) @@ -1146,6 +1151,70 @@ func (process *TeleportProcess) getConnector(clientIdentity, serverIdentity *sta }, nil } +// supportEntitlementsCompatibility ensures entitlements are backwards compatible +// If Entitlements are present, there are no changes +// If Entitlements are not present, sets the entitlements fields to legacy field values +// TODO(michellescripts) remove in v18 +func supportEntitlementsCompatibility(features *proto.Features) { + if len(features.Entitlements) > 0 { + return + } + + features.Entitlements = getBaseEntitlements(features.GetEntitlements()) + + // Entitlements: All records are {enabled: false}; update to equal legacy feature value + features.Entitlements[string(entitlements.ExternalAuditStorage)] = &proto.EntitlementInfo{Enabled: features.GetExternalAuditStorage()} + features.Entitlements[string(entitlements.FeatureHiding)] = &proto.EntitlementInfo{Enabled: features.GetFeatureHiding()} + features.Entitlements[string(entitlements.Identity)] = &proto.EntitlementInfo{Enabled: features.GetIdentityGovernance()} + features.Entitlements[string(entitlements.JoinActiveSessions)] = &proto.EntitlementInfo{Enabled: features.GetJoinActiveSessions()} + features.Entitlements[string(entitlements.MobileDeviceManagement)] = &proto.EntitlementInfo{Enabled: features.GetMobileDeviceManagement()} + features.Entitlements[string(entitlements.OIDC)] = &proto.EntitlementInfo{Enabled: features.GetOIDC()} + features.Entitlements[string(entitlements.Policy)] = &proto.EntitlementInfo{Enabled: features.GetPolicy().GetEnabled()} + features.Entitlements[string(entitlements.SAML)] = &proto.EntitlementInfo{Enabled: features.GetSAML()} + features.Entitlements[string(entitlements.K8s)] = &proto.EntitlementInfo{Enabled: features.GetKubernetes()} + features.Entitlements[string(entitlements.App)] = &proto.EntitlementInfo{Enabled: features.GetApp()} + features.Entitlements[string(entitlements.DB)] = &proto.EntitlementInfo{Enabled: features.GetDB()} + features.Entitlements[string(entitlements.Desktop)] = &proto.EntitlementInfo{Enabled: features.GetDesktop()} + features.Entitlements[string(entitlements.HSM)] = &proto.EntitlementInfo{Enabled: features.GetHSM()} + + // set default Identity fields to legacy feature value + features.Entitlements[string(entitlements.AccessLists)] = &proto.EntitlementInfo{Enabled: true, Limit: features.GetAccessList().GetCreateLimit()} + features.Entitlements[string(entitlements.AccessMonitoring)] = &proto.EntitlementInfo{Enabled: features.GetAccessMonitoring().GetEnabled(), Limit: features.GetAccessMonitoring().GetMaxReportRangeLimit()} + features.Entitlements[string(entitlements.AccessRequests)] = &proto.EntitlementInfo{Enabled: features.GetAccessRequests().MonthlyRequestLimit > 0, Limit: features.GetAccessRequests().GetMonthlyRequestLimit()} + features.Entitlements[string(entitlements.DeviceTrust)] = &proto.EntitlementInfo{Enabled: features.GetDeviceTrust().GetEnabled(), Limit: features.GetDeviceTrust().GetDevicesUsageLimit()} + // override Identity Package features if Identity is enabled: set true and clear limit + if features.GetIdentityGovernance() { + features.Entitlements[string(entitlements.AccessLists)] = &proto.EntitlementInfo{Enabled: true} + features.Entitlements[string(entitlements.AccessMonitoring)] = &proto.EntitlementInfo{Enabled: true} + features.Entitlements[string(entitlements.AccessRequests)] = &proto.EntitlementInfo{Enabled: true} + features.Entitlements[string(entitlements.DeviceTrust)] = &proto.EntitlementInfo{Enabled: true} + features.Entitlements[string(entitlements.OktaSCIM)] = &proto.EntitlementInfo{Enabled: true} + features.Entitlements[string(entitlements.OktaUserSync)] = &proto.EntitlementInfo{Enabled: true} + features.Entitlements[string(entitlements.SessionLocks)] = &proto.EntitlementInfo{Enabled: true} + } +} + +// getBaseEntitlements takes a cloud entitlement set and returns a modules Entitlement set +func getBaseEntitlements(protoEntitlements map[string]*proto.EntitlementInfo) map[string]*proto.EntitlementInfo { + all := entitlements.AllEntitlements + result := make(map[string]*proto.EntitlementInfo, len(all)) + + for _, e := range all { + al, ok := protoEntitlements[string(e)] + if !ok { + result[string(e)] = &proto.EntitlementInfo{} + continue + } + + result[string(e)] = &proto.EntitlementInfo{ + Enabled: al.Enabled, + Limit: al.Limit, + } + } + + return result +} + // newClient attempts to connect to either the proxy server or auth server // For config v3 and onwards, it will only connect to either the proxy (via tunnel) or the auth server (direct), // depending on what was specified in the config. diff --git a/lib/service/connect_test.go b/lib/service/connect_test.go new file mode 100644 index 0000000000000..5a2df2e136ef5 --- /dev/null +++ b/lib/service/connect_test.go @@ -0,0 +1,283 @@ +// Teleport +// Copyright (C) 2024 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package service + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/gravitational/teleport/api/client/proto" + apiutils "github.com/gravitational/teleport/api/utils" + "github.com/gravitational/teleport/entitlements" +) + +func Test_supportEntitlementsCompatibility(t *testing.T) { + tests := []struct { + name string + features *proto.Features + expected map[string]*proto.EntitlementInfo + }{ + { + name: "entitlements present; keeps entitlement values", + features: &proto.Features{ + DeviceTrust: nil, + AccessRequests: nil, + AccessList: nil, + AccessMonitoring: nil, + Policy: nil, + CustomTheme: "", + ProductType: 0, + SupportType: 0, + Kubernetes: false, + App: false, + DB: false, + OIDC: false, + SAML: false, + AccessControls: false, + AdvancedAccessWorkflows: false, + Cloud: false, + HSM: false, + Desktop: false, + RecoveryCodes: false, + Plugins: false, + AutomaticUpgrades: false, + IsUsageBased: false, + Assist: false, + FeatureHiding: false, + IdentityGovernance: false, + AccessGraph: false, + Questionnaire: false, + IsStripeManaged: false, + ExternalAuditStorage: false, + JoinActiveSessions: false, + MobileDeviceManagement: false, + AccessMonitoringConfigured: false, + Entitlements: map[string]*proto.EntitlementInfo{ + string(entitlements.AccessLists): {Enabled: true, Limit: 111}, + string(entitlements.AccessMonitoring): {Enabled: true, Limit: 2113}, + string(entitlements.AccessRequests): {Enabled: true, Limit: 39}, + string(entitlements.App): {Enabled: false}, + string(entitlements.CloudAuditLogRetention): {Enabled: true}, + string(entitlements.DB): {Enabled: true}, + string(entitlements.Desktop): {Enabled: true}, + string(entitlements.DeviceTrust): {Enabled: true, Limit: 103}, + string(entitlements.ExternalAuditStorage): {Enabled: true}, + string(entitlements.FeatureHiding): {Enabled: true}, + string(entitlements.HSM): {Enabled: true}, + string(entitlements.Identity): {Enabled: true}, + string(entitlements.JoinActiveSessions): {Enabled: true}, + string(entitlements.K8s): {Enabled: true}, + string(entitlements.MobileDeviceManagement): {Enabled: true}, + string(entitlements.OIDC): {Enabled: true}, + string(entitlements.OktaSCIM): {Enabled: true}, + string(entitlements.OktaUserSync): {Enabled: true}, + string(entitlements.Policy): {Enabled: true}, + string(entitlements.SAML): {Enabled: true}, + string(entitlements.SessionLocks): {Enabled: true}, + string(entitlements.UpsellAlert): {Enabled: true}, + string(entitlements.UsageReporting): {Enabled: true}, + }, + }, + expected: map[string]*proto.EntitlementInfo{ + string(entitlements.AccessLists): {Enabled: true, Limit: 111}, + string(entitlements.AccessMonitoring): {Enabled: true, Limit: 2113}, + string(entitlements.AccessRequests): {Enabled: true, Limit: 39}, + string(entitlements.App): {Enabled: false}, + string(entitlements.CloudAuditLogRetention): {Enabled: true}, + string(entitlements.DB): {Enabled: true}, + string(entitlements.Desktop): {Enabled: true}, + string(entitlements.DeviceTrust): {Enabled: true, Limit: 103}, + string(entitlements.ExternalAuditStorage): {Enabled: true}, + string(entitlements.FeatureHiding): {Enabled: true}, + string(entitlements.HSM): {Enabled: true}, + string(entitlements.Identity): {Enabled: true}, + string(entitlements.JoinActiveSessions): {Enabled: true}, + string(entitlements.K8s): {Enabled: true}, + string(entitlements.MobileDeviceManagement): {Enabled: true}, + string(entitlements.OIDC): {Enabled: true}, + string(entitlements.OktaSCIM): {Enabled: true}, + string(entitlements.OktaUserSync): {Enabled: true}, + string(entitlements.Policy): {Enabled: true}, + string(entitlements.SAML): {Enabled: true}, + string(entitlements.SessionLocks): {Enabled: true}, + string(entitlements.UpsellAlert): {Enabled: true}, + string(entitlements.UsageReporting): {Enabled: true}, + }, + }, + { + name: "entitlements not present; identity on - sets legacy fields & drops limits", + features: &proto.Features{ + DeviceTrust: &proto.DeviceTrustFeature{ + Enabled: true, + DevicesUsageLimit: 33, + }, + AccessRequests: &proto.AccessRequestsFeature{ + MonthlyRequestLimit: 22, + }, + AccessList: &proto.AccessListFeature{ + CreateLimit: 44, + }, + AccessMonitoring: &proto.AccessMonitoringFeature{ + Enabled: true, + MaxReportRangeLimit: 55, + }, + Policy: &proto.PolicyFeature{ + Enabled: true, + }, + CustomTheme: "", + ProductType: 0, + SupportType: 0, + Kubernetes: true, + App: true, + DB: true, + OIDC: true, + SAML: true, + AccessControls: true, + AdvancedAccessWorkflows: true, + Cloud: true, + HSM: true, + Desktop: true, + RecoveryCodes: true, + Plugins: true, + AutomaticUpgrades: true, + IsUsageBased: true, + Assist: true, + FeatureHiding: true, + IdentityGovernance: true, + AccessGraph: true, + Questionnaire: true, + IsStripeManaged: true, + ExternalAuditStorage: true, + JoinActiveSessions: true, + MobileDeviceManagement: true, + AccessMonitoringConfigured: true, + }, + expected: map[string]*proto.EntitlementInfo{ + string(entitlements.AccessLists): {Enabled: true}, + string(entitlements.AccessMonitoring): {Enabled: true}, + string(entitlements.AccessRequests): {Enabled: true}, + string(entitlements.App): {Enabled: true}, + string(entitlements.DB): {Enabled: true}, + string(entitlements.Desktop): {Enabled: true}, + string(entitlements.DeviceTrust): {Enabled: true}, + string(entitlements.ExternalAuditStorage): {Enabled: true}, + string(entitlements.FeatureHiding): {Enabled: true}, + string(entitlements.HSM): {Enabled: true}, + string(entitlements.Identity): {Enabled: true}, + string(entitlements.JoinActiveSessions): {Enabled: true}, + string(entitlements.K8s): {Enabled: true}, + string(entitlements.MobileDeviceManagement): {Enabled: true}, + string(entitlements.OIDC): {Enabled: true}, + string(entitlements.OktaSCIM): {Enabled: true}, + string(entitlements.OktaUserSync): {Enabled: true}, + string(entitlements.Policy): {Enabled: true}, + string(entitlements.SAML): {Enabled: true}, + string(entitlements.SessionLocks): {Enabled: true}, + // defaults, no legacy equivalent + string(entitlements.UsageReporting): {Enabled: false}, + string(entitlements.UpsellAlert): {Enabled: false}, + string(entitlements.CloudAuditLogRetention): {Enabled: false}, + }, + }, + { + name: "entitlements not present; identity off - sets legacy fields", + features: &proto.Features{ + DeviceTrust: &proto.DeviceTrustFeature{ + Enabled: true, + DevicesUsageLimit: 33, + }, + AccessRequests: &proto.AccessRequestsFeature{ + MonthlyRequestLimit: 22, + }, + AccessList: &proto.AccessListFeature{ + CreateLimit: 44, + }, + AccessMonitoring: &proto.AccessMonitoringFeature{ + Enabled: true, + MaxReportRangeLimit: 55, + }, + Policy: &proto.PolicyFeature{ + Enabled: true, + }, + CustomTheme: "", + ProductType: 0, + SupportType: 0, + Kubernetes: true, + App: true, + DB: true, + OIDC: true, + SAML: true, + AccessControls: true, + AdvancedAccessWorkflows: true, + Cloud: true, + HSM: true, + Desktop: true, + RecoveryCodes: true, + Plugins: true, + AutomaticUpgrades: true, + IsUsageBased: true, + Assist: true, + FeatureHiding: true, + IdentityGovernance: false, + AccessGraph: true, + Questionnaire: true, + IsStripeManaged: true, + ExternalAuditStorage: true, + JoinActiveSessions: true, + MobileDeviceManagement: true, + AccessMonitoringConfigured: true, + }, + expected: map[string]*proto.EntitlementInfo{ + string(entitlements.AccessLists): {Enabled: true, Limit: 44}, + string(entitlements.AccessMonitoring): {Enabled: true, Limit: 55}, + string(entitlements.AccessRequests): {Enabled: true, Limit: 22}, + string(entitlements.DeviceTrust): {Enabled: true, Limit: 33}, + string(entitlements.App): {Enabled: true}, + string(entitlements.DB): {Enabled: true}, + string(entitlements.Desktop): {Enabled: true}, + string(entitlements.ExternalAuditStorage): {Enabled: true}, + string(entitlements.FeatureHiding): {Enabled: true}, + string(entitlements.HSM): {Enabled: true}, + string(entitlements.JoinActiveSessions): {Enabled: true}, + string(entitlements.K8s): {Enabled: true}, + string(entitlements.MobileDeviceManagement): {Enabled: true}, + string(entitlements.OIDC): {Enabled: true}, + string(entitlements.Policy): {Enabled: true}, + string(entitlements.SAML): {Enabled: true}, + + // defaults, no legacy equivalent + string(entitlements.UsageReporting): {Enabled: false}, + string(entitlements.UpsellAlert): {Enabled: false}, + string(entitlements.CloudAuditLogRetention): {Enabled: false}, + // Identity off, fields false + string(entitlements.Identity): {Enabled: false}, + string(entitlements.SessionLocks): {Enabled: false}, + string(entitlements.OktaSCIM): {Enabled: false}, + string(entitlements.OktaUserSync): {Enabled: false}, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + cloned := apiutils.CloneProtoMsg(tt.features) + + supportEntitlementsCompatibility(cloned) + require.Equal(t, tt.expected, cloned.Entitlements) + }) + } +} From acdd343922cabefa026312a84e88d9999f09028b Mon Sep 17 00:00:00 2001 From: Roman Tkachenko Date: Wed, 7 Aug 2024 13:57:40 -0700 Subject: [PATCH 098/139] Release 16.1.4 (#45230) --- CHANGELOG.md | 6 ++ Makefile | 2 +- api/version.go | 2 +- .../macos/tsh/tsh.app/Contents/Info.plist | 4 +- .../macos/tshdev/tsh.app/Contents/Info.plist | 4 +- examples/chart/access/discord/Chart.yaml | 2 +- .../__snapshot__/configmap_test.yaml.snap | 4 +- .../__snapshot__/deployment_test.yaml.snap | 8 +-- examples/chart/access/email/Chart.yaml | 2 +- .../__snapshot__/configmap_test.yaml.snap | 24 +++---- .../__snapshot__/deployment_test.yaml.snap | 58 ++++++++-------- examples/chart/access/jira/Chart.yaml | 2 +- .../__snapshot__/configmap_test.yaml.snap | 4 +- .../__snapshot__/deployment_test.yaml.snap | 8 +-- examples/chart/access/mattermost/Chart.yaml | 2 +- .../__snapshot__/configmap_test.yaml.snap | 4 +- .../__snapshot__/deployment_test.yaml.snap | 28 ++++---- examples/chart/access/msteams/Chart.yaml | 2 +- .../__snapshot__/configmap_test.yaml.snap | 4 +- .../__snapshot__/deployment_test.yaml.snap | 8 +-- examples/chart/access/pagerduty/Chart.yaml | 2 +- .../__snapshot__/configmap_test.yaml.snap | 4 +- .../__snapshot__/deployment_test.yaml.snap | 8 +-- examples/chart/access/slack/Chart.yaml | 2 +- .../__snapshot__/configmap_test.yaml.snap | 4 +- .../__snapshot__/deployment_test.yaml.snap | 8 +-- examples/chart/event-handler/Chart.yaml | 2 +- .../__snapshot__/configmap_test.yaml.snap | 4 +- .../__snapshot__/deployment_test.yaml.snap | 6 +- examples/chart/teleport-cluster/Chart.yaml | 2 +- .../charts/teleport-operator/Chart.yaml | 2 +- .../auth_clusterrole_test.yaml.snap | 4 +- .../__snapshot__/auth_config_test.yaml.snap | 4 +- .../auth_deployment_test.yaml.snap | 8 +-- .../__snapshot__/proxy_config_test.yaml.snap | 4 +- .../proxy_deployment_test.yaml.snap | 36 +++++----- examples/chart/teleport-kube-agent/Chart.yaml | 2 +- .../__snapshot__/deployment_test.yaml.snap | 60 ++++++++--------- .../tests/__snapshot__/job_test.yaml.snap | 8 +-- .../__snapshot__/statefulset_test.yaml.snap | 66 +++++++++---------- .../updater_deployment_test.yaml.snap | 4 +- 41 files changed, 212 insertions(+), 206 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 839c7dbd556ab..aa146a7bdfbb7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## 16.1.4 (08/07/24) + +* Improved `tsh ssh` performance for concurrent execs. [#45162](https://github.com/gravitational/teleport/pull/45162) +* Fixed issue with loading cluster features when agents are upgraded prior to auth. [#45226](https://github.com/gravitational/teleport/pull/45226) +* Updated Go to `1.22.6`. [#45194](https://github.com/gravitational/teleport/pull/45194) + ## 16.1.3 (08/06/24) * Fixed an issue where `tsh aws` may display extra text in addition to the original command output. [#45168](https://github.com/gravitational/teleport/pull/45168) diff --git a/Makefile b/Makefile index 82fc23fd6cda3..c74c36486c161 100644 --- a/Makefile +++ b/Makefile @@ -11,7 +11,7 @@ # Stable releases: "1.0.0" # Pre-releases: "1.0.0-alpha.1", "1.0.0-beta.2", "1.0.0-rc.3" # Master/dev branch: "1.0.0-dev" -VERSION=16.1.3 +VERSION=16.1.4 DOCKER_IMAGE ?= teleport diff --git a/api/version.go b/api/version.go index eb819d19e100f..7b4f3de93291a 100644 --- a/api/version.go +++ b/api/version.go @@ -3,6 +3,6 @@ package api import "github.com/coreos/go-semver/semver" -const Version = "16.1.3" +const Version = "16.1.4" var SemVersion = semver.New(Version) diff --git a/build.assets/macos/tsh/tsh.app/Contents/Info.plist b/build.assets/macos/tsh/tsh.app/Contents/Info.plist index e15dc0f763b56..583b41de33c03 100644 --- a/build.assets/macos/tsh/tsh.app/Contents/Info.plist +++ b/build.assets/macos/tsh/tsh.app/Contents/Info.plist @@ -19,13 +19,13 @@ CFBundlePackageType APPL CFBundleShortVersionString - 16.1.3 + 16.1.4 CFBundleSupportedPlatforms MacOSX CFBundleVersion - 16.1.3 + 16.1.4 DTCompiler com.apple.compilers.llvm.clang.1_0 DTPlatformBuild diff --git a/build.assets/macos/tshdev/tsh.app/Contents/Info.plist b/build.assets/macos/tshdev/tsh.app/Contents/Info.plist index 74ecc83d7d76d..455951cc0e1ad 100644 --- a/build.assets/macos/tshdev/tsh.app/Contents/Info.plist +++ b/build.assets/macos/tshdev/tsh.app/Contents/Info.plist @@ -17,13 +17,13 @@ CFBundlePackageType APPL CFBundleShortVersionString - 16.1.3 + 16.1.4 CFBundleSupportedPlatforms MacOSX CFBundleVersion - 16.1.3 + 16.1.4 DTCompiler com.apple.compilers.llvm.clang.1_0 DTPlatformBuild diff --git a/examples/chart/access/discord/Chart.yaml b/examples/chart/access/discord/Chart.yaml index de05448997fff..0469f3b1635a0 100644 --- a/examples/chart/access/discord/Chart.yaml +++ b/examples/chart/access/discord/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "16.1.3" +.version: &version "16.1.4" apiVersion: v2 name: teleport-plugin-discord diff --git a/examples/chart/access/discord/tests/__snapshot__/configmap_test.yaml.snap b/examples/chart/access/discord/tests/__snapshot__/configmap_test.yaml.snap index fc0ed497fb876..3f74ba83a328a 100644 --- a/examples/chart/access/discord/tests/__snapshot__/configmap_test.yaml.snap +++ b/examples/chart/access/discord/tests/__snapshot__/configmap_test.yaml.snap @@ -24,6 +24,6 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-discord - app.kubernetes.io/version: 16.1.3 - helm.sh/chart: teleport-plugin-discord-16.1.3 + app.kubernetes.io/version: 16.1.4 + helm.sh/chart: teleport-plugin-discord-16.1.4 name: RELEASE-NAME-teleport-plugin-discord diff --git a/examples/chart/access/discord/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/access/discord/tests/__snapshot__/deployment_test.yaml.snap index 935608ea166e5..cb1dbda3786ce 100644 --- a/examples/chart/access/discord/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/access/discord/tests/__snapshot__/deployment_test.yaml.snap @@ -7,8 +7,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-discord - app.kubernetes.io/version: 16.1.3 - helm.sh/chart: teleport-plugin-discord-16.1.3 + app.kubernetes.io/version: 16.1.4 + helm.sh/chart: teleport-plugin-discord-16.1.4 name: RELEASE-NAME-teleport-plugin-discord spec: replicas: 1 @@ -22,8 +22,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-discord - app.kubernetes.io/version: 16.1.3 - helm.sh/chart: teleport-plugin-discord-16.1.3 + app.kubernetes.io/version: 16.1.4 + helm.sh/chart: teleport-plugin-discord-16.1.4 spec: containers: - command: diff --git a/examples/chart/access/email/Chart.yaml b/examples/chart/access/email/Chart.yaml index 66a3d2b868999..7301efa2dd8ba 100644 --- a/examples/chart/access/email/Chart.yaml +++ b/examples/chart/access/email/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "16.1.3" +.version: &version "16.1.4" apiVersion: v2 name: teleport-plugin-email diff --git a/examples/chart/access/email/tests/__snapshot__/configmap_test.yaml.snap b/examples/chart/access/email/tests/__snapshot__/configmap_test.yaml.snap index 401f23015d490..4a005a29163cc 100644 --- a/examples/chart/access/email/tests/__snapshot__/configmap_test.yaml.snap +++ b/examples/chart/access/email/tests/__snapshot__/configmap_test.yaml.snap @@ -26,8 +26,8 @@ should match the snapshot (mailgun on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.3 - helm.sh/chart: teleport-plugin-email-16.1.3 + app.kubernetes.io/version: 16.1.4 + helm.sh/chart: teleport-plugin-email-16.1.4 name: RELEASE-NAME-teleport-plugin-email should match the snapshot (smtp on): 1: | @@ -59,8 +59,8 @@ should match the snapshot (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.3 - helm.sh/chart: teleport-plugin-email-16.1.3 + app.kubernetes.io/version: 16.1.4 + helm.sh/chart: teleport-plugin-email-16.1.4 name: RELEASE-NAME-teleport-plugin-email should match the snapshot (smtp on, no starttls): 1: | @@ -92,8 +92,8 @@ should match the snapshot (smtp on, no starttls): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.3 - helm.sh/chart: teleport-plugin-email-16.1.3 + app.kubernetes.io/version: 16.1.4 + helm.sh/chart: teleport-plugin-email-16.1.4 name: RELEASE-NAME-teleport-plugin-email should match the snapshot (smtp on, password file): 1: | @@ -125,8 +125,8 @@ should match the snapshot (smtp on, password file): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.3 - helm.sh/chart: teleport-plugin-email-16.1.3 + app.kubernetes.io/version: 16.1.4 + helm.sh/chart: teleport-plugin-email-16.1.4 name: RELEASE-NAME-teleport-plugin-email should match the snapshot (smtp on, roleToRecipients set): 1: | @@ -161,8 +161,8 @@ should match the snapshot (smtp on, roleToRecipients set): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.3 - helm.sh/chart: teleport-plugin-email-16.1.3 + app.kubernetes.io/version: 16.1.4 + helm.sh/chart: teleport-plugin-email-16.1.4 name: RELEASE-NAME-teleport-plugin-email should match the snapshot (smtp on, starttls disabled): 1: | @@ -194,6 +194,6 @@ should match the snapshot (smtp on, starttls disabled): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.3 - helm.sh/chart: teleport-plugin-email-16.1.3 + app.kubernetes.io/version: 16.1.4 + helm.sh/chart: teleport-plugin-email-16.1.4 name: RELEASE-NAME-teleport-plugin-email diff --git a/examples/chart/access/email/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/access/email/tests/__snapshot__/deployment_test.yaml.snap index dd02098718242..99cd2e8b8deb9 100644 --- a/examples/chart/access/email/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/access/email/tests/__snapshot__/deployment_test.yaml.snap @@ -7,8 +7,8 @@ should be possible to override volume name (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.3 - helm.sh/chart: teleport-plugin-email-16.1.3 + app.kubernetes.io/version: 16.1.4 + helm.sh/chart: teleport-plugin-email-16.1.4 name: RELEASE-NAME-teleport-plugin-email spec: replicas: 1 @@ -22,8 +22,8 @@ should be possible to override volume name (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.3 - helm.sh/chart: teleport-plugin-email-16.1.3 + app.kubernetes.io/version: 16.1.4 + helm.sh/chart: teleport-plugin-email-16.1.4 spec: containers: - command: @@ -34,7 +34,7 @@ should be possible to override volume name (smtp on): env: - name: TELEPORT_PLUGIN_FAIL_FAST value: "true" - image: public.ecr.aws/gravitational/teleport-plugin-email:16.1.3 + image: public.ecr.aws/gravitational/teleport-plugin-email:16.1.4 imagePullPolicy: IfNotPresent name: teleport-plugin-email ports: @@ -75,8 +75,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.3 - helm.sh/chart: teleport-plugin-email-16.1.3 + app.kubernetes.io/version: 16.1.4 + helm.sh/chart: teleport-plugin-email-16.1.4 name: RELEASE-NAME-teleport-plugin-email spec: replicas: 1 @@ -90,8 +90,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.3 - helm.sh/chart: teleport-plugin-email-16.1.3 + app.kubernetes.io/version: 16.1.4 + helm.sh/chart: teleport-plugin-email-16.1.4 spec: containers: - command: @@ -136,8 +136,8 @@ should match the snapshot (mailgun on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.3 - helm.sh/chart: teleport-plugin-email-16.1.3 + app.kubernetes.io/version: 16.1.4 + helm.sh/chart: teleport-plugin-email-16.1.4 name: RELEASE-NAME-teleport-plugin-email spec: replicas: 1 @@ -151,8 +151,8 @@ should match the snapshot (mailgun on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.3 - helm.sh/chart: teleport-plugin-email-16.1.3 + app.kubernetes.io/version: 16.1.4 + helm.sh/chart: teleport-plugin-email-16.1.4 spec: containers: - command: @@ -163,7 +163,7 @@ should match the snapshot (mailgun on): env: - name: TELEPORT_PLUGIN_FAIL_FAST value: "true" - image: public.ecr.aws/gravitational/teleport-plugin-email:16.1.3 + image: public.ecr.aws/gravitational/teleport-plugin-email:16.1.4 imagePullPolicy: IfNotPresent name: teleport-plugin-email ports: @@ -204,8 +204,8 @@ should match the snapshot (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.3 - helm.sh/chart: teleport-plugin-email-16.1.3 + app.kubernetes.io/version: 16.1.4 + helm.sh/chart: teleport-plugin-email-16.1.4 name: RELEASE-NAME-teleport-plugin-email spec: replicas: 1 @@ -219,8 +219,8 @@ should match the snapshot (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.3 - helm.sh/chart: teleport-plugin-email-16.1.3 + app.kubernetes.io/version: 16.1.4 + helm.sh/chart: teleport-plugin-email-16.1.4 spec: containers: - command: @@ -231,7 +231,7 @@ should match the snapshot (smtp on): env: - name: TELEPORT_PLUGIN_FAIL_FAST value: "true" - image: public.ecr.aws/gravitational/teleport-plugin-email:16.1.3 + image: public.ecr.aws/gravitational/teleport-plugin-email:16.1.4 imagePullPolicy: IfNotPresent name: teleport-plugin-email ports: @@ -272,8 +272,8 @@ should mount external secret (mailgun on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.3 - helm.sh/chart: teleport-plugin-email-16.1.3 + app.kubernetes.io/version: 16.1.4 + helm.sh/chart: teleport-plugin-email-16.1.4 name: RELEASE-NAME-teleport-plugin-email spec: replicas: 1 @@ -287,8 +287,8 @@ should mount external secret (mailgun on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.3 - helm.sh/chart: teleport-plugin-email-16.1.3 + app.kubernetes.io/version: 16.1.4 + helm.sh/chart: teleport-plugin-email-16.1.4 spec: containers: - command: @@ -299,7 +299,7 @@ should mount external secret (mailgun on): env: - name: TELEPORT_PLUGIN_FAIL_FAST value: "true" - image: public.ecr.aws/gravitational/teleport-plugin-email:16.1.3 + image: public.ecr.aws/gravitational/teleport-plugin-email:16.1.4 imagePullPolicy: IfNotPresent name: teleport-plugin-email ports: @@ -340,8 +340,8 @@ should mount external secret (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.3 - helm.sh/chart: teleport-plugin-email-16.1.3 + app.kubernetes.io/version: 16.1.4 + helm.sh/chart: teleport-plugin-email-16.1.4 name: RELEASE-NAME-teleport-plugin-email spec: replicas: 1 @@ -355,8 +355,8 @@ should mount external secret (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 16.1.3 - helm.sh/chart: teleport-plugin-email-16.1.3 + app.kubernetes.io/version: 16.1.4 + helm.sh/chart: teleport-plugin-email-16.1.4 spec: containers: - command: @@ -367,7 +367,7 @@ should mount external secret (smtp on): env: - name: TELEPORT_PLUGIN_FAIL_FAST value: "true" - image: public.ecr.aws/gravitational/teleport-plugin-email:16.1.3 + image: public.ecr.aws/gravitational/teleport-plugin-email:16.1.4 imagePullPolicy: IfNotPresent name: teleport-plugin-email ports: diff --git a/examples/chart/access/jira/Chart.yaml b/examples/chart/access/jira/Chart.yaml index b5c5393646f31..41787ccc4c9ee 100644 --- a/examples/chart/access/jira/Chart.yaml +++ b/examples/chart/access/jira/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "16.1.3" +.version: &version "16.1.4" apiVersion: v2 name: teleport-plugin-jira diff --git a/examples/chart/access/jira/tests/__snapshot__/configmap_test.yaml.snap b/examples/chart/access/jira/tests/__snapshot__/configmap_test.yaml.snap index e040a2385d065..6ca6e1874255e 100644 --- a/examples/chart/access/jira/tests/__snapshot__/configmap_test.yaml.snap +++ b/examples/chart/access/jira/tests/__snapshot__/configmap_test.yaml.snap @@ -32,6 +32,6 @@ should match the snapshot (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-jira - app.kubernetes.io/version: 16.1.3 - helm.sh/chart: teleport-plugin-jira-16.1.3 + app.kubernetes.io/version: 16.1.4 + helm.sh/chart: teleport-plugin-jira-16.1.4 name: RELEASE-NAME-teleport-plugin-jira diff --git a/examples/chart/access/jira/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/access/jira/tests/__snapshot__/deployment_test.yaml.snap index 98e35425f302a..e5b20083022e5 100644 --- a/examples/chart/access/jira/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/access/jira/tests/__snapshot__/deployment_test.yaml.snap @@ -7,8 +7,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-jira - app.kubernetes.io/version: 16.1.3 - helm.sh/chart: teleport-plugin-jira-16.1.3 + app.kubernetes.io/version: 16.1.4 + helm.sh/chart: teleport-plugin-jira-16.1.4 name: RELEASE-NAME-teleport-plugin-jira spec: replicas: 1 @@ -22,8 +22,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-jira - app.kubernetes.io/version: 16.1.3 - helm.sh/chart: teleport-plugin-jira-16.1.3 + app.kubernetes.io/version: 16.1.4 + helm.sh/chart: teleport-plugin-jira-16.1.4 spec: containers: - command: diff --git a/examples/chart/access/mattermost/Chart.yaml b/examples/chart/access/mattermost/Chart.yaml index 831c4364e4f26..8e2ddd337afe1 100644 --- a/examples/chart/access/mattermost/Chart.yaml +++ b/examples/chart/access/mattermost/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "16.1.3" +.version: &version "16.1.4" apiVersion: v2 name: teleport-plugin-mattermost diff --git a/examples/chart/access/mattermost/tests/__snapshot__/configmap_test.yaml.snap b/examples/chart/access/mattermost/tests/__snapshot__/configmap_test.yaml.snap index 37e7abd61a8de..70098a95e6604 100644 --- a/examples/chart/access/mattermost/tests/__snapshot__/configmap_test.yaml.snap +++ b/examples/chart/access/mattermost/tests/__snapshot__/configmap_test.yaml.snap @@ -22,6 +22,6 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-mattermost - app.kubernetes.io/version: 16.1.3 - helm.sh/chart: teleport-plugin-mattermost-16.1.3 + app.kubernetes.io/version: 16.1.4 + helm.sh/chart: teleport-plugin-mattermost-16.1.4 name: RELEASE-NAME-teleport-plugin-mattermost diff --git a/examples/chart/access/mattermost/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/access/mattermost/tests/__snapshot__/deployment_test.yaml.snap index bdfece8c6cccb..0da7cda5bd7ac 100644 --- a/examples/chart/access/mattermost/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/access/mattermost/tests/__snapshot__/deployment_test.yaml.snap @@ -7,8 +7,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-mattermost - app.kubernetes.io/version: 16.1.3 - helm.sh/chart: teleport-plugin-mattermost-16.1.3 + app.kubernetes.io/version: 16.1.4 + helm.sh/chart: teleport-plugin-mattermost-16.1.4 name: RELEASE-NAME-teleport-plugin-mattermost spec: replicas: 1 @@ -22,8 +22,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-mattermost - app.kubernetes.io/version: 16.1.3 - helm.sh/chart: teleport-plugin-mattermost-16.1.3 + app.kubernetes.io/version: 16.1.4 + helm.sh/chart: teleport-plugin-mattermost-16.1.4 spec: containers: - command: @@ -75,8 +75,8 @@ should mount external secret: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-mattermost - app.kubernetes.io/version: 16.1.3 - helm.sh/chart: teleport-plugin-mattermost-16.1.3 + app.kubernetes.io/version: 16.1.4 + helm.sh/chart: teleport-plugin-mattermost-16.1.4 name: RELEASE-NAME-teleport-plugin-mattermost spec: replicas: 1 @@ -90,8 +90,8 @@ should mount external secret: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-mattermost - app.kubernetes.io/version: 16.1.3 - helm.sh/chart: teleport-plugin-mattermost-16.1.3 + app.kubernetes.io/version: 16.1.4 + helm.sh/chart: teleport-plugin-mattermost-16.1.4 spec: containers: - command: @@ -102,7 +102,7 @@ should mount external secret: env: - name: TELEPORT_PLUGIN_FAIL_FAST value: "true" - image: public.ecr.aws/gravitational/teleport-plugin-mattermost:16.1.3 + image: public.ecr.aws/gravitational/teleport-plugin-mattermost:16.1.4 imagePullPolicy: IfNotPresent name: teleport-plugin-mattermost ports: @@ -143,8 +143,8 @@ should override volume name: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-mattermost - app.kubernetes.io/version: 16.1.3 - helm.sh/chart: teleport-plugin-mattermost-16.1.3 + app.kubernetes.io/version: 16.1.4 + helm.sh/chart: teleport-plugin-mattermost-16.1.4 name: RELEASE-NAME-teleport-plugin-mattermost spec: replicas: 1 @@ -158,8 +158,8 @@ should override volume name: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-mattermost - app.kubernetes.io/version: 16.1.3 - helm.sh/chart: teleport-plugin-mattermost-16.1.3 + app.kubernetes.io/version: 16.1.4 + helm.sh/chart: teleport-plugin-mattermost-16.1.4 spec: containers: - command: @@ -170,7 +170,7 @@ should override volume name: env: - name: TELEPORT_PLUGIN_FAIL_FAST value: "true" - image: public.ecr.aws/gravitational/teleport-plugin-mattermost:16.1.3 + image: public.ecr.aws/gravitational/teleport-plugin-mattermost:16.1.4 imagePullPolicy: IfNotPresent name: teleport-plugin-mattermost ports: diff --git a/examples/chart/access/msteams/Chart.yaml b/examples/chart/access/msteams/Chart.yaml index 4c6bad6a80354..bf3b2bfc41a62 100644 --- a/examples/chart/access/msteams/Chart.yaml +++ b/examples/chart/access/msteams/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "16.1.3" +.version: &version "16.1.4" apiVersion: v2 name: teleport-plugin-msteams diff --git a/examples/chart/access/msteams/tests/__snapshot__/configmap_test.yaml.snap b/examples/chart/access/msteams/tests/__snapshot__/configmap_test.yaml.snap index 004281e21abb3..788ff06ced168 100644 --- a/examples/chart/access/msteams/tests/__snapshot__/configmap_test.yaml.snap +++ b/examples/chart/access/msteams/tests/__snapshot__/configmap_test.yaml.snap @@ -29,6 +29,6 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-msteams - app.kubernetes.io/version: 16.1.3 - helm.sh/chart: teleport-plugin-msteams-16.1.3 + app.kubernetes.io/version: 16.1.4 + helm.sh/chart: teleport-plugin-msteams-16.1.4 name: RELEASE-NAME-teleport-plugin-msteams diff --git a/examples/chart/access/msteams/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/access/msteams/tests/__snapshot__/deployment_test.yaml.snap index 74eabf138da4c..31d99267aae41 100644 --- a/examples/chart/access/msteams/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/access/msteams/tests/__snapshot__/deployment_test.yaml.snap @@ -7,8 +7,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-msteams - app.kubernetes.io/version: 16.1.3 - helm.sh/chart: teleport-plugin-msteams-16.1.3 + app.kubernetes.io/version: 16.1.4 + helm.sh/chart: teleport-plugin-msteams-16.1.4 name: RELEASE-NAME-teleport-plugin-msteams spec: replicas: 1 @@ -22,8 +22,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-msteams - app.kubernetes.io/version: 16.1.3 - helm.sh/chart: teleport-plugin-msteams-16.1.3 + app.kubernetes.io/version: 16.1.4 + helm.sh/chart: teleport-plugin-msteams-16.1.4 spec: containers: - command: diff --git a/examples/chart/access/pagerduty/Chart.yaml b/examples/chart/access/pagerduty/Chart.yaml index 8d1b8167a4e03..74fb027bab36e 100644 --- a/examples/chart/access/pagerduty/Chart.yaml +++ b/examples/chart/access/pagerduty/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "16.1.3" +.version: &version "16.1.4" apiVersion: v2 name: teleport-plugin-pagerduty diff --git a/examples/chart/access/pagerduty/tests/__snapshot__/configmap_test.yaml.snap b/examples/chart/access/pagerduty/tests/__snapshot__/configmap_test.yaml.snap index 1aba2798e7659..aec6384b7fa54 100644 --- a/examples/chart/access/pagerduty/tests/__snapshot__/configmap_test.yaml.snap +++ b/examples/chart/access/pagerduty/tests/__snapshot__/configmap_test.yaml.snap @@ -21,6 +21,6 @@ should match the snapshot (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-pagerduty - app.kubernetes.io/version: 16.1.3 - helm.sh/chart: teleport-plugin-pagerduty-16.1.3 + app.kubernetes.io/version: 16.1.4 + helm.sh/chart: teleport-plugin-pagerduty-16.1.4 name: RELEASE-NAME-teleport-plugin-pagerduty diff --git a/examples/chart/access/pagerduty/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/access/pagerduty/tests/__snapshot__/deployment_test.yaml.snap index 7c119794511b7..27e7e5acf7703 100644 --- a/examples/chart/access/pagerduty/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/access/pagerduty/tests/__snapshot__/deployment_test.yaml.snap @@ -7,8 +7,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-pagerduty - app.kubernetes.io/version: 16.1.3 - helm.sh/chart: teleport-plugin-pagerduty-16.1.3 + app.kubernetes.io/version: 16.1.4 + helm.sh/chart: teleport-plugin-pagerduty-16.1.4 name: RELEASE-NAME-teleport-plugin-pagerduty spec: replicas: 1 @@ -22,8 +22,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-pagerduty - app.kubernetes.io/version: 16.1.3 - helm.sh/chart: teleport-plugin-pagerduty-16.1.3 + app.kubernetes.io/version: 16.1.4 + helm.sh/chart: teleport-plugin-pagerduty-16.1.4 spec: containers: - command: diff --git a/examples/chart/access/slack/Chart.yaml b/examples/chart/access/slack/Chart.yaml index 6b18646958d38..4c3b4118abfdd 100644 --- a/examples/chart/access/slack/Chart.yaml +++ b/examples/chart/access/slack/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "16.1.3" +.version: &version "16.1.4" apiVersion: v2 name: teleport-plugin-slack diff --git a/examples/chart/access/slack/tests/__snapshot__/configmap_test.yaml.snap b/examples/chart/access/slack/tests/__snapshot__/configmap_test.yaml.snap index 8be48392122fa..880a8e6d9d1ad 100644 --- a/examples/chart/access/slack/tests/__snapshot__/configmap_test.yaml.snap +++ b/examples/chart/access/slack/tests/__snapshot__/configmap_test.yaml.snap @@ -24,6 +24,6 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-slack - app.kubernetes.io/version: 16.1.3 - helm.sh/chart: teleport-plugin-slack-16.1.3 + app.kubernetes.io/version: 16.1.4 + helm.sh/chart: teleport-plugin-slack-16.1.4 name: RELEASE-NAME-teleport-plugin-slack diff --git a/examples/chart/access/slack/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/access/slack/tests/__snapshot__/deployment_test.yaml.snap index 78dfb05a609f5..1d7da9e578662 100644 --- a/examples/chart/access/slack/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/access/slack/tests/__snapshot__/deployment_test.yaml.snap @@ -7,8 +7,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-slack - app.kubernetes.io/version: 16.1.3 - helm.sh/chart: teleport-plugin-slack-16.1.3 + app.kubernetes.io/version: 16.1.4 + helm.sh/chart: teleport-plugin-slack-16.1.4 name: RELEASE-NAME-teleport-plugin-slack spec: replicas: 1 @@ -22,8 +22,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-slack - app.kubernetes.io/version: 16.1.3 - helm.sh/chart: teleport-plugin-slack-16.1.3 + app.kubernetes.io/version: 16.1.4 + helm.sh/chart: teleport-plugin-slack-16.1.4 spec: containers: - command: diff --git a/examples/chart/event-handler/Chart.yaml b/examples/chart/event-handler/Chart.yaml index 8d31a13d2a770..aefda72e4bdad 100644 --- a/examples/chart/event-handler/Chart.yaml +++ b/examples/chart/event-handler/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "16.1.3" +.version: &version "16.1.4" apiVersion: v2 name: teleport-plugin-event-handler diff --git a/examples/chart/event-handler/tests/__snapshot__/configmap_test.yaml.snap b/examples/chart/event-handler/tests/__snapshot__/configmap_test.yaml.snap index 4f27386980baf..66dea478bfd3d 100644 --- a/examples/chart/event-handler/tests/__snapshot__/configmap_test.yaml.snap +++ b/examples/chart/event-handler/tests/__snapshot__/configmap_test.yaml.snap @@ -26,6 +26,6 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-event-handler - app.kubernetes.io/version: 16.1.3 - helm.sh/chart: teleport-plugin-event-handler-16.1.3 + app.kubernetes.io/version: 16.1.4 + helm.sh/chart: teleport-plugin-event-handler-16.1.4 name: RELEASE-NAME-teleport-plugin-event-handler diff --git a/examples/chart/event-handler/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/event-handler/tests/__snapshot__/deployment_test.yaml.snap index 1704858d75c76..f7eb578686b28 100644 --- a/examples/chart/event-handler/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/event-handler/tests/__snapshot__/deployment_test.yaml.snap @@ -7,8 +7,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-event-handler - app.kubernetes.io/version: 16.1.3 - helm.sh/chart: teleport-plugin-event-handler-16.1.3 + app.kubernetes.io/version: 16.1.4 + helm.sh/chart: teleport-plugin-event-handler-16.1.4 name: RELEASE-NAME-teleport-plugin-event-handler spec: replicas: 1 @@ -82,7 +82,7 @@ should mount tls.existingCASecretName and set environment when set in values: value: "true" - name: SSL_CERT_FILE value: /etc/teleport-tls-ca/ca.pem - image: public.ecr.aws/gravitational/teleport-plugin-event-handler:16.1.3 + image: public.ecr.aws/gravitational/teleport-plugin-event-handler:16.1.4 imagePullPolicy: IfNotPresent name: teleport-plugin-event-handler ports: diff --git a/examples/chart/teleport-cluster/Chart.yaml b/examples/chart/teleport-cluster/Chart.yaml index 228bfe689442a..22e62598c331c 100644 --- a/examples/chart/teleport-cluster/Chart.yaml +++ b/examples/chart/teleport-cluster/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "16.1.3" +.version: &version "16.1.4" name: teleport-cluster apiVersion: v2 diff --git a/examples/chart/teleport-cluster/charts/teleport-operator/Chart.yaml b/examples/chart/teleport-cluster/charts/teleport-operator/Chart.yaml index 9be5168385b9b..13777a99be719 100644 --- a/examples/chart/teleport-cluster/charts/teleport-operator/Chart.yaml +++ b/examples/chart/teleport-cluster/charts/teleport-operator/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "16.1.3" +.version: &version "16.1.4" name: teleport-operator apiVersion: v2 diff --git a/examples/chart/teleport-cluster/tests/__snapshot__/auth_clusterrole_test.yaml.snap b/examples/chart/teleport-cluster/tests/__snapshot__/auth_clusterrole_test.yaml.snap index 7d3a8e45adeec..22e19a142ef26 100644 --- a/examples/chart/teleport-cluster/tests/__snapshot__/auth_clusterrole_test.yaml.snap +++ b/examples/chart/teleport-cluster/tests/__snapshot__/auth_clusterrole_test.yaml.snap @@ -8,8 +8,8 @@ adds operator permissions to ClusterRole: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-cluster - app.kubernetes.io/version: 16.1.3 - helm.sh/chart: teleport-cluster-16.1.3 + app.kubernetes.io/version: 16.1.4 + helm.sh/chart: teleport-cluster-16.1.4 teleport.dev/majorVersion: "16" name: RELEASE-NAME rules: diff --git a/examples/chart/teleport-cluster/tests/__snapshot__/auth_config_test.yaml.snap b/examples/chart/teleport-cluster/tests/__snapshot__/auth_config_test.yaml.snap index d7f36ddd1a261..81aef259bf341 100644 --- a/examples/chart/teleport-cluster/tests/__snapshot__/auth_config_test.yaml.snap +++ b/examples/chart/teleport-cluster/tests/__snapshot__/auth_config_test.yaml.snap @@ -1848,8 +1848,8 @@ sets clusterDomain on Configmap: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-cluster - app.kubernetes.io/version: 16.1.3 - helm.sh/chart: teleport-cluster-16.1.3 + app.kubernetes.io/version: 16.1.4 + helm.sh/chart: teleport-cluster-16.1.4 teleport.dev/majorVersion: "16" name: RELEASE-NAME-auth namespace: NAMESPACE diff --git a/examples/chart/teleport-cluster/tests/__snapshot__/auth_deployment_test.yaml.snap b/examples/chart/teleport-cluster/tests/__snapshot__/auth_deployment_test.yaml.snap index 488acb7aac065..02e4945189bc6 100644 --- a/examples/chart/teleport-cluster/tests/__snapshot__/auth_deployment_test.yaml.snap +++ b/examples/chart/teleport-cluster/tests/__snapshot__/auth_deployment_test.yaml.snap @@ -8,7 +8,7 @@ - args: - --diag-addr=0.0.0.0:3000 - --apply-on-startup=/etc/teleport/apply-on-startup.yaml - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -141,7 +141,7 @@ should set nodeSelector when set in values: - args: - --diag-addr=0.0.0.0:3000 - --apply-on-startup=/etc/teleport/apply-on-startup.yaml - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -238,7 +238,7 @@ should set resources when set in values: - args: - --diag-addr=0.0.0.0:3000 - --apply-on-startup=/etc/teleport/apply-on-startup.yaml - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -324,7 +324,7 @@ should set securityContext when set in values: - args: - --diag-addr=0.0.0.0:3000 - --apply-on-startup=/etc/teleport/apply-on-startup.yaml - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent lifecycle: preStop: diff --git a/examples/chart/teleport-cluster/tests/__snapshot__/proxy_config_test.yaml.snap b/examples/chart/teleport-cluster/tests/__snapshot__/proxy_config_test.yaml.snap index 03c53484e0ea7..3d1ed52723f2d 100644 --- a/examples/chart/teleport-cluster/tests/__snapshot__/proxy_config_test.yaml.snap +++ b/examples/chart/teleport-cluster/tests/__snapshot__/proxy_config_test.yaml.snap @@ -567,8 +567,8 @@ sets clusterDomain on Configmap: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-cluster - app.kubernetes.io/version: 16.1.3 - helm.sh/chart: teleport-cluster-16.1.3 + app.kubernetes.io/version: 16.1.4 + helm.sh/chart: teleport-cluster-16.1.4 teleport.dev/majorVersion: "16" name: RELEASE-NAME-proxy namespace: NAMESPACE diff --git a/examples/chart/teleport-cluster/tests/__snapshot__/proxy_deployment_test.yaml.snap b/examples/chart/teleport-cluster/tests/__snapshot__/proxy_deployment_test.yaml.snap index ba1aa765db91b..9bd8c23cca769 100644 --- a/examples/chart/teleport-cluster/tests/__snapshot__/proxy_deployment_test.yaml.snap +++ b/examples/chart/teleport-cluster/tests/__snapshot__/proxy_deployment_test.yaml.snap @@ -11,8 +11,8 @@ sets clusterDomain on Deployment Pods: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-cluster - app.kubernetes.io/version: 16.1.3 - helm.sh/chart: teleport-cluster-16.1.3 + app.kubernetes.io/version: 16.1.4 + helm.sh/chart: teleport-cluster-16.1.4 teleport.dev/majorVersion: "16" name: RELEASE-NAME-proxy namespace: NAMESPACE @@ -26,7 +26,7 @@ sets clusterDomain on Deployment Pods: template: metadata: annotations: - checksum/config: 27f3e0c146b5a67ee8e4dce0e1e3c2dba3bb77b96a19d2f9db4cf9ebdb9687ac + checksum/config: f678f6cb77c35c70e794df5c213ac929462ee77b924b77492d82fd799dab5943 kubernetes.io/pod: test-annotation kubernetes.io/pod-different: 4 labels: @@ -34,8 +34,8 @@ sets clusterDomain on Deployment Pods: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-cluster - app.kubernetes.io/version: 16.1.3 - helm.sh/chart: teleport-cluster-16.1.3 + app.kubernetes.io/version: 16.1.4 + helm.sh/chart: teleport-cluster-16.1.4 teleport.dev/majorVersion: "16" spec: affinity: @@ -44,7 +44,7 @@ sets clusterDomain on Deployment Pods: containers: - args: - --diag-addr=0.0.0.0:3000 - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -105,7 +105,7 @@ sets clusterDomain on Deployment Pods: - wait - no-resolve - RELEASE-NAME-auth-v15.NAMESPACE.svc.test.com - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 name: wait-auth-update serviceAccountName: RELEASE-NAME-proxy terminationGracePeriodSeconds: 60 @@ -137,7 +137,7 @@ should provision initContainer correctly when set in values: - wait - no-resolve - RELEASE-NAME-auth-v15.NAMESPACE.svc.cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 name: wait-auth-update resources: limits: @@ -201,7 +201,7 @@ should set nodeSelector when set in values: containers: - args: - --diag-addr=0.0.0.0:3000 - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -262,7 +262,7 @@ should set nodeSelector when set in values: - wait - no-resolve - RELEASE-NAME-auth-v15.NAMESPACE.svc.cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 name: wait-auth-update nodeSelector: environment: security @@ -313,7 +313,7 @@ should set resources for wait-auth-update initContainer when set in values: containers: - args: - --diag-addr=0.0.0.0:3000 - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -381,7 +381,7 @@ should set resources for wait-auth-update initContainer when set in values: - wait - no-resolve - RELEASE-NAME-auth-v15.NAMESPACE.svc.cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 name: wait-auth-update resources: limits: @@ -421,7 +421,7 @@ should set resources when set in values: containers: - args: - --diag-addr=0.0.0.0:3000 - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -489,7 +489,7 @@ should set resources when set in values: - wait - no-resolve - RELEASE-NAME-auth-v15.NAMESPACE.svc.cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 name: wait-auth-update resources: limits: @@ -529,7 +529,7 @@ should set securityContext for initContainers when set in values: containers: - args: - --diag-addr=0.0.0.0:3000 - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -597,7 +597,7 @@ should set securityContext for initContainers when set in values: - wait - no-resolve - RELEASE-NAME-auth-v15.NAMESPACE.svc.cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 name: wait-auth-update securityContext: allowPrivilegeEscalation: false @@ -637,7 +637,7 @@ should set securityContext when set in values: containers: - args: - --diag-addr=0.0.0.0:3000 - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -705,7 +705,7 @@ should set securityContext when set in values: - wait - no-resolve - RELEASE-NAME-auth-v15.NAMESPACE.svc.cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 name: wait-auth-update securityContext: allowPrivilegeEscalation: false diff --git a/examples/chart/teleport-kube-agent/Chart.yaml b/examples/chart/teleport-kube-agent/Chart.yaml index 15ef43977f851..44e8f099d3563 100644 --- a/examples/chart/teleport-kube-agent/Chart.yaml +++ b/examples/chart/teleport-kube-agent/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "16.1.3" +.version: &version "16.1.4" name: teleport-kube-agent apiVersion: v2 diff --git a/examples/chart/teleport-kube-agent/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/teleport-kube-agent/tests/__snapshot__/deployment_test.yaml.snap index 3e5d7feddac61..d8bd30b1b78f0 100644 --- a/examples/chart/teleport-kube-agent/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/teleport-kube-agent/tests/__snapshot__/deployment_test.yaml.snap @@ -32,7 +32,7 @@ sets Deployment annotations when specified if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -109,7 +109,7 @@ sets Deployment labels when specified if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -173,7 +173,7 @@ sets Pod annotations when specified if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -237,7 +237,7 @@ sets Pod labels when specified if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -322,7 +322,7 @@ should add emptyDir for data when existingDataVolume is not set if action is Upg value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -387,7 +387,7 @@ should add insecureSkipProxyTLSVerify to args when set in values if action is Up value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -451,7 +451,7 @@ should correctly configure existingDataVolume when set if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -513,7 +513,7 @@ should expose diag port if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -589,7 +589,7 @@ should have multiple replicas when replicaCount is set (using .replicaCount, dep value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -665,7 +665,7 @@ should have multiple replicas when replicaCount is set (using highAvailability.r value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -729,7 +729,7 @@ should have one replica when replicaCount is not set if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -793,7 +793,7 @@ should mount extraVolumes and extraVolumeMounts if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -862,7 +862,7 @@ should mount jamfCredentialsSecret if it already exists and when role is jamf an value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -932,7 +932,7 @@ should mount jamfCredentialsSecret.name when role is jamf and action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1004,7 +1004,7 @@ should mount tls.existingCASecretName and set environment when set in values if value: cluster.local - name: SSL_CERT_FILE value: /etc/teleport-tls-ca/ca.pem - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1078,7 +1078,7 @@ should mount tls.existingCASecretName and set extra environment when set in valu value: http://username:password@my.proxy.host:3128 - name: SSL_CERT_FILE value: /etc/teleport-tls-ca/ca.pem - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1148,7 +1148,7 @@ should provision initContainer correctly when set in values if action is Upgrade value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1270,7 +1270,7 @@ should set affinity when set in values if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1334,7 +1334,7 @@ should set default serviceAccountName when not set in values if action is Upgrad value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1411,7 +1411,7 @@ should set environment when extraEnv set in values if action is Upgrade: value: cluster.local - name: HTTPS_PROXY value: http://username:password@my.proxy.host:3128 - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1539,7 +1539,7 @@ should set imagePullPolicy when set in values if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: Always livenessProbe: failureThreshold: 6 @@ -1603,7 +1603,7 @@ should set nodeSelector if set in values if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1669,7 +1669,7 @@ should set not set priorityClassName when not set in values if action is Upgrade value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1745,7 +1745,7 @@ should set preferred affinity when more than one replica is used if action is Up value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1809,7 +1809,7 @@ should set priorityClassName when set in values if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1874,7 +1874,7 @@ should set probeTimeoutSeconds when set in values if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1948,7 +1948,7 @@ should set required affinity when highAvailability.requireAntiAffinity is set if value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2012,7 +2012,7 @@ should set resources when set in values if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2083,7 +2083,7 @@ should set serviceAccountName when set in values if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2147,7 +2147,7 @@ should set tolerations when set in values if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 diff --git a/examples/chart/teleport-kube-agent/tests/__snapshot__/job_test.yaml.snap b/examples/chart/teleport-kube-agent/tests/__snapshot__/job_test.yaml.snap index b5b9953db5995..4fc21e36aaa82 100644 --- a/examples/chart/teleport-kube-agent/tests/__snapshot__/job_test.yaml.snap +++ b/examples/chart/teleport-kube-agent/tests/__snapshot__/job_test.yaml.snap @@ -25,7 +25,7 @@ should create ServiceAccount for post-delete hook by default: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent name: post-delete-job securityContext: @@ -106,7 +106,7 @@ should not create ServiceAccount for post-delete hook if serviceAccount.create i fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent name: post-delete-job securityContext: @@ -136,7 +136,7 @@ should not create ServiceAccount, Role or RoleBinding for post-delete hook if se fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent name: post-delete-job securityContext: @@ -166,7 +166,7 @@ should set nodeSelector in post-delete hook: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent name: post-delete-job securityContext: diff --git a/examples/chart/teleport-kube-agent/tests/__snapshot__/statefulset_test.yaml.snap b/examples/chart/teleport-kube-agent/tests/__snapshot__/statefulset_test.yaml.snap index 24beaf8c94a6a..5ca864660946a 100644 --- a/examples/chart/teleport-kube-agent/tests/__snapshot__/statefulset_test.yaml.snap +++ b/examples/chart/teleport-kube-agent/tests/__snapshot__/statefulset_test.yaml.snap @@ -16,7 +16,7 @@ sets Pod annotations when specified: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -86,7 +86,7 @@ sets Pod labels when specified: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -180,7 +180,7 @@ sets StatefulSet labels when specified: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -282,7 +282,7 @@ should add insecureSkipProxyTLSVerify to args when set in values: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -352,7 +352,7 @@ should add volumeClaimTemplate for data volume when using StatefulSet and action fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -442,7 +442,7 @@ should add volumeClaimTemplate for data volume when using StatefulSet and is Fre fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -522,7 +522,7 @@ should add volumeMount for data volume when using StatefulSet: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -592,7 +592,7 @@ should expose diag port: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -662,7 +662,7 @@ should generate Statefulset when storage is disabled and mode is a Upgrade: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -746,7 +746,7 @@ should have multiple replicas when replicaCount is set (using .replicaCount, dep fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -828,7 +828,7 @@ should have multiple replicas when replicaCount is set (using highAvailability.r fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -898,7 +898,7 @@ should have one replica when replicaCount is not set: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -968,7 +968,7 @@ should install Statefulset when storage is disabled and mode is a Fresh Install: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1040,7 +1040,7 @@ should mount extraVolumes and extraVolumeMounts: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1115,7 +1115,7 @@ should mount jamfCredentialsSecret if it already exists and when role is jamf: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1193,7 +1193,7 @@ should mount jamfCredentialsSecret.name when role is jamf: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1273,7 +1273,7 @@ should mount tls.existingCASecretName and set environment when set in values: value: RELEASE-NAME - name: SSL_CERT_FILE value: /etc/teleport-tls-ca/ca.pem - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1355,7 +1355,7 @@ should mount tls.existingCASecretName and set extra environment when set in valu value: /etc/teleport-tls-ca/ca.pem - name: HTTPS_PROXY value: http://username:password@my.proxy.host:3128 - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1433,7 +1433,7 @@ should not add emptyDir for data when using StatefulSet: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1503,7 +1503,7 @@ should provision initContainer correctly when set in values: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1631,7 +1631,7 @@ should set affinity when set in values: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1701,7 +1701,7 @@ should set default serviceAccountName when not set in values: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1784,7 +1784,7 @@ should set environment when extraEnv set in values: value: RELEASE-NAME - name: HTTPS_PROXY value: http://username:password@my.proxy.host:3128 - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1924,7 +1924,7 @@ should set imagePullPolicy when set in values: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: Always livenessProbe: failureThreshold: 6 @@ -1994,7 +1994,7 @@ should set nodeSelector if set in values: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2078,7 +2078,7 @@ should set preferred affinity when more than one replica is used: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2148,7 +2148,7 @@ should set probeTimeoutSeconds when set in values: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2228,7 +2228,7 @@ should set required affinity when highAvailability.requireAntiAffinity is set: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2298,7 +2298,7 @@ should set resources when set in values: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2375,7 +2375,7 @@ should set serviceAccountName when set in values: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2445,7 +2445,7 @@ should set storage.requests when set in values and action is an Upgrade: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2515,7 +2515,7 @@ should set storage.storageClassName when set in values and action is an Upgrade: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2585,7 +2585,7 @@ should set tolerations when set in values: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.1.3 + image: public.ecr.aws/gravitational/teleport-distroless:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 diff --git a/examples/chart/teleport-kube-agent/tests/__snapshot__/updater_deployment_test.yaml.snap b/examples/chart/teleport-kube-agent/tests/__snapshot__/updater_deployment_test.yaml.snap index 9d428347464c3..c9ffe3a1f9fe1 100644 --- a/examples/chart/teleport-kube-agent/tests/__snapshot__/updater_deployment_test.yaml.snap +++ b/examples/chart/teleport-kube-agent/tests/__snapshot__/updater_deployment_test.yaml.snap @@ -27,7 +27,7 @@ sets the affinity: - --base-image=public.ecr.aws/gravitational/teleport-distroless - --version-server=https://my-custom-version-server/v1 - --version-channel=custom/preview - image: public.ecr.aws/gravitational/teleport-kube-agent-updater:16.1.3 + image: public.ecr.aws/gravitational/teleport-kube-agent-updater:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -73,7 +73,7 @@ sets the tolerations: - --base-image=public.ecr.aws/gravitational/teleport-distroless - --version-server=https://my-custom-version-server/v1 - --version-channel=custom/preview - image: public.ecr.aws/gravitational/teleport-kube-agent-updater:16.1.3 + image: public.ecr.aws/gravitational/teleport-kube-agent-updater:16.1.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 From 4235c8cad5e8c6aa55c7737b4899143a4f36aaad Mon Sep 17 00:00:00 2001 From: Tim Buckley Date: Wed, 7 Aug 2024 16:06:14 -0600 Subject: [PATCH 099/139] [v16] Include tbot FIPS fix in v16 changelog (#45220) * Include tbot FIPS fix in v16 changelog No changelog entry was added to v16.1.3 for the FIPS build fix so this retroactively adds the entry. The e ref associated with this release does include the change, so only the changelog entry is missing. * Include affected versions in changelog entry --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index aa146a7bdfbb7..ea59df8af87c7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,7 @@ Enterprise: * Fixed a redirection issue with the SAML IdP authentication middleware which prevented users from signing into the service provider when an SAML authentication request was made with an HTTP-POST binding protocol, and user's didn't already have an active session with Teleport. [#4806](https://github.com/gravitational/teleport.e/pull/4806) * SAML applications can now be deleted from the Web UI. [#4778](https://github.com/gravitational/teleport.e/pull/4778) +* Fixed an issue introduced in v16.0.3 and v15.4.6 where `tbot` FIPS builds fail to start due to a missing boringcrypto dependency. [#4757](https://github.com/gravitational/teleport.e/pull/4757) ## 16.1.1 (07/31/24) From 79bb6365c16c5bf762dd51d1a37d206689bff666 Mon Sep 17 00:00:00 2001 From: rosstimothy <39066650+rosstimothy@users.noreply.github.com> Date: Wed, 7 Aug 2024 19:09:14 -0400 Subject: [PATCH 100/139] Add host user creation benchmark test (#45199) Includes a new benchmark test meant to cover the performance regression introduced in https://github.com/gravitational/teleport/pull/42884. A few additional tweaks to the ssh test suite were required to use the same fixtures in benchmark and unit tests. --- lib/services/presence.go | 4 ++ lib/srv/regular/sshserver.go | 5 +- lib/srv/regular/sshserver_test.go | 12 ++-- lib/srv/regular/sshserver_unix_test.go | 78 ++++++++++++++++++++++++++ lib/srv/sess.go | 1 + lib/srv/usermgmt.go | 5 +- lib/utils/testhelpers.go | 18 +++--- 7 files changed, 103 insertions(+), 20 deletions(-) diff --git a/lib/services/presence.go b/lib/services/presence.go index e9b9f8c3d06c3..1b7528ebdf425 100644 --- a/lib/services/presence.go +++ b/lib/services/presence.go @@ -20,6 +20,7 @@ package services import ( "context" + "time" "github.com/gravitational/teleport/api/client/proto" "github.com/gravitational/teleport/api/internalutils/stream" @@ -203,4 +204,7 @@ type Presence interface { type PresenceInternal interface { Presence InventoryInternal + + UpsertHostUserInteractionTime(ctx context.Context, name string, loginTime time.Time) error + GetHostUserInteractionTime(ctx context.Context, name string) (time.Time, error) } diff --git a/lib/srv/regular/sshserver.go b/lib/srv/regular/sshserver.go index 301f1c1d6345f..4fd35a888a5dc 100644 --- a/lib/srv/regular/sshserver.go +++ b/lib/srv/regular/sshserver.go @@ -64,7 +64,6 @@ import ( "github.com/gravitational/teleport/lib/reversetunnelclient" "github.com/gravitational/teleport/lib/service/servicecfg" "github.com/gravitational/teleport/lib/services" - "github.com/gravitational/teleport/lib/services/local" "github.com/gravitational/teleport/lib/srv" "github.com/gravitational/teleport/lib/srv/ingress" "github.com/gravitational/teleport/lib/sshutils" @@ -209,7 +208,7 @@ type Server struct { // creation createHostUser bool - storage *local.PresenceService + storage services.PresenceInternal // users is used to start the automatic user deletion loop users srv.HostUsers @@ -614,7 +613,7 @@ func SetCreateHostUser(createUser bool) ServerOption { } // SetStoragePresenceService configures host user creation on a server -func SetStoragePresenceService(service *local.PresenceService) ServerOption { +func SetStoragePresenceService(service services.PresenceInternal) ServerOption { return func(s *Server) error { s.storage = service return nil diff --git a/lib/srv/regular/sshserver_test.go b/lib/srv/regular/sshserver_test.go index 9a402fc9af256..624b1eac89fe9 100644 --- a/lib/srv/regular/sshserver_test.go +++ b/lib/srv/regular/sshserver_test.go @@ -126,7 +126,7 @@ func newFixture(t *testing.T) *sshTestFixture { return newCustomFixture(t, func(*auth.TestServerConfig) {}) } -func newFixtureWithoutDiskBasedLogging(t *testing.T, sshOpts ...ServerOption) *sshTestFixture { +func newFixtureWithoutDiskBasedLogging(t testing.TB, sshOpts ...ServerOption) *sshTestFixture { t.Helper() f := newCustomFixture(t, func(cfg *auth.TestServerConfig) { @@ -143,7 +143,7 @@ func newFixtureWithoutDiskBasedLogging(t *testing.T, sshOpts ...ServerOption) *s return f } -func (f *sshTestFixture) newSSHClient(ctx context.Context, t *testing.T, user *user.User) *tracessh.Client { +func (f *sshTestFixture) newSSHClient(ctx context.Context, t testing.TB, user *user.User) *tracessh.Client { // set up SSH client using the user private key for signing up, err := newUpack(f.testSrv, user.Username, []string{user.Username}, wildcardAllow) require.NoError(t, err) @@ -172,7 +172,7 @@ func (f *sshTestFixture) newSSHClient(ctx context.Context, t *testing.T, user *u return client } -func newCustomFixture(t *testing.T, mutateCfg func(*auth.TestServerConfig), sshOpts ...ServerOption) *sshTestFixture { +func newCustomFixture(t testing.TB, mutateCfg func(*auth.TestServerConfig), sshOpts ...ServerOption) *sshTestFixture { ctx := context.Background() u, err := user.Current() @@ -236,6 +236,7 @@ func newCustomFixture(t *testing.T, mutateCfg func(*auth.TestServerConfig), sshO SetLockWatcher(lockWatcher), SetX11ForwardingConfig(&x11.ServerConfig{}), SetSessionController(sessionController), + SetStoragePresenceService(testServer.AuthServer.AuthServer.PresenceInternal), } serverOptions = append(serverOptions, sshOpts...) @@ -2878,6 +2879,7 @@ func newUpack(testSvr *auth.TestServer, username string, allowedLogins []string, role.SetRules(types.Allow, rules) opts := role.GetOptions() opts.PermitX11Forwarding = types.NewBool(true) + opts.CreateHostUser = types.NewBoolOption(true) role.SetOptions(opts) role.SetLogins(types.Allow, allowedLogins) role.SetNodeLabels(types.Allow, allowedLabels) @@ -2926,7 +2928,7 @@ func newUpack(testSvr *auth.TestServer, username string, allowedLogins []string, }, nil } -func newLockWatcher(ctx context.Context, t *testing.T, client types.Events) *services.LockWatcher { +func newLockWatcher(ctx context.Context, t testing.TB, client types.Events) *services.LockWatcher { lockWatcher, err := services.NewLockWatcher(ctx, services.LockWatcherConfig{ ResourceWatcherConfig: services.ResourceWatcherConfig{ Component: "test", @@ -2964,7 +2966,7 @@ func newCertAuthorityWatcher(ctx context.Context, t *testing.T, client types.Eve } // newSigner creates a new SSH signer that can be used by the Server. -func newSigner(t *testing.T, ctx context.Context, testServer *auth.TestServer) ssh.Signer { +func newSigner(t testing.TB, ctx context.Context, testServer *auth.TestServer) ssh.Signer { t.Helper() priv, pub, err := testauthority.New().GenerateKeyPair() diff --git a/lib/srv/regular/sshserver_unix_test.go b/lib/srv/regular/sshserver_unix_test.go index 9a1a7dae48009..7b01dc4b4aa5f 100644 --- a/lib/srv/regular/sshserver_unix_test.go +++ b/lib/srv/regular/sshserver_unix_test.go @@ -21,15 +21,22 @@ package regular import ( + "context" "net" "os" + "os/user" + "sync" "syscall" "testing" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "golang.org/x/sys/unix" + tracessh "github.com/gravitational/teleport/api/observability/tracing/ssh" "github.com/gravitational/teleport/lib/srv" + "github.com/gravitational/teleport/lib/utils" + "github.com/gravitational/teleport/lib/utils/host" "github.com/gravitational/teleport/lib/utils/uds" ) @@ -128,3 +135,74 @@ func TestValidateListenerSocket(t *testing.T) { }) } } + +// BenchmarkRootExecCommand measures performance of running multiple exec requests +// over a single ssh connection. The same test is run with and without host user +// creation support to catch any performance degradation caused by user provisioning. +func BenchmarkRootExecCommand(b *testing.B) { + utils.RequireRoot(b) + + b.ReportAllocs() + + cases := []struct { + name string + createUser bool + }{ + { + name: "no user creation", + }, + { + name: "with user creation", + createUser: true, + }, + } + + for _, test := range cases { + b.Run(test.name, func(b *testing.B) { + var opts []ServerOption + if test.createUser { + opts = []ServerOption{SetCreateHostUser(true)} + } + + f := newFixtureWithoutDiskBasedLogging(b, opts...) + b.ResetTimer() + + for i := 0; i < b.N; i++ { + username := f.user + if test.createUser { + username = utils.GenerateLocalUsername(b) + b.Cleanup(func() { _, _ = host.UserDel(username) }) + } + + _, err := newUpack(f.testSrv, username, []string{username, f.user}, wildcardAllow) + require.NoError(b, err) + + clt := f.newSSHClient(context.Background(), b, &user.User{Username: username}) + + executeCommand(b, clt, "uptime", 10) + } + }) + } +} + +func executeCommand(tb testing.TB, clt *tracessh.Client, command string, executions int) { + tb.Helper() + + var wg sync.WaitGroup + for i := 0; i < executions; i++ { + wg.Add(1) + go func() { + defer wg.Done() + + ctx := context.Background() + + se, err := clt.NewSession(ctx) + assert.NoError(tb, err) + defer se.Close() + + assert.NoError(tb, se.Run(ctx, command)) + }() + } + + wg.Wait() +} diff --git a/lib/srv/sess.go b/lib/srv/sess.go index 1ffbc249db7e3..e5a3ebfb5a05d 100644 --- a/lib/srv/sess.go +++ b/lib/srv/sess.go @@ -271,6 +271,7 @@ func (s *SessionRegistry) TryCreateHostUser(ctx *ServerContext) error { ui, err := ctx.Identity.AccessChecker.HostUsers(ctx.srv.GetInfo()) if err != nil { if trace.IsAccessDenied(err) { + log.Warnf("Unable to create host users: %v", err) return nil } log.Debug("Error while checking host users creation permission: ", err) diff --git a/lib/srv/usermgmt.go b/lib/srv/usermgmt.go index 9ae82f186ca80..aaa93de0ffcd7 100644 --- a/lib/srv/usermgmt.go +++ b/lib/srv/usermgmt.go @@ -36,11 +36,10 @@ import ( "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/api/utils/retryutils" "github.com/gravitational/teleport/lib/services" - "github.com/gravitational/teleport/lib/services/local" ) // NewHostUsers initialize a new HostUsers object -func NewHostUsers(ctx context.Context, storage *local.PresenceService, uuid string) HostUsers { +func NewHostUsers(ctx context.Context, storage services.PresenceInternal, uuid string) HostUsers { //nolint:staticcheck // SA4023. False positive on macOS. backend, err := newHostUsersBackend() switch { @@ -177,7 +176,7 @@ type HostUserManagement struct { backend HostUsersBackend ctx context.Context cancel context.CancelFunc - storage *local.PresenceService + storage services.PresenceInternal userGrace time.Duration } diff --git a/lib/utils/testhelpers.go b/lib/utils/testhelpers.go index 82c72147278ce..446624717cf11 100644 --- a/lib/utils/testhelpers.go +++ b/lib/utils/testhelpers.go @@ -94,32 +94,32 @@ func RunTestBackgroundTask(ctx context.Context, t *testing.T, task *TestBackgrou } // RequireRoot skips the current test if it is not running as root. -func RequireRoot(t *testing.T) { - t.Helper() +func RequireRoot(tb testing.TB) { + tb.Helper() if os.Geteuid() != 0 { - t.Skip("This test will be skipped because tests are not being run as root.") + tb.Skip("This test will be skipped because tests are not being run as root.") } } -func generateUsername(t *testing.T) string { +func generateUsername(tb testing.TB) string { suffix := make([]byte, 8) _, err := rand.Read(suffix) - require.NoError(t, err) + require.NoError(tb, err) return fmt.Sprintf("teleport-%x", suffix) } // GenerateLocalUsername generates the username for a local user that does not // already exists (but it does not create the user). -func GenerateLocalUsername(t *testing.T) string { +func GenerateLocalUsername(tb testing.TB) string { const maxAttempts = 10 for i := 0; i < maxAttempts; i++ { - login := generateUsername(t) + login := generateUsername(tb) _, err := user.Lookup(login) if errors.Is(err, user.UnknownUserError(login)) { return login } - require.NoError(t, err) + require.NoError(tb, err) } - t.Fatalf("Unable to generate unused username after %v attempts", maxAttempts) + tb.Fatalf("Unable to generate unused username after %v attempts", maxAttempts) return "" } From 71779c395875d9be1fc02d4156d427c4cda626d3 Mon Sep 17 00:00:00 2001 From: Russell Jones Date: Wed, 7 Aug 2024 16:14:22 -0700 Subject: [PATCH 101/139] Fixed typo in Google Cloud KMS documentation. (#45182) --- docs/pages/choose-an-edition/teleport-enterprise/gcp-kms.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/pages/choose-an-edition/teleport-enterprise/gcp-kms.mdx b/docs/pages/choose-an-edition/teleport-enterprise/gcp-kms.mdx index 2727c7aa75e86..665e16ef31a56 100644 --- a/docs/pages/choose-an-edition/teleport-enterprise/gcp-kms.mdx +++ b/docs/pages/choose-an-edition/teleport-enterprise/gcp-kms.mdx @@ -211,7 +211,7 @@ auth_service: # ... ca_key_params: gcp_kms: - keyring: "projects//locations//keyRing/" + keyring: "projects//locations//keyRings/" protection_level: "SOFTWARE" ``` From 5bfb9a326f85b3c9bdfe497c0815b06c167d0ae4 Mon Sep 17 00:00:00 2001 From: "teleport-post-release-automation[bot]" <128860004+teleport-post-release-automation[bot]@users.noreply.github.com> Date: Wed, 7 Aug 2024 23:39:45 +0000 Subject: [PATCH 102/139] [auto] docs: Update version to v16.1.4 (#45237) Co-authored-by: GitHub --- docs/config.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/config.json b/docs/config.json index 2b980ff9ef6cf..8158c94339f01 100644 --- a/docs/config.json +++ b/docs/config.json @@ -1614,18 +1614,18 @@ "teleport": { "git": "api/14.0.0-gd1e081e", "major_version": "16", - "version": "16.1.3", + "version": "16.1.4", "url": "teleport.example.com", "golang": "1.22", "plugin": { - "version": "16.1.3" + "version": "16.1.4" }, "helm_repo_url": "https://charts.releases.teleport.dev", - "latest_oss_docker_image": "public.ecr.aws/gravitational/teleport-distroless:16.1.3", - "latest_oss_debug_docker_image": "public.ecr.aws/gravitational/teleport-distroless-debug:16.1.3", - "latest_ent_docker_image": "public.ecr.aws/gravitational/teleport-ent-distroless:16.1.3", - "latest_ent_debug_docker_image": "public.ecr.aws/gravitational/teleport-ent-distroless-debug:16.1.3", - "teleport_install_script_url": "https://cdn.teleport.dev/install-v16.1.3.sh" + "latest_oss_docker_image": "public.ecr.aws/gravitational/teleport-distroless:16.1.4", + "latest_oss_debug_docker_image": "public.ecr.aws/gravitational/teleport-distroless-debug:16.1.4", + "latest_ent_docker_image": "public.ecr.aws/gravitational/teleport-ent-distroless:16.1.4", + "latest_ent_debug_docker_image": "public.ecr.aws/gravitational/teleport-ent-distroless-debug:16.1.4", + "teleport_install_script_url": "https://cdn.teleport.dev/install-v16.1.4.sh" }, "terraform": { "version": "1.0.0" From 570f2c32d6c6791558e68bf1faaf61a50e7a5a87 Mon Sep 17 00:00:00 2001 From: Alan Parra Date: Thu, 8 Aug 2024 08:05:31 -0300 Subject: [PATCH 103/139] chore: Bump Buf to v1.36.0 (#45232) --- build.assets/versions.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.assets/versions.mk b/build.assets/versions.mk index 4fe1e22612231..b009717daa1a8 100644 --- a/build.assets/versions.mk +++ b/build.assets/versions.mk @@ -17,7 +17,7 @@ LIBPCSCLITE_VERSION ?= 1.9.9-teleport DEVTOOLSET ?= devtoolset-12 # Protogen related versions. -BUF_VERSION ?= v1.35.1 +BUF_VERSION ?= v1.36.0 # Keep in sync with api/proto/buf.yaml (and buf.lock). GOGO_PROTO_TAG ?= v1.3.2 NODE_GRPC_TOOLS_VERSION ?= 1.12.4 From 84f8ccc983b964cc33ef7642a7645b33dcac6184 Mon Sep 17 00:00:00 2001 From: Noah Stride Date: Thu, 8 Aug 2024 13:24:00 +0100 Subject: [PATCH 104/139] Add Protobuf types for SPIFFE Federation resource and audit events (#45041) (#45243) * Add gRPC types and events for SPIFFEFederation type * Fix copy-pasta mistake * Add to dynamic.go * Add to eventsmap --- .../go/teleport/machineid/v1/federation.pb.go | 634 ++++ .../machineid/v1/federation_service.pb.go | 513 +++ .../v1/federation_service_grpc.pb.go | 248 ++ .../teleport/legacy/types/events/events.proto | 64 + .../teleport/machineid/v1/federation.proto | 82 + .../machineid/v1/federation_service.proto | 76 + api/types/constants.go | 2 + api/types/events/events.pb.go | 2778 +++++++++++------ api/types/events/oneof.go | 8 + lib/events/api.go | 4 + lib/events/codes.go | 4 + lib/events/dynamic.go | 4 + lib/events/events_test.go | 2 + 13 files changed, 3434 insertions(+), 985 deletions(-) create mode 100644 api/gen/proto/go/teleport/machineid/v1/federation.pb.go create mode 100644 api/gen/proto/go/teleport/machineid/v1/federation_service.pb.go create mode 100644 api/gen/proto/go/teleport/machineid/v1/federation_service_grpc.pb.go create mode 100644 api/proto/teleport/machineid/v1/federation.proto create mode 100644 api/proto/teleport/machineid/v1/federation_service.proto diff --git a/api/gen/proto/go/teleport/machineid/v1/federation.pb.go b/api/gen/proto/go/teleport/machineid/v1/federation.pb.go new file mode 100644 index 0000000000000..c11aeea704338 --- /dev/null +++ b/api/gen/proto/go/teleport/machineid/v1/federation.pb.go @@ -0,0 +1,634 @@ +// Copyright 2024 Gravitational, Inc +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.34.0 +// protoc (unknown) +// source: teleport/machineid/v1/federation.proto + +package machineidv1 + +import ( + v1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/header/v1" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + durationpb "google.golang.org/protobuf/types/known/durationpb" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// SPIFFEFederation is a resource that represents the configuration of a trust +// domain federation. +type SPIFFEFederation struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The kind of resource represented. + Kind string `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"` + // Differentiates variations of the same kind. All resources should + // contain one, even if it is never populated. + SubKind string `protobuf:"bytes,2,opt,name=sub_kind,json=subKind,proto3" json:"sub_kind,omitempty"` + // The version of the resource being represented. + Version string `protobuf:"bytes,3,opt,name=version,proto3" json:"version,omitempty"` + // Common metadata that all resources share. + // Importantly, the name MUST match the name of the trust domain you federate + // with. + Metadata *v1.Metadata `protobuf:"bytes,4,opt,name=metadata,proto3" json:"metadata,omitempty"` + // The configured properties of the trust domain federation + Spec *SPIFFEFederationSpec `protobuf:"bytes,5,opt,name=spec,proto3" json:"spec,omitempty"` + // Fields that are set by the server as results of operations. These should + // not be modified by users. + Status *SPIFFEFederationStatus `protobuf:"bytes,6,opt,name=status,proto3" json:"status,omitempty"` +} + +func (x *SPIFFEFederation) Reset() { + *x = SPIFFEFederation{} + if protoimpl.UnsafeEnabled { + mi := &file_teleport_machineid_v1_federation_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SPIFFEFederation) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SPIFFEFederation) ProtoMessage() {} + +func (x *SPIFFEFederation) ProtoReflect() protoreflect.Message { + mi := &file_teleport_machineid_v1_federation_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SPIFFEFederation.ProtoReflect.Descriptor instead. +func (*SPIFFEFederation) Descriptor() ([]byte, []int) { + return file_teleport_machineid_v1_federation_proto_rawDescGZIP(), []int{0} +} + +func (x *SPIFFEFederation) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +func (x *SPIFFEFederation) GetSubKind() string { + if x != nil { + return x.SubKind + } + return "" +} + +func (x *SPIFFEFederation) GetVersion() string { + if x != nil { + return x.Version + } + return "" +} + +func (x *SPIFFEFederation) GetMetadata() *v1.Metadata { + if x != nil { + return x.Metadata + } + return nil +} + +func (x *SPIFFEFederation) GetSpec() *SPIFFEFederationSpec { + if x != nil { + return x.Spec + } + return nil +} + +func (x *SPIFFEFederation) GetStatus() *SPIFFEFederationStatus { + if x != nil { + return x.Status + } + return nil +} + +// SPIFFEFederationBundleSourceStatic is a static bundle source. It should be an +// option of last resort, as it requires manual updates. +type SPIFFEFederationBundleSourceStatic struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The SPIFFE JWKS bundle. + Bundle string `protobuf:"bytes,1,opt,name=bundle,proto3" json:"bundle,omitempty"` +} + +func (x *SPIFFEFederationBundleSourceStatic) Reset() { + *x = SPIFFEFederationBundleSourceStatic{} + if protoimpl.UnsafeEnabled { + mi := &file_teleport_machineid_v1_federation_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SPIFFEFederationBundleSourceStatic) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SPIFFEFederationBundleSourceStatic) ProtoMessage() {} + +func (x *SPIFFEFederationBundleSourceStatic) ProtoReflect() protoreflect.Message { + mi := &file_teleport_machineid_v1_federation_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SPIFFEFederationBundleSourceStatic.ProtoReflect.Descriptor instead. +func (*SPIFFEFederationBundleSourceStatic) Descriptor() ([]byte, []int) { + return file_teleport_machineid_v1_federation_proto_rawDescGZIP(), []int{1} +} + +func (x *SPIFFEFederationBundleSourceStatic) GetBundle() string { + if x != nil { + return x.Bundle + } + return "" +} + +// SPIFFEFederationBundleSourceHTTPSWeb is a bundle source that fetches the bundle +// from a HTTPS endpoint that is protected by a Web PKI certificate. +type SPIFFEFederationBundleSourceHTTPSWeb struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The URL of the SPIFFE Bundle Endpoint. + BundleEndpointUrl string `protobuf:"bytes,1,opt,name=bundle_endpoint_url,json=bundleEndpointUrl,proto3" json:"bundle_endpoint_url,omitempty"` +} + +func (x *SPIFFEFederationBundleSourceHTTPSWeb) Reset() { + *x = SPIFFEFederationBundleSourceHTTPSWeb{} + if protoimpl.UnsafeEnabled { + mi := &file_teleport_machineid_v1_federation_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SPIFFEFederationBundleSourceHTTPSWeb) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SPIFFEFederationBundleSourceHTTPSWeb) ProtoMessage() {} + +func (x *SPIFFEFederationBundleSourceHTTPSWeb) ProtoReflect() protoreflect.Message { + mi := &file_teleport_machineid_v1_federation_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SPIFFEFederationBundleSourceHTTPSWeb.ProtoReflect.Descriptor instead. +func (*SPIFFEFederationBundleSourceHTTPSWeb) Descriptor() ([]byte, []int) { + return file_teleport_machineid_v1_federation_proto_rawDescGZIP(), []int{2} +} + +func (x *SPIFFEFederationBundleSourceHTTPSWeb) GetBundleEndpointUrl() string { + if x != nil { + return x.BundleEndpointUrl + } + return "" +} + +// SPIFFEFederationBundleSource configures how the federation bundle is sourced. +// Only one field can be set. +type SPIFFEFederationBundleSource struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Static *SPIFFEFederationBundleSourceStatic `protobuf:"bytes,1,opt,name=static,proto3" json:"static,omitempty"` + HttpsWeb *SPIFFEFederationBundleSourceHTTPSWeb `protobuf:"bytes,2,opt,name=https_web,json=httpsWeb,proto3" json:"https_web,omitempty"` +} + +func (x *SPIFFEFederationBundleSource) Reset() { + *x = SPIFFEFederationBundleSource{} + if protoimpl.UnsafeEnabled { + mi := &file_teleport_machineid_v1_federation_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SPIFFEFederationBundleSource) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SPIFFEFederationBundleSource) ProtoMessage() {} + +func (x *SPIFFEFederationBundleSource) ProtoReflect() protoreflect.Message { + mi := &file_teleport_machineid_v1_federation_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SPIFFEFederationBundleSource.ProtoReflect.Descriptor instead. +func (*SPIFFEFederationBundleSource) Descriptor() ([]byte, []int) { + return file_teleport_machineid_v1_federation_proto_rawDescGZIP(), []int{3} +} + +func (x *SPIFFEFederationBundleSource) GetStatic() *SPIFFEFederationBundleSourceStatic { + if x != nil { + return x.Static + } + return nil +} + +func (x *SPIFFEFederationBundleSource) GetHttpsWeb() *SPIFFEFederationBundleSourceHTTPSWeb { + if x != nil { + return x.HttpsWeb + } + return nil +} + +// SPIFFEFederationSpec is the configuration of a trust domain federation. +type SPIFFEFederationSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The source of the federation bundle. + BundleSource *SPIFFEFederationBundleSource `protobuf:"bytes,1,opt,name=bundle_source,json=bundleSource,proto3" json:"bundle_source,omitempty"` +} + +func (x *SPIFFEFederationSpec) Reset() { + *x = SPIFFEFederationSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_teleport_machineid_v1_federation_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SPIFFEFederationSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SPIFFEFederationSpec) ProtoMessage() {} + +func (x *SPIFFEFederationSpec) ProtoReflect() protoreflect.Message { + mi := &file_teleport_machineid_v1_federation_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SPIFFEFederationSpec.ProtoReflect.Descriptor instead. +func (*SPIFFEFederationSpec) Descriptor() ([]byte, []int) { + return file_teleport_machineid_v1_federation_proto_rawDescGZIP(), []int{4} +} + +func (x *SPIFFEFederationSpec) GetBundleSource() *SPIFFEFederationBundleSource { + if x != nil { + return x.BundleSource + } + return nil +} + +// FederationStatus is the status of a trust domain federation. +type SPIFFEFederationStatus struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The most recently fetched bundle from the federated trust domain. + CurrentBundle string `protobuf:"bytes,1,opt,name=current_bundle,json=currentBundle,proto3" json:"current_bundle,omitempty"` + // The time that the most recently fetched bundle was obtained. + CurrentBundleSyncedAt *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=current_bundle_synced_at,json=currentBundleSyncedAt,proto3" json:"current_bundle_synced_at,omitempty"` + // The duration that the current bundle suggests the next bundle should be + // refresh after. + CurrentBundleRefreshHint *durationpb.Duration `protobuf:"bytes,3,opt,name=current_bundle_refresh_hint,json=currentBundleRefreshHint,proto3" json:"current_bundle_refresh_hint,omitempty"` +} + +func (x *SPIFFEFederationStatus) Reset() { + *x = SPIFFEFederationStatus{} + if protoimpl.UnsafeEnabled { + mi := &file_teleport_machineid_v1_federation_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SPIFFEFederationStatus) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SPIFFEFederationStatus) ProtoMessage() {} + +func (x *SPIFFEFederationStatus) ProtoReflect() protoreflect.Message { + mi := &file_teleport_machineid_v1_federation_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SPIFFEFederationStatus.ProtoReflect.Descriptor instead. +func (*SPIFFEFederationStatus) Descriptor() ([]byte, []int) { + return file_teleport_machineid_v1_federation_proto_rawDescGZIP(), []int{5} +} + +func (x *SPIFFEFederationStatus) GetCurrentBundle() string { + if x != nil { + return x.CurrentBundle + } + return "" +} + +func (x *SPIFFEFederationStatus) GetCurrentBundleSyncedAt() *timestamppb.Timestamp { + if x != nil { + return x.CurrentBundleSyncedAt + } + return nil +} + +func (x *SPIFFEFederationStatus) GetCurrentBundleRefreshHint() *durationpb.Duration { + if x != nil { + return x.CurrentBundleRefreshHint + } + return nil +} + +var File_teleport_machineid_v1_federation_proto protoreflect.FileDescriptor + +var file_teleport_machineid_v1_federation_proto_rawDesc = []byte{ + 0x0a, 0x26, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, + 0x6e, 0x65, 0x69, 0x64, 0x2f, 0x76, 0x31, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x15, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, + 0x72, 0x74, 0x2e, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x69, 0x64, 0x2e, 0x76, 0x31, 0x1a, + 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, + 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x1a, 0x21, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x22, 0x9d, 0x02, 0x0a, 0x10, 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, + 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x19, 0x0a, 0x08, + 0x73, 0x75, 0x62, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x73, 0x75, 0x62, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x38, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x68, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x3f, 0x0a, 0x04, 0x73, + 0x70, 0x65, 0x63, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x74, 0x65, 0x6c, 0x65, + 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x69, 0x64, 0x2e, 0x76, + 0x31, 0x2e, 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x45, 0x0a, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x74, + 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x69, + 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x22, 0x3c, 0x0a, 0x22, 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x53, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x6e, + 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x6e, 0x64, 0x6c, + 0x65, 0x22, 0x56, 0x0a, 0x24, 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x48, 0x54, 0x54, 0x50, 0x53, 0x57, 0x65, 0x62, 0x12, 0x2e, 0x0a, 0x13, 0x62, 0x75, 0x6e, + 0x64, 0x6c, 0x65, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x75, 0x72, 0x6c, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x45, 0x6e, + 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x55, 0x72, 0x6c, 0x22, 0xcb, 0x01, 0x0a, 0x1c, 0x53, 0x50, + 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, + 0x6e, 0x64, 0x6c, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x51, 0x0a, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x69, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x74, 0x65, 0x6c, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x69, 0x64, 0x2e, + 0x76, 0x31, 0x2e, 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, + 0x74, 0x61, 0x74, 0x69, 0x63, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x12, 0x58, 0x0a, + 0x09, 0x68, 0x74, 0x74, 0x70, 0x73, 0x5f, 0x77, 0x65, 0x62, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x3b, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6d, 0x61, 0x63, 0x68, + 0x69, 0x6e, 0x65, 0x69, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, 0x46, + 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x53, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x54, 0x54, 0x50, 0x53, 0x57, 0x65, 0x62, 0x52, 0x08, 0x68, + 0x74, 0x74, 0x70, 0x73, 0x57, 0x65, 0x62, 0x22, 0x70, 0x0a, 0x14, 0x53, 0x50, 0x49, 0x46, 0x46, + 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x12, + 0x58, 0x0a, 0x0d, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x2e, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x69, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x53, + 0x50, 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, + 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0c, 0x62, 0x75, 0x6e, + 0x64, 0x6c, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0xee, 0x01, 0x0a, 0x16, 0x53, 0x50, + 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, + 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x53, 0x0a, 0x18, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x73, 0x79, + 0x6e, 0x63, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x15, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x41, 0x74, + 0x12, 0x58, 0x0a, 0x1b, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x62, 0x75, 0x6e, 0x64, + 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x5f, 0x68, 0x69, 0x6e, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x18, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, + 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x48, 0x69, 0x6e, 0x74, 0x42, 0x56, 0x5a, 0x54, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, + 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, + 0x65, 0x69, 0x64, 0x2f, 0x76, 0x31, 0x3b, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x69, 0x64, + 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_teleport_machineid_v1_federation_proto_rawDescOnce sync.Once + file_teleport_machineid_v1_federation_proto_rawDescData = file_teleport_machineid_v1_federation_proto_rawDesc +) + +func file_teleport_machineid_v1_federation_proto_rawDescGZIP() []byte { + file_teleport_machineid_v1_federation_proto_rawDescOnce.Do(func() { + file_teleport_machineid_v1_federation_proto_rawDescData = protoimpl.X.CompressGZIP(file_teleport_machineid_v1_federation_proto_rawDescData) + }) + return file_teleport_machineid_v1_federation_proto_rawDescData +} + +var file_teleport_machineid_v1_federation_proto_msgTypes = make([]protoimpl.MessageInfo, 6) +var file_teleport_machineid_v1_federation_proto_goTypes = []interface{}{ + (*SPIFFEFederation)(nil), // 0: teleport.machineid.v1.SPIFFEFederation + (*SPIFFEFederationBundleSourceStatic)(nil), // 1: teleport.machineid.v1.SPIFFEFederationBundleSourceStatic + (*SPIFFEFederationBundleSourceHTTPSWeb)(nil), // 2: teleport.machineid.v1.SPIFFEFederationBundleSourceHTTPSWeb + (*SPIFFEFederationBundleSource)(nil), // 3: teleport.machineid.v1.SPIFFEFederationBundleSource + (*SPIFFEFederationSpec)(nil), // 4: teleport.machineid.v1.SPIFFEFederationSpec + (*SPIFFEFederationStatus)(nil), // 5: teleport.machineid.v1.SPIFFEFederationStatus + (*v1.Metadata)(nil), // 6: teleport.header.v1.Metadata + (*timestamppb.Timestamp)(nil), // 7: google.protobuf.Timestamp + (*durationpb.Duration)(nil), // 8: google.protobuf.Duration +} +var file_teleport_machineid_v1_federation_proto_depIdxs = []int32{ + 6, // 0: teleport.machineid.v1.SPIFFEFederation.metadata:type_name -> teleport.header.v1.Metadata + 4, // 1: teleport.machineid.v1.SPIFFEFederation.spec:type_name -> teleport.machineid.v1.SPIFFEFederationSpec + 5, // 2: teleport.machineid.v1.SPIFFEFederation.status:type_name -> teleport.machineid.v1.SPIFFEFederationStatus + 1, // 3: teleport.machineid.v1.SPIFFEFederationBundleSource.static:type_name -> teleport.machineid.v1.SPIFFEFederationBundleSourceStatic + 2, // 4: teleport.machineid.v1.SPIFFEFederationBundleSource.https_web:type_name -> teleport.machineid.v1.SPIFFEFederationBundleSourceHTTPSWeb + 3, // 5: teleport.machineid.v1.SPIFFEFederationSpec.bundle_source:type_name -> teleport.machineid.v1.SPIFFEFederationBundleSource + 7, // 6: teleport.machineid.v1.SPIFFEFederationStatus.current_bundle_synced_at:type_name -> google.protobuf.Timestamp + 8, // 7: teleport.machineid.v1.SPIFFEFederationStatus.current_bundle_refresh_hint:type_name -> google.protobuf.Duration + 8, // [8:8] is the sub-list for method output_type + 8, // [8:8] is the sub-list for method input_type + 8, // [8:8] is the sub-list for extension type_name + 8, // [8:8] is the sub-list for extension extendee + 0, // [0:8] is the sub-list for field type_name +} + +func init() { file_teleport_machineid_v1_federation_proto_init() } +func file_teleport_machineid_v1_federation_proto_init() { + if File_teleport_machineid_v1_federation_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_teleport_machineid_v1_federation_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SPIFFEFederation); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_teleport_machineid_v1_federation_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SPIFFEFederationBundleSourceStatic); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_teleport_machineid_v1_federation_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SPIFFEFederationBundleSourceHTTPSWeb); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_teleport_machineid_v1_federation_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SPIFFEFederationBundleSource); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_teleport_machineid_v1_federation_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SPIFFEFederationSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_teleport_machineid_v1_federation_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SPIFFEFederationStatus); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_teleport_machineid_v1_federation_proto_rawDesc, + NumEnums: 0, + NumMessages: 6, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_teleport_machineid_v1_federation_proto_goTypes, + DependencyIndexes: file_teleport_machineid_v1_federation_proto_depIdxs, + MessageInfos: file_teleport_machineid_v1_federation_proto_msgTypes, + }.Build() + File_teleport_machineid_v1_federation_proto = out.File + file_teleport_machineid_v1_federation_proto_rawDesc = nil + file_teleport_machineid_v1_federation_proto_goTypes = nil + file_teleport_machineid_v1_federation_proto_depIdxs = nil +} diff --git a/api/gen/proto/go/teleport/machineid/v1/federation_service.pb.go b/api/gen/proto/go/teleport/machineid/v1/federation_service.pb.go new file mode 100644 index 0000000000000..e58ad63436b61 --- /dev/null +++ b/api/gen/proto/go/teleport/machineid/v1/federation_service.pb.go @@ -0,0 +1,513 @@ +// Copyright 2024 Gravitational, Inc +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.34.0 +// protoc (unknown) +// source: teleport/machineid/v1/federation_service.proto + +package machineidv1 + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + emptypb "google.golang.org/protobuf/types/known/emptypb" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// GetSPIFFEFederationRequest is the request message for GetSPIFFEFederation. +type GetSPIFFEFederationRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The name of the SPIFFEFederation resource to fetch. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` +} + +func (x *GetSPIFFEFederationRequest) Reset() { + *x = GetSPIFFEFederationRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_teleport_machineid_v1_federation_service_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetSPIFFEFederationRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetSPIFFEFederationRequest) ProtoMessage() {} + +func (x *GetSPIFFEFederationRequest) ProtoReflect() protoreflect.Message { + mi := &file_teleport_machineid_v1_federation_service_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetSPIFFEFederationRequest.ProtoReflect.Descriptor instead. +func (*GetSPIFFEFederationRequest) Descriptor() ([]byte, []int) { + return file_teleport_machineid_v1_federation_service_proto_rawDescGZIP(), []int{0} +} + +func (x *GetSPIFFEFederationRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +// Request for ListSPIFFEFederations. +// +// Follows the pagination semantics of +// https://cloud.google.com/apis/design/standard_methods#list +type ListSPIFFEFederationsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The maximum number of items to return. + // The server may impose a different page size at its discretion. + PageSize int32 `protobuf:"varint,1,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + // The page_token value returned from a previous ListSPIFFEFederations + // request, if any. + PageToken string `protobuf:"bytes,2,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` +} + +func (x *ListSPIFFEFederationsRequest) Reset() { + *x = ListSPIFFEFederationsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_teleport_machineid_v1_federation_service_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListSPIFFEFederationsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListSPIFFEFederationsRequest) ProtoMessage() {} + +func (x *ListSPIFFEFederationsRequest) ProtoReflect() protoreflect.Message { + mi := &file_teleport_machineid_v1_federation_service_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListSPIFFEFederationsRequest.ProtoReflect.Descriptor instead. +func (*ListSPIFFEFederationsRequest) Descriptor() ([]byte, []int) { + return file_teleport_machineid_v1_federation_service_proto_rawDescGZIP(), []int{1} +} + +func (x *ListSPIFFEFederationsRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize + } + return 0 +} + +func (x *ListSPIFFEFederationsRequest) GetPageToken() string { + if x != nil { + return x.PageToken + } + return "" +} + +// ListSPIFFEFederationsResponse is the response message for ListSPIFFEFederations. +type ListSPIFFEFederationsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SpiffeFederations []*SPIFFEFederation `protobuf:"bytes,1,rep,name=spiffe_federations,json=spiffeFederations,proto3" json:"spiffe_federations,omitempty"` + // Token to retrieve the next page of results, or empty if there are no + // more results exist. + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` +} + +func (x *ListSPIFFEFederationsResponse) Reset() { + *x = ListSPIFFEFederationsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_teleport_machineid_v1_federation_service_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListSPIFFEFederationsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListSPIFFEFederationsResponse) ProtoMessage() {} + +func (x *ListSPIFFEFederationsResponse) ProtoReflect() protoreflect.Message { + mi := &file_teleport_machineid_v1_federation_service_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListSPIFFEFederationsResponse.ProtoReflect.Descriptor instead. +func (*ListSPIFFEFederationsResponse) Descriptor() ([]byte, []int) { + return file_teleport_machineid_v1_federation_service_proto_rawDescGZIP(), []int{2} +} + +func (x *ListSPIFFEFederationsResponse) GetSpiffeFederations() []*SPIFFEFederation { + if x != nil { + return x.SpiffeFederations + } + return nil +} + +func (x *ListSPIFFEFederationsResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken + } + return "" +} + +// DeleteSPIFFEFederationRequest is the request message for DeleteSPIFFEFederation. +type DeleteSPIFFEFederationRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The name of the SPIFFEFederation resource to delete. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` +} + +func (x *DeleteSPIFFEFederationRequest) Reset() { + *x = DeleteSPIFFEFederationRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_teleport_machineid_v1_federation_service_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteSPIFFEFederationRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteSPIFFEFederationRequest) ProtoMessage() {} + +func (x *DeleteSPIFFEFederationRequest) ProtoReflect() protoreflect.Message { + mi := &file_teleport_machineid_v1_federation_service_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteSPIFFEFederationRequest.ProtoReflect.Descriptor instead. +func (*DeleteSPIFFEFederationRequest) Descriptor() ([]byte, []int) { + return file_teleport_machineid_v1_federation_service_proto_rawDescGZIP(), []int{3} +} + +func (x *DeleteSPIFFEFederationRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +// CreateSPIFFEFederationRequest is the request message for CreateSPIFFEFederation. +type CreateSPIFFEFederationRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The SPIFFEFederation resource to create. + SpiffeFederation *SPIFFEFederation `protobuf:"bytes,1,opt,name=spiffe_federation,json=spiffeFederation,proto3" json:"spiffe_federation,omitempty"` +} + +func (x *CreateSPIFFEFederationRequest) Reset() { + *x = CreateSPIFFEFederationRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_teleport_machineid_v1_federation_service_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateSPIFFEFederationRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateSPIFFEFederationRequest) ProtoMessage() {} + +func (x *CreateSPIFFEFederationRequest) ProtoReflect() protoreflect.Message { + mi := &file_teleport_machineid_v1_federation_service_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateSPIFFEFederationRequest.ProtoReflect.Descriptor instead. +func (*CreateSPIFFEFederationRequest) Descriptor() ([]byte, []int) { + return file_teleport_machineid_v1_federation_service_proto_rawDescGZIP(), []int{4} +} + +func (x *CreateSPIFFEFederationRequest) GetSpiffeFederation() *SPIFFEFederation { + if x != nil { + return x.SpiffeFederation + } + return nil +} + +var File_teleport_machineid_v1_federation_service_proto protoreflect.FileDescriptor + +var file_teleport_machineid_v1_federation_service_proto_rawDesc = []byte{ + 0x0a, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, + 0x6e, 0x65, 0x69, 0x64, 0x2f, 0x76, 0x31, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x12, 0x15, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6d, 0x61, 0x63, 0x68, 0x69, + 0x6e, 0x65, 0x69, 0x64, 0x2e, 0x76, 0x31, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x26, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x6d, + 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x69, 0x64, 0x2f, 0x76, 0x31, 0x2f, 0x66, 0x65, 0x64, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x30, 0x0a, 0x1a, + 0x47, 0x65, 0x74, 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x5a, + 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, + 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, + 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x9f, 0x01, 0x0a, 0x1d, 0x4c, + 0x69, 0x73, 0x74, 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x56, 0x0a, 0x12, + 0x73, 0x70, 0x69, 0x66, 0x66, 0x65, 0x5f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, + 0x6f, 0x72, 0x74, 0x2e, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x69, 0x64, 0x2e, 0x76, 0x31, + 0x2e, 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x11, 0x73, 0x70, 0x69, 0x66, 0x66, 0x65, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, + 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, + 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x33, 0x0a, 0x1d, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0x75, 0x0a, 0x1d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x50, 0x49, 0x46, 0x46, + 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x54, 0x0a, 0x11, 0x73, 0x70, 0x69, 0x66, 0x66, 0x65, 0x5f, 0x66, 0x65, 0x64, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, + 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, + 0x69, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x73, 0x70, 0x69, 0x66, 0x66, 0x65, 0x46, 0x65, + 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x32, 0xf2, 0x03, 0x0a, 0x17, 0x53, 0x50, 0x49, + 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x12, 0x71, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x53, 0x50, 0x49, 0x46, 0x46, + 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x31, 0x2e, 0x74, 0x65, + 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x69, 0x64, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, + 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, + 0x65, 0x69, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x82, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, + 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x33, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6d, 0x61, 0x63, + 0x68, 0x69, 0x6e, 0x65, 0x69, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x50, + 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x2e, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x69, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x66, 0x0a, 0x16, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x2e, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x69, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x12, 0x77, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x50, + 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, + 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, + 0x65, 0x69, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x50, 0x49, + 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, + 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x69, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x50, 0x49, + 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x56, 0x5a, + 0x54, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x72, 0x61, 0x76, + 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, + 0x72, 0x74, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2f, 0x67, 0x6f, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x6d, 0x61, 0x63, + 0x68, 0x69, 0x6e, 0x65, 0x69, 0x64, 0x2f, 0x76, 0x31, 0x3b, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, + 0x65, 0x69, 0x64, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_teleport_machineid_v1_federation_service_proto_rawDescOnce sync.Once + file_teleport_machineid_v1_federation_service_proto_rawDescData = file_teleport_machineid_v1_federation_service_proto_rawDesc +) + +func file_teleport_machineid_v1_federation_service_proto_rawDescGZIP() []byte { + file_teleport_machineid_v1_federation_service_proto_rawDescOnce.Do(func() { + file_teleport_machineid_v1_federation_service_proto_rawDescData = protoimpl.X.CompressGZIP(file_teleport_machineid_v1_federation_service_proto_rawDescData) + }) + return file_teleport_machineid_v1_federation_service_proto_rawDescData +} + +var file_teleport_machineid_v1_federation_service_proto_msgTypes = make([]protoimpl.MessageInfo, 5) +var file_teleport_machineid_v1_federation_service_proto_goTypes = []interface{}{ + (*GetSPIFFEFederationRequest)(nil), // 0: teleport.machineid.v1.GetSPIFFEFederationRequest + (*ListSPIFFEFederationsRequest)(nil), // 1: teleport.machineid.v1.ListSPIFFEFederationsRequest + (*ListSPIFFEFederationsResponse)(nil), // 2: teleport.machineid.v1.ListSPIFFEFederationsResponse + (*DeleteSPIFFEFederationRequest)(nil), // 3: teleport.machineid.v1.DeleteSPIFFEFederationRequest + (*CreateSPIFFEFederationRequest)(nil), // 4: teleport.machineid.v1.CreateSPIFFEFederationRequest + (*SPIFFEFederation)(nil), // 5: teleport.machineid.v1.SPIFFEFederation + (*emptypb.Empty)(nil), // 6: google.protobuf.Empty +} +var file_teleport_machineid_v1_federation_service_proto_depIdxs = []int32{ + 5, // 0: teleport.machineid.v1.ListSPIFFEFederationsResponse.spiffe_federations:type_name -> teleport.machineid.v1.SPIFFEFederation + 5, // 1: teleport.machineid.v1.CreateSPIFFEFederationRequest.spiffe_federation:type_name -> teleport.machineid.v1.SPIFFEFederation + 0, // 2: teleport.machineid.v1.SPIFFEFederationService.GetSPIFFEFederation:input_type -> teleport.machineid.v1.GetSPIFFEFederationRequest + 1, // 3: teleport.machineid.v1.SPIFFEFederationService.ListSPIFFEFederations:input_type -> teleport.machineid.v1.ListSPIFFEFederationsRequest + 3, // 4: teleport.machineid.v1.SPIFFEFederationService.DeleteSPIFFEFederation:input_type -> teleport.machineid.v1.DeleteSPIFFEFederationRequest + 4, // 5: teleport.machineid.v1.SPIFFEFederationService.CreateSPIFFEFederation:input_type -> teleport.machineid.v1.CreateSPIFFEFederationRequest + 5, // 6: teleport.machineid.v1.SPIFFEFederationService.GetSPIFFEFederation:output_type -> teleport.machineid.v1.SPIFFEFederation + 2, // 7: teleport.machineid.v1.SPIFFEFederationService.ListSPIFFEFederations:output_type -> teleport.machineid.v1.ListSPIFFEFederationsResponse + 6, // 8: teleport.machineid.v1.SPIFFEFederationService.DeleteSPIFFEFederation:output_type -> google.protobuf.Empty + 5, // 9: teleport.machineid.v1.SPIFFEFederationService.CreateSPIFFEFederation:output_type -> teleport.machineid.v1.SPIFFEFederation + 6, // [6:10] is the sub-list for method output_type + 2, // [2:6] is the sub-list for method input_type + 2, // [2:2] is the sub-list for extension type_name + 2, // [2:2] is the sub-list for extension extendee + 0, // [0:2] is the sub-list for field type_name +} + +func init() { file_teleport_machineid_v1_federation_service_proto_init() } +func file_teleport_machineid_v1_federation_service_proto_init() { + if File_teleport_machineid_v1_federation_service_proto != nil { + return + } + file_teleport_machineid_v1_federation_proto_init() + if !protoimpl.UnsafeEnabled { + file_teleport_machineid_v1_federation_service_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetSPIFFEFederationRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_teleport_machineid_v1_federation_service_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListSPIFFEFederationsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_teleport_machineid_v1_federation_service_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListSPIFFEFederationsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_teleport_machineid_v1_federation_service_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteSPIFFEFederationRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_teleport_machineid_v1_federation_service_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateSPIFFEFederationRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_teleport_machineid_v1_federation_service_proto_rawDesc, + NumEnums: 0, + NumMessages: 5, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_teleport_machineid_v1_federation_service_proto_goTypes, + DependencyIndexes: file_teleport_machineid_v1_federation_service_proto_depIdxs, + MessageInfos: file_teleport_machineid_v1_federation_service_proto_msgTypes, + }.Build() + File_teleport_machineid_v1_federation_service_proto = out.File + file_teleport_machineid_v1_federation_service_proto_rawDesc = nil + file_teleport_machineid_v1_federation_service_proto_goTypes = nil + file_teleport_machineid_v1_federation_service_proto_depIdxs = nil +} diff --git a/api/gen/proto/go/teleport/machineid/v1/federation_service_grpc.pb.go b/api/gen/proto/go/teleport/machineid/v1/federation_service_grpc.pb.go new file mode 100644 index 0000000000000..47fa1351948ae --- /dev/null +++ b/api/gen/proto/go/teleport/machineid/v1/federation_service_grpc.pb.go @@ -0,0 +1,248 @@ +// Copyright 2024 Gravitational, Inc +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.3.0 +// - protoc (unknown) +// source: teleport/machineid/v1/federation_service.proto + +package machineidv1 + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + emptypb "google.golang.org/protobuf/types/known/emptypb" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +const ( + SPIFFEFederationService_GetSPIFFEFederation_FullMethodName = "/teleport.machineid.v1.SPIFFEFederationService/GetSPIFFEFederation" + SPIFFEFederationService_ListSPIFFEFederations_FullMethodName = "/teleport.machineid.v1.SPIFFEFederationService/ListSPIFFEFederations" + SPIFFEFederationService_DeleteSPIFFEFederation_FullMethodName = "/teleport.machineid.v1.SPIFFEFederationService/DeleteSPIFFEFederation" + SPIFFEFederationService_CreateSPIFFEFederation_FullMethodName = "/teleport.machineid.v1.SPIFFEFederationService/CreateSPIFFEFederation" +) + +// SPIFFEFederationServiceClient is the client API for SPIFFEFederationService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type SPIFFEFederationServiceClient interface { + // GetSPIFFEFederation returns a SPIFFEFederation resource by name. + GetSPIFFEFederation(ctx context.Context, in *GetSPIFFEFederationRequest, opts ...grpc.CallOption) (*SPIFFEFederation, error) + // ListSPIFFEFederations returns a list of SPIFFEFederation resources. + // Follows the pagination semantics of + // https://cloud.google.com/apis/design/design_patterns#list_pagination + ListSPIFFEFederations(ctx context.Context, in *ListSPIFFEFederationsRequest, opts ...grpc.CallOption) (*ListSPIFFEFederationsResponse, error) + // DeleteSPIFFEFederation deletes a SPIFFEFederation resource by name. + DeleteSPIFFEFederation(ctx context.Context, in *DeleteSPIFFEFederationRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) + // CreateSPIFFEFederation creates a SPIFFEFederation resource. + CreateSPIFFEFederation(ctx context.Context, in *CreateSPIFFEFederationRequest, opts ...grpc.CallOption) (*SPIFFEFederation, error) +} + +type sPIFFEFederationServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewSPIFFEFederationServiceClient(cc grpc.ClientConnInterface) SPIFFEFederationServiceClient { + return &sPIFFEFederationServiceClient{cc} +} + +func (c *sPIFFEFederationServiceClient) GetSPIFFEFederation(ctx context.Context, in *GetSPIFFEFederationRequest, opts ...grpc.CallOption) (*SPIFFEFederation, error) { + out := new(SPIFFEFederation) + err := c.cc.Invoke(ctx, SPIFFEFederationService_GetSPIFFEFederation_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *sPIFFEFederationServiceClient) ListSPIFFEFederations(ctx context.Context, in *ListSPIFFEFederationsRequest, opts ...grpc.CallOption) (*ListSPIFFEFederationsResponse, error) { + out := new(ListSPIFFEFederationsResponse) + err := c.cc.Invoke(ctx, SPIFFEFederationService_ListSPIFFEFederations_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *sPIFFEFederationServiceClient) DeleteSPIFFEFederation(ctx context.Context, in *DeleteSPIFFEFederationRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + out := new(emptypb.Empty) + err := c.cc.Invoke(ctx, SPIFFEFederationService_DeleteSPIFFEFederation_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *sPIFFEFederationServiceClient) CreateSPIFFEFederation(ctx context.Context, in *CreateSPIFFEFederationRequest, opts ...grpc.CallOption) (*SPIFFEFederation, error) { + out := new(SPIFFEFederation) + err := c.cc.Invoke(ctx, SPIFFEFederationService_CreateSPIFFEFederation_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// SPIFFEFederationServiceServer is the server API for SPIFFEFederationService service. +// All implementations must embed UnimplementedSPIFFEFederationServiceServer +// for forward compatibility +type SPIFFEFederationServiceServer interface { + // GetSPIFFEFederation returns a SPIFFEFederation resource by name. + GetSPIFFEFederation(context.Context, *GetSPIFFEFederationRequest) (*SPIFFEFederation, error) + // ListSPIFFEFederations returns a list of SPIFFEFederation resources. + // Follows the pagination semantics of + // https://cloud.google.com/apis/design/design_patterns#list_pagination + ListSPIFFEFederations(context.Context, *ListSPIFFEFederationsRequest) (*ListSPIFFEFederationsResponse, error) + // DeleteSPIFFEFederation deletes a SPIFFEFederation resource by name. + DeleteSPIFFEFederation(context.Context, *DeleteSPIFFEFederationRequest) (*emptypb.Empty, error) + // CreateSPIFFEFederation creates a SPIFFEFederation resource. + CreateSPIFFEFederation(context.Context, *CreateSPIFFEFederationRequest) (*SPIFFEFederation, error) + mustEmbedUnimplementedSPIFFEFederationServiceServer() +} + +// UnimplementedSPIFFEFederationServiceServer must be embedded to have forward compatible implementations. +type UnimplementedSPIFFEFederationServiceServer struct { +} + +func (UnimplementedSPIFFEFederationServiceServer) GetSPIFFEFederation(context.Context, *GetSPIFFEFederationRequest) (*SPIFFEFederation, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetSPIFFEFederation not implemented") +} +func (UnimplementedSPIFFEFederationServiceServer) ListSPIFFEFederations(context.Context, *ListSPIFFEFederationsRequest) (*ListSPIFFEFederationsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListSPIFFEFederations not implemented") +} +func (UnimplementedSPIFFEFederationServiceServer) DeleteSPIFFEFederation(context.Context, *DeleteSPIFFEFederationRequest) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteSPIFFEFederation not implemented") +} +func (UnimplementedSPIFFEFederationServiceServer) CreateSPIFFEFederation(context.Context, *CreateSPIFFEFederationRequest) (*SPIFFEFederation, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateSPIFFEFederation not implemented") +} +func (UnimplementedSPIFFEFederationServiceServer) mustEmbedUnimplementedSPIFFEFederationServiceServer() { +} + +// UnsafeSPIFFEFederationServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to SPIFFEFederationServiceServer will +// result in compilation errors. +type UnsafeSPIFFEFederationServiceServer interface { + mustEmbedUnimplementedSPIFFEFederationServiceServer() +} + +func RegisterSPIFFEFederationServiceServer(s grpc.ServiceRegistrar, srv SPIFFEFederationServiceServer) { + s.RegisterService(&SPIFFEFederationService_ServiceDesc, srv) +} + +func _SPIFFEFederationService_GetSPIFFEFederation_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetSPIFFEFederationRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SPIFFEFederationServiceServer).GetSPIFFEFederation(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: SPIFFEFederationService_GetSPIFFEFederation_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SPIFFEFederationServiceServer).GetSPIFFEFederation(ctx, req.(*GetSPIFFEFederationRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _SPIFFEFederationService_ListSPIFFEFederations_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListSPIFFEFederationsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SPIFFEFederationServiceServer).ListSPIFFEFederations(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: SPIFFEFederationService_ListSPIFFEFederations_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SPIFFEFederationServiceServer).ListSPIFFEFederations(ctx, req.(*ListSPIFFEFederationsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _SPIFFEFederationService_DeleteSPIFFEFederation_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteSPIFFEFederationRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SPIFFEFederationServiceServer).DeleteSPIFFEFederation(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: SPIFFEFederationService_DeleteSPIFFEFederation_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SPIFFEFederationServiceServer).DeleteSPIFFEFederation(ctx, req.(*DeleteSPIFFEFederationRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _SPIFFEFederationService_CreateSPIFFEFederation_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateSPIFFEFederationRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SPIFFEFederationServiceServer).CreateSPIFFEFederation(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: SPIFFEFederationService_CreateSPIFFEFederation_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SPIFFEFederationServiceServer).CreateSPIFFEFederation(ctx, req.(*CreateSPIFFEFederationRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// SPIFFEFederationService_ServiceDesc is the grpc.ServiceDesc for SPIFFEFederationService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var SPIFFEFederationService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "teleport.machineid.v1.SPIFFEFederationService", + HandlerType: (*SPIFFEFederationServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "GetSPIFFEFederation", + Handler: _SPIFFEFederationService_GetSPIFFEFederation_Handler, + }, + { + MethodName: "ListSPIFFEFederations", + Handler: _SPIFFEFederationService_ListSPIFFEFederations_Handler, + }, + { + MethodName: "DeleteSPIFFEFederation", + Handler: _SPIFFEFederationService_DeleteSPIFFEFederation_Handler, + }, + { + MethodName: "CreateSPIFFEFederation", + Handler: _SPIFFEFederationService_CreateSPIFFEFederation_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "teleport/machineid/v1/federation_service.proto", +} diff --git a/api/proto/teleport/legacy/types/events/events.proto b/api/proto/teleport/legacy/types/events/events.proto index 706c85d1def4a..64152aeecb738 100644 --- a/api/proto/teleport/legacy/types/events/events.proto +++ b/api/proto/teleport/legacy/types/events/events.proto @@ -4444,6 +4444,8 @@ message OneOf { events.IntegrationCreate IntegrationCreate = 165; events.IntegrationUpdate IntegrationUpdate = 166; events.IntegrationDelete IntegrationDelete = 167; + events.SPIFFEFederationCreate SPIFFEFederationCreate = 168; + events.SPIFFEFederationDelete SPIFFEFederationDelete = 169; } } @@ -6620,3 +6622,65 @@ message SpannerRPC { (gogoproto.casttype) = "Struct" ]; } + +// SPIFFEFederationCreate is emitted when a SPIFFE federation is created. +message SPIFFEFederationCreate { + // Metadata is a common event metadata + Metadata Metadata = 1 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // ResourceMetadata is a common resource event metadata + ResourceMetadata Resource = 2 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // User is a common user event metadata + UserMetadata User = 3 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // ConnectionMetadata holds information about the connection + ConnectionMetadata Connection = 4 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; +} + +// SPIFFEFederationDelete is emitted when a SPIFFE federation is deleted. +message SPIFFEFederationDelete { + // Metadata is a common event metadata + Metadata Metadata = 1 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // ResourceMetadata is a common resource event metadata + ResourceMetadata Resource = 2 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // User is a common user event metadata + UserMetadata User = 3 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // ConnectionMetadata holds information about the connection + ConnectionMetadata Connection = 4 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; +} diff --git a/api/proto/teleport/machineid/v1/federation.proto b/api/proto/teleport/machineid/v1/federation.proto new file mode 100644 index 0000000000000..f80eda451bec6 --- /dev/null +++ b/api/proto/teleport/machineid/v1/federation.proto @@ -0,0 +1,82 @@ +// Copyright 2024 Gravitational, Inc +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package teleport.machineid.v1; + +import "google/protobuf/duration.proto"; +import "google/protobuf/timestamp.proto"; +import "teleport/header/v1/metadata.proto"; + +option go_package = "github.com/gravitational/teleport/api/gen/proto/go/teleport/machineid/v1;machineidv1"; + +// SPIFFEFederation is a resource that represents the configuration of a trust +// domain federation. +message SPIFFEFederation { + // The kind of resource represented. + string kind = 1; + // Differentiates variations of the same kind. All resources should + // contain one, even if it is never populated. + string sub_kind = 2; + // The version of the resource being represented. + string version = 3; + // Common metadata that all resources share. + // Importantly, the name MUST match the name of the trust domain you federate + // with. + teleport.header.v1.Metadata metadata = 4; + // The configured properties of the trust domain federation + SPIFFEFederationSpec spec = 5; + // Fields that are set by the server as results of operations. These should + // not be modified by users. + SPIFFEFederationStatus status = 6; +} + +// SPIFFEFederationBundleSourceStatic is a static bundle source. It should be an +// option of last resort, as it requires manual updates. +message SPIFFEFederationBundleSourceStatic { + // The SPIFFE JWKS bundle. + string bundle = 1; +} + +// SPIFFEFederationBundleSourceHTTPSWeb is a bundle source that fetches the bundle +// from a HTTPS endpoint that is protected by a Web PKI certificate. +message SPIFFEFederationBundleSourceHTTPSWeb { + // The URL of the SPIFFE Bundle Endpoint. + string bundle_endpoint_url = 1; +} + +// SPIFFEFederationBundleSource configures how the federation bundle is sourced. +// Only one field can be set. +message SPIFFEFederationBundleSource { + SPIFFEFederationBundleSourceStatic static = 1; + SPIFFEFederationBundleSourceHTTPSWeb https_web = 2; +} + +// SPIFFEFederationSpec is the configuration of a trust domain federation. +message SPIFFEFederationSpec { + // The source of the federation bundle. + SPIFFEFederationBundleSource bundle_source = 1; +} + +// FederationStatus is the status of a trust domain federation. +message SPIFFEFederationStatus { + // The most recently fetched bundle from the federated trust domain. + string current_bundle = 1; + // The time that the most recently fetched bundle was obtained. + google.protobuf.Timestamp current_bundle_synced_at = 2; + // The duration that the current bundle suggests the next bundle should be + // refresh after. + google.protobuf.Duration current_bundle_refresh_hint = 3; +} diff --git a/api/proto/teleport/machineid/v1/federation_service.proto b/api/proto/teleport/machineid/v1/federation_service.proto new file mode 100644 index 0000000000000..18d0f3bf4ecbd --- /dev/null +++ b/api/proto/teleport/machineid/v1/federation_service.proto @@ -0,0 +1,76 @@ +// Copyright 2024 Gravitational, Inc +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package teleport.machineid.v1; + +import "google/protobuf/empty.proto"; +import "teleport/machineid/v1/federation.proto"; + +option go_package = "github.com/gravitational/teleport/api/gen/proto/go/teleport/machineid/v1;machineidv1"; + +// GetSPIFFEFederationRequest is the request message for GetSPIFFEFederation. +message GetSPIFFEFederationRequest { + // The name of the SPIFFEFederation resource to fetch. + string name = 1; +} + +// Request for ListSPIFFEFederations. +// +// Follows the pagination semantics of +// https://cloud.google.com/apis/design/standard_methods#list +message ListSPIFFEFederationsRequest { + // The maximum number of items to return. + // The server may impose a different page size at its discretion. + int32 page_size = 1; + // The page_token value returned from a previous ListSPIFFEFederations + // request, if any. + string page_token = 2; +} + +// ListSPIFFEFederationsResponse is the response message for ListSPIFFEFederations. +message ListSPIFFEFederationsResponse { + repeated SPIFFEFederation spiffe_federations = 1; + // Token to retrieve the next page of results, or empty if there are no + // more results exist. + string next_page_token = 2; +} + +// DeleteSPIFFEFederationRequest is the request message for DeleteSPIFFEFederation. +message DeleteSPIFFEFederationRequest { + // The name of the SPIFFEFederation resource to delete. + string name = 1; +} + +// CreateSPIFFEFederationRequest is the request message for CreateSPIFFEFederation. +message CreateSPIFFEFederationRequest { + // The SPIFFEFederation resource to create. + SPIFFEFederation spiffe_federation = 1; +} + +// SPIFFEFederationService provides methods to manage SPIFFE Federations +// between trust domains. +service SPIFFEFederationService { + // GetSPIFFEFederation returns a SPIFFEFederation resource by name. + rpc GetSPIFFEFederation(GetSPIFFEFederationRequest) returns (SPIFFEFederation); + // ListSPIFFEFederations returns a list of SPIFFEFederation resources. + // Follows the pagination semantics of + // https://cloud.google.com/apis/design/design_patterns#list_pagination + rpc ListSPIFFEFederations(ListSPIFFEFederationsRequest) returns (ListSPIFFEFederationsResponse); + // DeleteSPIFFEFederation deletes a SPIFFEFederation resource by name. + rpc DeleteSPIFFEFederation(DeleteSPIFFEFederationRequest) returns (google.protobuf.Empty); + // CreateSPIFFEFederation creates a SPIFFEFederation resource. + rpc CreateSPIFFEFederation(CreateSPIFFEFederationRequest) returns (SPIFFEFederation); +} diff --git a/api/types/constants.go b/api/types/constants.go index effe5f175a32d..a819e4f4f8906 100644 --- a/api/types/constants.go +++ b/api/types/constants.go @@ -65,6 +65,8 @@ const ( // KindBot is a Machine ID bot resource KindBot = "bot" + // KindSPIFFEFederation is a SPIFFE federation resource + KindSPIFFEFederation = "spiffe_federation" // KindHostCert is a host certificate KindHostCert = "host_cert" diff --git a/api/types/events/events.pb.go b/api/types/events/events.pb.go index 4b48b17da317a..d1a4eed42ddcd 100644 --- a/api/types/events/events.pb.go +++ b/api/types/events/events.pb.go @@ -7505,6 +7505,8 @@ type OneOf struct { // *OneOf_IntegrationCreate // *OneOf_IntegrationUpdate // *OneOf_IntegrationDelete + // *OneOf_SPIFFEFederationCreate + // *OneOf_SPIFFEFederationDelete Event isOneOf_Event `protobuf_oneof:"Event"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -8045,6 +8047,12 @@ type OneOf_IntegrationUpdate struct { type OneOf_IntegrationDelete struct { IntegrationDelete *IntegrationDelete `protobuf:"bytes,167,opt,name=IntegrationDelete,proto3,oneof" json:"IntegrationDelete,omitempty"` } +type OneOf_SPIFFEFederationCreate struct { + SPIFFEFederationCreate *SPIFFEFederationCreate `protobuf:"bytes,168,opt,name=SPIFFEFederationCreate,proto3,oneof" json:"SPIFFEFederationCreate,omitempty"` +} +type OneOf_SPIFFEFederationDelete struct { + SPIFFEFederationDelete *SPIFFEFederationDelete `protobuf:"bytes,169,opt,name=SPIFFEFederationDelete,proto3,oneof" json:"SPIFFEFederationDelete,omitempty"` +} func (*OneOf_UserLogin) isOneOf_Event() {} func (*OneOf_UserCreate) isOneOf_Event() {} @@ -8211,6 +8219,8 @@ func (*OneOf_DiscoveryConfigDeleteAll) isOneOf_Event() {} func (*OneOf_IntegrationCreate) isOneOf_Event() {} func (*OneOf_IntegrationUpdate) isOneOf_Event() {} func (*OneOf_IntegrationDelete) isOneOf_Event() {} +func (*OneOf_SPIFFEFederationCreate) isOneOf_Event() {} +func (*OneOf_SPIFFEFederationDelete) isOneOf_Event() {} func (m *OneOf) GetEvent() isOneOf_Event { if m != nil { @@ -9374,6 +9384,20 @@ func (m *OneOf) GetIntegrationDelete() *IntegrationDelete { return nil } +func (m *OneOf) GetSPIFFEFederationCreate() *SPIFFEFederationCreate { + if x, ok := m.GetEvent().(*OneOf_SPIFFEFederationCreate); ok { + return x.SPIFFEFederationCreate + } + return nil +} + +func (m *OneOf) GetSPIFFEFederationDelete() *SPIFFEFederationDelete { + if x, ok := m.GetEvent().(*OneOf_SPIFFEFederationDelete); ok { + return x.SPIFFEFederationDelete + } + return nil +} + // XXX_OneofWrappers is for the internal use of the proto package. func (*OneOf) XXX_OneofWrappers() []interface{} { return []interface{}{ @@ -9542,6 +9566,8 @@ func (*OneOf) XXX_OneofWrappers() []interface{} { (*OneOf_IntegrationCreate)(nil), (*OneOf_IntegrationUpdate)(nil), (*OneOf_IntegrationDelete)(nil), + (*OneOf_SPIFFEFederationCreate)(nil), + (*OneOf_SPIFFEFederationDelete)(nil), } } @@ -13315,6 +13341,102 @@ func (m *SpannerRPC) XXX_DiscardUnknown() { var xxx_messageInfo_SpannerRPC proto.InternalMessageInfo +// SPIFFEFederationCreate is emitted when a SPIFFE federation is created. +type SPIFFEFederationCreate struct { + // Metadata is a common event metadata + Metadata `protobuf:"bytes,1,opt,name=Metadata,proto3,embedded=Metadata" json:""` + // ResourceMetadata is a common resource event metadata + ResourceMetadata `protobuf:"bytes,2,opt,name=Resource,proto3,embedded=Resource" json:""` + // User is a common user event metadata + UserMetadata `protobuf:"bytes,3,opt,name=User,proto3,embedded=User" json:""` + // ConnectionMetadata holds information about the connection + ConnectionMetadata `protobuf:"bytes,4,opt,name=Connection,proto3,embedded=Connection" json:""` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SPIFFEFederationCreate) Reset() { *m = SPIFFEFederationCreate{} } +func (m *SPIFFEFederationCreate) String() string { return proto.CompactTextString(m) } +func (*SPIFFEFederationCreate) ProtoMessage() {} +func (*SPIFFEFederationCreate) Descriptor() ([]byte, []int) { + return fileDescriptor_007ba1c3d6266d56, []int{208} +} +func (m *SPIFFEFederationCreate) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SPIFFEFederationCreate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SPIFFEFederationCreate.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *SPIFFEFederationCreate) XXX_Merge(src proto.Message) { + xxx_messageInfo_SPIFFEFederationCreate.Merge(m, src) +} +func (m *SPIFFEFederationCreate) XXX_Size() int { + return m.Size() +} +func (m *SPIFFEFederationCreate) XXX_DiscardUnknown() { + xxx_messageInfo_SPIFFEFederationCreate.DiscardUnknown(m) +} + +var xxx_messageInfo_SPIFFEFederationCreate proto.InternalMessageInfo + +// SPIFFEFederationDelete is emitted when a SPIFFE federation is deleted. +type SPIFFEFederationDelete struct { + // Metadata is a common event metadata + Metadata `protobuf:"bytes,1,opt,name=Metadata,proto3,embedded=Metadata" json:""` + // ResourceMetadata is a common resource event metadata + ResourceMetadata `protobuf:"bytes,2,opt,name=Resource,proto3,embedded=Resource" json:""` + // User is a common user event metadata + UserMetadata `protobuf:"bytes,3,opt,name=User,proto3,embedded=User" json:""` + // ConnectionMetadata holds information about the connection + ConnectionMetadata `protobuf:"bytes,4,opt,name=Connection,proto3,embedded=Connection" json:""` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SPIFFEFederationDelete) Reset() { *m = SPIFFEFederationDelete{} } +func (m *SPIFFEFederationDelete) String() string { return proto.CompactTextString(m) } +func (*SPIFFEFederationDelete) ProtoMessage() {} +func (*SPIFFEFederationDelete) Descriptor() ([]byte, []int) { + return fileDescriptor_007ba1c3d6266d56, []int{209} +} +func (m *SPIFFEFederationDelete) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SPIFFEFederationDelete) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SPIFFEFederationDelete.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *SPIFFEFederationDelete) XXX_Merge(src proto.Message) { + xxx_messageInfo_SPIFFEFederationDelete.Merge(m, src) +} +func (m *SPIFFEFederationDelete) XXX_Size() int { + return m.Size() +} +func (m *SPIFFEFederationDelete) XXX_DiscardUnknown() { + xxx_messageInfo_SPIFFEFederationDelete.DiscardUnknown(m) +} + +var xxx_messageInfo_SPIFFEFederationDelete proto.InternalMessageInfo + func init() { proto.RegisterEnum("events.UserKind", UserKind_name, UserKind_value) proto.RegisterEnum("events.EventAction", EventAction_name, EventAction_value) @@ -13547,6 +13669,8 @@ func init() { proto.RegisterType((*SessionRecordingConfigUpdate)(nil), "events.SessionRecordingConfigUpdate") proto.RegisterType((*AccessPathChanged)(nil), "events.AccessPathChanged") proto.RegisterType((*SpannerRPC)(nil), "events.SpannerRPC") + proto.RegisterType((*SPIFFEFederationCreate)(nil), "events.SPIFFEFederationCreate") + proto.RegisterType((*SPIFFEFederationDelete)(nil), "events.SPIFFEFederationDelete") } func init() { @@ -13554,980 +13678,984 @@ func init() { } var fileDescriptor_007ba1c3d6266d56 = []byte{ - // 15565 bytes of a gzipped FileDescriptorProto + // 15623 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x6b, 0x74, 0x1c, 0xc9, 0x75, 0x18, 0x8c, 0x79, 0x60, 0x00, 0x5c, 0x3c, 0x08, 0x14, 0x5f, 0xbd, 0x5c, 0x92, 0xb3, 0xdb, 0xab, 0xa5, 0xc8, 0xd5, 0x2e, 0xa9, 0xe5, 0x72, 0x77, 0xb5, 0x2f, 0xed, 0x0e, 0x30, 0x00, 0x31, 0x24, 0x5e, 0xdb, 0x03, 0x92, 0x5a, 0xbd, 0xc6, 0x8d, 0xe9, 0x02, 0xd0, 0xcb, 0x99, 0xee, 0x51, - 0x77, 0x0f, 0x41, 0xec, 0xf7, 0x88, 0xe5, 0xf8, 0x21, 0x39, 0x92, 0xa2, 0xc8, 0xb1, 0x65, 0xc7, - 0x4e, 0x2c, 0xdb, 0xc7, 0x89, 0xe3, 0xe3, 0xd8, 0x71, 0x9c, 0x63, 0x5b, 0x71, 0x74, 0x62, 0x47, - 0x79, 0xac, 0xa3, 0xe3, 0x1c, 0xdb, 0x49, 0x7c, 0x7c, 0x12, 0x07, 0x72, 0x94, 0x38, 0x3f, 0x70, - 0x92, 0x13, 0x27, 0xd1, 0x89, 0x1d, 0xc7, 0xc9, 0xc9, 0xa9, 0x5b, 0xd5, 0xdd, 0xd5, 0x8f, 0x19, - 0x3c, 0xd7, 0x58, 0x88, 0xf8, 0x43, 0x62, 0xee, 0xbd, 0x75, 0xab, 0xfa, 0xd6, 0xad, 0xaa, 0x5b, - 0x55, 0xb7, 0xee, 0x85, 0x4b, 0x1e, 0x6d, 0xd0, 0x96, 0xed, 0x78, 0x57, 0x1a, 0x74, 0x45, 0xaf, - 0xaf, 0x5f, 0xf1, 0xd6, 0x5b, 0xd4, 0xbd, 0x42, 0xef, 0x51, 0xcb, 0xf3, 0xff, 0xbb, 0xdc, 0x72, - 0x6c, 0xcf, 0x26, 0x05, 0xfe, 0xeb, 0xcc, 0x89, 0x15, 0x7b, 0xc5, 0x46, 0xd0, 0x15, 0xf6, 0x17, - 0xc7, 0x9e, 0x39, 0xbb, 0x62, 0xdb, 0x2b, 0x0d, 0x7a, 0x05, 0x7f, 0x2d, 0xb5, 0x97, 0xaf, 0xb8, - 0x9e, 0xd3, 0xae, 0x7b, 0x02, 0x5b, 0x8c, 0x63, 0x3d, 0xb3, 0x49, 0x5d, 0x4f, 0x6f, 0xb6, 0x04, - 0xc1, 0xf9, 0x38, 0xc1, 0x9a, 0xa3, 0xb7, 0x5a, 0xd4, 0x11, 0x95, 0x9f, 0x79, 0x34, 0xbd, 0x9d, - 0xf8, 0xaf, 0x20, 0x79, 0x2a, 0x9d, 0xc4, 0x67, 0x14, 0xe3, 0xa8, 0x7e, 0x21, 0x0b, 0xfd, 0xb3, - 0xd4, 0xd3, 0x0d, 0xdd, 0xd3, 0xc9, 0x59, 0xe8, 0xad, 0x58, 0x06, 0xbd, 0xaf, 0x64, 0x1e, 0xc9, - 0x5c, 0xcc, 0x8d, 0x17, 0x36, 0x37, 0x8a, 0x59, 0x6a, 0x6a, 0x1c, 0x48, 0xce, 0x41, 0x7e, 0x71, - 0xbd, 0x45, 0x95, 0xec, 0x23, 0x99, 0x8b, 0x03, 0xe3, 0x03, 0x9b, 0x1b, 0xc5, 0x5e, 0x94, 0x85, - 0x86, 0x60, 0xf2, 0x28, 0x64, 0x2b, 0x65, 0x25, 0x87, 0xc8, 0xb1, 0xcd, 0x8d, 0xe2, 0x70, 0xdb, - 0x34, 0x9e, 0xb4, 0x9b, 0xa6, 0x47, 0x9b, 0x2d, 0x6f, 0x5d, 0xcb, 0x56, 0xca, 0xe4, 0x02, 0xe4, - 0x27, 0x6c, 0x83, 0x2a, 0x79, 0x24, 0x22, 0x9b, 0x1b, 0xc5, 0x91, 0xba, 0x6d, 0x50, 0x89, 0x0a, - 0xf1, 0xe4, 0x35, 0xc8, 0x2f, 0x9a, 0x4d, 0xaa, 0xf4, 0x3e, 0x92, 0xb9, 0x38, 0x78, 0xf5, 0xcc, - 0x65, 0x2e, 0x95, 0xcb, 0xbe, 0x54, 0x2e, 0x2f, 0xfa, 0x62, 0x1b, 0x1f, 0x7d, 0x7b, 0xa3, 0xd8, - 0xb3, 0xb9, 0x51, 0xcc, 0x33, 0x49, 0x7e, 0xfe, 0xeb, 0xc5, 0x8c, 0x86, 0x25, 0xc9, 0xcb, 0x30, - 0x38, 0xd1, 0x68, 0xbb, 0x1e, 0x75, 0xe6, 0xf4, 0x26, 0x55, 0x0a, 0x58, 0xe1, 0x99, 0xcd, 0x8d, - 0xe2, 0xa9, 0x3a, 0x07, 0xd7, 0x2c, 0xbd, 0x29, 0x57, 0x2c, 0x93, 0xab, 0xbf, 0x9c, 0x81, 0x63, - 0x55, 0xea, 0xba, 0xa6, 0x6d, 0x05, 0xb2, 0x79, 0x1c, 0x06, 0x04, 0xa8, 0x52, 0x46, 0xf9, 0x0c, - 0x8c, 0xf7, 0x6d, 0x6e, 0x14, 0x73, 0xae, 0x69, 0x68, 0x21, 0x86, 0xbc, 0x1f, 0xfa, 0xee, 0x98, - 0xde, 0xea, 0xec, 0x54, 0x49, 0xc8, 0xe9, 0xd4, 0xe6, 0x46, 0x91, 0xac, 0x99, 0xde, 0x6a, 0xad, - 0xb9, 0xac, 0x4b, 0x15, 0xfa, 0x64, 0x64, 0x06, 0x46, 0x17, 0x1c, 0xf3, 0x9e, 0xee, 0xd1, 0x9b, - 0x74, 0x7d, 0xc1, 0x6e, 0x98, 0xf5, 0x75, 0x21, 0xc5, 0x47, 0x36, 0x37, 0x8a, 0x67, 0x5b, 0x1c, - 0x57, 0xbb, 0x4b, 0xd7, 0x6b, 0x2d, 0xc4, 0x4a, 0x4c, 0x12, 0x25, 0xd5, 0xaf, 0xf6, 0xc2, 0xd0, - 0x2d, 0x97, 0x3a, 0x41, 0xbb, 0x2f, 0x40, 0x9e, 0xfd, 0x16, 0x4d, 0x46, 0x99, 0xb7, 0x5d, 0xea, - 0xc8, 0x32, 0x67, 0x78, 0x72, 0x09, 0x7a, 0x67, 0xec, 0x15, 0xd3, 0x12, 0xcd, 0x3e, 0xbe, 0xb9, - 0x51, 0x3c, 0xd6, 0x60, 0x00, 0x89, 0x92, 0x53, 0x90, 0x0f, 0xc2, 0x50, 0xa5, 0xc9, 0x74, 0xc8, - 0xb6, 0x74, 0xcf, 0x76, 0x44, 0x6b, 0x51, 0xba, 0xa6, 0x04, 0x97, 0x0a, 0x46, 0xe8, 0xc9, 0x8b, - 0x00, 0xa5, 0x3b, 0x55, 0xcd, 0x6e, 0xd0, 0x92, 0x36, 0x27, 0x94, 0x01, 0x4b, 0xeb, 0x6b, 0x6e, - 0xcd, 0xb1, 0x1b, 0xb4, 0xa6, 0x3b, 0x72, 0xb5, 0x12, 0x35, 0x99, 0x84, 0x91, 0x52, 0xbd, 0x4e, - 0x5d, 0x57, 0xa3, 0x9f, 0x68, 0x53, 0xd7, 0x73, 0x95, 0xde, 0x47, 0x72, 0x17, 0x07, 0xc6, 0xcf, - 0x6d, 0x6e, 0x14, 0x1f, 0xd2, 0x11, 0x53, 0x73, 0x04, 0x4a, 0x62, 0x11, 0x2b, 0x44, 0xc6, 0x61, - 0xb8, 0xf4, 0x56, 0xdb, 0xa1, 0x15, 0x83, 0x5a, 0x9e, 0xe9, 0xad, 0x0b, 0x0d, 0x39, 0xbb, 0xb9, - 0x51, 0x54, 0x74, 0x86, 0xa8, 0x99, 0x02, 0x23, 0x31, 0x89, 0x16, 0x21, 0xf3, 0x30, 0x76, 0x7d, - 0x62, 0xa1, 0x4a, 0x9d, 0x7b, 0x66, 0x9d, 0x96, 0xea, 0x75, 0xbb, 0x6d, 0x79, 0x4a, 0x1f, 0xf2, - 0x79, 0x74, 0x73, 0xa3, 0x78, 0x6e, 0xa5, 0xde, 0xaa, 0xb9, 0x1c, 0x5b, 0xd3, 0x39, 0x5a, 0x62, - 0x96, 0x2c, 0x4b, 0x3e, 0x0c, 0xc3, 0x8b, 0x0e, 0xd3, 0x42, 0xa3, 0x4c, 0x19, 0x5c, 0xe9, 0x47, - 0xfd, 0x3f, 0x75, 0x59, 0x4c, 0x40, 0x1c, 0xea, 0xf7, 0x2c, 0x6f, 0xac, 0xc7, 0x0b, 0xd4, 0x0c, - 0xc4, 0xc9, 0x8d, 0x8d, 0xb0, 0x22, 0x14, 0x14, 0xf6, 0xf1, 0xa6, 0x43, 0x8d, 0x84, 0xb6, 0x0d, - 0x60, 0x9b, 0x2f, 0x6d, 0x6e, 0x14, 0x1f, 0x77, 0x04, 0x4d, 0xad, 0xab, 0xda, 0x75, 0x64, 0x45, - 0x26, 0xa1, 0x9f, 0x69, 0xd3, 0x4d, 0xd3, 0x32, 0x14, 0x78, 0x24, 0x73, 0x71, 0xe4, 0xea, 0xa8, - 0xdf, 0x7a, 0x1f, 0x3e, 0x7e, 0x7a, 0x73, 0xa3, 0x78, 0x9c, 0xe9, 0x60, 0xed, 0xae, 0x69, 0xc9, - 0x53, 0x44, 0x50, 0x54, 0xfd, 0xa3, 0x3c, 0x8c, 0x30, 0xe1, 0x48, 0x7a, 0x5c, 0x62, 0x43, 0x92, - 0x41, 0xd8, 0x08, 0x75, 0x5b, 0x7a, 0x9d, 0x0a, 0x95, 0x46, 0x76, 0x96, 0x0f, 0x94, 0xd8, 0xc5, - 0xe9, 0xc9, 0x25, 0xe8, 0xe7, 0xa0, 0x4a, 0x59, 0x68, 0xf9, 0xf0, 0xe6, 0x46, 0x71, 0xc0, 0x45, - 0x58, 0xcd, 0x34, 0xb4, 0x00, 0xcd, 0xd4, 0x8c, 0xff, 0x3d, 0x6d, 0xbb, 0x1e, 0x63, 0x2e, 0x94, - 0x1c, 0xd5, 0x4c, 0x14, 0x58, 0x15, 0x28, 0x59, 0xcd, 0xa2, 0x85, 0xc8, 0x0b, 0x00, 0x1c, 0x52, - 0x32, 0x0c, 0x47, 0x68, 0xfa, 0x43, 0x9b, 0x1b, 0xc5, 0x93, 0x82, 0x85, 0x6e, 0x18, 0xf2, 0x30, - 0x91, 0x88, 0x49, 0x13, 0x86, 0xf8, 0xaf, 0x19, 0x7d, 0x89, 0x36, 0xb8, 0x9a, 0x0f, 0x5e, 0xbd, - 0xe8, 0x4b, 0x33, 0x2a, 0x9d, 0xcb, 0x32, 0xe9, 0xa4, 0xe5, 0x39, 0xeb, 0xe3, 0x45, 0x31, 0x33, - 0x9e, 0x16, 0x55, 0x35, 0x10, 0x27, 0x8f, 0x49, 0xb9, 0x0c, 0x9b, 0x30, 0xa7, 0x6c, 0x67, 0x4d, - 0x77, 0x0c, 0x6a, 0x8c, 0xaf, 0xcb, 0x13, 0xe6, 0xb2, 0x0f, 0xae, 0x2d, 0xc9, 0x3a, 0x20, 0x93, - 0x93, 0x09, 0x18, 0xe6, 0xdc, 0xaa, 0xed, 0x25, 0xec, 0xfb, 0xbe, 0x84, 0xb4, 0xdc, 0xf6, 0x52, - 0xbc, 0xbf, 0xa3, 0x65, 0xd8, 0x98, 0xe4, 0x80, 0xdb, 0xd4, 0x61, 0xb3, 0x29, 0xaa, 0xbf, 0x18, - 0x93, 0x82, 0xc9, 0x3d, 0x8e, 0x49, 0xf2, 0x10, 0x45, 0xce, 0xbc, 0x0a, 0x63, 0x09, 0x51, 0x90, - 0x51, 0xc8, 0xdd, 0xa5, 0xeb, 0x5c, 0x5d, 0x34, 0xf6, 0x27, 0x39, 0x01, 0xbd, 0xf7, 0xf4, 0x46, - 0x5b, 0xac, 0x65, 0x1a, 0xff, 0xf1, 0x62, 0xf6, 0x03, 0x19, 0x36, 0xf5, 0x93, 0x09, 0xdb, 0xb2, - 0x68, 0xdd, 0x93, 0x67, 0xff, 0xe7, 0x60, 0x60, 0xc6, 0xae, 0xeb, 0x0d, 0xec, 0x47, 0xae, 0x77, - 0xca, 0xe6, 0x46, 0xf1, 0x04, 0xeb, 0xc0, 0xcb, 0x0d, 0x86, 0x91, 0xda, 0x14, 0x92, 0x32, 0x05, - 0xd0, 0x68, 0xd3, 0xf6, 0x28, 0x16, 0xcc, 0x86, 0x0a, 0x80, 0x05, 0x1d, 0x44, 0xc9, 0x0a, 0x10, - 0x12, 0x93, 0x2b, 0xd0, 0xbf, 0xc0, 0x16, 0xbc, 0xba, 0xdd, 0x10, 0xca, 0x87, 0x73, 0x32, 0x2e, - 0x82, 0xf2, 0xa0, 0xf1, 0x89, 0xd4, 0x69, 0x18, 0x99, 0x68, 0x98, 0xd4, 0xf2, 0xe4, 0x56, 0xb3, - 0x21, 0x55, 0x5a, 0xa1, 0x96, 0x27, 0xb7, 0x1a, 0x07, 0x9f, 0xce, 0xa0, 0x72, 0xab, 0x03, 0x52, - 0xf5, 0x9f, 0xe7, 0xe0, 0xa1, 0x9b, 0xed, 0x25, 0xea, 0x58, 0xd4, 0xa3, 0xae, 0x58, 0x19, 0x03, - 0xae, 0x73, 0x30, 0x96, 0x40, 0x0a, 0xee, 0xb8, 0x62, 0xdd, 0x0d, 0x90, 0x35, 0xb1, 0xd8, 0xca, - 0xd3, 0x5e, 0xa2, 0x28, 0x99, 0x86, 0x63, 0x21, 0x90, 0x35, 0xc2, 0x55, 0xb2, 0x38, 0xa7, 0x9f, - 0xdf, 0xdc, 0x28, 0x9e, 0x91, 0xb8, 0xb1, 0x66, 0xcb, 0x1a, 0x1c, 0x2f, 0x46, 0x6e, 0xc2, 0x68, - 0x08, 0xba, 0xee, 0xd8, 0xed, 0x96, 0xab, 0xe4, 0x90, 0x55, 0x71, 0x73, 0xa3, 0xf8, 0xb0, 0xc4, - 0x6a, 0x05, 0x91, 0xf2, 0x4a, 0x1a, 0x2f, 0x48, 0xbe, 0x33, 0x23, 0x73, 0x13, 0xa3, 0x30, 0x8f, - 0xa3, 0xf0, 0x79, 0x7f, 0x14, 0x76, 0x14, 0xd2, 0xe5, 0x78, 0x49, 0x31, 0x28, 0x63, 0xcd, 0x48, - 0x0c, 0xca, 0x44, 0x8d, 0x67, 0x26, 0xe0, 0x64, 0x2a, 0xaf, 0x1d, 0x69, 0xf5, 0x1f, 0xe4, 0x64, - 0x2e, 0x0b, 0xb6, 0x11, 0x74, 0xe6, 0xbc, 0xdc, 0x99, 0x0b, 0xb6, 0x81, 0xe6, 0x52, 0x26, 0x5c, - 0xc4, 0xa4, 0xc6, 0xb6, 0x6c, 0x23, 0x6e, 0x35, 0x25, 0xcb, 0x92, 0x8f, 0xc3, 0xa9, 0x04, 0x90, - 0x4f, 0xd7, 0x5c, 0xfb, 0x2f, 0x6c, 0x6e, 0x14, 0xd5, 0x14, 0xae, 0xf1, 0xd9, 0xbb, 0x03, 0x17, - 0xa2, 0xc3, 0x69, 0x49, 0xea, 0xb6, 0xe5, 0xe9, 0xa6, 0x25, 0xac, 0x3c, 0x3e, 0x4a, 0xde, 0xbb, - 0xb9, 0x51, 0x7c, 0x4c, 0xd6, 0x41, 0x9f, 0x26, 0xde, 0xf8, 0x4e, 0x7c, 0x88, 0x01, 0x4a, 0x0a, - 0xaa, 0xd2, 0xd4, 0x57, 0x7c, 0xd3, 0xf5, 0xe2, 0xe6, 0x46, 0xf1, 0x3d, 0xa9, 0x75, 0x98, 0x8c, - 0x4a, 0x5e, 0x2a, 0x3b, 0x71, 0x22, 0x1a, 0x90, 0x10, 0x37, 0x67, 0x1b, 0x14, 0xbf, 0xa1, 0x17, - 0xf9, 0xab, 0x9b, 0x1b, 0xc5, 0xf3, 0x12, 0x7f, 0xcb, 0x36, 0x68, 0xbc, 0xf9, 0x29, 0xa5, 0xd5, - 0x5f, 0xce, 0xc1, 0xf9, 0x6a, 0x69, 0x76, 0xa6, 0x62, 0xf8, 0xb6, 0xc5, 0x82, 0x63, 0xdf, 0x33, - 0x0d, 0x69, 0xf4, 0x2e, 0xc1, 0xe9, 0x18, 0x6a, 0x12, 0xcd, 0x99, 0xc0, 0xaa, 0xc5, 0x6f, 0xf3, - 0xed, 0x96, 0x96, 0xa0, 0xa9, 0x71, 0x9b, 0xa7, 0x16, 0x31, 0xe9, 0x3b, 0x31, 0x62, 0x7d, 0x14, - 0x43, 0x55, 0x57, 0x6d, 0xc7, 0xab, 0xb7, 0x3d, 0xa1, 0x04, 0xd8, 0x47, 0x89, 0x3a, 0x5c, 0x41, - 0xd4, 0xa5, 0x0a, 0x9f, 0x0f, 0xf9, 0x74, 0x06, 0x46, 0x4b, 0x9e, 0xe7, 0x98, 0x4b, 0x6d, 0x8f, - 0xce, 0xea, 0xad, 0x96, 0x69, 0xad, 0xe0, 0x58, 0x1f, 0xbc, 0xfa, 0x72, 0xb0, 0x46, 0x76, 0x95, - 0xc4, 0xe5, 0x78, 0x71, 0x69, 0x88, 0xea, 0x3e, 0xaa, 0xd6, 0xe4, 0x38, 0x79, 0x88, 0xc6, 0xcb, - 0xb1, 0x21, 0x9a, 0xca, 0x6b, 0x47, 0x43, 0xf4, 0x0b, 0x39, 0x38, 0x3b, 0x7f, 0xd7, 0xd3, 0x35, - 0xea, 0xda, 0x6d, 0xa7, 0x4e, 0xdd, 0x5b, 0x2d, 0x43, 0xf7, 0x68, 0x38, 0x52, 0x8b, 0xd0, 0x5b, - 0x32, 0x0c, 0x6a, 0x20, 0xbb, 0x5e, 0xbe, 0xff, 0xd2, 0x19, 0x40, 0xe3, 0x70, 0xf2, 0x38, 0xf4, - 0x89, 0x32, 0xc8, 0xbd, 0x77, 0x7c, 0x70, 0x73, 0xa3, 0xd8, 0xd7, 0xe6, 0x20, 0xcd, 0xc7, 0x31, - 0xb2, 0x32, 0x6d, 0x50, 0x46, 0x96, 0x0b, 0xc9, 0x0c, 0x0e, 0xd2, 0x7c, 0x1c, 0x79, 0x1d, 0x46, - 0x90, 0x6d, 0xd0, 0x1e, 0x31, 0xf7, 0x9d, 0xf0, 0xa5, 0x2b, 0x37, 0x96, 0x2f, 0x4d, 0xd8, 0x9a, - 0x9a, 0xe3, 0x17, 0xd0, 0x62, 0x0c, 0xc8, 0x1d, 0x18, 0x15, 0x8d, 0x08, 0x99, 0xf6, 0x76, 0x61, - 0x7a, 0x72, 0x73, 0xa3, 0x38, 0x26, 0xda, 0x2f, 0xb1, 0x4d, 0x30, 0x61, 0x8c, 0x45, 0xb3, 0x43, - 0xc6, 0x85, 0xad, 0x18, 0x8b, 0x2f, 0x96, 0x19, 0xc7, 0x99, 0xa8, 0x6f, 0xc0, 0x90, 0x5c, 0x90, - 0x9c, 0xc2, 0x3d, 0x2e, 0x1f, 0x27, 0xb8, 0x3b, 0x36, 0x0d, 0xdc, 0xd8, 0x3e, 0x0d, 0x83, 0x65, - 0xea, 0xd6, 0x1d, 0xb3, 0xc5, 0xac, 0x06, 0xa1, 0xe4, 0xc7, 0x36, 0x37, 0x8a, 0x83, 0x46, 0x08, - 0xd6, 0x64, 0x1a, 0xf5, 0x7f, 0x64, 0xe0, 0x14, 0xe3, 0x5d, 0x72, 0x5d, 0x73, 0xc5, 0x6a, 0xca, - 0xcb, 0xf6, 0x93, 0x50, 0xa8, 0x62, 0x7d, 0xa2, 0xa6, 0x13, 0x9b, 0x1b, 0xc5, 0x51, 0xde, 0x02, - 0x49, 0x0f, 0x05, 0x4d, 0xb0, 0xc1, 0xcb, 0x6e, 0xb1, 0xc1, 0x63, 0x26, 0xad, 0xa7, 0x3b, 0x9e, - 0x69, 0xad, 0x54, 0x3d, 0xdd, 0x6b, 0xbb, 0x11, 0x93, 0x56, 0x60, 0x6a, 0x2e, 0xa2, 0x22, 0x26, - 0x6d, 0xa4, 0x10, 0x79, 0x15, 0x86, 0x26, 0x2d, 0x23, 0x64, 0xc2, 0x27, 0xc4, 0x87, 0x99, 0xa5, - 0x49, 0x11, 0x9e, 0x64, 0x11, 0x29, 0xa0, 0xfe, 0xad, 0x0c, 0x28, 0x7c, 0x37, 0x36, 0x63, 0xba, - 0xde, 0x2c, 0x6d, 0x2e, 0x49, 0xb3, 0xd3, 0x94, 0xbf, 0xbd, 0x63, 0x38, 0x69, 0x2d, 0x42, 0x53, - 0x40, 0x6c, 0xef, 0x1a, 0xa6, 0xeb, 0xc5, 0x27, 0xc3, 0x58, 0x29, 0x52, 0x81, 0x3e, 0xce, 0x99, - 0xdb, 0x12, 0x83, 0x57, 0x15, 0x5f, 0x11, 0xe2, 0x55, 0x73, 0x65, 0x68, 0x72, 0x62, 0x79, 0x7f, - 0x2e, 0xca, 0xab, 0x7f, 0x3b, 0x0b, 0xa3, 0xf1, 0x42, 0xe4, 0x0e, 0xf4, 0xdf, 0xb0, 0x4d, 0x8b, - 0x1a, 0xf3, 0x16, 0xb6, 0xb0, 0xfb, 0x29, 0x85, 0x6f, 0x8b, 0x1f, 0x7f, 0x13, 0xcb, 0xd4, 0x64, - 0x0b, 0x16, 0x0f, 0x2d, 0x02, 0x66, 0xe4, 0xc3, 0x30, 0xc0, 0x6c, 0xc0, 0x7b, 0xc8, 0x39, 0xbb, - 0x25, 0xe7, 0x47, 0x04, 0xe7, 0x13, 0x0e, 0x2f, 0x94, 0x64, 0x1d, 0xb2, 0x63, 0x7a, 0xa5, 0x51, - 0xdd, 0xb5, 0x2d, 0xd1, 0xf3, 0xa8, 0x57, 0x0e, 0x42, 0x64, 0xbd, 0xe2, 0x34, 0xcc, 0x74, 0xe5, - 0x1f, 0x8b, 0xdd, 0x20, 0xed, 0x5d, 0xb8, 0xac, 0xe2, 0x3d, 0x20, 0x11, 0xab, 0xdf, 0x9d, 0x85, - 0xa7, 0x42, 0x91, 0x69, 0xf4, 0x9e, 0x49, 0xd7, 0x84, 0x38, 0x57, 0xcd, 0x96, 0xd8, 0x3c, 0x32, - 0x95, 0x77, 0x27, 0x56, 0x75, 0x6b, 0x85, 0x1a, 0xe4, 0x12, 0xf4, 0xb2, 0x1d, 0xbe, 0xab, 0x64, - 0xd0, 0x5c, 0xc3, 0xe9, 0xc4, 0x61, 0x00, 0xf9, 0xf4, 0x01, 0x29, 0x88, 0x0d, 0x85, 0x45, 0x47, - 0x37, 0x3d, 0xbf, 0x67, 0x4b, 0xc9, 0x9e, 0xdd, 0x46, 0x8d, 0x97, 0x39, 0x0f, 0x3e, 0xe7, 0xa3, - 0x20, 0x3c, 0x04, 0xc8, 0x82, 0xe0, 0x24, 0x67, 0x5e, 0x80, 0x41, 0x89, 0x78, 0x47, 0x93, 0xfa, - 0x97, 0xf3, 0xb2, 0xae, 0xfb, 0xcd, 0x12, 0xba, 0x7e, 0x85, 0xe9, 0xa8, 0xeb, 0x32, 0xab, 0x82, - 0x2b, 0xb9, 0xd0, 0x44, 0x04, 0x45, 0x35, 0x11, 0x41, 0xe4, 0x19, 0xe8, 0xe7, 0x2c, 0x82, 0xfd, - 0x2b, 0xee, 0x7d, 0x1d, 0x84, 0x45, 0x97, 0xe6, 0x80, 0x90, 0xfc, 0x74, 0x06, 0xce, 0x75, 0x95, - 0x04, 0x2a, 0xc3, 0xe0, 0xd5, 0x67, 0x77, 0x25, 0xc6, 0xf1, 0xa7, 0x36, 0x37, 0x8a, 0x97, 0x9a, - 0x01, 0x49, 0xcd, 0x91, 0x68, 0x6a, 0x75, 0x4e, 0x24, 0xb5, 0xab, 0x7b, 0x53, 0x98, 0xf1, 0xc8, - 0x2b, 0x9d, 0xc2, 0x33, 0x1c, 0xab, 0xbe, 0xee, 0x37, 0x32, 0x1f, 0x1a, 0x8f, 0xe2, 0x7b, 0x97, - 0x7d, 0x92, 0x94, 0x6a, 0x3a, 0x70, 0x21, 0x75, 0x38, 0xcd, 0x31, 0x65, 0x7d, 0x7d, 0x7e, 0x79, - 0xd6, 0xb6, 0xbc, 0x55, 0xbf, 0x82, 0x5e, 0xf9, 0x10, 0x04, 0x2b, 0x30, 0xf4, 0xf5, 0x9a, 0xbd, - 0x5c, 0x6b, 0x32, 0xaa, 0x94, 0x3a, 0x3a, 0x71, 0x62, 0x13, 0xad, 0x18, 0x73, 0xfe, 0x14, 0x54, - 0x08, 0x8f, 0xa8, 0xfc, 0x71, 0x9a, 0x9c, 0x70, 0x62, 0x85, 0xd4, 0x0a, 0x0c, 0xcd, 0xd8, 0xf5, - 0xbb, 0x81, 0xba, 0xbc, 0x00, 0x85, 0x45, 0xdd, 0x59, 0xa1, 0x1e, 0xca, 0x62, 0xf0, 0xea, 0xd8, - 0x65, 0x7e, 0xec, 0xcb, 0x88, 0x38, 0x62, 0x7c, 0x44, 0xcc, 0x06, 0x05, 0x0f, 0x7f, 0x6b, 0xa2, - 0x80, 0xfa, 0xf5, 0x5e, 0x18, 0x12, 0x47, 0x94, 0x38, 0x9b, 0x93, 0x17, 0xc3, 0x43, 0x5f, 0x31, - 0x7d, 0x05, 0xc7, 0x34, 0xc1, 0xf1, 0xd2, 0x10, 0x63, 0xf6, 0x9b, 0x1b, 0xc5, 0xcc, 0xe6, 0x46, - 0xb1, 0x47, 0xeb, 0x97, 0x36, 0x95, 0xe1, 0x7a, 0x23, 0x2d, 0xb0, 0xf2, 0xa1, 0x63, 0xac, 0x2c, - 0x5f, 0x7f, 0x5e, 0x85, 0x3e, 0xd1, 0x06, 0xa1, 0x71, 0xa7, 0xc3, 0xb3, 0x8c, 0xc8, 0x51, 0x6b, - 0xac, 0xb4, 0x5f, 0x8a, 0xbc, 0x0c, 0x05, 0xbe, 0xb7, 0x17, 0x02, 0x38, 0x95, 0x7e, 0x16, 0x12, - 0x2b, 0x2e, 0xca, 0x90, 0x69, 0x80, 0x70, 0x5f, 0x1f, 0x9c, 0x2c, 0x0b, 0x0e, 0xc9, 0x1d, 0x7f, - 0x8c, 0x8b, 0x54, 0x96, 0x3c, 0x07, 0x43, 0x8b, 0xd4, 0x69, 0x9a, 0x96, 0xde, 0xa8, 0x9a, 0x6f, - 0xf9, 0x87, 0xcb, 0xb8, 0xf0, 0xba, 0xe6, 0x5b, 0xf2, 0xc8, 0x8d, 0xd0, 0x91, 0x8f, 0xa5, 0xed, - 0x9b, 0xfb, 0xb0, 0x21, 0x8f, 0x6e, 0xb9, 0xa1, 0x8c, 0xb5, 0x27, 0x65, 0x1b, 0xfd, 0x3a, 0x0c, - 0x47, 0xb6, 0x4c, 0xe2, 0xf4, 0xf0, 0x5c, 0x92, 0xb5, 0xb4, 0xff, 0x8b, 0xb1, 0x8d, 0x72, 0x60, - 0x9a, 0x5c, 0xb1, 0x4c, 0xcf, 0xd4, 0x1b, 0x13, 0x76, 0xb3, 0xa9, 0x5b, 0x86, 0x32, 0x10, 0x6a, - 0xb2, 0xc9, 0x31, 0xb5, 0x3a, 0x47, 0xc9, 0x9a, 0x1c, 0x2d, 0xc4, 0xb6, 0xe5, 0xa2, 0x0f, 0x35, - 0x5a, 0xb7, 0x1d, 0x66, 0x0b, 0xe0, 0xe1, 0xa0, 0xd8, 0x96, 0xbb, 0x1c, 0x57, 0x73, 0x7c, 0xa4, - 0x6c, 0x6c, 0xc7, 0x0b, 0xde, 0xc8, 0xf7, 0x0f, 0x8e, 0x0e, 0xc5, 0xcf, 0x73, 0xd5, 0xbf, 0x99, - 0x83, 0x41, 0x41, 0xca, 0x96, 0xd2, 0x23, 0x05, 0xdf, 0x8b, 0x82, 0xa7, 0x2a, 0x6a, 0x61, 0xbf, - 0x14, 0x55, 0xfd, 0x4c, 0x36, 0x98, 0x8d, 0x16, 0x1c, 0xd3, 0xda, 0xdb, 0x6c, 0x74, 0x01, 0x60, - 0x62, 0xb5, 0x6d, 0xdd, 0xe5, 0xf7, 0x56, 0xd9, 0xf0, 0xde, 0xaa, 0x6e, 0x6a, 0x12, 0x86, 0x9c, - 0x83, 0x7c, 0x99, 0xf1, 0x67, 0x3d, 0x33, 0x34, 0x3e, 0xf0, 0x36, 0xe7, 0x94, 0x79, 0x4a, 0x43, - 0x30, 0xdb, 0x5c, 0x8d, 0xaf, 0x7b, 0x94, 0x9b, 0xb3, 0x39, 0xbe, 0xb9, 0x5a, 0x62, 0x00, 0x8d, - 0xc3, 0xc9, 0x35, 0x18, 0x2b, 0xd3, 0x86, 0xbe, 0x3e, 0x6b, 0x36, 0x1a, 0xa6, 0x4b, 0xeb, 0xb6, - 0x65, 0xb8, 0x28, 0x64, 0x51, 0x5d, 0xd3, 0xd5, 0x92, 0x04, 0x44, 0x85, 0xc2, 0xfc, 0xf2, 0xb2, - 0x4b, 0x3d, 0x14, 0x5f, 0x6e, 0x1c, 0xd8, 0xe4, 0x6c, 0x23, 0x44, 0x13, 0x18, 0xf5, 0xe7, 0x32, - 0x6c, 0xf7, 0xe2, 0xde, 0xf5, 0xec, 0x56, 0xa0, 0xe5, 0x7b, 0x12, 0xc9, 0xa5, 0xd0, 0xae, 0xc8, - 0xe2, 0xd7, 0x1e, 0x13, 0x5f, 0xdb, 0x27, 0x6c, 0x8b, 0xd0, 0xa2, 0x48, 0xfd, 0xaa, 0xdc, 0x16, - 0x5f, 0xa5, 0xfe, 0x61, 0x16, 0x4e, 0x8b, 0x16, 0x4f, 0x34, 0xcc, 0xd6, 0x92, 0xad, 0x3b, 0x86, - 0x46, 0xeb, 0xd4, 0xbc, 0x47, 0x0f, 0xe7, 0xc0, 0x8b, 0x0e, 0x9d, 0xfc, 0x1e, 0x86, 0xce, 0x55, - 0xdc, 0x08, 0x32, 0xc9, 0xe0, 0x81, 0x2f, 0x37, 0x2a, 0x46, 0x37, 0x37, 0x8a, 0x43, 0x06, 0x07, - 0xe3, 0x91, 0xbf, 0x26, 0x13, 0x31, 0x25, 0x99, 0xa1, 0xd6, 0x8a, 0xb7, 0x8a, 0x4a, 0xd2, 0xcb, - 0x95, 0xa4, 0x81, 0x10, 0x4d, 0x60, 0xd4, 0xff, 0x9c, 0x85, 0x13, 0x71, 0x91, 0x57, 0xa9, 0x65, - 0x1c, 0xc9, 0xfb, 0x9d, 0x91, 0xf7, 0x37, 0x73, 0xf0, 0xb0, 0x28, 0x53, 0x5d, 0xd5, 0x1d, 0x6a, - 0x94, 0x4d, 0x87, 0xd6, 0x3d, 0xdb, 0x59, 0x3f, 0xc4, 0x06, 0xd4, 0xfe, 0x89, 0xfd, 0x1a, 0x14, - 0xc4, 0xf6, 0x9f, 0xaf, 0x33, 0x23, 0x41, 0x4b, 0x10, 0x9a, 0x58, 0xa1, 0xf8, 0xd1, 0x41, 0xac, - 0xb3, 0x0a, 0xdb, 0xe9, 0xac, 0x0f, 0xc0, 0x70, 0x20, 0x7a, 0xdc, 0x88, 0xf6, 0x85, 0xd6, 0x96, - 0xe1, 0x23, 0x70, 0x2f, 0xaa, 0x45, 0x09, 0xb1, 0x36, 0x1f, 0x50, 0x29, 0xa3, 0x35, 0x34, 0x2c, - 0x6a, 0x0b, 0xca, 0x99, 0x86, 0x26, 0x13, 0xa9, 0x1b, 0x79, 0x38, 0x93, 0xde, 0xed, 0x1a, 0xd5, - 0x8d, 0xa3, 0x5e, 0xff, 0x96, 0xec, 0x75, 0xf2, 0x28, 0xe4, 0x17, 0x74, 0x6f, 0x55, 0xdc, 0x83, - 0xe3, 0x9d, 0xf0, 0xb2, 0xd9, 0xa0, 0xb5, 0x96, 0xee, 0xad, 0x6a, 0x88, 0x92, 0xe6, 0x0c, 0x40, - 0x8e, 0x29, 0x73, 0x86, 0xb4, 0xd8, 0x0f, 0x3e, 0x92, 0xb9, 0x98, 0x4f, 0x5d, 0xec, 0xbf, 0x9e, - 0xef, 0x34, 0xaf, 0xdc, 0x71, 0x4c, 0x8f, 0x1e, 0x69, 0xd8, 0x91, 0x86, 0xed, 0x51, 0xc3, 0x7e, - 0x3b, 0x0b, 0xc3, 0xc1, 0xa6, 0xe9, 0x4d, 0x5a, 0x3f, 0x98, 0xb5, 0x2a, 0xdc, 0xca, 0xe4, 0xf6, - 0xbc, 0x95, 0xd9, 0x8b, 0x42, 0xa9, 0xc1, 0x91, 0x27, 0x37, 0x0d, 0x50, 0x62, 0xfc, 0xc8, 0x33, - 0x38, 0xe8, 0x7c, 0x14, 0xfa, 0x66, 0xf5, 0xfb, 0x66, 0xb3, 0xdd, 0x14, 0x56, 0x3a, 0xfa, 0x75, - 0x35, 0xf5, 0xfb, 0x9a, 0x0f, 0x57, 0xff, 0x65, 0x06, 0x46, 0x84, 0x50, 0x05, 0xf3, 0x3d, 0x49, - 0x35, 0x94, 0x4e, 0x76, 0xcf, 0xd2, 0xc9, 0xed, 0x5e, 0x3a, 0xea, 0x8f, 0xe4, 0x40, 0x99, 0x32, - 0x1b, 0x74, 0xd1, 0xd1, 0x2d, 0x77, 0x99, 0x3a, 0x62, 0x3b, 0x3d, 0xc9, 0x58, 0xed, 0xe9, 0x03, - 0xa5, 0x29, 0x25, 0xbb, 0xab, 0x29, 0xe5, 0x7d, 0x30, 0x20, 0x1a, 0x13, 0xf8, 0x14, 0xe2, 0xa8, - 0x71, 0x7c, 0xa0, 0x16, 0xe2, 0x19, 0x71, 0xa9, 0xd5, 0x72, 0xec, 0x7b, 0xd4, 0xe1, 0xb7, 0x54, - 0x82, 0x58, 0xf7, 0x81, 0x5a, 0x88, 0x97, 0x38, 0x53, 0xdf, 0x5e, 0x94, 0x39, 0x53, 0x47, 0x0b, - 0xf1, 0xe4, 0x22, 0xf4, 0xcf, 0xd8, 0x75, 0x1d, 0x05, 0xcd, 0xa7, 0x95, 0xa1, 0xcd, 0x8d, 0x62, - 0x7f, 0x43, 0xc0, 0xb4, 0x00, 0xcb, 0x28, 0xcb, 0xf6, 0x9a, 0xd5, 0xb0, 0x75, 0xee, 0xfc, 0xd2, - 0xcf, 0x29, 0x0d, 0x01, 0xd3, 0x02, 0x2c, 0xa3, 0x64, 0x32, 0x47, 0xa7, 0xa2, 0xfe, 0x90, 0xe7, - 0xb2, 0x80, 0x69, 0x01, 0x56, 0xfd, 0xb9, 0x3c, 0xd3, 0x5e, 0xd7, 0x7c, 0xeb, 0x81, 0x5f, 0x17, - 0xc2, 0x01, 0xd3, 0xbb, 0x8b, 0x01, 0xf3, 0xc0, 0x1c, 0xd8, 0xa9, 0x7f, 0xd4, 0x07, 0x20, 0xa4, - 0x3f, 0x79, 0xb4, 0x39, 0xdc, 0x9b, 0xd6, 0x94, 0x61, 0x6c, 0xd2, 0x5a, 0xd5, 0xad, 0x3a, 0x35, - 0xc2, 0x63, 0xcb, 0x02, 0x0e, 0x6d, 0xf4, 0xe9, 0xa5, 0x02, 0x19, 0x9e, 0x5b, 0x6a, 0xc9, 0x02, - 0xe4, 0x69, 0x18, 0xac, 0x58, 0x1e, 0x75, 0xf4, 0xba, 0x67, 0xde, 0xa3, 0x62, 0x6a, 0xc0, 0x9b, - 0x61, 0x33, 0x04, 0x6b, 0x32, 0x0d, 0xb9, 0x06, 0x43, 0x0b, 0xba, 0xe3, 0x99, 0x75, 0xb3, 0xa5, - 0x5b, 0x9e, 0xab, 0xf4, 0xe3, 0x8c, 0x86, 0x16, 0x46, 0x4b, 0x82, 0x6b, 0x11, 0x2a, 0xf2, 0x31, - 0x18, 0xc0, 0xad, 0x29, 0x3a, 0x4e, 0x0f, 0x6c, 0x79, 0x71, 0xf8, 0x58, 0xe8, 0x1e, 0xc8, 0x4f, - 0x5f, 0xf1, 0x06, 0x38, 0x7e, 0x77, 0x18, 0x70, 0x24, 0x1f, 0x82, 0xbe, 0x49, 0xcb, 0x40, 0xe6, - 0xb0, 0x25, 0x73, 0x55, 0x30, 0x3f, 0x15, 0x32, 0xb7, 0x5b, 0x31, 0xde, 0x3e, 0xbb, 0xf4, 0x51, - 0x36, 0xf8, 0xce, 0x8d, 0xb2, 0xa1, 0x77, 0xe0, 0x58, 0x7c, 0x78, 0xbf, 0x8e, 0xc5, 0x47, 0x76, - 0x79, 0x2c, 0xae, 0xbe, 0x05, 0x83, 0xe3, 0x0b, 0x53, 0xc1, 0xe8, 0x7d, 0x08, 0x72, 0x0b, 0xc2, - 0x53, 0x21, 0xcf, 0xed, 0x99, 0x96, 0x69, 0x68, 0x0c, 0x46, 0x2e, 0x41, 0xff, 0x04, 0xba, 0xbf, - 0x89, 0x5b, 0xc4, 0x3c, 0x5f, 0xff, 0xea, 0x08, 0x43, 0x2f, 0x58, 0x1f, 0x4d, 0x1e, 0x87, 0xbe, - 0x05, 0xc7, 0x5e, 0x71, 0xf4, 0xa6, 0x58, 0x83, 0xd1, 0x55, 0xa4, 0xc5, 0x41, 0x9a, 0x8f, 0x53, - 0xbf, 0x2f, 0xe3, 0x9b, 0xed, 0xac, 0x44, 0xb5, 0x8d, 0x47, 0xf3, 0x58, 0x77, 0x3f, 0x2f, 0xe1, - 0x72, 0x90, 0xe6, 0xe3, 0xc8, 0x25, 0xe8, 0x9d, 0x74, 0x1c, 0xdb, 0x91, 0x9d, 0xcd, 0x29, 0x03, - 0xc8, 0xd7, 0xbd, 0x48, 0x41, 0x9e, 0x87, 0x41, 0x3e, 0xe7, 0xf0, 0x13, 0xcd, 0x5c, 0xb7, 0x9b, - 0x52, 0x99, 0x52, 0xfd, 0x6a, 0x4e, 0xb2, 0xd9, 0xb8, 0xc4, 0x1f, 0xc0, 0x5b, 0x81, 0x67, 0x20, - 0x37, 0xbe, 0x30, 0x25, 0x26, 0xc0, 0xe3, 0x7e, 0x51, 0x49, 0x55, 0x62, 0xe5, 0x18, 0x35, 0x39, - 0x0b, 0xf9, 0x05, 0xa6, 0x3e, 0x05, 0x54, 0x8f, 0xfe, 0xcd, 0x8d, 0x62, 0xbe, 0xc5, 0xf4, 0x07, - 0xa1, 0x88, 0x65, 0x9b, 0x19, 0xbe, 0x63, 0xe2, 0xd8, 0x70, 0x1f, 0x73, 0x16, 0xf2, 0x25, 0x67, - 0xe5, 0x9e, 0x98, 0xb5, 0x10, 0xab, 0x3b, 0x2b, 0xf7, 0x34, 0x84, 0x92, 0x2b, 0x00, 0x1a, 0xf5, - 0xda, 0x8e, 0x85, 0xef, 0x40, 0x06, 0xf0, 0xfc, 0x0d, 0x67, 0x43, 0x07, 0xa1, 0xb5, 0xba, 0x6d, - 0x50, 0x4d, 0x22, 0x51, 0x7f, 0x32, 0xbc, 0xd8, 0x29, 0x9b, 0xee, 0xdd, 0xa3, 0x2e, 0xdc, 0x41, - 0x17, 0xea, 0xe2, 0x88, 0x33, 0xd9, 0x49, 0x45, 0xe8, 0x9d, 0x6a, 0xe8, 0x2b, 0x2e, 0xf6, 0xa1, - 0xf0, 0x25, 0x5b, 0x66, 0x00, 0x8d, 0xc3, 0x63, 0xfd, 0xd4, 0xbf, 0x75, 0x3f, 0x7d, 0xb1, 0x37, - 0x18, 0x6d, 0x73, 0xd4, 0x5b, 0xb3, 0x9d, 0xa3, 0xae, 0xda, 0x6e, 0x57, 0x5d, 0x80, 0xbe, 0xaa, - 0x53, 0x97, 0x8e, 0x2e, 0x70, 0x3f, 0xe0, 0x3a, 0x75, 0x7e, 0x6c, 0xe1, 0x23, 0x19, 0x5d, 0xd9, - 0xf5, 0x90, 0xae, 0x2f, 0xa4, 0x33, 0x5c, 0x4f, 0xd0, 0x09, 0xa4, 0xa0, 0x5b, 0xb0, 0x1d, 0x4f, - 0x74, 0x5c, 0x40, 0xd7, 0xb2, 0x1d, 0x4f, 0xf3, 0x91, 0xe4, 0x7d, 0x00, 0x8b, 0x13, 0x0b, 0xbe, - 0xb3, 0xfd, 0x40, 0xe8, 0x0b, 0x28, 0xbc, 0xec, 0x35, 0x09, 0x4d, 0x16, 0x61, 0x60, 0xbe, 0x45, - 0x1d, 0xbe, 0x15, 0xe2, 0x2f, 0x3b, 0xde, 0x1b, 0x13, 0xad, 0xe8, 0xf7, 0xcb, 0xe2, 0xff, 0x80, - 0x9c, 0xaf, 0x2f, 0xb6, 0xff, 0x53, 0x0b, 0x19, 0x91, 0xe7, 0xa1, 0x50, 0xe2, 0x76, 0xde, 0x20, - 0xb2, 0x0c, 0x44, 0x86, 0x5b, 0x50, 0x8e, 0xe2, 0x7b, 0x76, 0x1d, 0xff, 0xd6, 0x04, 0xb9, 0x7a, - 0x09, 0x46, 0xe3, 0xd5, 0x90, 0x41, 0xe8, 0x9b, 0x98, 0x9f, 0x9b, 0x9b, 0x9c, 0x58, 0x1c, 0xed, - 0x21, 0xfd, 0x90, 0xaf, 0x4e, 0xce, 0x95, 0x47, 0x33, 0xea, 0xcf, 0x48, 0x33, 0x08, 0x53, 0xad, - 0xa3, 0xab, 0xe1, 0x3d, 0xdd, 0xb7, 0x8c, 0xe2, 0x7d, 0x28, 0x9e, 0x18, 0x34, 0x4d, 0xcf, 0xa3, - 0x86, 0x58, 0x25, 0xf0, 0xbe, 0xd0, 0xbb, 0xaf, 0x25, 0xf0, 0xe4, 0x49, 0x18, 0x46, 0x98, 0xb8, - 0x22, 0xe4, 0xfb, 0x63, 0x51, 0xc0, 0xb9, 0xaf, 0x45, 0x91, 0xea, 0xd7, 0xc2, 0xdb, 0xe1, 0x19, - 0xaa, 0x1f, 0xd6, 0x1b, 0xc5, 0x77, 0x49, 0x7f, 0xa9, 0x7f, 0x9a, 0xe7, 0x4f, 0x40, 0xf8, 0xc3, - 0xbd, 0x83, 0x10, 0x65, 0x78, 0xa4, 0x9b, 0xdb, 0xc1, 0x91, 0xee, 0x93, 0x50, 0x98, 0xa5, 0xde, - 0xaa, 0xed, 0x3b, 0x7e, 0xa1, 0x87, 0x5e, 0x13, 0x21, 0xb2, 0x87, 0x1e, 0xa7, 0x21, 0x77, 0x81, - 0xf8, 0xaf, 0xf2, 0x02, 0x47, 0x6c, 0xff, 0x08, 0xf9, 0x74, 0x62, 0x9f, 0x52, 0xc5, 0x27, 0xb9, - 0xe8, 0x63, 0x7f, 0x22, 0x70, 0xf4, 0x96, 0x3c, 0xb1, 0xfe, 0x64, 0xa3, 0x58, 0xe0, 0x34, 0x5a, - 0x0a, 0x5b, 0xf2, 0x3a, 0x0c, 0xcc, 0x4e, 0x95, 0xc4, 0x0b, 0x3d, 0xee, 0x15, 0xf1, 0x50, 0x20, - 0x45, 0x1f, 0x11, 0x88, 0x04, 0xdf, 0xdb, 0x34, 0x97, 0xf5, 0xe4, 0x03, 0xbd, 0x90, 0x0b, 0xd3, - 0x16, 0xfe, 0x72, 0x47, 0x9c, 0x2e, 0x04, 0xda, 0x12, 0x7d, 0xcf, 0x13, 0x97, 0x15, 0xc7, 0xc6, - 0xb4, 0xa5, 0x7f, 0x0f, 0xa3, 0x7b, 0x1e, 0xc6, 0x4a, 0xad, 0x56, 0xc3, 0xa4, 0x06, 0xea, 0x8b, - 0xd6, 0x6e, 0x50, 0x57, 0xb8, 0xfc, 0xe0, 0x63, 0x10, 0x9d, 0x23, 0x6b, 0xf8, 0x2e, 0xb4, 0xe6, - 0xb4, 0xa3, 0xfe, 0x99, 0xc9, 0xb2, 0xea, 0x0f, 0x64, 0xe1, 0xd4, 0x84, 0x43, 0x75, 0x8f, 0xce, - 0x4e, 0x95, 0x4a, 0x6d, 0xf4, 0x91, 0x6b, 0x34, 0xa8, 0xb5, 0x72, 0x30, 0xc3, 0xfa, 0x25, 0x18, - 0x09, 0x1a, 0x50, 0xad, 0xdb, 0x2d, 0x2a, 0x3f, 0xac, 0xaa, 0xfb, 0x98, 0x9a, 0xcb, 0x50, 0x5a, - 0x8c, 0x94, 0xdc, 0x84, 0xe3, 0x01, 0xa4, 0xd4, 0x68, 0xd8, 0x6b, 0x1a, 0x6d, 0xbb, 0xdc, 0x31, - 0xb6, 0x9f, 0x3b, 0xc6, 0x86, 0x1c, 0x74, 0x86, 0xaf, 0x39, 0x8c, 0x40, 0x4b, 0x2b, 0xa5, 0x7e, - 0x29, 0x07, 0xa7, 0x6f, 0xeb, 0x0d, 0xd3, 0x08, 0x45, 0xa3, 0x51, 0xb7, 0x65, 0x5b, 0x2e, 0x3d, - 0x44, 0xa3, 0x34, 0x32, 0x14, 0xf2, 0xfb, 0x32, 0x14, 0x92, 0x5d, 0xd4, 0xbb, 0xe7, 0x2e, 0x2a, - 0xec, 0xaa, 0x8b, 0xfe, 0x53, 0x06, 0x46, 0x7d, 0xc7, 0x7f, 0xf9, 0x35, 0xb5, 0xe4, 0x95, 0x8e, - 0x47, 0x88, 0x31, 0x3f, 0x68, 0xc4, 0x93, 0x2a, 0xf4, 0x4d, 0xde, 0x6f, 0x99, 0x0e, 0x75, 0xb7, - 0xe1, 0xc4, 0x7d, 0x4e, 0x1c, 0x97, 0x8c, 0x51, 0x5e, 0x24, 0x71, 0x52, 0xc2, 0xc1, 0xf8, 0x9c, - 0x8f, 0x3f, 0x7d, 0x18, 0xf7, 0x9f, 0x88, 0xf3, 0xe7, 0x7c, 0xe2, 0x89, 0x44, 0xe4, 0x7d, 0x66, - 0x48, 0x4a, 0x1e, 0x83, 0xdc, 0xe2, 0xe2, 0x8c, 0x98, 0x49, 0xf1, 0x69, 0xbe, 0xe7, 0xc9, 0xef, - 0x15, 0x19, 0x56, 0xfd, 0xbd, 0x2c, 0x00, 0x53, 0x05, 0x3e, 0x5c, 0x0f, 0x44, 0x09, 0xc7, 0xa1, - 0xdf, 0x17, 0xb8, 0x50, 0xc3, 0xc0, 0x6b, 0x3f, 0xde, 0x11, 0xf1, 0xba, 0x83, 0x17, 0x1a, 0x45, - 0xdf, 0x91, 0x9c, 0xdf, 0x03, 0xe0, 0xce, 0x06, 0x1d, 0xc9, 0x7d, 0xf7, 0xf1, 0xf7, 0xc1, 0x80, - 0x98, 0xf1, 0xec, 0xc8, 0xf9, 0x7f, 0xdd, 0x07, 0x6a, 0x21, 0x3e, 0x36, 0xb5, 0x16, 0xf6, 0xb0, - 0x10, 0xfb, 0xe2, 0xe5, 0xbd, 0x72, 0x24, 0xde, 0x7d, 0x16, 0xef, 0xe7, 0x84, 0x78, 0xf9, 0x0b, - 0x9e, 0x43, 0x2b, 0xde, 0x7d, 0x3b, 0xfb, 0x56, 0x7f, 0x3b, 0x03, 0x84, 0x35, 0x6b, 0x41, 0x77, - 0xdd, 0x35, 0xdb, 0x31, 0xb8, 0x73, 0xfa, 0x81, 0x08, 0x66, 0xff, 0xee, 0x2b, 0xbf, 0xda, 0x0f, - 0xc7, 0x23, 0x8e, 0xbf, 0x87, 0x7c, 0xb2, 0xba, 0x14, 0x1d, 0x4d, 0xdd, 0x5e, 0xbd, 0xbc, 0x47, - 0xbe, 0x10, 0xed, 0x8d, 0x3c, 0x40, 0x93, 0x6e, 0x42, 0x9f, 0x82, 0x21, 0xf1, 0x83, 0xad, 0xd0, - 0xfe, 0x4d, 0x17, 0x8e, 0x52, 0x97, 0x01, 0xb4, 0x08, 0x9a, 0x3c, 0x0b, 0x03, 0x6c, 0xc0, 0xac, - 0x60, 0x14, 0x8f, 0xbe, 0xf0, 0x45, 0x89, 0xe1, 0x03, 0xe5, 0xf5, 0x24, 0xa0, 0x94, 0xde, 0x11, - 0xf5, 0x6f, 0xe3, 0x1d, 0xd1, 0xc7, 0x61, 0xb0, 0x64, 0x59, 0xb6, 0x87, 0x9b, 0x74, 0x57, 0x5c, - 0x4d, 0x74, 0xb4, 0xca, 0x1f, 0xc3, 0xc7, 0xf1, 0x21, 0x7d, 0xaa, 0x59, 0x2e, 0x33, 0x24, 0x57, - 0xfd, 0x57, 0x31, 0xd4, 0x11, 0x5e, 0xe5, 0x78, 0x3d, 0xe3, 0x08, 0x58, 0xf2, 0x51, 0x0c, 0x76, - 0xde, 0xf0, 0x82, 0x63, 0xb7, 0x6c, 0x97, 0x1a, 0x5c, 0x50, 0x83, 0x61, 0xa8, 0x81, 0x96, 0x40, - 0xe0, 0x3b, 0xb6, 0x48, 0x44, 0x8d, 0x48, 0x11, 0xb2, 0x0c, 0x27, 0xfc, 0x8b, 0xe2, 0xe0, 0xc5, - 0x60, 0xa5, 0xec, 0x2a, 0x43, 0xf8, 0x2a, 0x89, 0xc4, 0x95, 0xa1, 0x52, 0x1e, 0x3f, 0xef, 0x5f, - 0x8b, 0xf8, 0x4f, 0x0e, 0x6b, 0xa6, 0x21, 0x77, 0x75, 0x2a, 0x3f, 0xf2, 0x6d, 0x30, 0x38, 0xab, - 0xdf, 0x2f, 0xb7, 0xc5, 0xd9, 0xcb, 0xf0, 0xf6, 0x6f, 0x5f, 0x9a, 0xfa, 0xfd, 0x9a, 0x21, 0xca, - 0xc5, 0x6c, 0x0a, 0x99, 0x25, 0xa9, 0xc1, 0xa9, 0x05, 0xc7, 0x6e, 0xda, 0x1e, 0x35, 0x62, 0x8f, - 0xef, 0x8e, 0x85, 0xaf, 0x75, 0x5b, 0x82, 0xa2, 0xd6, 0xe5, 0x15, 0x5e, 0x07, 0x36, 0xa4, 0x09, - 0xc7, 0x4a, 0xae, 0xdb, 0x6e, 0xd2, 0xf0, 0x86, 0x6a, 0x74, 0xcb, 0xcf, 0x78, 0xaf, 0xf0, 0x5a, - 0x7e, 0x58, 0xc7, 0xa2, 0xfc, 0x82, 0xaa, 0xe6, 0x99, 0x72, 0x8d, 0xf8, 0x2d, 0x71, 0xde, 0x37, - 0xf2, 0xfd, 0x23, 0xa3, 0xc7, 0xb4, 0xd3, 0xc9, 0xc6, 0x2c, 0x9a, 0x5e, 0x83, 0xaa, 0x5f, 0xc9, - 0x00, 0x84, 0x02, 0x26, 0x4f, 0x45, 0x43, 0x05, 0x65, 0xc2, 0x8b, 0x0e, 0x11, 0xbd, 0x20, 0x12, - 0x1b, 0x88, 0x9c, 0x85, 0x3c, 0x46, 0xb8, 0xc8, 0x86, 0x07, 0xab, 0x77, 0x4d, 0xcb, 0xd0, 0x10, - 0xca, 0xb0, 0xd2, 0x53, 0x74, 0xc4, 0xe2, 0xa5, 0x3e, 0xb7, 0x0a, 0xcb, 0x70, 0xac, 0xda, 0x5e, - 0xf2, 0xeb, 0x96, 0xde, 0xd5, 0x61, 0xa0, 0x0d, 0xb7, 0xbd, 0x14, 0x3c, 0x46, 0x8d, 0x84, 0x31, - 0x89, 0x16, 0x51, 0x7f, 0x2e, 0x13, 0x9b, 0x05, 0x0f, 0x70, 0xd1, 0x7b, 0x4f, 0xd2, 0x4f, 0x23, - 0x39, 0x2d, 0xa9, 0x3f, 0x9a, 0x85, 0xc1, 0x05, 0xdb, 0xf1, 0x44, 0xc8, 0x90, 0xc3, 0xbd, 0x0a, - 0x49, 0x7b, 0xa5, 0xfc, 0x0e, 0xf6, 0x4a, 0x67, 0x21, 0x2f, 0xb9, 0x28, 0xf3, 0x7b, 0x11, 0xc3, - 0x70, 0x34, 0x84, 0xaa, 0xdf, 0x9e, 0x05, 0xf8, 0xd0, 0xd3, 0x4f, 0x3f, 0xc0, 0x02, 0x52, 0x7f, - 0x38, 0x03, 0xc7, 0xc4, 0x45, 0x9d, 0x14, 0x74, 0xab, 0xcf, 0xbf, 0x62, 0x95, 0xc7, 0x25, 0x07, - 0x69, 0x3e, 0x8e, 0x2d, 0x01, 0x93, 0xf7, 0x4d, 0x0f, 0xef, 0x2a, 0xa4, 0xa8, 0x5b, 0x54, 0xc0, - 0xe4, 0x25, 0xc0, 0xa7, 0x23, 0x4f, 0xf9, 0x57, 0x90, 0xb9, 0x70, 0xdd, 0x63, 0x05, 0x26, 0x53, - 0xaf, 0x21, 0xd5, 0x5f, 0xcc, 0x43, 0x7e, 0xf2, 0x3e, 0xad, 0x1f, 0xf2, 0xae, 0x91, 0x0e, 0x36, - 0xf3, 0x7b, 0x3c, 0xd8, 0xdc, 0x8d, 0x4f, 0xc5, 0xab, 0x61, 0x7f, 0x16, 0xa2, 0xd5, 0xc7, 0x7a, - 0x3e, 0x5e, 0xbd, 0xdf, 0xd3, 0x87, 0xcf, 0x25, 0xe7, 0x1f, 0xe7, 0x20, 0x57, 0x9d, 0x58, 0x38, - 0xd2, 0x9b, 0x03, 0xd5, 0x9b, 0xee, 0x77, 0xd6, 0x6a, 0x70, 0x0d, 0xd5, 0x1f, 0x7a, 0x89, 0xc6, - 0x6e, 0x9c, 0xbe, 0x99, 0x83, 0x91, 0xea, 0xd4, 0xe2, 0x82, 0x74, 0x12, 0x7c, 0x93, 0x7b, 0xf2, - 0xa1, 0x4f, 0x19, 0xef, 0xd2, 0xb3, 0x09, 0x7b, 0xe6, 0x56, 0xc5, 0xf2, 0x9e, 0xbb, 0x76, 0x5b, - 0x6f, 0xb4, 0x29, 0x1e, 0xbd, 0x70, 0xbf, 0x5f, 0xd7, 0x7c, 0x8b, 0x7e, 0x09, 0x1f, 0xfe, 0xfb, - 0x0c, 0xc8, 0x4b, 0x90, 0xbb, 0x25, 0x3c, 0x32, 0x3a, 0xf1, 0x79, 0xe6, 0x2a, 0xe7, 0xc3, 0x26, - 0xc1, 0x5c, 0xdb, 0x34, 0x90, 0x03, 0x2b, 0xc5, 0x0a, 0x5f, 0x17, 0x0b, 0xf0, 0xb6, 0x0a, 0xaf, - 0xf8, 0x85, 0xaf, 0x57, 0xca, 0xa4, 0x0a, 0x83, 0x0b, 0xd4, 0x69, 0x9a, 0xd8, 0x51, 0xfe, 0x9c, - 0xdd, 0x9d, 0x09, 0xdb, 0xa9, 0x0c, 0xb6, 0xc2, 0x42, 0xc8, 0x4c, 0xe6, 0x42, 0xde, 0x00, 0xe0, - 0x36, 0xca, 0x36, 0x03, 0x39, 0x9e, 0x43, 0xbb, 0x9f, 0x9b, 0x96, 0x29, 0x36, 0x9e, 0xc4, 0x8c, - 0xdc, 0x85, 0xd1, 0x59, 0xdb, 0x30, 0x97, 0x4d, 0xee, 0x7a, 0x89, 0x15, 0x14, 0xb6, 0x76, 0x78, - 0x62, 0xa6, 0x64, 0x53, 0x2a, 0x97, 0x56, 0x4d, 0x82, 0xb1, 0xfa, 0x0f, 0x7a, 0x21, 0xcf, 0xba, - 0xfd, 0x68, 0xfc, 0xee, 0x65, 0xfc, 0x96, 0x60, 0xf4, 0x8e, 0xed, 0xdc, 0x35, 0xad, 0x95, 0xc0, - 0x2b, 0x5e, 0xec, 0x4d, 0xd1, 0x93, 0x67, 0x8d, 0xe3, 0x6a, 0x81, 0x03, 0xbd, 0x96, 0x20, 0xdf, - 0x62, 0x04, 0xbf, 0x00, 0xc0, 0xdf, 0xba, 0x23, 0x4d, 0x7f, 0x18, 0xac, 0x82, 0xbf, 0x84, 0x47, - 0x47, 0x7b, 0x39, 0x58, 0x45, 0x48, 0xcc, 0x36, 0xe1, 0xdc, 0x17, 0x62, 0x00, 0xfd, 0xee, 0x71, - 0x13, 0x8e, 0xbe, 0x10, 0xb2, 0x11, 0xc0, 0xbd, 0x22, 0x16, 0x00, 0xa4, 0xfb, 0x25, 0x88, 0x09, - 0x22, 0x32, 0x39, 0x88, 0xf0, 0x70, 0x29, 0xd7, 0x4b, 0x9a, 0xc4, 0x83, 0x3c, 0x17, 0xbb, 0x00, - 0x27, 0x11, 0x6e, 0x1d, 0xef, 0xbf, 0x43, 0x07, 0xaa, 0xa1, 0xad, 0x1c, 0xa8, 0xd4, 0xcf, 0x64, - 0x61, 0xa0, 0xda, 0x5e, 0x72, 0xd7, 0x5d, 0x8f, 0x36, 0x0f, 0xb9, 0x1a, 0xfb, 0xdb, 0xab, 0x7c, - 0xea, 0xf6, 0xea, 0x31, 0x5f, 0x28, 0xd2, 0xb9, 0x63, 0x60, 0xd2, 0xf9, 0xe2, 0xf8, 0x3b, 0x59, - 0x18, 0xe5, 0x17, 0x67, 0x65, 0xd3, 0xad, 0xef, 0x83, 0x33, 0xff, 0xc1, 0x4b, 0x65, 0x6f, 0x97, - 0xcd, 0xdb, 0x78, 0x22, 0xa1, 0x7e, 0x32, 0x0b, 0x83, 0xa5, 0xb6, 0xb7, 0x5a, 0xf2, 0x50, 0xb7, - 0x1e, 0xc8, 0xfd, 0xc9, 0xaf, 0x67, 0xe0, 0x18, 0x6b, 0xc8, 0xa2, 0x7d, 0x97, 0x5a, 0xfb, 0x70, - 0xf0, 0x28, 0x1f, 0x20, 0x66, 0x77, 0x79, 0x80, 0xe8, 0xcb, 0x32, 0xb7, 0x33, 0x59, 0xe2, 0x71, - 0xb9, 0x66, 0x37, 0xe8, 0xe1, 0xfe, 0x8c, 0x7d, 0x3c, 0x2e, 0xf7, 0x05, 0xb2, 0x0f, 0xd7, 0x33, - 0xdf, 0x5a, 0x02, 0xd9, 0x87, 0xb3, 0xa5, 0x6f, 0x0d, 0x81, 0x7c, 0x35, 0x03, 0x03, 0xe3, 0xb6, - 0x77, 0xc8, 0x07, 0xbe, 0xf8, 0x8a, 0xc3, 0xad, 0xe6, 0xfe, 0x57, 0x1c, 0x6e, 0xdd, 0x54, 0x7f, - 0x30, 0x0b, 0x27, 0x44, 0x90, 0x6e, 0x71, 0xfe, 0x70, 0x34, 0x1d, 0x8b, 0xc1, 0x96, 0x14, 0xcd, - 0xd1, 0x3c, 0x24, 0x44, 0xf3, 0x53, 0x39, 0x38, 0x81, 0xa1, 0x4c, 0xd9, 0xb6, 0xec, 0x5b, 0xc0, - 0x16, 0x21, 0xf5, 0xe8, 0x25, 0xe8, 0x6c, 0xca, 0x25, 0xe8, 0x9f, 0x6c, 0x14, 0x9f, 0x5b, 0x31, - 0xbd, 0xd5, 0xf6, 0xd2, 0xe5, 0xba, 0xdd, 0xbc, 0xb2, 0xe2, 0xe8, 0xf7, 0x4c, 0x7e, 0xfd, 0xa7, - 0x37, 0xae, 0x04, 0xf9, 0x2e, 0xf4, 0x96, 0x29, 0x32, 0x61, 0x54, 0x71, 0xaf, 0xc3, 0xb8, 0xfa, - 0xd7, 0xa7, 0x2e, 0xc0, 0x0d, 0xdb, 0xb4, 0x84, 0x4f, 0x21, 0x37, 0x74, 0xab, 0x6c, 0x7f, 0xf8, - 0xa6, 0x6d, 0x5a, 0xb5, 0xb8, 0x63, 0xe1, 0x4e, 0xeb, 0x0b, 0x59, 0x6b, 0x52, 0x35, 0xea, 0xbf, - 0xc8, 0xc0, 0x43, 0x51, 0x2d, 0xfe, 0x56, 0xb0, 0x1d, 0x7f, 0x28, 0x0b, 0x27, 0xaf, 0xa3, 0x70, - 0x02, 0x47, 0x8e, 0xa3, 0x79, 0x4b, 0x0c, 0xce, 0x14, 0xd9, 0x1c, 0x59, 0x94, 0x9d, 0x65, 0x73, - 0x34, 0xa9, 0x0b, 0xd9, 0xfc, 0x46, 0x06, 0x8e, 0xcf, 0x57, 0xca, 0x13, 0xdf, 0x22, 0x23, 0x2a, - 0xf9, 0x3d, 0x87, 0xdc, 0xe0, 0x4c, 0x7c, 0xcf, 0x21, 0x37, 0x3d, 0xbf, 0x90, 0x85, 0xe3, 0xd5, - 0xd2, 0xec, 0xcc, 0xb7, 0xca, 0x0c, 0x3e, 0x21, 0x7b, 0x1d, 0xfa, 0x87, 0x60, 0xc2, 0x16, 0x90, - 0x3f, 0xf3, 0xf6, 0xd5, 0xce, 0xde, 0x88, 0x49, 0xa1, 0x1c, 0xf2, 0xa9, 0x7b, 0x5f, 0x84, 0xc2, - 0x34, 0x3f, 0x42, 0x7d, 0xc8, 0x35, 0xff, 0x1f, 0x15, 0x60, 0xf0, 0x66, 0x7b, 0x89, 0x0a, 0xe7, - 0x94, 0x07, 0xfa, 0xe4, 0xf7, 0x2a, 0x0c, 0x0a, 0x31, 0xe0, 0xad, 0x89, 0x14, 0x3c, 0x4f, 0x04, - 0x43, 0xe1, 0xf1, 0x89, 0x64, 0x22, 0x72, 0x16, 0xf2, 0xb7, 0xa9, 0xb3, 0x24, 0xbf, 0x2b, 0xbd, - 0x47, 0x9d, 0x25, 0x0d, 0xa1, 0x64, 0x26, 0x74, 0x99, 0x2f, 0x2d, 0x54, 0x30, 0x91, 0x8a, 0xb8, - 0xb0, 0xc1, 0xcc, 0x30, 0x81, 0xdf, 0x9b, 0xde, 0x32, 0x79, 0x0a, 0x16, 0xf9, 0x4d, 0x7b, 0xbc, - 0x24, 0x99, 0x83, 0x31, 0xd9, 0xf1, 0x89, 0x67, 0x11, 0xe9, 0x4f, 0x61, 0x97, 0x96, 0x3f, 0x24, - 0x59, 0x94, 0xbc, 0x0a, 0x43, 0x3e, 0x10, 0x5d, 0xb8, 0x06, 0xc2, 0xd0, 0xf5, 0x01, 0xab, 0x58, - 0x8a, 0xa2, 0x48, 0x01, 0x99, 0x01, 0x5e, 0x43, 0x40, 0x0a, 0x83, 0x98, 0x4b, 0x5c, 0xa4, 0x00, - 0x79, 0x16, 0x19, 0xe0, 0x33, 0x0f, 0x74, 0x56, 0x19, 0xc4, 0x47, 0x97, 0xe8, 0x92, 0xef, 0x08, - 0x38, 0x7f, 0x5a, 0x1b, 0x21, 0x23, 0xf3, 0x00, 0xa1, 0x53, 0x81, 0x08, 0x60, 0xb0, 0x63, 0x77, - 0x07, 0x89, 0x85, 0x7c, 0x1d, 0x38, 0xbc, 0x9b, 0xeb, 0x40, 0xf5, 0xb7, 0xb2, 0x30, 0x58, 0x6a, - 0xb5, 0x82, 0xa1, 0xf0, 0x14, 0x14, 0x4a, 0xad, 0xd6, 0x2d, 0xad, 0x22, 0x87, 0x32, 0xd7, 0x5b, - 0xad, 0x5a, 0xdb, 0x31, 0x65, 0x9f, 0x50, 0x4e, 0x44, 0x26, 0x60, 0xb8, 0xd4, 0x6a, 0x2d, 0xb4, - 0x97, 0x1a, 0x66, 0x5d, 0xca, 0x8c, 0xc4, 0x93, 0xb8, 0xb5, 0x5a, 0xb5, 0x16, 0x62, 0xe2, 0xe9, - 0xb1, 0xa2, 0x65, 0xc8, 0xc7, 0x31, 0xec, 0x8f, 0x48, 0xcc, 0xc3, 0x53, 0x7f, 0xa8, 0x41, 0x10, - 0xf3, 0xb0, 0x6d, 0x97, 0x03, 0x22, 0x1e, 0xec, 0xfd, 0xac, 0x1f, 0x32, 0x9f, 0x55, 0x94, 0x48, - 0xc0, 0x13, 0xb2, 0x24, 0xef, 0x87, 0xbe, 0x52, 0xab, 0x25, 0xdd, 0x37, 0xa1, 0x53, 0x11, 0x2b, - 0x15, 0xeb, 0x63, 0x9f, 0xec, 0xcc, 0xcb, 0x30, 0x12, 0xad, 0x6c, 0x47, 0xc1, 0xe2, 0xff, 0x38, - 0x83, 0x1f, 0x74, 0xc8, 0x7d, 0x9a, 0x9f, 0x81, 0x5c, 0xa9, 0xd5, 0x12, 0xf3, 0xd1, 0xf1, 0x94, - 0xfe, 0x88, 0x3f, 0x81, 0x2e, 0xb5, 0x5a, 0xfe, 0xa7, 0x1f, 0xf2, 0xc7, 0x11, 0xbb, 0xfa, 0xf4, - 0xaf, 0xf2, 0x4f, 0x3f, 0xdc, 0x0f, 0x17, 0xd4, 0x5f, 0xcc, 0xc1, 0xb1, 0x52, 0xab, 0x75, 0x14, - 0x64, 0x7e, 0xbf, 0x1e, 0x5a, 0x3f, 0x0d, 0x20, 0x4d, 0x8f, 0x7d, 0xc1, 0xd3, 0xad, 0x41, 0x69, - 0x6a, 0x54, 0x32, 0x9a, 0x44, 0xe4, 0xab, 0x5f, 0xff, 0x8e, 0xd4, 0xef, 0x93, 0x39, 0x9c, 0x8a, - 0x0f, 0x7b, 0xd0, 0xa8, 0x77, 0x4b, 0xb7, 0x89, 0x3e, 0x28, 0xec, 0xa8, 0x0f, 0x7e, 0x2d, 0x32, - 0x78, 0x30, 0x68, 0xf9, 0x51, 0x2f, 0xf4, 0xee, 0xc9, 0x2c, 0x1e, 0x91, 0x85, 0x29, 0x22, 0xd9, - 0xf8, 0x89, 0x94, 0x44, 0x5c, 0xa5, 0x3a, 0x43, 0xd5, 0x4c, 0x43, 0x8b, 0xd1, 0xfa, 0x7d, 0xd8, - 0xb7, 0xa3, 0x3e, 0xdc, 0xc8, 0xe2, 0xdb, 0xe9, 0x20, 0x2e, 0xd3, 0xde, 0x77, 0x17, 0x57, 0x00, - 0xb8, 0xe7, 0x41, 0xe0, 0xd6, 0x3c, 0xcc, 0x43, 0xb0, 0xf0, 0xfc, 0x4a, 0x22, 0x04, 0x4b, 0x48, - 0x12, 0x78, 0x48, 0xe5, 0x52, 0x3d, 0xa4, 0x2e, 0x41, 0xbf, 0xa6, 0xaf, 0xbd, 0xde, 0xa6, 0xce, - 0xba, 0x30, 0x67, 0x78, 0xd8, 0x43, 0x7d, 0xad, 0xf6, 0x09, 0x06, 0xd4, 0x02, 0x34, 0x51, 0x83, - 0xc7, 0xf7, 0x92, 0x47, 0x08, 0x3f, 0x23, 0x0f, 0x9e, 0xdc, 0xef, 0x46, 0xd1, 0xc9, 0x8b, 0x90, - 0x2b, 0xdd, 0xa9, 0x0a, 0xc9, 0x06, 0x5d, 0x5b, 0xba, 0x53, 0x15, 0xf2, 0xea, 0x58, 0xf6, 0x4e, - 0x55, 0xfd, 0x64, 0x16, 0x48, 0x92, 0x92, 0x3c, 0x07, 0x03, 0x08, 0x5d, 0x61, 0x3a, 0x23, 0x27, - 0xe6, 0x5c, 0x73, 0x6b, 0x0e, 0x42, 0x23, 0xc6, 0x9d, 0x4f, 0x4a, 0x5e, 0xc0, 0x1c, 0xc4, 0x22, - 0x35, 0x5c, 0x24, 0x31, 0xe7, 0x9a, 0xeb, 0x67, 0xed, 0x8d, 0xa5, 0x20, 0x16, 0xc4, 0x68, 0x17, - 0xde, 0xa9, 0x4e, 0xdb, 0xae, 0x27, 0x44, 0xcd, 0xed, 0xc2, 0x35, 0x17, 0x33, 0xc2, 0x46, 0xec, - 0x42, 0x4e, 0x86, 0x59, 0xad, 0xee, 0x54, 0xf9, 0x33, 0x15, 0x43, 0xb3, 0x1b, 0xbe, 0x41, 0xc9, - 0xb3, 0x5a, 0xad, 0xb9, 0x35, 0xfe, 0xc4, 0xc5, 0xc0, 0xe4, 0xc7, 0x91, 0xac, 0x56, 0x91, 0x52, - 0xea, 0x67, 0xfb, 0x61, 0xb4, 0xac, 0x7b, 0xfa, 0x92, 0xee, 0x52, 0x69, 0x37, 0x7d, 0xcc, 0x87, - 0xf9, 0x9f, 0x23, 0xc9, 0xc1, 0x58, 0x4a, 0xf9, 0x9a, 0x78, 0x01, 0xf2, 0x52, 0xc8, 0x37, 0xc8, - 0x39, 0x2a, 0x27, 0x31, 0x5b, 0xaa, 0xb5, 0x04, 0x58, 0x4b, 0x10, 0x92, 0x27, 0x61, 0xd0, 0x87, - 0xb1, 0x0d, 0x40, 0x2e, 0xd4, 0x19, 0x63, 0x89, 0xd9, 0xff, 0x9a, 0x8c, 0x26, 0x2f, 0xc0, 0x90, - 0xff, 0x53, 0x32, 0xad, 0x79, 0x46, 0xb6, 0xa5, 0xc4, 0xee, 0x49, 0x26, 0x95, 0x8b, 0xe2, 0xfc, - 0xd6, 0x1b, 0x29, 0x1a, 0x4b, 0x7a, 0x16, 0x21, 0x25, 0x9f, 0x80, 0x11, 0xff, 0xb7, 0xd8, 0x30, - 0xf0, 0xfc, 0x70, 0x4f, 0x06, 0xb9, 0x95, 0x63, 0x62, 0xbd, 0x1c, 0x25, 0xe7, 0x5b, 0x87, 0x87, - 0xfd, 0x3c, 0x5e, 0xc6, 0x52, 0x72, 0xe7, 0x10, 0xab, 0x80, 0x54, 0x60, 0xcc, 0x87, 0x84, 0x1a, - 0xda, 0x17, 0xee, 0x18, 0x8d, 0xa5, 0x5a, 0xaa, 0x92, 0x26, 0x4b, 0x91, 0x06, 0x9c, 0x8d, 0x00, - 0x0d, 0x77, 0xd5, 0x5c, 0xf6, 0xc4, 0x76, 0x4f, 0xc4, 0x20, 0x16, 0x89, 0x1b, 0x03, 0xae, 0x9c, - 0xc6, 0xcf, 0xc0, 0x1a, 0xcd, 0x0e, 0xd5, 0x95, 0x1b, 0xa9, 0xc2, 0x09, 0x1f, 0x7f, 0x7d, 0x62, - 0x61, 0xc1, 0xb1, 0xdf, 0xa4, 0x75, 0xaf, 0x52, 0x16, 0xdb, 0x65, 0x8c, 0x4d, 0x67, 0x2c, 0xd5, - 0x56, 0xea, 0x2d, 0xa6, 0x14, 0x0c, 0x17, 0x65, 0x9e, 0x5a, 0x98, 0xdc, 0x86, 0x93, 0x12, 0xbc, - 0x62, 0xb9, 0x9e, 0x6e, 0xd5, 0x69, 0xa5, 0x2c, 0xf6, 0xd0, 0xb8, 0x9f, 0x17, 0x5c, 0x4d, 0x81, - 0x8c, 0xb2, 0x4d, 0x2f, 0x4e, 0x5e, 0x86, 0x61, 0x1f, 0xc1, 0x6f, 0x11, 0x07, 0xf1, 0x16, 0x11, - 0x87, 0xa4, 0xb1, 0x54, 0x8b, 0xbf, 0xa6, 0x8c, 0x12, 0xcb, 0x1a, 0x85, 0xa9, 0xed, 0x87, 0x22, - 0x1a, 0xe5, 0xad, 0xb7, 0x52, 0x95, 0x11, 0xd3, 0xdd, 0xbf, 0x1a, 0x6a, 0xd4, 0xbc, 0x63, 0xae, - 0x98, 0x7c, 0x27, 0xed, 0x3f, 0xa0, 0x5c, 0xaa, 0xd9, 0x08, 0x4c, 0xd3, 0x0f, 0x4e, 0x7e, 0xa6, - 0x04, 0xc7, 0x53, 0x74, 0x6c, 0x47, 0x3b, 0xc6, 0xcf, 0x64, 0xc3, 0x46, 0x1c, 0xf2, 0x6d, 0xe3, - 0x38, 0xf4, 0xfb, 0x5f, 0x22, 0x8c, 0x07, 0xa5, 0xd3, 0xd0, 0x8c, 0xf3, 0xf0, 0xf1, 0x11, 0x71, - 0x1c, 0xf2, 0xad, 0xe4, 0x7e, 0x88, 0xe3, 0xed, 0x4c, 0x28, 0x8e, 0x43, 0xbe, 0xbd, 0xfc, 0x8d, - 0x5c, 0x38, 0x27, 0x1d, 0xed, 0x31, 0xf7, 0xcb, 0x4c, 0x0e, 0xfd, 0x60, 0x0b, 0x3b, 0x78, 0xc8, - 0x28, 0xab, 0x66, 0xdf, 0x2e, 0x55, 0xf3, 0x77, 0x92, 0xfd, 0xc9, 0x4d, 0xcf, 0x43, 0xd9, 0x9f, - 0xfb, 0x30, 0x58, 0xc9, 0xd5, 0x70, 0x1d, 0xe3, 0x36, 0x7a, 0xaf, 0x14, 0xe2, 0x6f, 0x49, 0x98, - 0xe8, 0x51, 0x12, 0xf2, 0x11, 0x38, 0x1d, 0x01, 0x2c, 0xe8, 0x8e, 0xde, 0xa4, 0x5e, 0x98, 0x71, - 0x10, 0x83, 0x36, 0xf9, 0xa5, 0x6b, 0xad, 0x00, 0x2d, 0x67, 0x31, 0xec, 0xc0, 0x41, 0x52, 0x8e, - 0xbe, 0x1d, 0x38, 0x49, 0x7f, 0x31, 0x17, 0x9a, 0x2a, 0xd1, 0xe0, 0xab, 0x1a, 0x75, 0xdb, 0x0d, - 0xef, 0xc1, 0xed, 0xe0, 0xdd, 0xa5, 0xb6, 0x98, 0x86, 0x63, 0xa5, 0xe5, 0x65, 0x5a, 0xf7, 0xfc, - 0x98, 0xd2, 0xae, 0x08, 0xb7, 0xc7, 0xb7, 0x0e, 0x02, 0x25, 0x62, 0x04, 0x47, 0x72, 0xe3, 0xc7, - 0x8a, 0xa9, 0xbf, 0x9b, 0x07, 0x25, 0x30, 0xdd, 0x83, 0x87, 0x5a, 0x07, 0xb8, 0x4c, 0xbe, 0x2b, - 0x7a, 0xc5, 0x84, 0xb1, 0x50, 0x18, 0xd5, 0x76, 0xb3, 0xa9, 0xe3, 0xd0, 0x63, 0x5b, 0x83, 0x62, - 0x9c, 0x59, 0x48, 0xc8, 0x77, 0x03, 0x67, 0xc4, 0x6e, 0x80, 0x84, 0x0f, 0xe1, 0x6a, 0x2e, 0x67, - 0xa1, 0x25, 0xb9, 0x92, 0xcf, 0x65, 0xe0, 0x84, 0xdf, 0x29, 0xf3, 0x4b, 0xcc, 0x2c, 0x9e, 0xb0, - 0xdb, 0x96, 0xe7, 0xef, 0x44, 0x5e, 0xec, 0x5c, 0x1d, 0xef, 0xa4, 0xcb, 0x69, 0x85, 0x79, 0x4b, - 0x82, 0xc0, 0x12, 0x81, 0x42, 0xd8, 0x48, 0x53, 0xab, 0x23, 0x91, 0x96, 0x5a, 0xef, 0x99, 0xeb, - 0xf0, 0x50, 0x47, 0x96, 0x5b, 0x99, 0xa1, 0xbd, 0xb2, 0x19, 0xfa, 0xaf, 0x32, 0xe1, 0x44, 0x14, - 0x13, 0x12, 0xb9, 0x0c, 0x10, 0x82, 0xc4, 0xc6, 0x74, 0x64, 0x73, 0xa3, 0x08, 0xa1, 0xd0, 0x34, - 0x89, 0x82, 0xcc, 0x43, 0x41, 0x88, 0x85, 0x67, 0xf7, 0x7d, 0xdf, 0x16, 0xbd, 0x70, 0x59, 0x96, - 0x03, 0x6e, 0x3a, 0xc5, 0x37, 0x0b, 0x36, 0x67, 0x5e, 0x80, 0xc1, 0xdd, 0x7e, 0xd7, 0xe7, 0x72, - 0x40, 0xe4, 0x5d, 0xe4, 0x01, 0x9a, 0xd8, 0x87, 0x78, 0x0a, 0xbb, 0x08, 0xfd, 0xec, 0x13, 0x30, - 0xdf, 0x85, 0x14, 0xdf, 0xb6, 0x2d, 0x60, 0x5a, 0x80, 0x0d, 0x83, 0x4b, 0xf5, 0xa5, 0x07, 0x97, - 0x52, 0xbf, 0x3f, 0x07, 0xa7, 0xe4, 0x0e, 0x29, 0x53, 0x0c, 0x99, 0x7f, 0xd4, 0x29, 0xef, 0x60, - 0xa7, 0xa8, 0x50, 0xe0, 0x9b, 0x07, 0x91, 0xbb, 0x80, 0x1f, 0xec, 0x20, 0x44, 0x13, 0x18, 0xf5, - 0xdf, 0x67, 0x61, 0x78, 0xc1, 0x76, 0xbd, 0x15, 0x87, 0xba, 0x0b, 0xba, 0xe3, 0x3e, 0xc0, 0xdd, - 0xf1, 0x01, 0x18, 0xc6, 0xf0, 0x40, 0x4d, 0x6a, 0xf1, 0x10, 0x3a, 0xbd, 0x52, 0xb2, 0x11, 0x1f, - 0x21, 0xf2, 0x4a, 0x45, 0x08, 0x99, 0xf6, 0x73, 0xcb, 0x4f, 0x0a, 0xda, 0xc4, 0xcd, 0x3e, 0x0e, - 0x57, 0x7f, 0x3c, 0x07, 0x43, 0xbe, 0x94, 0xc7, 0xcd, 0xc3, 0x7a, 0x53, 0x73, 0xb0, 0x42, 0xbe, - 0x02, 0xb0, 0x60, 0x3b, 0x9e, 0xde, 0x98, 0x0b, 0x35, 0x1f, 0x8f, 0x38, 0x5b, 0x08, 0xe5, 0x65, - 0x24, 0x12, 0x5c, 0xbf, 0x42, 0xb3, 0x9a, 0x4f, 0x4c, 0x7c, 0xfd, 0x0a, 0xa0, 0x9a, 0x44, 0xa1, - 0xfe, 0x4a, 0x16, 0x8e, 0xf9, 0x9d, 0x34, 0x79, 0x9f, 0xd6, 0xdb, 0x0f, 0xf2, 0xdc, 0x14, 0x95, - 0x76, 0xef, 0x96, 0xd2, 0x56, 0xff, 0xbb, 0x34, 0x91, 0x4c, 0x34, 0xec, 0xa3, 0x89, 0xe4, 0xcf, - 0x42, 0xc7, 0xd5, 0xef, 0xcc, 0xc1, 0x09, 0x5f, 0xea, 0x53, 0x6d, 0x0b, 0x0f, 0x07, 0x26, 0xf4, - 0x46, 0xe3, 0x41, 0xde, 0x8d, 0x0f, 0xfa, 0x82, 0x98, 0x17, 0xf1, 0xf6, 0x44, 0x8e, 0xbf, 0x65, - 0x01, 0xae, 0xd9, 0xa6, 0xa1, 0xc9, 0x44, 0xe4, 0x55, 0x18, 0xf2, 0x7f, 0x96, 0x9c, 0x15, 0x7f, - 0x0b, 0x8e, 0x47, 0xfd, 0x41, 0x21, 0xdd, 0x89, 0x84, 0x15, 0x88, 0x14, 0x50, 0xff, 0x63, 0x01, - 0xce, 0xdc, 0x31, 0x2d, 0xc3, 0x5e, 0x73, 0xfd, 0x14, 0x91, 0x87, 0xfe, 0xa8, 0xeb, 0xa0, 0x53, - 0x43, 0xbe, 0x0e, 0x27, 0xe3, 0x22, 0x75, 0x82, 0xc0, 0xdd, 0xa2, 0x77, 0xd6, 0x38, 0x41, 0xcd, - 0x4f, 0x16, 0x29, 0xee, 0xcb, 0xb4, 0xf4, 0x92, 0xf1, 0x6c, 0x93, 0x7d, 0xdb, 0xc9, 0x36, 0xf9, - 0x04, 0x14, 0xca, 0x76, 0x53, 0x37, 0xfd, 0x00, 0x33, 0x38, 0x8a, 0x83, 0x7a, 0x11, 0xa3, 0x09, - 0x0a, 0xc6, 0x5f, 0x54, 0x8c, 0x5d, 0x36, 0x10, 0xf2, 0xf7, 0x0b, 0x30, 0x2b, 0x4d, 0x93, 0x89, - 0x88, 0x0d, 0xc3, 0xa2, 0x3a, 0x71, 0xbb, 0x05, 0xb8, 0x79, 0x7a, 0xd6, 0x97, 0x51, 0x67, 0xb5, - 0xba, 0x1c, 0x29, 0xc7, 0xb7, 0x51, 0x3c, 0x09, 0xa6, 0xf8, 0x18, 0x7e, 0xcf, 0xa5, 0x45, 0xf9, - 0x4b, 0x42, 0xc0, 0x49, 0x66, 0x30, 0x29, 0x04, 0x9c, 0x65, 0x64, 0x22, 0x32, 0x09, 0x63, 0x18, - 0x5e, 0x39, 0xd8, 0x4a, 0x31, 0x95, 0x18, 0x42, 0xa3, 0x12, 0x2f, 0x4d, 0x78, 0x44, 0x66, 0xf6, - 0x71, 0xb5, 0xba, 0x40, 0x6b, 0xc9, 0x12, 0x67, 0x5e, 0x03, 0x92, 0x6c, 0xf3, 0x8e, 0xae, 0x4d, - 0xfe, 0x89, 0xb4, 0xaf, 0x3b, 0xec, 0x8e, 0x2f, 0xfb, 0x31, 0xdb, 0x45, 0x52, 0x87, 0xf5, 0xbe, - 0x93, 0xa9, 0xc3, 0x0a, 0xfb, 0x9a, 0x3a, 0x4c, 0xfd, 0xd9, 0x0c, 0x8c, 0x25, 0xe2, 0x8c, 0x93, - 0x67, 0x00, 0x38, 0x44, 0x8a, 0xe7, 0x88, 0x01, 0x52, 0xc2, 0xd8, 0xe3, 0x62, 0x0d, 0x0c, 0xc9, - 0xc8, 0x15, 0xe8, 0xe7, 0xbf, 0x44, 0x0c, 0xa6, 0x64, 0x91, 0x76, 0xdb, 0x34, 0xb4, 0x80, 0x28, - 0xac, 0x05, 0x2f, 0x0e, 0x73, 0xa9, 0x45, 0xbc, 0xf5, 0x56, 0x50, 0x0b, 0x23, 0x53, 0x3f, 0x9b, - 0x85, 0xa1, 0xa0, 0xc1, 0x25, 0xe3, 0xa0, 0x74, 0xae, 0x20, 0x42, 0xb6, 0xe7, 0xb6, 0x0a, 0xd9, - 0x1e, 0x9b, 0x54, 0x45, 0x8c, 0xf6, 0xfd, 0x7b, 0xf7, 0xf4, 0xf9, 0x2c, 0x1c, 0x0b, 0x6a, 0x3d, - 0xc0, 0x3b, 0xaa, 0x77, 0x91, 0x48, 0x3e, 0x97, 0x01, 0x65, 0xdc, 0x6c, 0x34, 0x4c, 0x6b, 0xa5, - 0x62, 0x2d, 0xdb, 0x4e, 0x13, 0x67, 0xbd, 0x83, 0x3b, 0xa7, 0x55, 0xbf, 0x27, 0x03, 0x63, 0xa2, - 0x41, 0x13, 0xba, 0x63, 0x1c, 0xdc, 0x21, 0x58, 0xbc, 0x25, 0x07, 0xa7, 0x2f, 0xea, 0x97, 0xb3, - 0x00, 0x33, 0x76, 0xfd, 0xee, 0x21, 0x7f, 0x36, 0xf5, 0x12, 0x14, 0x78, 0x20, 0x2c, 0xa1, 0xb1, - 0x63, 0xe2, 0x79, 0x10, 0xfb, 0x34, 0x8e, 0x18, 0x1f, 0x15, 0xf3, 0x71, 0x81, 0x07, 0xd2, 0x52, - 0x32, 0x9a, 0x28, 0xc2, 0x2a, 0x65, 0x74, 0x62, 0xc1, 0x08, 0x2a, 0x65, 0xb0, 0x68, 0xa5, 0x9b, - 0x1b, 0xc5, 0x7c, 0xc3, 0xae, 0xdf, 0xd5, 0x90, 0x5e, 0xfd, 0xd3, 0x0c, 0x97, 0xdd, 0x21, 0x7f, - 0xfc, 0xe9, 0x7f, 0x7e, 0x7e, 0x87, 0x9f, 0xff, 0xbd, 0x19, 0x38, 0xa1, 0xd1, 0xba, 0x7d, 0x8f, - 0x3a, 0xeb, 0x13, 0xb6, 0x41, 0xaf, 0x53, 0x8b, 0x3a, 0x07, 0x35, 0xa2, 0xfe, 0x3e, 0xe6, 0xb8, - 0x08, 0x1b, 0x73, 0xcb, 0xa5, 0xc6, 0xe1, 0xc9, 0x3f, 0xa2, 0xfe, 0xdd, 0x3e, 0x50, 0x52, 0x4d, - 0xdb, 0x43, 0x6b, 0xce, 0x75, 0xdc, 0xaf, 0xe4, 0xf7, 0x6b, 0xbf, 0xd2, 0xbb, 0xb3, 0xfd, 0x4a, - 0x61, 0xa7, 0xfb, 0x95, 0xbe, 0xed, 0xec, 0x57, 0x9a, 0xf1, 0xfd, 0x4a, 0x3f, 0xee, 0x57, 0x9e, - 0xe9, 0xba, 0x5f, 0x99, 0xb4, 0x8c, 0x5d, 0xee, 0x56, 0x0e, 0x6d, 0x6e, 0xdc, 0xdd, 0x6c, 0xb3, - 0x2e, 0xb2, 0x49, 0xb1, 0x6e, 0x3b, 0x06, 0x35, 0xc4, 0xee, 0x0a, 0x8f, 0xf6, 0x1d, 0x01, 0xd3, - 0x02, 0x6c, 0x22, 0xd1, 0xf0, 0xf0, 0x76, 0x12, 0x0d, 0xef, 0xc3, 0xfe, 0xeb, 0x33, 0x59, 0x18, - 0x9b, 0xa0, 0x8e, 0xc7, 0x23, 0x6d, 0xee, 0x87, 0xe7, 0x5a, 0x09, 0x8e, 0x49, 0x0c, 0xd1, 0x22, - 0xcf, 0x86, 0xde, 0x78, 0x75, 0xea, 0x78, 0x71, 0x67, 0xbe, 0x38, 0x3d, 0xab, 0xde, 0x4f, 0xf6, - 0x25, 0xc6, 0x6e, 0x50, 0xbd, 0x0f, 0xe7, 0x82, 0x34, 0xc5, 0x2f, 0x2d, 0xa0, 0x97, 0xf2, 0x77, - 0xe5, 0x77, 0x9e, 0xbf, 0x4b, 0xfd, 0x99, 0x0c, 0x5c, 0xd0, 0xa8, 0x45, 0xd7, 0xf4, 0xa5, 0x06, - 0x95, 0x9a, 0x25, 0x56, 0x06, 0x36, 0x6b, 0x98, 0x6e, 0x53, 0xf7, 0xea, 0xab, 0x7b, 0x92, 0xd1, - 0x14, 0x0c, 0xc9, 0xf3, 0xd7, 0x0e, 0xe6, 0xb6, 0x48, 0x39, 0xf5, 0xbf, 0xe4, 0xa0, 0x6f, 0xdc, - 0xf6, 0x6e, 0xd8, 0x7b, 0x4c, 0x28, 0x17, 0x4e, 0xf9, 0xd9, 0x1d, 0x1c, 0xe8, 0xbc, 0x1f, 0x2b, - 0x97, 0x62, 0xec, 0xa3, 0xa7, 0xe7, 0x92, 0x9d, 0xc8, 0x45, 0xe0, 0x93, 0xed, 0x30, 0x95, 0xdc, - 0x73, 0x30, 0x80, 0x41, 0x5a, 0xa4, 0x23, 0x57, 0xf4, 0xa3, 0xf6, 0x18, 0x30, 0x5e, 0x47, 0x48, - 0x4a, 0x3e, 0x12, 0x09, 0x0d, 0x5a, 0xd8, 0x7b, 0xea, 0x39, 0x39, 0x4a, 0xe8, 0x33, 0xfc, 0xb6, - 0x0e, 0xdb, 0x24, 0xa5, 0xe9, 0xc0, 0xa3, 0x92, 0x58, 0x93, 0x02, 0xc2, 0xfd, 0x4b, 0x0b, 0xa7, - 0x7e, 0x33, 0x0f, 0x43, 0xbe, 0xcb, 0xed, 0x01, 0x75, 0xfb, 0x53, 0x50, 0x98, 0xb6, 0xa5, 0x24, - 0x03, 0xe8, 0xa2, 0xbb, 0x6a, 0xbb, 0x31, 0xdf, 0x63, 0x41, 0xc4, 0x04, 0x36, 0x67, 0x1b, 0xb2, - 0x83, 0x39, 0x0a, 0xcc, 0xb2, 0x8d, 0xc4, 0x03, 0xdd, 0x80, 0x90, 0x5c, 0x80, 0x3c, 0xfa, 0xe6, - 0x4b, 0x07, 0xed, 0x31, 0x7f, 0x7c, 0xc4, 0x4b, 0x0a, 0x55, 0xd8, 0xa9, 0x42, 0xf5, 0xed, 0x56, - 0xa1, 0xfa, 0xf7, 0x57, 0xa1, 0xde, 0x80, 0x21, 0xac, 0xc9, 0xcf, 0x51, 0xb6, 0xf5, 0x9a, 0xf8, - 0x90, 0x58, 0xb6, 0x86, 0x79, 0xbb, 0x45, 0xa6, 0x32, 0x5c, 0xad, 0x22, 0xac, 0x62, 0x6a, 0x07, - 0x7b, 0x50, 0xbb, 0xdf, 0xc9, 0x40, 0xdf, 0x2d, 0xeb, 0xae, 0x65, 0xaf, 0xed, 0x4d, 0xe3, 0x9e, - 0x81, 0x41, 0xc1, 0x46, 0x5a, 0x18, 0xf0, 0xcd, 0x75, 0x9b, 0x83, 0x6b, 0xc8, 0x49, 0x93, 0xa9, - 0xc8, 0xcb, 0x41, 0x21, 0x7c, 0x7e, 0x93, 0x0b, 0xd3, 0x74, 0xf8, 0x85, 0xea, 0xd1, 0xcc, 0x02, - 0x32, 0x39, 0x39, 0x0b, 0xf9, 0x32, 0x6b, 0xaa, 0x14, 0xa7, 0x96, 0x35, 0x45, 0x43, 0xa8, 0xfa, - 0x99, 0x3c, 0x8c, 0xc4, 0xce, 0xac, 0x9e, 0x80, 0x01, 0x71, 0x66, 0x64, 0xfa, 0xa9, 0x0e, 0xf0, - 0x79, 0x4e, 0x00, 0xd4, 0xfa, 0xf9, 0x9f, 0x15, 0x83, 0x7c, 0x10, 0xfa, 0x6c, 0x17, 0xd7, 0x33, - 0xfc, 0x96, 0x91, 0x70, 0x08, 0xcd, 0x57, 0x59, 0xdb, 0xf9, 0xe0, 0x10, 0x24, 0xb2, 0x46, 0xda, - 0x2e, 0x7e, 0xda, 0x35, 0x18, 0xd0, 0x5d, 0x97, 0x7a, 0x35, 0x4f, 0x5f, 0x91, 0xb3, 0x1f, 0x04, - 0x40, 0x79, 0x74, 0x20, 0x70, 0x51, 0x5f, 0x21, 0xaf, 0xc1, 0x70, 0xdd, 0xa1, 0xb8, 0xe2, 0xe9, - 0x0d, 0xd6, 0x4a, 0xc9, 0x22, 0x8d, 0x20, 0xe4, 0xfb, 0x8d, 0x10, 0x51, 0x31, 0xc8, 0x6d, 0x18, - 0x16, 0x9f, 0xc3, 0x7d, 0xe3, 0x71, 0xa0, 0x8d, 0x84, 0x2b, 0x10, 0x17, 0x09, 0xf7, 0x8e, 0x17, - 0x4f, 0x24, 0x64, 0x72, 0x99, 0xaf, 0x21, 0x91, 0x92, 0x79, 0x20, 0x6b, 0x74, 0xa9, 0xa6, 0xb7, - 0xbd, 0x55, 0x56, 0x17, 0x0f, 0xde, 0x2d, 0x92, 0xfe, 0xe1, 0xbb, 0x82, 0x24, 0x56, 0x7e, 0x6e, - 0xb1, 0x46, 0x97, 0x4a, 0x11, 0x24, 0xb9, 0x03, 0x27, 0x93, 0x45, 0xd8, 0x27, 0xf3, 0xc3, 0xfb, - 0xc7, 0x36, 0x37, 0x8a, 0xc5, 0x54, 0x02, 0x89, 0xed, 0xf1, 0x04, 0xdb, 0x8a, 0x71, 0x23, 0xdf, - 0xdf, 0x37, 0xda, 0xaf, 0x8d, 0xb0, 0xb2, 0xbe, 0xf5, 0x67, 0x1a, 0xea, 0xd7, 0x32, 0xcc, 0xca, - 0x63, 0x1f, 0x84, 0x59, 0x8f, 0x99, 0xae, 0x37, 0x77, 0xa8, 0xeb, 0xcd, 0x30, 0x3f, 0x61, 0xc1, - 0xed, 0x32, 0xbb, 0x6a, 0x02, 0x4b, 0x2e, 0x43, 0xc1, 0x90, 0x0f, 0xbc, 0x4e, 0x45, 0x3b, 0xc1, - 0xaf, 0x47, 0x13, 0x54, 0xe4, 0x22, 0xe4, 0xd9, 0x6a, 0x13, 0xdf, 0xed, 0xca, 0x86, 0x81, 0x86, - 0x14, 0xea, 0xb7, 0x67, 0x61, 0x48, 0xfa, 0x9a, 0xab, 0x7b, 0xfa, 0x9c, 0x17, 0xb7, 0xd7, 0x4c, - 0xdf, 0x29, 0x05, 0xb7, 0x41, 0x7e, 0x93, 0xaf, 0x05, 0xa2, 0xd8, 0xd6, 0x85, 0x91, 0x10, 0xcc, - 0x73, 0xe2, 0x43, 0x0b, 0xdb, 0xdf, 0xf9, 0x31, 0xfa, 0x1b, 0xf9, 0xfe, 0xec, 0x68, 0xee, 0x46, - 0xbe, 0x3f, 0x3f, 0xda, 0x8b, 0x91, 0xae, 0x30, 0xb8, 0x34, 0xdf, 0x56, 0x5b, 0xcb, 0xe6, 0xca, - 0x21, 0x7f, 0x9d, 0xb1, 0xbf, 0x51, 0xc0, 0x62, 0xb2, 0x39, 0xe4, 0x4f, 0x35, 0xde, 0x51, 0xd9, - 0x1c, 0xe5, 0x33, 0x14, 0xb2, 0xf9, 0xdd, 0x0c, 0x28, 0xa9, 0xb2, 0x29, 0x1d, 0x90, 0x9f, 0xc2, - 0xfe, 0x65, 0x35, 0xfc, 0x46, 0x16, 0xc6, 0x2a, 0x96, 0x47, 0x57, 0xf8, 0x66, 0xef, 0x90, 0x4f, - 0x15, 0x37, 0x61, 0x50, 0xfa, 0x18, 0xd1, 0xe7, 0x0f, 0x07, 0x5b, 0xe9, 0x10, 0xd5, 0x81, 0x93, - 0x5c, 0x7a, 0x1f, 0x13, 0xa1, 0xc7, 0x84, 0x7c, 0xc8, 0xe7, 0x9c, 0xc3, 0x21, 0xe4, 0x43, 0x3e, - 0x79, 0xbd, 0x4b, 0x85, 0xfc, 0x5f, 0x33, 0x70, 0x3c, 0xa5, 0x72, 0x72, 0x01, 0xfa, 0xaa, 0xed, - 0x25, 0x0c, 0x6c, 0x95, 0x09, 0x3d, 0x7a, 0xdd, 0xf6, 0x12, 0xc6, 0xb4, 0xd2, 0x7c, 0x24, 0x59, - 0xc4, 0xe7, 0xeb, 0xf3, 0x95, 0xf2, 0x84, 0x90, 0xaa, 0x2a, 0x3d, 0xc4, 0x67, 0xe0, 0xb4, 0x2f, - 0x0b, 0x9e, 0xb8, 0xdb, 0xa6, 0x51, 0x8f, 0x3d, 0x71, 0x67, 0x65, 0xc8, 0x47, 0x61, 0xa0, 0xf4, - 0x56, 0xdb, 0xa1, 0xc8, 0x97, 0x4b, 0xfc, 0x3d, 0x01, 0x5f, 0x1f, 0x91, 0xc6, 0x99, 0xbf, 0xd6, - 0x67, 0x14, 0x71, 0xde, 0x21, 0x43, 0xf5, 0xb3, 0x19, 0x38, 0xd3, 0xb9, 0x75, 0xe4, 0xfd, 0xd0, - 0xc7, 0x76, 0xe6, 0x25, 0x6d, 0x4e, 0x7c, 0x3a, 0xcf, 0x00, 0x6a, 0x37, 0x68, 0x4d, 0x77, 0x64, - 0x63, 0xdf, 0x27, 0x23, 0xaf, 0xc0, 0x60, 0xc5, 0x75, 0xdb, 0xd4, 0xa9, 0x3e, 0x73, 0x4b, 0xab, - 0x88, 0x3d, 0x21, 0xee, 0x39, 0x4c, 0x04, 0xd7, 0xdc, 0x67, 0x62, 0xa1, 0xab, 0x64, 0x7a, 0xf5, - 0x53, 0x19, 0x38, 0xdb, 0xed, 0xab, 0xc8, 0x33, 0xd0, 0xbf, 0x48, 0x2d, 0xdd, 0xf2, 0x2a, 0x65, - 0xd1, 0x24, 0xdc, 0x62, 0x79, 0x08, 0x8b, 0xee, 0x14, 0x02, 0x42, 0x56, 0x88, 0x1f, 0x09, 0x06, - 0x3e, 0x08, 0xfc, 0xf8, 0x12, 0x61, 0xb1, 0x42, 0x3e, 0xa1, 0xfa, 0xab, 0x3a, 0xf4, 0xce, 0x5b, - 0x74, 0x7e, 0x99, 0x3c, 0x0d, 0x03, 0x4c, 0xf7, 0x31, 0xfd, 0xbe, 0x18, 0x68, 0x63, 0xf2, 0x80, - 0x41, 0xc4, 0x74, 0x8f, 0x16, 0x52, 0x91, 0x6b, 0x72, 0xce, 0x6f, 0xa1, 0x0e, 0x44, 0x2e, 0xc3, - 0x31, 0xd3, 0x3d, 0x9a, 0x9c, 0x1b, 0xfc, 0x9a, 0x9c, 0x6b, 0x59, 0x74, 0x76, 0xa4, 0x14, 0xc7, - 0xf8, 0xa5, 0xc4, 0x34, 0x30, 0x93, 0x96, 0x90, 0x38, 0x6e, 0x13, 0x24, 0x29, 0xa6, 0x7b, 0xb4, - 0xf4, 0x44, 0xc6, 0x43, 0xb2, 0x1b, 0x53, 0xfc, 0x16, 0x52, 0xc6, 0x4d, 0xf7, 0x68, 0x11, 0x5a, - 0xf2, 0x3c, 0x0c, 0x8a, 0xdf, 0x37, 0x6c, 0xd3, 0x8a, 0xc7, 0xb0, 0x90, 0x50, 0xd3, 0x3d, 0x9a, - 0x4c, 0x29, 0x55, 0xba, 0xe0, 0x98, 0x96, 0x27, 0x5e, 0xc6, 0xc5, 0x2b, 0x45, 0x9c, 0x54, 0x29, - 0xfe, 0x26, 0xaf, 0xc0, 0x70, 0x10, 0x1c, 0xe4, 0x4d, 0x5a, 0xf7, 0xc4, 0x91, 0xce, 0xc9, 0x58, - 0x61, 0x8e, 0x9c, 0xee, 0xd1, 0xa2, 0xd4, 0xe4, 0x22, 0x14, 0x34, 0xea, 0x9a, 0x6f, 0xf9, 0xf7, - 0x17, 0x23, 0xd2, 0x74, 0x66, 0xbe, 0xc5, 0xa4, 0x24, 0xf0, 0xac, 0x77, 0xc2, 0x0b, 0x13, 0x71, - 0x00, 0x43, 0x62, 0xb5, 0x4c, 0x5a, 0x06, 0xeb, 0x1d, 0xe9, 0xb6, 0xec, 0xb5, 0x30, 0x64, 0x8a, - 0x48, 0xb4, 0x36, 0x18, 0x7f, 0x9b, 0x2a, 0x63, 0xa7, 0x7b, 0xb4, 0x18, 0xbd, 0x24, 0xd5, 0xb2, - 0xe9, 0xde, 0x15, 0x51, 0xea, 0xe2, 0x52, 0x65, 0x28, 0x49, 0xaa, 0xec, 0xa7, 0x54, 0xf5, 0x1c, - 0xf5, 0xd6, 0x6c, 0xe7, 0xae, 0x88, 0x49, 0x17, 0xaf, 0x5a, 0x60, 0xa5, 0xaa, 0x05, 0x44, 0xae, - 0x9a, 0x2d, 0x32, 0x23, 0xe9, 0x55, 0xeb, 0x9e, 0x2e, 0x57, 0xcd, 0xf7, 0x97, 0x7e, 0x27, 0xcd, - 0x50, 0xfd, 0x1e, 0xcf, 0x77, 0x9b, 0xec, 0x50, 0xc4, 0x49, 0x1d, 0x8a, 0xbf, 0x59, 0xa5, 0x52, - 0x4e, 0x53, 0x91, 0xd0, 0x36, 0xa8, 0x54, 0x42, 0xb1, 0x4a, 0xe5, 0xec, 0xa7, 0xd7, 0xe4, 0x54, - 0x9f, 0xca, 0x58, 0xb4, 0x83, 0x42, 0x0c, 0xeb, 0x20, 0x29, 0x25, 0x68, 0x11, 0xd3, 0x08, 0x2a, - 0x04, 0xc9, 0x07, 0x83, 0x16, 0x4e, 0x2c, 0x4c, 0xf7, 0x68, 0x98, 0x60, 0x50, 0xe5, 0x09, 0x2a, - 0x95, 0xe3, 0x48, 0x31, 0xe4, 0x53, 0x30, 0xd8, 0x74, 0x8f, 0xc6, 0x93, 0x57, 0x3e, 0x2d, 0xa5, - 0x82, 0x52, 0x4e, 0x44, 0xa7, 0x88, 0x00, 0xc1, 0xa6, 0x88, 0x30, 0x61, 0xd4, 0x54, 0x32, 0x5d, - 0x92, 0x72, 0x32, 0xba, 0xa2, 0xc6, 0xf1, 0xd3, 0x3d, 0x5a, 0x32, 0xc5, 0xd2, 0xf3, 0x91, 0x0c, - 0x42, 0xca, 0xa9, 0x58, 0xe0, 0x98, 0x10, 0xc5, 0xc4, 0x25, 0xe7, 0x1a, 0x9a, 0x4f, 0xcd, 0xf9, - 0xad, 0x9c, 0x8e, 0x2e, 0xc7, 0x29, 0x24, 0xd3, 0x3d, 0x5a, 0x6a, 0xb6, 0xf0, 0x89, 0x44, 0x1e, - 0x1f, 0x45, 0x89, 0x5e, 0xd6, 0xc6, 0xd0, 0xd3, 0x3d, 0x5a, 0x22, 0xf3, 0xcf, 0x35, 0x39, 0x81, - 0x8e, 0xf2, 0x50, 0xb4, 0x13, 0x43, 0x0c, 0xeb, 0x44, 0x29, 0xd1, 0xce, 0x35, 0x39, 0xa9, 0x8a, - 0x72, 0x26, 0x59, 0x2a, 0x9c, 0x39, 0xa5, 0xe4, 0x2b, 0x5a, 0x7a, 0x9e, 0x08, 0xe5, 0x61, 0x91, - 0xa9, 0x4f, 0x94, 0x4f, 0xa3, 0x99, 0xee, 0xd1, 0xd2, 0x73, 0x4c, 0x68, 0xe9, 0x09, 0x16, 0x94, - 0xb3, 0xdd, 0x78, 0x06, 0xad, 0x4b, 0x4f, 0xce, 0xa0, 0x77, 0x09, 0x77, 0xaf, 0x9c, 0x8b, 0x46, - 0xad, 0xec, 0x48, 0x38, 0xdd, 0xa3, 0x75, 0x09, 0x9a, 0x7f, 0xab, 0x43, 0xec, 0x79, 0xe5, 0x7c, - 0x34, 0x51, 0x67, 0x2a, 0xd1, 0x74, 0x8f, 0xd6, 0x21, 0x72, 0xfd, 0xad, 0x0e, 0xa1, 0xc9, 0x95, - 0x62, 0x57, 0xb6, 0x81, 0x3c, 0x3a, 0x04, 0x36, 0x9f, 0x4f, 0x8d, 0xea, 0xad, 0x3c, 0x12, 0x55, - 0xdd, 0x14, 0x12, 0xa6, 0xba, 0x69, 0xf1, 0xc0, 0xe7, 0x53, 0xc3, 0x50, 0x2b, 0x8f, 0x76, 0x61, - 0x18, 0xb4, 0x31, 0x35, 0x80, 0xf5, 0x7c, 0x6a, 0x1c, 0x68, 0x45, 0x8d, 0x32, 0x4c, 0x21, 0x61, - 0x0c, 0xd3, 0x22, 0x48, 0xcf, 0xa7, 0x86, 0x0b, 0x56, 0x1e, 0xeb, 0xc2, 0x30, 0x6c, 0x61, 0x5a, - 0xa0, 0xe1, 0xe7, 0x23, 0xf1, 0x7a, 0x95, 0xf7, 0x44, 0xe7, 0x0d, 0x09, 0xc5, 0xe6, 0x0d, 0x39, - 0xb2, 0xef, 0x44, 0x22, 0x22, 0xa1, 0xf2, 0x78, 0x74, 0x98, 0xc7, 0xd0, 0x6c, 0x98, 0xc7, 0x63, - 0x18, 0x4e, 0x24, 0x22, 0xb3, 0x29, 0x17, 0x3a, 0x31, 0x41, 0x74, 0x94, 0x09, 0x8f, 0xe5, 0x56, - 0x49, 0x09, 0x0d, 0xa6, 0xbc, 0x37, 0xea, 0x68, 0x98, 0x20, 0x98, 0xee, 0xd1, 0x52, 0x02, 0x8a, - 0x69, 0xe9, 0x71, 0x30, 0x94, 0x8b, 0xd1, 0x61, 0x9b, 0x46, 0xc3, 0x86, 0x6d, 0x6a, 0x0c, 0x8d, - 0x99, 0x34, 0x6f, 0x68, 0xe5, 0x52, 0xd4, 0x30, 0x4b, 0x52, 0x30, 0xc3, 0x2c, 0xc5, 0x8b, 0x5a, - 0x4b, 0x8f, 0xec, 0xa0, 0x3c, 0xd1, 0xb5, 0x85, 0x48, 0x93, 0xd2, 0x42, 0x1e, 0xe8, 0x20, 0xb4, - 0x9d, 0x6e, 0xb5, 0x1a, 0xb6, 0x6e, 0x28, 0xef, 0x4b, 0xb5, 0x9d, 0x38, 0x52, 0xb2, 0x9d, 0x38, - 0x80, 0xad, 0xf2, 0xb2, 0xd3, 0xad, 0xf2, 0x64, 0x74, 0x95, 0x97, 0x71, 0x6c, 0x95, 0x8f, 0x38, - 0xe8, 0x4e, 0x24, 0x1c, 0x54, 0x95, 0xa7, 0xa2, 0x0a, 0x10, 0x43, 0x33, 0x05, 0x88, 0xbb, 0xb4, - 0x7e, 0xbc, 0xb3, 0x4b, 0xa7, 0x72, 0x19, 0xb9, 0x3d, 0xe2, 0x73, 0xeb, 0x44, 0x37, 0xdd, 0xa3, - 0x75, 0x76, 0x0b, 0xad, 0xa4, 0x78, 0x68, 0x2a, 0x57, 0xa2, 0x0a, 0x96, 0x20, 0x60, 0x0a, 0x96, - 0xf4, 0xeb, 0xac, 0xa4, 0xb8, 0x58, 0x2a, 0xef, 0xef, 0xc8, 0x2a, 0xf8, 0xe6, 0x14, 0xc7, 0xcc, - 0x6b, 0xb2, 0x8f, 0xa4, 0xf2, 0x74, 0x74, 0xb1, 0x0b, 0x31, 0x6c, 0xb1, 0x93, 0x7c, 0x29, 0xaf, - 0xc9, 0xde, 0x81, 0xca, 0xd5, 0x64, 0xa9, 0x70, 0x89, 0x94, 0xbc, 0x08, 0xb5, 0x74, 0xa7, 0x3a, - 0xe5, 0x99, 0xa8, 0xd6, 0xa5, 0xd1, 0x30, 0xad, 0x4b, 0x75, 0xc8, 0x9b, 0x4a, 0xfa, 0xc6, 0x29, - 0xd7, 0xe2, 0x67, 0x09, 0x51, 0x3c, 0xb3, 0x7c, 0x12, 0xfe, 0x74, 0xaf, 0xc5, 0x83, 0x34, 0x29, - 0xcf, 0xc6, 0x2e, 0x33, 0x22, 0x58, 0x66, 0xdf, 0xc6, 0x82, 0x3a, 0xbd, 0x16, 0x8f, 0x6b, 0xa4, - 0x3c, 0x97, 0xce, 0x21, 0xd0, 0x95, 0x78, 0x1c, 0xa4, 0xd7, 0xe2, 0xa1, 0x80, 0x94, 0xe7, 0xd3, - 0x39, 0x04, 0xd2, 0x8d, 0x87, 0x0e, 0x7a, 0x5a, 0x0a, 0x4e, 0xac, 0x7c, 0x20, 0x6a, 0x3a, 0x06, - 0x08, 0x66, 0x3a, 0x86, 0x21, 0x8c, 0x9f, 0x96, 0x82, 0xfa, 0x2a, 0x2f, 0x24, 0x8a, 0x04, 0x8d, - 0x95, 0x42, 0xff, 0x3e, 0x2d, 0x05, 0xc3, 0x55, 0x5e, 0x4c, 0x14, 0x09, 0x5a, 0x27, 0x85, 0xcc, - 0x35, 0xba, 0xbd, 0x9a, 0x52, 0x5e, 0x8a, 0x1e, 0x71, 0x74, 0xa6, 0x9c, 0xee, 0xd1, 0xba, 0xbd, - 0xbe, 0xfa, 0x78, 0x67, 0x4f, 0x43, 0xe5, 0xe5, 0xe8, 0x10, 0xee, 0x44, 0xc7, 0x86, 0x70, 0x47, - 0x6f, 0xc5, 0x57, 0x62, 0x2f, 0xa8, 0x95, 0x57, 0xa2, 0x53, 0x5c, 0x04, 0xc9, 0xa6, 0xb8, 0xf8, - 0x7b, 0xeb, 0xc8, 0xd3, 0x60, 0xe5, 0x83, 0xd1, 0x29, 0x4e, 0xc6, 0xb1, 0x29, 0x2e, 0xf2, 0x8c, - 0x78, 0x22, 0xf1, 0x62, 0x55, 0x79, 0x35, 0x3a, 0xc5, 0xc5, 0xd0, 0x6c, 0x8a, 0x8b, 0xbf, 0x71, - 0x7d, 0x25, 0xf6, 0x70, 0x53, 0x79, 0x2d, 0xbd, 0xfd, 0x88, 0x94, 0xdb, 0xcf, 0x9f, 0x79, 0x6a, - 0xe9, 0x2f, 0x10, 0x95, 0x52, 0x74, 0xfc, 0xa6, 0xd1, 0xb0, 0xf1, 0x9b, 0xfa, 0x7a, 0x31, 0xbe, - 0x71, 0x10, 0x5a, 0x35, 0xde, 0x65, 0xe3, 0x10, 0x9a, 0x22, 0x29, 0xe0, 0xc8, 0x1e, 0x99, 0x6f, - 0x84, 0x26, 0x3a, 0xec, 0x91, 0xfd, 0x6d, 0x50, 0x8c, 0x9e, 0xcd, 0xae, 0x09, 0xc7, 0x37, 0xa5, - 0x1c, 0x9d, 0x5d, 0x13, 0x04, 0x6c, 0x76, 0x4d, 0xba, 0xcb, 0x4d, 0xc1, 0xa8, 0xd0, 0x22, 0xee, - 0xcf, 0x67, 0x5a, 0x2b, 0xca, 0x64, 0xec, 0x01, 0x50, 0x0c, 0xcf, 0x66, 0xa7, 0x38, 0x0c, 0xd7, - 0x6b, 0x0e, 0x9b, 0x68, 0x98, 0xad, 0x25, 0x5b, 0x77, 0x8c, 0x2a, 0xb5, 0x0c, 0x65, 0x2a, 0xb6, - 0x5e, 0xa7, 0xd0, 0xe0, 0x7a, 0x9d, 0x02, 0xc7, 0xc0, 0x44, 0x31, 0xb8, 0x46, 0xeb, 0xd4, 0xbc, - 0x47, 0x95, 0xeb, 0xc8, 0xb6, 0xd8, 0x89, 0xad, 0x20, 0x9b, 0xee, 0xd1, 0x3a, 0x71, 0x60, 0xb6, - 0xfa, 0xec, 0x7a, 0xf5, 0xf5, 0x99, 0xe0, 0xd1, 0xeb, 0x82, 0x43, 0x5b, 0xba, 0x43, 0x95, 0xe9, - 0xa8, 0xad, 0x9e, 0x4a, 0xc4, 0x6c, 0xf5, 0x54, 0x44, 0x92, 0xad, 0x3f, 0x16, 0x2a, 0xdd, 0xd8, - 0x86, 0x23, 0x22, 0xbd, 0x34, 0x9b, 0x9d, 0xa2, 0x08, 0x26, 0xa0, 0x19, 0xdb, 0x5a, 0xc1, 0x93, - 0x8a, 0x1b, 0xd1, 0xd9, 0xa9, 0x33, 0x25, 0x9b, 0x9d, 0x3a, 0x63, 0x99, 0xaa, 0x47, 0xb1, 0x7c, - 0x0c, 0xde, 0x8c, 0xaa, 0x7a, 0x0a, 0x09, 0x53, 0xf5, 0x14, 0x70, 0x92, 0xa1, 0x46, 0x5d, 0xea, - 0x29, 0x33, 0xdd, 0x18, 0x22, 0x49, 0x92, 0x21, 0x82, 0x93, 0x0c, 0xa7, 0xa8, 0x57, 0x5f, 0x55, - 0x66, 0xbb, 0x31, 0x44, 0x92, 0x24, 0x43, 0x04, 0xb3, 0xcd, 0x66, 0x14, 0x3c, 0xde, 0x6e, 0xdc, - 0xf5, 0xfb, 0x6c, 0x2e, 0xba, 0xd9, 0xec, 0x48, 0xc8, 0x36, 0x9b, 0x1d, 0x91, 0xe4, 0x53, 0xdb, - 0x76, 0xcc, 0x54, 0xe6, 0xb1, 0xc2, 0xcb, 0xa1, 0x5d, 0xb0, 0x9d, 0x52, 0xd3, 0x3d, 0xda, 0x76, - 0x1d, 0x3f, 0xdf, 0x17, 0xb8, 0x42, 0x29, 0x0b, 0x58, 0xd5, 0xb1, 0xe0, 0xac, 0x82, 0x83, 0xa7, - 0x7b, 0xb4, 0xc0, 0x59, 0xea, 0x79, 0x18, 0xc4, 0x8f, 0xaa, 0x58, 0xa6, 0x57, 0x1e, 0x57, 0x5e, - 0x8f, 0x6e, 0x99, 0x24, 0x14, 0xdb, 0x32, 0x49, 0x3f, 0xd9, 0x24, 0x8e, 0x3f, 0xf9, 0x14, 0x53, - 0x1e, 0x57, 0xb4, 0xe8, 0x24, 0x1e, 0x41, 0xb2, 0x49, 0x3c, 0x02, 0x08, 0xea, 0x2d, 0x3b, 0x76, - 0xab, 0x3c, 0xae, 0x54, 0x53, 0xea, 0xe5, 0xa8, 0xa0, 0x5e, 0xfe, 0x33, 0xa8, 0xb7, 0xba, 0xda, - 0xf6, 0xca, 0xec, 0x1b, 0x17, 0x53, 0xea, 0xf5, 0x91, 0x41, 0xbd, 0x3e, 0x80, 0x4d, 0x85, 0x08, - 0x58, 0x70, 0x6c, 0x36, 0x69, 0xdf, 0x34, 0x1b, 0x0d, 0xe5, 0x56, 0x74, 0x2a, 0x8c, 0xe3, 0xd9, - 0x54, 0x18, 0x87, 0x31, 0xd3, 0x93, 0xb7, 0x8a, 0x2e, 0xb5, 0x57, 0x94, 0xdb, 0x51, 0xd3, 0x33, - 0xc4, 0x30, 0xd3, 0x33, 0xfc, 0x85, 0xbb, 0x0b, 0xf6, 0x4b, 0xa3, 0xcb, 0x0e, 0x75, 0x57, 0x95, - 0x3b, 0xb1, 0xdd, 0x85, 0x84, 0xc3, 0xdd, 0x85, 0xf4, 0x9b, 0xac, 0xc0, 0xc3, 0x91, 0x85, 0xc6, - 0xbf, 0x7b, 0xaa, 0x52, 0xdd, 0xa9, 0xaf, 0x2a, 0x1f, 0x42, 0x56, 0x8f, 0xa5, 0x2e, 0x55, 0x51, - 0xd2, 0xe9, 0x1e, 0xad, 0x1b, 0x27, 0xdc, 0x96, 0xbf, 0x3e, 0xc3, 0x23, 0x08, 0x6a, 0x0b, 0x13, - 0xfe, 0x26, 0xf4, 0x8d, 0xd8, 0xb6, 0x3c, 0x49, 0x82, 0xdb, 0xf2, 0x24, 0x98, 0xb4, 0xe0, 0x7c, - 0x6c, 0xab, 0x36, 0xab, 0x37, 0xd8, 0xbe, 0x84, 0x1a, 0x0b, 0x7a, 0xfd, 0x2e, 0xf5, 0x94, 0x0f, - 0x23, 0xef, 0x0b, 0x1d, 0x36, 0x7c, 0x31, 0xea, 0xe9, 0x1e, 0x6d, 0x0b, 0x7e, 0x44, 0x85, 0x7c, - 0x75, 0x6a, 0x71, 0x41, 0xf9, 0x48, 0xf4, 0x7c, 0x93, 0xc1, 0xa6, 0x7b, 0x34, 0xc4, 0x31, 0x2b, - 0xed, 0x56, 0x6b, 0xc5, 0xd1, 0x0d, 0xca, 0x0d, 0x2d, 0xb4, 0xdd, 0x84, 0x01, 0xfa, 0xd1, 0xa8, - 0x95, 0xd6, 0x89, 0x8e, 0x59, 0x69, 0x9d, 0x70, 0x4c, 0x51, 0x23, 0xc1, 0xf2, 0x95, 0x8f, 0x45, - 0x15, 0x35, 0x82, 0x64, 0x8a, 0x1a, 0x0d, 0xad, 0xff, 0x21, 0x38, 0x15, 0xec, 0xe7, 0xc5, 0xfa, - 0xcb, 0x3b, 0x4d, 0xf9, 0x38, 0xf2, 0x39, 0x9f, 0xb8, 0x0c, 0x88, 0x50, 0x4d, 0xf7, 0x68, 0x1d, - 0xca, 0xb3, 0x15, 0x37, 0x91, 0x07, 0x46, 0x98, 0x17, 0xdf, 0x16, 0x5d, 0x71, 0x3b, 0x90, 0xb1, - 0x15, 0xb7, 0x03, 0x2a, 0x95, 0xb9, 0x10, 0xaa, 0xbe, 0x05, 0xf3, 0x40, 0xa6, 0x9d, 0x38, 0xa4, - 0x32, 0x17, 0x96, 0xda, 0xd2, 0x16, 0xcc, 0x03, 0x6b, 0xad, 0x13, 0x07, 0x72, 0x11, 0x0a, 0xd5, - 0xea, 0xac, 0xd6, 0xb6, 0x94, 0x7a, 0xcc, 0x07, 0x0c, 0xa1, 0xd3, 0x3d, 0x9a, 0xc0, 0x33, 0x33, - 0x68, 0xb2, 0xa1, 0xbb, 0x9e, 0x59, 0x77, 0x71, 0xc4, 0xf8, 0x23, 0xc4, 0x88, 0x9a, 0x41, 0x69, - 0x34, 0xcc, 0x0c, 0x4a, 0x83, 0x33, 0x7b, 0x71, 0x42, 0x77, 0x5d, 0xdd, 0x32, 0x1c, 0x7d, 0x1c, - 0x97, 0x09, 0x1a, 0x7b, 0x1e, 0x10, 0xc1, 0x32, 0x7b, 0x31, 0x0a, 0xc1, 0xc3, 0x77, 0x1f, 0xe2, - 0x9b, 0x39, 0xcb, 0xb1, 0xc3, 0xf7, 0x18, 0x1e, 0x0f, 0xdf, 0x63, 0x30, 0xb4, 0x3b, 0x7d, 0x98, - 0x46, 0x57, 0x4c, 0x26, 0x22, 0x65, 0x25, 0x66, 0x77, 0xc6, 0x09, 0xd0, 0xee, 0x8c, 0x03, 0x23, - 0x4d, 0xf2, 0x97, 0xdb, 0xd5, 0x0e, 0x4d, 0x0a, 0x57, 0xd9, 0x44, 0x19, 0xb6, 0x7e, 0x87, 0x83, - 0xa3, 0xbc, 0x6e, 0xe9, 0x4d, 0xbb, 0x3c, 0xee, 0x4b, 0xdd, 0x8c, 0xae, 0xdf, 0x1d, 0x09, 0xd9, - 0xfa, 0xdd, 0x11, 0xc9, 0x66, 0x57, 0x7f, 0xa3, 0xb5, 0xaa, 0x3b, 0xd4, 0x28, 0x9b, 0x0e, 0x9e, - 0x2c, 0xae, 0xf3, 0xad, 0xe1, 0x9b, 0xd1, 0xd9, 0xb5, 0x0b, 0x29, 0x9b, 0x5d, 0xbb, 0xa0, 0x99, - 0x91, 0x97, 0x8e, 0xd6, 0xa8, 0x6e, 0x28, 0x77, 0xa3, 0x46, 0x5e, 0x67, 0x4a, 0x66, 0xe4, 0x75, - 0xc6, 0x76, 0xfe, 0x9c, 0x3b, 0x8e, 0xe9, 0x51, 0xa5, 0xb1, 0x9d, 0xcf, 0x41, 0xd2, 0xce, 0x9f, - 0x83, 0x68, 0xb6, 0x21, 0x8c, 0x77, 0x48, 0x33, 0xba, 0x21, 0x4c, 0x76, 0x43, 0xbc, 0x04, 0xb3, - 0x58, 0xc4, 0x2b, 0x11, 0xc5, 0x8a, 0x5a, 0x2c, 0x02, 0xcc, 0x2c, 0x96, 0xf0, 0x1d, 0x49, 0xe4, - 0x81, 0x81, 0x62, 0x47, 0xd7, 0x50, 0x19, 0xc7, 0xd6, 0xd0, 0xc8, 0x63, 0x84, 0xe7, 0x23, 0xde, - 0xb3, 0x4a, 0x2b, 0x6a, 0x75, 0x48, 0x28, 0x66, 0x75, 0xc8, 0x7e, 0xb6, 0x13, 0x70, 0x0c, 0x6f, - 0xc1, 0xb5, 0x76, 0x70, 0x8f, 0xf3, 0x89, 0xe8, 0x67, 0xc6, 0xd0, 0xec, 0x33, 0x63, 0xa0, 0x08, - 0x13, 0x31, 0x6d, 0x39, 0x1d, 0x98, 0x84, 0xe7, 0x83, 0x31, 0x10, 0x99, 0x01, 0x52, 0x2d, 0xcd, - 0xce, 0x54, 0x8c, 0x05, 0xf9, 0x8a, 0xcc, 0x8d, 0x9e, 0xc0, 0x26, 0x29, 0xa6, 0x7b, 0xb4, 0x94, - 0x72, 0xe4, 0x4d, 0x38, 0x2b, 0xa0, 0xe2, 0x09, 0x20, 0xa6, 0x8b, 0x36, 0x82, 0x05, 0xc1, 0x8b, - 0x7a, 0x67, 0x74, 0xa3, 0x9d, 0xee, 0xd1, 0xba, 0xf2, 0xea, 0x5c, 0x97, 0x58, 0x1f, 0xda, 0xdb, - 0xa9, 0x2b, 0x58, 0x24, 0xba, 0xf2, 0xea, 0x5c, 0x97, 0x90, 0xfb, 0xbd, 0xed, 0xd4, 0x15, 0x74, - 0x42, 0x57, 0x5e, 0xc4, 0x85, 0x62, 0x37, 0x7c, 0xa9, 0xd1, 0x50, 0xd6, 0xb0, 0xba, 0xf7, 0x6e, - 0xa7, 0xba, 0x12, 0x1a, 0x9c, 0x5b, 0x71, 0x64, 0xb3, 0xf4, 0x7c, 0x8b, 0x5a, 0xd5, 0xc8, 0x02, - 0x74, 0x3f, 0x3a, 0x4b, 0x27, 0x08, 0xd8, 0x2c, 0x9d, 0x00, 0xb2, 0x01, 0x25, 0x3b, 0x61, 0x2b, - 0xeb, 0xd1, 0x01, 0x25, 0xe3, 0xd8, 0x80, 0x8a, 0x38, 0x6c, 0xcf, 0xc3, 0xf1, 0xf9, 0xbb, 0x9e, - 0xee, 0x5b, 0x90, 0xae, 0xe8, 0xca, 0xb7, 0x62, 0x97, 0x4c, 0x49, 0x12, 0xbc, 0x64, 0x4a, 0x82, - 0xd9, 0x18, 0x61, 0xe0, 0xea, 0xba, 0x55, 0x9f, 0xd2, 0xcd, 0x46, 0xdb, 0xa1, 0xca, 0xff, 0x13, - 0x1d, 0x23, 0x31, 0x34, 0x1b, 0x23, 0x31, 0x10, 0x5b, 0xa0, 0x19, 0xa8, 0xe4, 0xba, 0xe6, 0x8a, - 0x25, 0xf6, 0x95, 0xed, 0x86, 0xa7, 0xfc, 0xbf, 0xd1, 0x05, 0x3a, 0x8d, 0x86, 0x2d, 0xd0, 0x69, - 0x70, 0x3c, 0x75, 0x4a, 0x49, 0xa5, 0xae, 0xfc, 0x7f, 0xb1, 0x53, 0xa7, 0x14, 0x1a, 0x3c, 0x75, - 0x4a, 0x4b, 0xc3, 0x3e, 0x05, 0xa3, 0xdc, 0x26, 0x9b, 0x31, 0x83, 0xbb, 0xea, 0xff, 0x3f, 0xba, - 0x3e, 0xc6, 0xf1, 0x6c, 0x7d, 0x8c, 0xc3, 0xa2, 0x7c, 0x44, 0x17, 0xfc, 0xb9, 0x4e, 0x7c, 0x02, - 0xf9, 0x27, 0xca, 0x90, 0xeb, 0x32, 0x1f, 0x31, 0x52, 0xbe, 0x3d, 0xd3, 0x89, 0x51, 0x30, 0x3c, - 0x12, 0x85, 0xa2, 0x8c, 0x34, 0x7a, 0xcf, 0xa4, 0x6b, 0xca, 0x27, 0x3b, 0x32, 0xe2, 0x04, 0x51, - 0x46, 0x1c, 0x46, 0xde, 0x80, 0x53, 0x21, 0x6c, 0x96, 0x36, 0x97, 0x82, 0x99, 0xe9, 0x3b, 0x32, - 0x51, 0x33, 0x38, 0x9d, 0x8c, 0x99, 0xc1, 0xe9, 0x98, 0x34, 0xd6, 0x42, 0x74, 0x7f, 0x7e, 0x0b, - 0xd6, 0x81, 0x04, 0x3b, 0x30, 0x48, 0x63, 0x2d, 0xa4, 0xf9, 0x9d, 0x5b, 0xb0, 0x0e, 0x64, 0xda, - 0x81, 0x01, 0xf9, 0x74, 0x06, 0x2e, 0xa4, 0xa3, 0x4a, 0x8d, 0xc6, 0x94, 0xed, 0x84, 0x38, 0xe5, - 0xbb, 0x32, 0xd1, 0x83, 0x86, 0xed, 0x15, 0x9b, 0xee, 0xd1, 0xb6, 0x59, 0x01, 0xf9, 0x20, 0x0c, - 0x97, 0xda, 0x86, 0xe9, 0xe1, 0xc5, 0x1b, 0x33, 0x9c, 0xbf, 0x3b, 0x13, 0xdb, 0xe2, 0xc8, 0x58, - 0xdc, 0xe2, 0xc8, 0x00, 0x72, 0x03, 0xc6, 0xaa, 0xb4, 0xde, 0x76, 0x4c, 0x6f, 0x5d, 0xc3, 0x34, - 0xf9, 0x8c, 0xc7, 0xf7, 0x64, 0xa2, 0x93, 0x58, 0x82, 0x82, 0x4d, 0x62, 0x09, 0x20, 0xb9, 0xdd, - 0x21, 0x99, 0xba, 0xf2, 0xa9, 0x4c, 0xd7, 0x6b, 0xf9, 0xa0, 0x2f, 0x3b, 0xe4, 0x62, 0x5f, 0x48, - 0x4d, 0x4e, 0xad, 0x7c, 0x3a, 0xd3, 0xe5, 0x1a, 0x5d, 0x9a, 0xe1, 0x52, 0xf2, 0x5a, 0x2f, 0xa4, - 0x66, 0x0e, 0x56, 0xbe, 0x37, 0xd3, 0xe5, 0xda, 0x3b, 0xe4, 0x98, 0x96, 0x74, 0xf8, 0x59, 0xee, - 0x29, 0x22, 0x18, 0xfd, 0x85, 0x4c, 0xd2, 0x55, 0x24, 0x28, 0x2f, 0x11, 0xb2, 0x62, 0xb7, 0xdc, - 0x40, 0xe9, 0x3f, 0x93, 0x49, 0xfa, 0xe6, 0x85, 0xc5, 0xc2, 0x5f, 0x84, 0xc2, 0x99, 0xc9, 0xfb, - 0x1e, 0x75, 0x2c, 0xbd, 0x81, 0xdd, 0x59, 0xf5, 0x6c, 0x47, 0x5f, 0xa1, 0x93, 0x96, 0xbe, 0xd4, - 0xa0, 0xca, 0x67, 0x33, 0x51, 0x0b, 0xb6, 0x33, 0x29, 0xb3, 0x60, 0x3b, 0x63, 0xc9, 0x2a, 0x3c, - 0x9c, 0x86, 0x2d, 0x9b, 0x2e, 0xd6, 0xf3, 0xb9, 0x4c, 0xd4, 0x84, 0xed, 0x42, 0xcb, 0x4c, 0xd8, - 0x2e, 0x68, 0x72, 0x15, 0x06, 0xc6, 0x6d, 0x7f, 0xfa, 0xfd, 0x8b, 0x31, 0x67, 0xc8, 0x00, 0x33, - 0xdd, 0xa3, 0x85, 0x64, 0xa2, 0x8c, 0x18, 0xd4, 0x9f, 0x4f, 0x96, 0x09, 0x2f, 0x9f, 0x82, 0x1f, - 0xa2, 0x8c, 0x10, 0xf7, 0x5f, 0x4a, 0x96, 0x09, 0xef, 0xb8, 0x82, 0x1f, 0x6c, 0x26, 0xe1, 0x35, - 0xce, 0x4e, 0x95, 0x98, 0xdd, 0x36, 0xb1, 0xaa, 0x37, 0x1a, 0xd4, 0x5a, 0xa1, 0xca, 0x17, 0x62, - 0x33, 0x49, 0x3a, 0x19, 0x9b, 0x49, 0xd2, 0x31, 0xe4, 0xa3, 0x70, 0xfa, 0xb6, 0xde, 0x30, 0x8d, - 0x10, 0xe7, 0xe7, 0x91, 0x55, 0xbe, 0x2f, 0x13, 0xdd, 0x4d, 0x77, 0xa0, 0x63, 0xbb, 0xe9, 0x0e, - 0x28, 0x32, 0x0b, 0x04, 0x97, 0xd1, 0x60, 0xb6, 0x60, 0xeb, 0xb3, 0xf2, 0x97, 0x33, 0x51, 0x3b, - 0x35, 0x49, 0xc2, 0xec, 0xd4, 0x24, 0x94, 0xd4, 0x3a, 0x07, 0xa4, 0x57, 0xbe, 0x3f, 0x13, 0x3d, - 0xad, 0xe9, 0x44, 0x38, 0xdd, 0xa3, 0x75, 0x8e, 0x6a, 0x7f, 0x1d, 0x46, 0xab, 0x0b, 0x95, 0xa9, - 0xa9, 0xc9, 0xea, 0xed, 0x4a, 0x19, 0xdd, 0x77, 0x0d, 0xe5, 0x07, 0x62, 0x2b, 0x56, 0x9c, 0x80, - 0xad, 0x58, 0x71, 0x18, 0x79, 0x09, 0x86, 0x58, 0xfb, 0xd9, 0x80, 0xc1, 0x4f, 0xfe, 0x62, 0x26, - 0x6a, 0x4e, 0xc9, 0x48, 0x66, 0x4e, 0xc9, 0xbf, 0x49, 0x15, 0x4e, 0x30, 0x29, 0x2e, 0x38, 0x74, - 0x99, 0x3a, 0xd4, 0xaa, 0xfb, 0x63, 0xfa, 0x07, 0x33, 0x51, 0x2b, 0x23, 0x8d, 0x88, 0x59, 0x19, - 0x69, 0x70, 0x72, 0x17, 0xce, 0xc6, 0x4f, 0x82, 0xe4, 0xc7, 0x54, 0xca, 0x0f, 0x65, 0x62, 0xc6, - 0x70, 0x17, 0x62, 0x34, 0x86, 0xbb, 0xe0, 0x89, 0x05, 0xe7, 0xc4, 0xb1, 0x8a, 0x70, 0xb8, 0x8c, - 0xd7, 0xf6, 0x57, 0x78, 0x6d, 0x8f, 0x87, 0x0e, 0x81, 0x5d, 0xa8, 0xa7, 0x7b, 0xb4, 0xee, 0xec, - 0x98, 0x9e, 0x25, 0xc3, 0xae, 0x2b, 0x3f, 0x9c, 0x49, 0xf7, 0x48, 0x89, 0xb8, 0x29, 0xa7, 0xc5, - 0x6b, 0x7f, 0xa3, 0x53, 0xd0, 0x70, 0xe5, 0x47, 0x62, 0xe3, 0x2d, 0x9d, 0x8c, 0x8d, 0xb7, 0x0e, - 0x51, 0xc7, 0x6f, 0xc0, 0x18, 0x57, 0xea, 0x05, 0x1d, 0x87, 0xa1, 0xb5, 0x42, 0x0d, 0xe5, 0xaf, - 0xc6, 0x56, 0xbb, 0x04, 0x05, 0xba, 0xf6, 0xc4, 0x81, 0x6c, 0xea, 0xae, 0xb6, 0x74, 0xcb, 0xc2, - 0x63, 0x56, 0xe5, 0xaf, 0xc5, 0xa6, 0xee, 0x10, 0x85, 0x8e, 0xbb, 0xc1, 0x2f, 0xa6, 0x09, 0xdd, - 0x12, 0x6e, 0x28, 0x3f, 0x1a, 0xd3, 0x84, 0x6e, 0xc4, 0x4c, 0x13, 0xba, 0x66, 0xef, 0xb8, 0xdd, - 0xe1, 0x61, 0xa3, 0xf2, 0xa5, 0xd8, 0x8a, 0x9c, 0x4a, 0xc5, 0x56, 0xe4, 0xf4, 0x77, 0x91, 0xb7, - 0x3b, 0x3c, 0x0a, 0x54, 0x7e, 0xac, 0x3b, 0xdf, 0x70, 0xa5, 0x4f, 0x7f, 0x53, 0x78, 0xbb, 0xc3, - 0x83, 0x3a, 0xe5, 0xc7, 0xbb, 0xf3, 0x0d, 0x1d, 0xfb, 0xd2, 0xdf, 0xe3, 0xd5, 0x3a, 0x3f, 0x46, - 0x53, 0x7e, 0x22, 0x3e, 0x75, 0x75, 0x20, 0xc4, 0xa9, 0xab, 0xd3, 0x8b, 0xb6, 0x1b, 0x29, 0x4f, - 0xc2, 0x94, 0x9f, 0x8c, 0x29, 0x56, 0x82, 0x82, 0x29, 0x56, 0xf2, 0x25, 0xd9, 0x8d, 0x94, 0x97, - 0x4f, 0xca, 0x5f, 0xef, 0xcc, 0x2b, 0x10, 0x6a, 0xca, 0x83, 0xa9, 0x1b, 0x29, 0x0f, 0x7c, 0x94, - 0xbf, 0xd1, 0x99, 0x57, 0xe8, 0x1f, 0x94, 0x00, 0x8e, 0xf7, 0x41, 0x2f, 0xee, 0x38, 0xd5, 0x2f, - 0x65, 0x60, 0xa8, 0xea, 0x39, 0x54, 0x6f, 0x8a, 0x68, 0x0f, 0x67, 0xa0, 0x9f, 0xbb, 0x6e, 0xf9, - 0xaf, 0x27, 0xb4, 0xe0, 0x37, 0xb9, 0x00, 0x23, 0x33, 0xba, 0xeb, 0x61, 0xc9, 0x8a, 0x65, 0xd0, - 0xfb, 0xf8, 0x6c, 0x21, 0xa7, 0xc5, 0xa0, 0x64, 0x86, 0xd3, 0xf1, 0x72, 0x18, 0x9b, 0x27, 0xb7, - 0x65, 0x90, 0x83, 0xfe, 0xb7, 0x37, 0x8a, 0x3d, 0x18, 0xd3, 0x20, 0x56, 0x56, 0xfd, 0x5a, 0x06, - 0x12, 0x4e, 0x65, 0xbb, 0x7f, 0xd5, 0x34, 0x0f, 0xc7, 0x62, 0xf1, 0xa0, 0xc4, 0xdb, 0x8b, 0x6d, - 0x86, 0x8b, 0x8a, 0x97, 0x26, 0xef, 0x0d, 0x7c, 0xfe, 0x6f, 0x69, 0x33, 0x22, 0x80, 0x45, 0xdf, - 0xe6, 0x46, 0x31, 0xd7, 0x76, 0x1a, 0x9a, 0x84, 0x12, 0x0f, 0x94, 0x7f, 0x61, 0x34, 0x0c, 0x76, - 0x43, 0x2e, 0x88, 0x27, 0x56, 0x99, 0x30, 0xec, 0x45, 0x2c, 0x95, 0x22, 0x7f, 0x52, 0xf5, 0x41, - 0x18, 0xaa, 0x34, 0x5b, 0xd4, 0x71, 0x6d, 0x4b, 0xf7, 0x6c, 0x3f, 0x65, 0x3b, 0x86, 0x44, 0x30, - 0x25, 0xb8, 0xfc, 0x4c, 0x5f, 0xa6, 0x27, 0x97, 0xfc, 0xec, 0x0e, 0x39, 0x0c, 0x33, 0x84, 0xb1, - 0x32, 0xe3, 0xe9, 0xf9, 0x38, 0x05, 0x23, 0xbd, 0xe5, 0xea, 0xf8, 0x3a, 0x24, 0x20, 0x6d, 0x33, - 0x80, 0x4c, 0x8a, 0x14, 0xe4, 0x49, 0x28, 0xe0, 0x69, 0x9a, 0x8b, 0x59, 0x5b, 0x44, 0x30, 0x8e, - 0x06, 0x42, 0xe4, 0xd0, 0x07, 0x9c, 0x86, 0xdc, 0x84, 0xd1, 0xf0, 0xaa, 0xe0, 0xba, 0x63, 0xb7, - 0x5b, 0x7e, 0x9c, 0x66, 0x4c, 0x6b, 0x78, 0x37, 0xc0, 0xd5, 0x56, 0x10, 0x29, 0xb1, 0x48, 0x14, - 0x24, 0xd3, 0x70, 0x2c, 0x84, 0x31, 0x11, 0xf9, 0xf1, 0xe1, 0x31, 0x37, 0x8f, 0xc4, 0x8b, 0x89, - 0x33, 0x92, 0x9b, 0x27, 0x56, 0x8c, 0x54, 0xa0, 0xcf, 0x8f, 0xc4, 0xd1, 0xbf, 0xa5, 0x92, 0x1e, - 0x17, 0x91, 0x38, 0xfa, 0xe4, 0x18, 0x1c, 0x7e, 0x79, 0x32, 0x05, 0x23, 0x9a, 0xdd, 0xf6, 0xe8, - 0xa2, 0x2d, 0xd6, 0x58, 0x11, 0x40, 0x18, 0xdb, 0xe4, 0x30, 0x4c, 0xcd, 0xb3, 0xfd, 0xac, 0x90, - 0x72, 0x76, 0xc2, 0x68, 0x29, 0x32, 0x07, 0x63, 0x89, 0x4b, 0x15, 0x39, 0x57, 0xa3, 0xf4, 0x79, - 0x49, 0x66, 0xc9, 0xa2, 0xe4, 0xbb, 0x33, 0x50, 0x58, 0x74, 0x74, 0xd3, 0x73, 0xc5, 0xc3, 0x92, - 0x93, 0x97, 0xd7, 0x1c, 0xbd, 0xc5, 0xf4, 0xe3, 0x32, 0xc6, 0x91, 0xba, 0xad, 0x37, 0xda, 0xd4, - 0x1d, 0xbf, 0xc3, 0xbe, 0xee, 0x5f, 0x6f, 0x14, 0x5f, 0x5a, 0xc1, 0xad, 0xdb, 0xe5, 0xba, 0xdd, - 0xbc, 0xb2, 0xe2, 0xe8, 0xf7, 0x4c, 0x0f, 0xa7, 0x0e, 0xbd, 0x71, 0xc5, 0xa3, 0x0d, 0xdc, 0x21, - 0x5e, 0xd1, 0x5b, 0xe6, 0x15, 0x8c, 0x57, 0x78, 0x25, 0xe0, 0xc4, 0x6b, 0x60, 0x2a, 0xe0, 0xe1, - 0x5f, 0xb2, 0x0a, 0x70, 0x1c, 0x99, 0x63, 0x1b, 0x2b, 0xfc, 0xd4, 0x52, 0xab, 0x25, 0x5e, 0xa9, - 0x48, 0xfb, 0x2a, 0x1f, 0xc3, 0x15, 0x3b, 0x10, 0x98, 0xde, 0x6a, 0xc9, 0xd9, 0x60, 0x43, 0x3a, - 0xa6, 0x05, 0x8b, 0xa2, 0x45, 0xbe, 0x98, 0x86, 0x43, 0x89, 0xfb, 0x8d, 0x4d, 0x11, 0x52, 0xbc, - 0x18, 0x59, 0x82, 0x63, 0x82, 0x6f, 0x10, 0xd1, 0x77, 0x24, 0x3a, 0x2b, 0xc4, 0xd0, 0x5c, 0x69, - 0x83, 0x36, 0x1a, 0x02, 0x2c, 0xd7, 0x11, 0x2b, 0x41, 0xc6, 0xc3, 0x34, 0x63, 0x73, 0x7a, 0x93, - 0xba, 0xca, 0x31, 0xd4, 0xd8, 0xb3, 0x9b, 0x1b, 0x45, 0xc5, 0x2f, 0x8f, 0x41, 0x69, 0x52, 0x93, - 0x66, 0x62, 0x11, 0x99, 0x07, 0xd7, 0xfa, 0xd1, 0x14, 0x1e, 0x71, 0x9d, 0x8f, 0x16, 0x21, 0x13, - 0x30, 0x1c, 0x38, 0xc9, 0xde, 0xba, 0x55, 0x29, 0xe3, 0x33, 0x98, 0x81, 0xf1, 0x73, 0x9b, 0x1b, - 0xc5, 0x87, 0x62, 0x31, 0x77, 0x65, 0x26, 0x91, 0x32, 0xd2, 0x7b, 0x39, 0xfe, 0x2e, 0x26, 0xf6, - 0x5e, 0xae, 0x95, 0xf2, 0x5e, 0x6e, 0x81, 0xbc, 0x02, 0x83, 0xa5, 0x3b, 0x55, 0xf1, 0x0e, 0xd0, - 0x55, 0x8e, 0x87, 0x51, 0xda, 0x31, 0x6f, 0xaa, 0x78, 0x33, 0x28, 0x37, 0x5d, 0xa6, 0x27, 0x93, - 0x30, 0x12, 0xb9, 0x67, 0x77, 0x95, 0x13, 0xc8, 0x01, 0x5b, 0xae, 0x23, 0xa6, 0xe6, 0x08, 0x54, - 0x24, 0x93, 0x6f, 0xa4, 0x10, 0xd3, 0x1a, 0xb6, 0x55, 0x6d, 0x34, 0xec, 0x35, 0x8d, 0xe2, 0x93, - 0x43, 0x7c, 0x54, 0xd3, 0xcf, 0xb5, 0xc6, 0x10, 0xa8, 0x9a, 0xc3, 0x71, 0x91, 0xd4, 0xbd, 0xd1, - 0x62, 0xe4, 0x4d, 0x20, 0x18, 0x23, 0x9b, 0x1a, 0xfe, 0xb1, 0x6b, 0xa5, 0xec, 0x2a, 0xa7, 0x30, - 0x9e, 0x1e, 0x89, 0xbf, 0x79, 0xad, 0x94, 0xc7, 0x2f, 0x88, 0xe9, 0xe3, 0xbc, 0xce, 0x4b, 0xd5, - 0x1c, 0x81, 0xab, 0x99, 0x91, 0x04, 0x62, 0x29, 0x5c, 0xc9, 0x1a, 0x9c, 0x5e, 0x70, 0xe8, 0x3d, - 0xd3, 0x6e, 0xbb, 0xfe, 0xf2, 0xe1, 0xcf, 0x5b, 0xa7, 0xb7, 0x9c, 0xb7, 0x1e, 0x15, 0x15, 0x9f, - 0x6c, 0x39, 0xf4, 0x5e, 0xcd, 0x8f, 0xa2, 0x16, 0x89, 0x24, 0xd4, 0x89, 0x3b, 0xa6, 0x41, 0x7b, - 0xab, 0xed, 0x50, 0x01, 0x37, 0xa9, 0xab, 0x28, 0xe1, 0x54, 0xcb, 0x5f, 0x8f, 0x9a, 0x01, 0x2e, - 0x92, 0x06, 0x2d, 0x5a, 0x8c, 0x68, 0x40, 0xae, 0x4f, 0xf8, 0x47, 0xf0, 0xa5, 0x3a, 0x4f, 0x16, - 0xa5, 0x3c, 0x84, 0xcc, 0x54, 0x26, 0x96, 0x95, 0x7a, 0x10, 0x51, 0xb1, 0xa6, 0x0b, 0xbc, 0x2c, - 0x96, 0x64, 0x69, 0x32, 0x03, 0xa3, 0x0b, 0x0e, 0x6e, 0x08, 0x6e, 0xd2, 0xf5, 0x05, 0xbb, 0x61, - 0xd6, 0xd7, 0xf1, 0x6d, 0x8f, 0x98, 0x2a, 0x5b, 0x1c, 0x57, 0xbb, 0x4b, 0xd7, 0x6b, 0x2d, 0xc4, - 0xca, 0xcb, 0x4a, 0xbc, 0xa4, 0x1c, 0xe1, 0xec, 0xe1, 0xed, 0x45, 0x38, 0xa3, 0x30, 0x2a, 0x0e, - 0xf0, 0xef, 0x7b, 0xd4, 0x62, 0x4b, 0xbd, 0x2b, 0xde, 0xf1, 0x28, 0xb1, 0x03, 0xff, 0x00, 0x2f, - 0xd2, 0xf8, 0xf2, 0x51, 0x46, 0x03, 0xb0, 0xdc, 0xb0, 0x78, 0x11, 0xf5, 0x17, 0x72, 0xf2, 0xd4, - 0x49, 0xce, 0x42, 0x5e, 0x0a, 0xb0, 0x8d, 0x31, 0x8e, 0x30, 0x18, 0x61, 0x5e, 0x44, 0x5d, 0x1b, - 0x10, 0x66, 0x47, 0xf0, 0x98, 0x15, 0xd3, 0xa6, 0x84, 0x71, 0x6f, 0xb4, 0x90, 0x00, 0x53, 0x56, - 0xb4, 0x97, 0x1a, 0x66, 0x1d, 0x43, 0x54, 0xe6, 0xa4, 0x94, 0x15, 0x08, 0xe5, 0x11, 0x2a, 0x25, - 0x12, 0x72, 0x15, 0x06, 0xfd, 0x3d, 0x64, 0x18, 0xe3, 0x0b, 0x23, 0x17, 0xfa, 0x09, 0x8f, 0x79, - 0x60, 0x44, 0x89, 0x88, 0xbc, 0x88, 0x29, 0xbf, 0xfd, 0x87, 0xc2, 0xbd, 0xa1, 0xf9, 0x22, 0x0f, - 0xfc, 0x58, 0xce, 0x6f, 0xff, 0xbd, 0xf0, 0x38, 0x0c, 0xcb, 0x9a, 0xe4, 0x27, 0xe9, 0xc1, 0x39, - 0x2f, 0xa2, 0x7e, 0x72, 0xdf, 0x46, 0x8b, 0x90, 0x79, 0x18, 0x4b, 0x28, 0x8f, 0x88, 0x08, 0x86, - 0x89, 0x1a, 0x53, 0x34, 0x4f, 0x5e, 0x53, 0x13, 0x65, 0xc9, 0x63, 0x90, 0xbb, 0xa5, 0x55, 0x44, - 0x54, 0x22, 0x1e, 0xd0, 0x2a, 0xf2, 0x64, 0x99, 0x61, 0xd5, 0xef, 0xc8, 0x26, 0x96, 0x15, 0x26, - 0x3d, 0xc1, 0x4a, 0xea, 0x41, 0x94, 0x9e, 0x5f, 0x3f, 0x97, 0x9e, 0x44, 0x44, 0x2e, 0x42, 0x7f, - 0x2c, 0x35, 0x38, 0xbe, 0x2f, 0x0f, 0xf2, 0x82, 0x07, 0x58, 0x72, 0x55, 0xca, 0x2d, 0x25, 0xc5, - 0xe8, 0xf3, 0x73, 0x4b, 0xc5, 0x83, 0xd5, 0x61, 0x96, 0xa9, 0xab, 0xb1, 0x30, 0xf6, 0x7e, 0x06, - 0xe7, 0xe4, 0x92, 0x16, 0x86, 0xad, 0x0f, 0x0c, 0xca, 0xde, 0xad, 0x0c, 0x4a, 0xf5, 0x57, 0x33, - 0xc9, 0x21, 0x42, 0xae, 0x25, 0x63, 0x6e, 0xf1, 0xe4, 0xcd, 0x3e, 0x50, 0xae, 0x35, 0x88, 0xbe, - 0x15, 0x89, 0x9e, 0x95, 0xdd, 0x75, 0xf4, 0xac, 0xdc, 0x0e, 0xa3, 0x67, 0xa9, 0xff, 0x2b, 0xdf, - 0xd5, 0x57, 0xec, 0x40, 0xa2, 0x2c, 0xbc, 0xc0, 0x36, 0x45, 0xac, 0xf6, 0x92, 0x9b, 0x30, 0xed, - 0xb9, 0x2b, 0x4c, 0x4d, 0xe7, 0x43, 0xcb, 0xd5, 0xa2, 0x94, 0xe4, 0x55, 0x18, 0xf2, 0x3f, 0x00, - 0xa3, 0xb2, 0x49, 0xd1, 0xc4, 0x82, 0x05, 0x29, 0x9e, 0x7f, 0x5b, 0x2e, 0x40, 0x9e, 0x85, 0x01, - 0x34, 0x47, 0x5a, 0x7a, 0xdd, 0x0f, 0xd9, 0xc7, 0x63, 0xfc, 0xf9, 0x40, 0x39, 0x92, 0x40, 0x40, - 0x49, 0x3e, 0x06, 0x85, 0x48, 0x02, 0xf8, 0x2b, 0xdb, 0x70, 0xae, 0xbb, 0x2c, 0x87, 0x9b, 0xe5, - 0x1b, 0x8c, 0x78, 0xf2, 0x77, 0xc1, 0x94, 0x2c, 0xc2, 0xf1, 0x05, 0x87, 0x1a, 0xe8, 0xc6, 0x39, - 0x79, 0xbf, 0xe5, 0x88, 0x60, 0xc0, 0x7c, 0x94, 0xe3, 0xfa, 0xd2, 0xf2, 0xd1, 0x6c, 0xe5, 0x13, - 0x78, 0x39, 0x6e, 0x58, 0x4a, 0x71, 0x66, 0x74, 0xf0, 0x96, 0xdc, 0xa4, 0xeb, 0x6b, 0x98, 0x04, - 0xb4, 0x3f, 0x34, 0x3a, 0x84, 0xa0, 0xef, 0x0a, 0x94, 0x6c, 0x74, 0x44, 0x0b, 0x9d, 0x79, 0x01, - 0x06, 0x77, 0x1b, 0xb2, 0xf5, 0xe7, 0xb3, 0x1d, 0xbc, 0xae, 0x1f, 0xdc, 0xac, 0x19, 0x41, 0xbe, - 0xb6, 0xde, 0x0e, 0xf9, 0xda, 0xbe, 0x99, 0xed, 0xe0, 0x52, 0xfe, 0x40, 0xe7, 0x55, 0x0a, 0x84, - 0x11, 0xcd, 0xab, 0x14, 0xa6, 0xb4, 0x32, 0x0d, 0x4d, 0x26, 0x8a, 0x65, 0x60, 0x2b, 0x6c, 0x99, - 0x81, 0xed, 0xa7, 0x72, 0xdd, 0x5c, 0xee, 0x8f, 0x64, 0xbf, 0x13, 0xd9, 0x5f, 0x85, 0xc1, 0x40, - 0xb2, 0x95, 0x32, 0x1a, 0x3d, 0xc3, 0x41, 0x80, 0x68, 0x0e, 0xc6, 0x32, 0x12, 0x11, 0xb9, 0xc4, - 0xdb, 0x5a, 0x35, 0xdf, 0xe2, 0xf1, 0x4e, 0x87, 0x45, 0x24, 0x4b, 0xdd, 0xd3, 0x6b, 0xae, 0xf9, - 0x16, 0xd5, 0x02, 0xb4, 0xfa, 0x0f, 0xb3, 0xa9, 0xef, 0x16, 0x8e, 0xfa, 0x68, 0x07, 0x7d, 0x94, - 0x22, 0x44, 0xfe, 0xe2, 0xe2, 0x48, 0x88, 0x3b, 0x10, 0xe2, 0x1f, 0x66, 0x53, 0xdf, 0xa7, 0x1c, - 0x09, 0x71, 0x27, 0xb3, 0xc5, 0x93, 0x30, 0xa0, 0xd9, 0x6b, 0x2e, 0xa6, 0x5b, 0x16, 0x73, 0x05, - 0x4e, 0xd4, 0x8e, 0xbd, 0xe6, 0xf2, 0x54, 0xd4, 0x5a, 0x48, 0xa0, 0xfe, 0x71, 0xb6, 0xcb, 0x0b, - 0x9e, 0x23, 0xc1, 0xbf, 0x93, 0x4b, 0xe4, 0x2f, 0x65, 0x23, 0x2f, 0x84, 0x1e, 0xe8, 0x04, 0xa5, - 0xd5, 0xfa, 0x2a, 0x6d, 0xea, 0xf1, 0x04, 0xa5, 0x2e, 0x42, 0x45, 0x9a, 0xb0, 0x90, 0x44, 0xfd, - 0x72, 0x36, 0xf6, 0x44, 0xea, 0x48, 0x76, 0xdb, 0x96, 0x5d, 0xa0, 0x75, 0xe2, 0xd5, 0xd7, 0x91, - 0xe4, 0xb6, 0x2b, 0xb9, 0x4f, 0x65, 0x63, 0x0f, 0xe4, 0x1e, 0x58, 0xd9, 0xb1, 0x01, 0x98, 0x7c, - 0xb8, 0xf7, 0xc0, 0x6a, 0xd2, 0x93, 0x30, 0x20, 0xe4, 0x10, 0x2c, 0x15, 0x7c, 0xde, 0xe7, 0x40, - 0x3c, 0x65, 0x0d, 0x08, 0xd4, 0xef, 0xca, 0x42, 0xf4, 0xe1, 0xe2, 0x03, 0xaa, 0x43, 0xbf, 0x94, - 0x8d, 0x3e, 0xd9, 0x7c, 0x70, 0xf5, 0xe7, 0x32, 0x40, 0xb5, 0xbd, 0x54, 0x17, 0x11, 0xff, 0x7a, - 0xa5, 0x63, 0xfa, 0x00, 0xaa, 0x49, 0x14, 0xea, 0xff, 0xce, 0xa6, 0xbe, 0x23, 0x7d, 0x70, 0x05, - 0xf8, 0x0c, 0x9e, 0x8a, 0xd7, 0xad, 0x70, 0x22, 0xc7, 0x43, 0x48, 0x36, 0xfe, 0x12, 0x89, 0x46, - 0x7c, 0x42, 0xf2, 0x81, 0x14, 0x73, 0x0d, 0xc3, 0xa0, 0x86, 0xe6, 0x9a, 0x7c, 0x0d, 0x21, 0x19, - 0x6e, 0xff, 0x2c, 0xbb, 0xd5, 0xb3, 0xdb, 0x07, 0x79, 0x55, 0xed, 0x5b, 0xd0, 0xd7, 0x31, 0x3c, - 0x14, 0xeb, 0x89, 0x21, 0x9e, 0x06, 0xa3, 0xc5, 0x41, 0xf2, 0xb5, 0x99, 0xa0, 0x52, 0xff, 0xa0, - 0x37, 0xfd, 0xcd, 0xe7, 0x83, 0x2b, 0xc2, 0xb3, 0x90, 0x5f, 0xd0, 0xbd, 0x55, 0xa1, 0xc9, 0x78, - 0xa5, 0xd7, 0xd2, 0xbd, 0x55, 0x0d, 0xa1, 0xe4, 0x12, 0xf4, 0x6b, 0xfa, 0x1a, 0x3f, 0xf3, 0x2c, - 0x84, 0x29, 0x4a, 0x1c, 0x7d, 0xad, 0xc6, 0xcf, 0x3d, 0x03, 0x34, 0x51, 0x83, 0x14, 0x39, 0xfc, - 0xe4, 0x1b, 0xf3, 0x33, 0xf0, 0x14, 0x39, 0x41, 0x62, 0x9c, 0xb3, 0x90, 0x1f, 0xb7, 0x8d, 0x75, - 0xbc, 0xbe, 0x1a, 0xe2, 0x95, 0x2d, 0xd9, 0xc6, 0xba, 0x86, 0x50, 0xf2, 0xe9, 0x0c, 0xf4, 0x4d, - 0x53, 0xdd, 0x60, 0x23, 0x64, 0xa0, 0x9b, 0xc3, 0xc8, 0x87, 0xf6, 0xc7, 0x61, 0x64, 0x6c, 0x95, - 0x57, 0x26, 0x2b, 0x8a, 0xa8, 0x9f, 0x5c, 0x87, 0xfe, 0x09, 0xdd, 0xa3, 0x2b, 0xb6, 0xb3, 0x8e, - 0x2e, 0x30, 0x23, 0xa1, 0xdf, 0x60, 0x44, 0x7f, 0x7c, 0x22, 0x7e, 0x33, 0x56, 0x17, 0xbf, 0xb4, - 0xa0, 0x30, 0x13, 0x8b, 0xc8, 0xb7, 0x39, 0x18, 0x8a, 0x85, 0x27, 0xd6, 0x0c, 0xd2, 0x6a, 0x06, - 0xc7, 0xca, 0x43, 0xe9, 0xc7, 0xca, 0x68, 0x3d, 0xa2, 0x9b, 0x1c, 0x26, 0xa6, 0x19, 0xc6, 0x45, - 0x9f, 0x5b, 0x8f, 0x08, 0xc5, 0xbc, 0x34, 0x9a, 0x44, 0xa2, 0x7e, 0xbd, 0x17, 0x52, 0x5f, 0x88, - 0x1d, 0x29, 0xf9, 0x91, 0x92, 0x87, 0x4a, 0x5e, 0x4e, 0x28, 0xf9, 0x99, 0xe4, 0x9b, 0xc3, 0x77, - 0xa9, 0x86, 0x7f, 0x31, 0x9f, 0x78, 0xb1, 0xfc, 0x60, 0xef, 0x2e, 0x43, 0xe9, 0xf5, 0x6e, 0x29, - 0xbd, 0x60, 0x40, 0x14, 0xb6, 0x1c, 0x10, 0x7d, 0xdb, 0x1d, 0x10, 0xfd, 0x1d, 0x07, 0x44, 0xa8, - 0x20, 0x03, 0x1d, 0x15, 0xa4, 0x22, 0x06, 0x0d, 0x74, 0x4f, 0x7a, 0x76, 0x76, 0x73, 0xa3, 0x38, - 0xc2, 0x46, 0x53, 0x6a, 0xba, 0x33, 0x64, 0xa1, 0x7e, 0x2d, 0xdf, 0x25, 0xcc, 0xc0, 0x81, 0xe8, - 0xc8, 0x33, 0x90, 0x2b, 0xb5, 0x5a, 0x42, 0x3f, 0x8e, 0x4b, 0x11, 0x0e, 0x3a, 0x94, 0x62, 0xd4, - 0xe4, 0x45, 0xc8, 0x95, 0xee, 0x54, 0xe3, 0xc1, 0xd2, 0x4b, 0x77, 0xaa, 0xe2, 0x4b, 0x3a, 0x96, - 0xbd, 0x53, 0x25, 0x2f, 0x87, 0x51, 0xcb, 0x56, 0xdb, 0xd6, 0x5d, 0xb1, 0x51, 0x14, 0x9e, 0xb2, - 0xbe, 0x3b, 0x4e, 0x9d, 0xa1, 0xd8, 0x76, 0x31, 0x46, 0x1b, 0xd3, 0xa6, 0xc2, 0xf6, 0xb5, 0xa9, - 0x6f, 0x4b, 0x6d, 0xea, 0xdf, 0xae, 0x36, 0x0d, 0x6c, 0x43, 0x9b, 0x60, 0x4b, 0x6d, 0x1a, 0xdc, - 0xbb, 0x36, 0xb5, 0xe0, 0x4c, 0x32, 0x34, 0x4c, 0xa0, 0x11, 0x1a, 0x90, 0x24, 0x56, 0x38, 0x96, - 0xe0, 0xd5, 0x7f, 0x9b, 0x63, 0x6b, 0x3c, 0x2f, 0x6e, 0x3c, 0xab, 0xac, 0x96, 0x52, 0x5a, 0xfd, - 0xf9, 0x6c, 0xe7, 0x88, 0x36, 0x87, 0x73, 0x8a, 0xfb, 0xb6, 0x54, 0x29, 0xe5, 0xa3, 0x2f, 0x0c, - 0x3b, 0x4b, 0x39, 0xc6, 0x36, 0x4d, 0x66, 0x5f, 0xcd, 0x74, 0x0a, 0xb3, 0xb3, 0x27, 0x89, 0x3d, - 0x9e, 0xf4, 0x68, 0x43, 0x17, 0x7b, 0x37, 0xea, 0xca, 0x16, 0x4f, 0xb3, 0x9a, 0xdb, 0x65, 0x9a, - 0xd5, 0x5f, 0xcd, 0xc0, 0xf1, 0x9b, 0xed, 0x25, 0x2a, 0x3c, 0xd8, 0x82, 0x66, 0xbc, 0x09, 0xc0, - 0xc0, 0xc2, 0x89, 0x25, 0x83, 0x4e, 0x2c, 0xef, 0x93, 0x43, 0xe4, 0xc4, 0x0a, 0x5c, 0x0e, 0xa9, - 0xb9, 0x03, 0xcb, 0x39, 0xdf, 0x0f, 0xf3, 0x6e, 0x7b, 0x89, 0xd6, 0x12, 0x9e, 0x2c, 0x12, 0xf7, - 0x33, 0xaf, 0x70, 0x0f, 0xf7, 0xdd, 0x3a, 0x8d, 0xfc, 0x6c, 0xb6, 0x63, 0x54, 0xa2, 0x43, 0x9b, - 0x14, 0xe6, 0x23, 0xa9, 0xbd, 0x12, 0x4f, 0x0e, 0x93, 0x42, 0x12, 0xe3, 0x98, 0xc6, 0x25, 0x5d, - 0x60, 0x87, 0x3c, 0x55, 0xd1, 0x3b, 0x2a, 0xb0, 0xdf, 0xca, 0x74, 0x8c, 0x1e, 0x75, 0x58, 0x05, - 0xa6, 0xfe, 0x87, 0x9c, 0x1f, 0xb4, 0x6a, 0x4f, 0x9f, 0xf0, 0x24, 0x0c, 0x88, 0xb7, 0x7b, 0x51, - 0x07, 0x5c, 0x71, 0x94, 0x87, 0x47, 0xc3, 0x01, 0x01, 0x5b, 0xe6, 0xfd, 0xa0, 0x3a, 0x41, 0x8e, - 0x5d, 0x5c, 0xe6, 0x4d, 0x01, 0x65, 0xf4, 0x12, 0x09, 0x5b, 0xc8, 0x27, 0xef, 0x9b, 0x1e, 0x5a, - 0x05, 0xac, 0x2f, 0x73, 0x7c, 0x21, 0xa7, 0xf7, 0x4d, 0x8f, 0xdb, 0x04, 0x01, 0x9a, 0x2d, 0xd2, - 0xd5, 0x30, 0x11, 0xa3, 0x58, 0xa4, 0x5d, 0x91, 0x8f, 0x52, 0xbc, 0xf8, 0x7a, 0x12, 0x06, 0x84, - 0x57, 0xab, 0x70, 0x33, 0x11, 0xad, 0x15, 0x7e, 0xb0, 0xd8, 0xda, 0x80, 0x80, 0x71, 0xd4, 0xe8, - 0x4a, 0xe8, 0x58, 0x87, 0x1c, 0x1d, 0x84, 0x68, 0x02, 0x43, 0xae, 0xc2, 0x48, 0xd5, 0xd3, 0x2d, - 0x43, 0x77, 0x8c, 0xf9, 0xb6, 0xd7, 0x6a, 0x7b, 0xb2, 0x51, 0xea, 0x7a, 0x86, 0xdd, 0xf6, 0xb4, - 0x18, 0x05, 0x79, 0x3f, 0x0c, 0xfb, 0x90, 0x49, 0xc7, 0xb1, 0x1d, 0xd9, 0xf2, 0x70, 0x3d, 0x83, - 0x3a, 0x8e, 0x16, 0x25, 0x20, 0x1f, 0x80, 0xe1, 0x8a, 0x75, 0xcf, 0xe6, 0x19, 0x3e, 0x6f, 0x69, - 0x33, 0xc2, 0x0e, 0xc1, 0x57, 0x54, 0x66, 0x80, 0xa8, 0xb5, 0x9d, 0x86, 0x16, 0x25, 0x54, 0x37, - 0xb3, 0xc9, 0xd8, 0x5e, 0x0f, 0xee, 0xa6, 0xe5, 0x52, 0xd4, 0x99, 0x0e, 0x3d, 0x48, 0xd1, 0x20, - 0x94, 0x7d, 0x79, 0xb9, 0x5d, 0x78, 0x15, 0xfa, 0x6f, 0xd2, 0x75, 0xee, 0xf7, 0x59, 0x08, 0x5d, - 0x85, 0xef, 0x0a, 0x98, 0x7c, 0xe2, 0xea, 0xd3, 0xa9, 0x5f, 0xc9, 0x26, 0xa3, 0x96, 0x3d, 0xb8, - 0xc2, 0x7e, 0x3f, 0xf4, 0xa1, 0x28, 0x2b, 0xfe, 0x91, 0x3f, 0x0a, 0x10, 0xc5, 0x1d, 0xf5, 0x40, - 0xf6, 0xc9, 0xd4, 0x1f, 0x2b, 0xc4, 0x43, 0xd9, 0x3d, 0xb8, 0xd2, 0x7b, 0x09, 0x06, 0x27, 0x6c, - 0xcb, 0x35, 0x5d, 0x8f, 0x5a, 0x75, 0x5f, 0x61, 0x1f, 0x62, 0x06, 0x55, 0x3d, 0x04, 0xcb, 0xcf, - 0x87, 0x24, 0xea, 0xdd, 0x28, 0x2f, 0x79, 0x0e, 0x06, 0x50, 0xe4, 0xe8, 0x27, 0x2d, 0x65, 0x10, - 0x5f, 0x62, 0xc0, 0xb8, 0x93, 0x74, 0x48, 0x4a, 0x6e, 0x41, 0xff, 0xc4, 0xaa, 0xd9, 0x30, 0x1c, - 0x6a, 0xa1, 0xbf, 0xb0, 0x14, 0x50, 0x2f, 0xda, 0x97, 0x97, 0xf1, 0x5f, 0xa4, 0xe5, 0xcd, 0xa9, - 0x8b, 0x62, 0x91, 0x07, 0x54, 0x02, 0x76, 0xe6, 0xfb, 0xb3, 0x00, 0x61, 0x01, 0xf2, 0x08, 0x64, - 0x83, 0x1c, 0x67, 0xe8, 0xa6, 0x12, 0xd1, 0xa0, 0x2c, 0x2e, 0x15, 0x62, 0x6c, 0x67, 0xb7, 0x1c, - 0xdb, 0xb7, 0xa0, 0xc0, 0x4f, 0xbc, 0xd0, 0x93, 0x5c, 0x8a, 0xae, 0xd5, 0xb1, 0xc1, 0x97, 0x91, - 0x9e, 0x6f, 0x66, 0xd1, 0xf2, 0x8c, 0x78, 0x65, 0x73, 0x66, 0x67, 0xea, 0xd0, 0x8b, 0x7f, 0x91, - 0x0b, 0x90, 0x47, 0x29, 0x66, 0x70, 0x1f, 0x8b, 0xb3, 0x74, 0x4c, 0x7e, 0x88, 0x67, 0xdd, 0x34, - 0x61, 0x5b, 0x1e, 0xab, 0x1a, 0x5b, 0x3d, 0x24, 0xe4, 0x22, 0x60, 0x11, 0xb9, 0x08, 0x98, 0xfa, - 0x4f, 0xb3, 0x29, 0x41, 0x16, 0x1f, 0xdc, 0x61, 0xf2, 0x02, 0x00, 0xbe, 0xc6, 0x66, 0xf2, 0xf4, - 0x9f, 0x68, 0xe0, 0x28, 0x41, 0x46, 0xa8, 0xb6, 0x91, 0x6d, 0x47, 0x48, 0xac, 0xfe, 0x7a, 0x26, - 0x11, 0x99, 0x6f, 0x4f, 0x72, 0x94, 0xad, 0xb2, 0xec, 0x2e, 0xcd, 0x58, 0xbf, 0x2f, 0x72, 0x3b, - 0xeb, 0x8b, 0xe8, 0xb7, 0xec, 0x83, 0x65, 0x7a, 0x90, 0xdf, 0xf2, 0xf5, 0x6c, 0x5a, 0x9c, 0xc2, - 0xc3, 0xa9, 0xe2, 0xd7, 0x02, 0xa3, 0x34, 0xbf, 0x9d, 0xec, 0xe0, 0xc2, 0x4c, 0xfd, 0x38, 0x1c, - 0x8b, 0x45, 0xef, 0x13, 0x89, 0x07, 0x2f, 0x74, 0x0f, 0x03, 0xd8, 0xf9, 0x1d, 0x7f, 0x84, 0x4c, - 0xfd, 0x3f, 0x99, 0xee, 0xb1, 0x1b, 0x0f, 0x5c, 0x75, 0x52, 0x04, 0x90, 0xfb, 0xb3, 0x11, 0xc0, - 0x3e, 0x6c, 0x83, 0x0f, 0xb7, 0x00, 0xde, 0x25, 0x93, 0xc7, 0x3b, 0x2d, 0x80, 0x1f, 0xcb, 0x6c, - 0x19, 0x7a, 0xf3, 0xa0, 0x65, 0xa0, 0xfe, 0xdb, 0x4c, 0x6a, 0x88, 0xcc, 0x3d, 0xb5, 0xeb, 0x65, - 0x28, 0x70, 0xb7, 0x1a, 0xd1, 0x2a, 0x29, 0xa9, 0x08, 0x83, 0x76, 0x28, 0x2f, 0xca, 0x90, 0x19, - 0xe8, 0xe3, 0x6d, 0x30, 0xe2, 0xc9, 0x77, 0x53, 0xda, 0x69, 0x74, 0x9a, 0x1c, 0x05, 0x5a, 0xfd, - 0xb5, 0x4c, 0x22, 0x62, 0xe7, 0x01, 0x7e, 0x5b, 0x38, 0x55, 0xe7, 0xb6, 0x3f, 0x55, 0xab, 0xbf, - 0x9f, 0x4d, 0x0f, 0x18, 0x7a, 0x80, 0x1f, 0xb2, 0x1f, 0xc7, 0x69, 0xbb, 0x5b, 0xb7, 0x16, 0x61, - 0x24, 0x2a, 0x0b, 0xb1, 0x6c, 0x9d, 0x4f, 0x0f, 0x9b, 0xda, 0xa1, 0x15, 0x31, 0x1e, 0xea, 0xdb, - 0x99, 0x64, 0xac, 0xd3, 0x03, 0x9f, 0x9f, 0x76, 0xa7, 0x2d, 0xd1, 0x4f, 0x79, 0x97, 0xac, 0x35, - 0xfb, 0xf1, 0x29, 0xef, 0x92, 0x55, 0x63, 0x77, 0x9f, 0xf2, 0xd3, 0xd9, 0x4e, 0xa1, 0x62, 0x0f, - 0xfc, 0x83, 0x3e, 0x2c, 0x0b, 0x99, 0xb7, 0x4c, 0x7c, 0xda, 0x23, 0x9d, 0x62, 0xb3, 0x76, 0xe0, - 0x99, 0xe0, 0xb3, 0xbb, 0x31, 0x9e, 0x2a, 0xac, 0x77, 0x89, 0x22, 0x1f, 0x0e, 0x61, 0xbd, 0x4b, - 0x86, 0xca, 0xbb, 0x4f, 0x58, 0x7f, 0x2f, 0xbb, 0xdd, 0xf8, 0xc4, 0x47, 0xc2, 0x4b, 0x08, 0xef, - 0xf3, 0xd9, 0x64, 0xdc, 0xec, 0x03, 0x17, 0xd3, 0x14, 0x14, 0x44, 0x04, 0xef, 0x8e, 0xc2, 0xe1, - 0xf8, 0x4e, 0x16, 0x8d, 0xf8, 0x8e, 0x6b, 0x20, 0x2e, 0x72, 0xb6, 0x27, 0x12, 0x4e, 0xab, 0xfe, - 0x71, 0x26, 0x16, 0x64, 0xfa, 0x40, 0x8e, 0x10, 0x76, 0xb5, 0x24, 0x91, 0x57, 0xfc, 0xc3, 0xcc, - 0x7c, 0x2c, 0xc8, 0x67, 0xf0, 0x3d, 0x65, 0xea, 0xe9, 0x66, 0x23, 0x5e, 0x5e, 0xc4, 0x04, 0xf8, - 0x4a, 0x16, 0xc6, 0x12, 0xa4, 0xe4, 0x42, 0x24, 0x94, 0x0e, 0x1e, 0x4b, 0xc6, 0x9c, 0xc7, 0x79, - 0x50, 0x9d, 0x1d, 0x9c, 0xa4, 0x5e, 0x80, 0x7c, 0x59, 0x5f, 0xe7, 0xdf, 0xd6, 0xcb, 0x59, 0x1a, - 0xfa, 0xba, 0x7c, 0xe2, 0x86, 0x78, 0xb2, 0x04, 0x27, 0xf9, 0x7d, 0x88, 0x69, 0x5b, 0x8b, 0x66, - 0x93, 0x56, 0xac, 0x59, 0xb3, 0xd1, 0x30, 0x5d, 0x71, 0xa9, 0xf7, 0xe4, 0xe6, 0x46, 0xf1, 0xa2, - 0x67, 0x7b, 0x7a, 0xa3, 0x46, 0x7d, 0xb2, 0x9a, 0x67, 0x36, 0x69, 0xcd, 0xb4, 0x6a, 0x4d, 0xa4, - 0x94, 0x58, 0xa6, 0xb3, 0x22, 0x15, 0x1e, 0xcf, 0xb5, 0x5a, 0xd7, 0x2d, 0x8b, 0x1a, 0x15, 0x6b, - 0x7c, 0xdd, 0xa3, 0xfc, 0x32, 0x30, 0xc7, 0x8f, 0x04, 0xf9, 0xdb, 0x70, 0x8e, 0x66, 0x8c, 0x97, - 0x18, 0x81, 0x96, 0x52, 0x48, 0xfd, 0x95, 0x7c, 0x4a, 0x7c, 0xf1, 0x43, 0xa4, 0x3e, 0x7e, 0x4f, - 0xe7, 0xb7, 0xe8, 0xe9, 0x2b, 0xd0, 0x77, 0x9b, 0x3a, 0x78, 0xbe, 0xc5, 0x2f, 0x18, 0xd0, 0x99, - 0xfd, 0x1e, 0x07, 0xc9, 0x37, 0x34, 0x82, 0x8a, 0x34, 0xe0, 0xcc, 0x22, 0xeb, 0xa6, 0xf4, 0xce, - 0x2c, 0xec, 0xa2, 0x33, 0xbb, 0xf0, 0x23, 0x6f, 0xc0, 0x69, 0xc4, 0xa6, 0x74, 0x6b, 0x1f, 0x56, - 0x85, 0xe1, 0xa5, 0x78, 0x55, 0xe9, 0x9d, 0xdb, 0xa9, 0x3c, 0xf9, 0x30, 0x0c, 0x05, 0x03, 0xc4, - 0xa4, 0xae, 0xb8, 0xb9, 0xe8, 0x32, 0xce, 0x78, 0xec, 0x36, 0x06, 0x46, 0x17, 0xb2, 0x68, 0xfc, - 0xaf, 0x08, 0x2f, 0xf5, 0xdf, 0x64, 0xba, 0xc5, 0x39, 0x3f, 0xf0, 0x59, 0xf9, 0x15, 0xe8, 0x33, - 0xf8, 0x47, 0x09, 0x9d, 0xea, 0x1e, 0x09, 0x9d, 0x93, 0x6a, 0x7e, 0x19, 0xf5, 0xf7, 0x32, 0x5d, - 0xc3, 0xab, 0x1f, 0xf6, 0xcf, 0xfb, 0x7c, 0xae, 0xc3, 0xe7, 0x89, 0x49, 0xf4, 0x12, 0x8c, 0x9a, - 0x61, 0x8c, 0xd9, 0x5a, 0x18, 0x7e, 0x4a, 0x3b, 0x26, 0xc1, 0x71, 0x74, 0x5d, 0x83, 0x53, 0xbe, - 0xe3, 0xa3, 0xe3, 0x7b, 0x88, 0xb9, 0xb5, 0xb6, 0x63, 0xf2, 0x71, 0xa9, 0x9d, 0x70, 0x63, 0xee, - 0x63, 0xee, 0x2d, 0xc7, 0x64, 0x15, 0xe8, 0xde, 0x2a, 0xb5, 0xf4, 0xda, 0x9a, 0xed, 0xdc, 0xc5, - 0x00, 0xa1, 0x7c, 0x70, 0x6a, 0xc7, 0x38, 0xfc, 0x8e, 0x0f, 0x26, 0x8f, 0xc1, 0xf0, 0x4a, 0xa3, - 0x4d, 0x83, 0x90, 0x8c, 0xfc, 0xae, 0x4f, 0x1b, 0x62, 0xc0, 0xe0, 0x86, 0xe4, 0x1c, 0x00, 0x12, - 0x79, 0x18, 0xfc, 0x1e, 0x2f, 0xf6, 0xb4, 0x01, 0x06, 0x59, 0x14, 0xdd, 0x75, 0x86, 0x6b, 0x35, - 0x17, 0x52, 0xad, 0x61, 0x5b, 0x2b, 0x35, 0x8f, 0x3a, 0x4d, 0x6c, 0x28, 0x3a, 0x33, 0x68, 0xa7, - 0x90, 0x02, 0xaf, 0x4e, 0xdc, 0x19, 0xdb, 0x5a, 0x59, 0xa4, 0x4e, 0x93, 0x35, 0xf5, 0x49, 0x20, - 0xa2, 0xa9, 0x0e, 0x1e, 0x7a, 0xf0, 0x8f, 0x43, 0x6f, 0x06, 0x4d, 0x7c, 0x04, 0x3f, 0x0d, 0xc1, - 0x0f, 0x2b, 0xc2, 0x20, 0x8f, 0x4b, 0xc7, 0x85, 0x86, 0x2e, 0x0c, 0x1a, 0x70, 0x10, 0xca, 0xeb, - 0x14, 0x08, 0xef, 0x0a, 0xee, 0xd5, 0xad, 0x89, 0x5f, 0xea, 0x67, 0x72, 0x69, 0x11, 0xe1, 0xf7, - 0xa4, 0x68, 0xe1, 0xb4, 0x9a, 0xdd, 0xd1, 0xb4, 0x7a, 0xcc, 0x6a, 0x37, 0x6b, 0x7a, 0xab, 0x55, - 0x5b, 0x36, 0x1b, 0xf8, 0xac, 0x0a, 0x17, 0x3e, 0x6d, 0xd8, 0x6a, 0x37, 0x4b, 0xad, 0xd6, 0x14, - 0x07, 0x92, 0x27, 0x60, 0x8c, 0xd1, 0x61, 0x27, 0x05, 0x94, 0x79, 0xa4, 0x64, 0x0c, 0x30, 0xb0, - 0xab, 0x4f, 0xfb, 0x10, 0xf4, 0x0b, 0x9e, 0x7c, 0xad, 0xea, 0xd5, 0xfa, 0x38, 0x33, 0x97, 0xf5, - 0x5c, 0xc0, 0x86, 0x4f, 0xae, 0xbd, 0xda, 0x80, 0x5f, 0x1e, 0xc3, 0x17, 0x5b, 0xed, 0x26, 0x8f, - 0x88, 0xd5, 0x87, 0xc8, 0xe0, 0x37, 0xb9, 0x00, 0x23, 0x8c, 0x4b, 0x20, 0x30, 0x1e, 0xf1, 0xb5, - 0x57, 0x8b, 0x41, 0xc9, 0x55, 0x38, 0x11, 0x81, 0x70, 0x1b, 0x94, 0x3f, 0x13, 0xe8, 0xd5, 0x52, - 0x71, 0xea, 0x97, 0x73, 0xd1, 0x38, 0xf5, 0x07, 0xd0, 0x11, 0xa7, 0xa1, 0xcf, 0x76, 0x56, 0x6a, - 0x6d, 0xa7, 0x21, 0xc6, 0x5e, 0xc1, 0x76, 0x56, 0x6e, 0x39, 0x0d, 0x72, 0x12, 0x0a, 0xac, 0x77, - 0x4c, 0x43, 0x0c, 0xb1, 0x5e, 0xbd, 0xd5, 0xaa, 0x18, 0xa4, 0xc4, 0x3b, 0x04, 0xa3, 0x85, 0xd6, - 0xea, 0xb8, 0xb5, 0xe7, 0x4e, 0x09, 0xbd, 0x7c, 0xc5, 0x4b, 0x20, 0xb1, 0x9f, 0x30, 0x86, 0x28, - 0x3f, 0x08, 0x88, 0xb1, 0x30, 0x70, 0x5b, 0x62, 0xf0, 0x3e, 0x89, 0xb3, 0x10, 0xc8, 0x90, 0x05, - 0xdf, 0xc4, 0x18, 0xa4, 0x0c, 0x24, 0xa4, 0x6a, 0xda, 0x86, 0xb9, 0x6c, 0x52, 0xfe, 0xaa, 0xa3, - 0x97, 0x5f, 0xfc, 0x26, 0xb1, 0xda, 0xa8, 0xcf, 0x64, 0x56, 0x40, 0xc8, 0x4b, 0x5c, 0x09, 0x39, - 0x1d, 0xae, 0x7d, 0xbc, 0x6f, 0xb9, 0x9d, 0x16, 0x43, 0xa1, 0x66, 0x62, 0x79, 0x5c, 0x08, 0xd5, - 0xb7, 0x73, 0xc9, 0x64, 0x05, 0x07, 0x62, 0xd7, 0x4c, 0x03, 0x88, 0x5c, 0x24, 0xe1, 0xe5, 0x5a, - 0xe0, 0x71, 0x1e, 0x62, 0x3a, 0xf0, 0x90, 0xca, 0x92, 0x4b, 0xd0, 0xcf, 0xbf, 0xa8, 0x52, 0x16, - 0xf6, 0x0e, 0xba, 0x88, 0xb9, 0x2d, 0x73, 0x79, 0x19, 0xfd, 0xc9, 0x02, 0x34, 0xb9, 0x00, 0x7d, - 0xe5, 0xb9, 0x6a, 0xb5, 0x34, 0xe7, 0xdf, 0x14, 0xe3, 0xfb, 0x12, 0xc3, 0x72, 0x6b, 0xae, 0x6e, - 0xb9, 0x9a, 0x8f, 0x24, 0x8f, 0x41, 0xa1, 0xb2, 0x80, 0x64, 0xfc, 0xd5, 0xe4, 0xe0, 0xe6, 0x46, - 0xb1, 0xcf, 0x6c, 0x71, 0x2a, 0x81, 0xc2, 0x7a, 0x6f, 0x57, 0xca, 0x92, 0xbb, 0x04, 0xaf, 0xf7, - 0x9e, 0x69, 0xe0, 0xb5, 0xb3, 0x16, 0xa0, 0xc9, 0xb3, 0x30, 0x54, 0xa5, 0x8e, 0xa9, 0x37, 0xe6, - 0xda, 0xb8, 0x55, 0x94, 0x42, 0x29, 0xba, 0x08, 0xaf, 0x59, 0x88, 0xd0, 0x22, 0x64, 0xe4, 0x2c, - 0xe4, 0xa7, 0x4d, 0xcb, 0x7f, 0xc2, 0x80, 0x3e, 0xee, 0xab, 0xa6, 0xe5, 0x69, 0x08, 0x55, 0xff, - 0x5b, 0x36, 0x3d, 0xe3, 0xc3, 0x01, 0x0c, 0xc7, 0x5d, 0xde, 0xf4, 0xc6, 0x94, 0x20, 0xbf, 0x07, - 0x25, 0x58, 0x86, 0x63, 0x25, 0xa3, 0x69, 0x5a, 0x25, 0xfc, 0xe9, 0xce, 0x4e, 0x95, 0x70, 0x78, - 0x4b, 0x4f, 0xe8, 0x62, 0x68, 0xf1, 0x3d, 0x3c, 0x9e, 0x2e, 0x43, 0xd5, 0x74, 0x8e, 0xab, 0x35, - 0x97, 0xf5, 0x5a, 0x9d, 0x27, 0x4b, 0xd0, 0xe2, 0x4c, 0xd5, 0xef, 0xcb, 0x6e, 0x91, 0xa4, 0xe2, - 0x41, 0x94, 0xbe, 0xfa, 0x85, 0x6c, 0xf7, 0x3c, 0x21, 0x0f, 0xa4, 0x50, 0xfe, 0x30, 0x9b, 0x92, - 0xb5, 0x63, 0x4f, 0x92, 0xb8, 0x04, 0xfd, 0x9c, 0x4d, 0xe0, 0x6a, 0x8b, 0x33, 0x0e, 0x57, 0x56, - 0x9c, 0xe9, 0x7c, 0x34, 0x99, 0x83, 0x13, 0xa5, 0xe5, 0x65, 0x5a, 0xf7, 0xc2, 0xc8, 0xca, 0x73, - 0x61, 0xa0, 0x54, 0x1e, 0x8e, 0x56, 0xe0, 0xc3, 0xc8, 0xcc, 0x18, 0x10, 0x24, 0xb5, 0x1c, 0x59, - 0x84, 0x53, 0x71, 0x78, 0x95, 0x9b, 0xe9, 0x79, 0x29, 0x42, 0x6d, 0x82, 0x23, 0xff, 0x4f, 0xeb, - 0x50, 0x36, 0xad, 0x95, 0x38, 0x9d, 0xf6, 0x76, 0x6b, 0x25, 0xce, 0xad, 0xa9, 0xe5, 0xd4, 0xaf, - 0xe4, 0xe4, 0xe4, 0x26, 0x0f, 0xae, 0x53, 0xd4, 0xb5, 0x88, 0x2b, 0xf4, 0x76, 0x87, 0xcc, 0xb3, - 0x22, 0xca, 0x87, 0xd1, 0x76, 0x7c, 0xaf, 0xc1, 0x20, 0xca, 0x00, 0x02, 0x65, 0xff, 0xbf, 0x80, - 0x92, 0x54, 0x20, 0x5f, 0x72, 0x56, 0xb8, 0x09, 0xba, 0xd5, 0xc3, 0x27, 0xdd, 0x59, 0x71, 0xd3, - 0x1f, 0x3e, 0x31, 0x16, 0x4f, 0xcc, 0xf2, 0x90, 0xbe, 0x37, 0x4d, 0xcb, 0x20, 0x0f, 0xc1, 0xc9, - 0x5b, 0xd5, 0x49, 0xad, 0x76, 0xb3, 0x32, 0x57, 0xae, 0xdd, 0x9a, 0xab, 0x2e, 0x4c, 0x4e, 0x54, - 0xa6, 0x2a, 0x93, 0xe5, 0xd1, 0x1e, 0x72, 0x1c, 0x8e, 0x85, 0xa8, 0xe9, 0x5b, 0xb3, 0xa5, 0xb9, - 0xd1, 0x0c, 0x19, 0x83, 0xe1, 0x10, 0x38, 0x3e, 0xbf, 0x38, 0x9a, 0x7d, 0xe2, 0xbd, 0x30, 0x88, - 0x7b, 0x16, 0x3e, 0x7f, 0x93, 0x21, 0xe8, 0x9f, 0x1f, 0xaf, 0x4e, 0x6a, 0xb7, 0x91, 0x09, 0x40, - 0xa1, 0x3c, 0x39, 0xc7, 0x18, 0x66, 0x9e, 0xf8, 0x9f, 0x19, 0x80, 0xea, 0xd4, 0xe2, 0x82, 0x20, - 0x1c, 0x84, 0xbe, 0xca, 0xdc, 0xed, 0xd2, 0x4c, 0x85, 0xd1, 0xf5, 0x43, 0x7e, 0x7e, 0x61, 0x92, - 0xd5, 0x30, 0x00, 0xbd, 0x13, 0x33, 0xf3, 0xd5, 0xc9, 0xd1, 0x2c, 0x03, 0x6a, 0x93, 0xa5, 0xf2, - 0x68, 0x8e, 0x01, 0xef, 0x68, 0x95, 0xc5, 0xc9, 0xd1, 0x3c, 0xfb, 0x73, 0xa6, 0xba, 0x58, 0x5a, - 0x1c, 0xed, 0x65, 0x7f, 0x4e, 0xe1, 0x9f, 0x05, 0xc6, 0xac, 0x3a, 0xb9, 0x88, 0x3f, 0xfa, 0x58, - 0x13, 0xa6, 0xfc, 0x5f, 0xfd, 0x0c, 0xc5, 0x58, 0x97, 0x2b, 0xda, 0xe8, 0x00, 0xfb, 0xc1, 0x58, - 0xb2, 0x1f, 0xc0, 0x1a, 0xa7, 0x4d, 0xce, 0xce, 0xdf, 0x9e, 0x1c, 0x1d, 0x64, 0xbc, 0x66, 0x6f, - 0x32, 0xf0, 0x10, 0xfb, 0x53, 0x9b, 0x65, 0x7f, 0x0e, 0x33, 0x4e, 0xda, 0x64, 0x69, 0x66, 0xa1, - 0xb4, 0x38, 0x3d, 0x3a, 0xc2, 0xda, 0x83, 0x3c, 0x8f, 0xf1, 0x92, 0x73, 0xa5, 0xd9, 0xc9, 0xd1, - 0x51, 0x41, 0x53, 0x9e, 0xa9, 0xcc, 0xdd, 0x1c, 0x1d, 0xc3, 0x86, 0xbc, 0x31, 0x8b, 0x3f, 0x08, - 0x2b, 0x80, 0x7f, 0x1d, 0x7f, 0xe2, 0xa3, 0x50, 0x98, 0xaf, 0xa2, 0x95, 0x72, 0x1a, 0x8e, 0xcf, - 0x57, 0x6b, 0x8b, 0x6f, 0x2c, 0x4c, 0xc6, 0xe4, 0x3d, 0x06, 0xc3, 0x3e, 0x62, 0xa6, 0x32, 0x77, - 0xeb, 0x43, 0x5c, 0xda, 0x3e, 0x68, 0xb6, 0x34, 0x31, 0x5f, 0x1d, 0xcd, 0xb2, 0x5e, 0xf1, 0x41, - 0x77, 0x2a, 0x73, 0xe5, 0xf9, 0x3b, 0xd5, 0xd1, 0xdc, 0x13, 0xf7, 0xfc, 0x04, 0xa1, 0xf3, 0x8e, - 0xb9, 0x62, 0x5a, 0xe4, 0x1c, 0x3c, 0x54, 0x9e, 0xbc, 0x5d, 0x99, 0x98, 0xac, 0xcd, 0x6b, 0x95, - 0xeb, 0x95, 0xb9, 0x58, 0x4d, 0x27, 0x61, 0x2c, 0x8a, 0x2e, 0x2d, 0x54, 0x46, 0x33, 0xe4, 0x14, - 0x90, 0x28, 0xf8, 0x46, 0x69, 0x76, 0x6a, 0x34, 0x4b, 0x14, 0x38, 0x11, 0x85, 0x57, 0xe6, 0x16, - 0x6f, 0xcd, 0x4d, 0x8e, 0xe6, 0x9e, 0xf8, 0x89, 0x0c, 0x9c, 0x4c, 0x7d, 0x34, 0x4f, 0x54, 0x38, - 0x3f, 0x39, 0x53, 0xaa, 0x2e, 0x56, 0x26, 0xaa, 0x93, 0x25, 0x6d, 0x62, 0xba, 0x36, 0x51, 0x5a, - 0x9c, 0xbc, 0x3e, 0xaf, 0xbd, 0x51, 0xbb, 0x3e, 0x39, 0x37, 0xa9, 0x95, 0x66, 0x46, 0x7b, 0xc8, - 0x63, 0x50, 0xec, 0x40, 0x53, 0x9d, 0x9c, 0xb8, 0xa5, 0x55, 0x16, 0xdf, 0x18, 0xcd, 0x90, 0x47, - 0xe1, 0x5c, 0x47, 0x22, 0xf6, 0x7b, 0x34, 0x4b, 0xce, 0xc3, 0x99, 0x4e, 0x24, 0xaf, 0xcf, 0x8c, - 0xe6, 0x9e, 0xf8, 0xc1, 0x0c, 0x90, 0xe4, 0xab, 0x67, 0xf2, 0x08, 0x9c, 0x65, 0x7a, 0x51, 0xeb, - 0xdc, 0xc0, 0x47, 0xe1, 0x5c, 0x2a, 0x85, 0xd4, 0xbc, 0x22, 0x3c, 0xdc, 0x81, 0x44, 0x34, 0xee, - 0x2c, 0x28, 0xe9, 0x04, 0xd8, 0xb4, 0x5f, 0xcc, 0xc0, 0xc9, 0x54, 0x93, 0x89, 0x5c, 0x84, 0xf7, - 0x94, 0xca, 0xb3, 0xac, 0x6f, 0x26, 0x16, 0x2b, 0xf3, 0x73, 0xd5, 0xda, 0xec, 0x54, 0xa9, 0xc6, - 0xb4, 0xef, 0x56, 0x35, 0xd6, 0x9b, 0x17, 0x40, 0xed, 0x42, 0x39, 0x31, 0x5d, 0x9a, 0xbb, 0xce, - 0x86, 0x1f, 0x79, 0x0f, 0x3c, 0xd2, 0x91, 0x6e, 0x72, 0xae, 0x34, 0x3e, 0x33, 0x59, 0x1e, 0xcd, - 0x92, 0xc7, 0xe1, 0xd1, 0x8e, 0x54, 0xe5, 0x4a, 0x95, 0x93, 0xe5, 0xc6, 0xcb, 0x6f, 0xff, 0xbb, - 0xf3, 0x3d, 0x6f, 0x7f, 0xe3, 0x7c, 0xe6, 0x37, 0xbf, 0x71, 0x3e, 0xf3, 0xfb, 0xdf, 0x38, 0x9f, - 0xf9, 0xf0, 0xd5, 0x9d, 0xbc, 0x66, 0xe7, 0x13, 0xe5, 0x52, 0x01, 0xa7, 0xaf, 0x67, 0xfe, 0x6f, - 0x00, 0x00, 0x00, 0xff, 0xff, 0x63, 0x10, 0x84, 0x17, 0xb2, 0x55, 0x01, 0x00, + 0x77, 0x0f, 0x41, 0xec, 0xf7, 0xb2, 0xfc, 0xf9, 0x21, 0xf9, 0x93, 0xf4, 0xe9, 0x93, 0x3f, 0x5b, + 0x7e, 0x25, 0x96, 0xed, 0xe3, 0xc4, 0xf6, 0x71, 0xec, 0x38, 0xce, 0xb1, 0xad, 0x38, 0x3a, 0xb1, + 0xa3, 0x3c, 0xd6, 0xd1, 0x71, 0x8e, 0xed, 0x24, 0x3e, 0x3e, 0x89, 0x03, 0x39, 0x4a, 0x9c, 0x1f, + 0x38, 0xc9, 0x89, 0x93, 0xe8, 0xd8, 0x8e, 0xe3, 0xe4, 0xe4, 0xd4, 0xad, 0xea, 0xee, 0xea, 0xc7, + 0x0c, 0x9e, 0x6b, 0x2c, 0x44, 0xfc, 0x21, 0x31, 0xf7, 0xde, 0xba, 0x55, 0x7d, 0xeb, 0x56, 0xd5, + 0xad, 0xaa, 0x5b, 0xf7, 0xc2, 0x25, 0x8f, 0x36, 0x68, 0xcb, 0x76, 0xbc, 0x2b, 0x0d, 0xba, 0xa2, + 0xd7, 0xd7, 0xaf, 0x78, 0xeb, 0x2d, 0xea, 0x5e, 0xa1, 0xf7, 0xa8, 0xe5, 0xf9, 0xff, 0x5d, 0x6e, + 0x39, 0xb6, 0x67, 0x93, 0x02, 0xff, 0x75, 0xe6, 0xc4, 0x8a, 0xbd, 0x62, 0x23, 0xe8, 0x0a, 0xfb, + 0x8b, 0x63, 0xcf, 0x9c, 0x5d, 0xb1, 0xed, 0x95, 0x06, 0xbd, 0x82, 0xbf, 0x96, 0xda, 0xcb, 0x57, + 0x5c, 0xcf, 0x69, 0xd7, 0x3d, 0x81, 0x2d, 0xc6, 0xb1, 0x9e, 0xd9, 0xa4, 0xae, 0xa7, 0x37, 0x5b, + 0x82, 0xe0, 0x7c, 0x9c, 0x60, 0xcd, 0xd1, 0x5b, 0x2d, 0xea, 0x88, 0xca, 0xcf, 0x3c, 0x9a, 0xde, + 0x4e, 0xfc, 0x57, 0x90, 0x3c, 0x95, 0x4e, 0xe2, 0x33, 0x8a, 0x71, 0x54, 0xbf, 0x90, 0x85, 0xfe, + 0x59, 0xea, 0xe9, 0x86, 0xee, 0xe9, 0xe4, 0x2c, 0xf4, 0x56, 0x2c, 0x83, 0xde, 0x57, 0x32, 0x8f, + 0x64, 0x2e, 0xe6, 0xc6, 0x0b, 0x9b, 0x1b, 0xc5, 0x2c, 0x35, 0x35, 0x0e, 0x24, 0xe7, 0x20, 0xbf, + 0xb8, 0xde, 0xa2, 0x4a, 0xf6, 0x91, 0xcc, 0xc5, 0x81, 0xf1, 0x81, 0xcd, 0x8d, 0x62, 0x2f, 0xca, + 0x42, 0x43, 0x30, 0x79, 0x14, 0xb2, 0x95, 0xb2, 0x92, 0x43, 0xe4, 0xd8, 0xe6, 0x46, 0x71, 0xb8, + 0x6d, 0x1a, 0x4f, 0xda, 0x4d, 0xd3, 0xa3, 0xcd, 0x96, 0xb7, 0xae, 0x65, 0x2b, 0x65, 0x72, 0x01, + 0xf2, 0x13, 0xb6, 0x41, 0x95, 0x3c, 0x12, 0x91, 0xcd, 0x8d, 0xe2, 0x48, 0xdd, 0x36, 0xa8, 0x44, + 0x85, 0x78, 0xf2, 0x1a, 0xe4, 0x17, 0xcd, 0x26, 0x55, 0x7a, 0x1f, 0xc9, 0x5c, 0x1c, 0xbc, 0x7a, + 0xe6, 0x32, 0x97, 0xca, 0x65, 0x5f, 0x2a, 0x97, 0x17, 0x7d, 0xb1, 0x8d, 0x8f, 0xbe, 0xbd, 0x51, + 0xec, 0xd9, 0xdc, 0x28, 0xe6, 0x99, 0x24, 0x3f, 0xff, 0xf5, 0x62, 0x46, 0xc3, 0x92, 0xe4, 0x65, + 0x18, 0x9c, 0x68, 0xb4, 0x5d, 0x8f, 0x3a, 0x73, 0x7a, 0x93, 0x2a, 0x05, 0xac, 0xf0, 0xcc, 0xe6, + 0x46, 0xf1, 0x54, 0x9d, 0x83, 0x6b, 0x96, 0xde, 0x94, 0x2b, 0x96, 0xc9, 0xd5, 0x5f, 0xcd, 0xc0, + 0xb1, 0x2a, 0x75, 0x5d, 0xd3, 0xb6, 0x02, 0xd9, 0x3c, 0x0e, 0x03, 0x02, 0x54, 0x29, 0xa3, 0x7c, + 0x06, 0xc6, 0xfb, 0x36, 0x37, 0x8a, 0x39, 0xd7, 0x34, 0xb4, 0x10, 0x43, 0xde, 0x0f, 0x7d, 0x77, + 0x4c, 0x6f, 0x75, 0x76, 0xaa, 0x24, 0xe4, 0x74, 0x6a, 0x73, 0xa3, 0x48, 0xd6, 0x4c, 0x6f, 0xb5, + 0xd6, 0x5c, 0xd6, 0xa5, 0x0a, 0x7d, 0x32, 0x32, 0x03, 0xa3, 0x0b, 0x8e, 0x79, 0x4f, 0xf7, 0xe8, + 0x4d, 0xba, 0xbe, 0x60, 0x37, 0xcc, 0xfa, 0xba, 0x90, 0xe2, 0x23, 0x9b, 0x1b, 0xc5, 0xb3, 0x2d, + 0x8e, 0xab, 0xdd, 0xa5, 0xeb, 0xb5, 0x16, 0x62, 0x25, 0x26, 0x89, 0x92, 0xea, 0x57, 0x7b, 0x61, + 0xe8, 0x96, 0x4b, 0x9d, 0xa0, 0xdd, 0x17, 0x20, 0xcf, 0x7e, 0x8b, 0x26, 0xa3, 0xcc, 0xdb, 0x2e, + 0x75, 0x64, 0x99, 0x33, 0x3c, 0xb9, 0x04, 0xbd, 0x33, 0xf6, 0x8a, 0x69, 0x89, 0x66, 0x1f, 0xdf, + 0xdc, 0x28, 0x1e, 0x6b, 0x30, 0x80, 0x44, 0xc9, 0x29, 0xc8, 0x07, 0x61, 0xa8, 0xd2, 0x64, 0x3a, + 0x64, 0x5b, 0xba, 0x67, 0x3b, 0xa2, 0xb5, 0x28, 0x5d, 0x53, 0x82, 0x4b, 0x05, 0x23, 0xf4, 0xe4, + 0x45, 0x80, 0xd2, 0x9d, 0xaa, 0x66, 0x37, 0x68, 0x49, 0x9b, 0x13, 0xca, 0x80, 0xa5, 0xf5, 0x35, + 0xb7, 0xe6, 0xd8, 0x0d, 0x5a, 0xd3, 0x1d, 0xb9, 0x5a, 0x89, 0x9a, 0x4c, 0xc2, 0x48, 0xa9, 0x5e, + 0xa7, 0xae, 0xab, 0xd1, 0x4f, 0xb4, 0xa9, 0xeb, 0xb9, 0x4a, 0xef, 0x23, 0xb9, 0x8b, 0x03, 0xe3, + 0xe7, 0x36, 0x37, 0x8a, 0x0f, 0xe9, 0x88, 0xa9, 0x39, 0x02, 0x25, 0xb1, 0x88, 0x15, 0x22, 0xe3, + 0x30, 0x5c, 0x7a, 0xab, 0xed, 0xd0, 0x8a, 0x41, 0x2d, 0xcf, 0xf4, 0xd6, 0x85, 0x86, 0x9c, 0xdd, + 0xdc, 0x28, 0x2a, 0x3a, 0x43, 0xd4, 0x4c, 0x81, 0x91, 0x98, 0x44, 0x8b, 0x90, 0x79, 0x18, 0xbb, + 0x3e, 0xb1, 0x50, 0xa5, 0xce, 0x3d, 0xb3, 0x4e, 0x4b, 0xf5, 0xba, 0xdd, 0xb6, 0x3c, 0xa5, 0x0f, + 0xf9, 0x3c, 0xba, 0xb9, 0x51, 0x3c, 0xb7, 0x52, 0x6f, 0xd5, 0x5c, 0x8e, 0xad, 0xe9, 0x1c, 0x2d, + 0x31, 0x4b, 0x96, 0x25, 0x1f, 0x86, 0xe1, 0x45, 0x87, 0x69, 0xa1, 0x51, 0xa6, 0x0c, 0xae, 0xf4, + 0xa3, 0xfe, 0x9f, 0xba, 0x2c, 0x26, 0x20, 0x0e, 0xf5, 0x7b, 0x96, 0x37, 0xd6, 0xe3, 0x05, 0x6a, + 0x06, 0xe2, 0xe4, 0xc6, 0x46, 0x58, 0x11, 0x0a, 0x0a, 0xfb, 0x78, 0xd3, 0xa1, 0x46, 0x42, 0xdb, + 0x06, 0xb0, 0xcd, 0x97, 0x36, 0x37, 0x8a, 0x8f, 0x3b, 0x82, 0xa6, 0xd6, 0x55, 0xed, 0x3a, 0xb2, + 0x22, 0x93, 0xd0, 0xcf, 0xb4, 0xe9, 0xa6, 0x69, 0x19, 0x0a, 0x3c, 0x92, 0xb9, 0x38, 0x72, 0x75, + 0xd4, 0x6f, 0xbd, 0x0f, 0x1f, 0x3f, 0xbd, 0xb9, 0x51, 0x3c, 0xce, 0x74, 0xb0, 0x76, 0xd7, 0xb4, + 0xe4, 0x29, 0x22, 0x28, 0xaa, 0xfe, 0x69, 0x1e, 0x46, 0x98, 0x70, 0x24, 0x3d, 0x2e, 0xb1, 0x21, + 0xc9, 0x20, 0x6c, 0x84, 0xba, 0x2d, 0xbd, 0x4e, 0x85, 0x4a, 0x23, 0x3b, 0xcb, 0x07, 0x4a, 0xec, + 0xe2, 0xf4, 0xe4, 0x12, 0xf4, 0x73, 0x50, 0xa5, 0x2c, 0xb4, 0x7c, 0x78, 0x73, 0xa3, 0x38, 0xe0, + 0x22, 0xac, 0x66, 0x1a, 0x5a, 0x80, 0x66, 0x6a, 0xc6, 0xff, 0x9e, 0xb6, 0x5d, 0x8f, 0x31, 0x17, + 0x4a, 0x8e, 0x6a, 0x26, 0x0a, 0xac, 0x0a, 0x94, 0xac, 0x66, 0xd1, 0x42, 0xe4, 0x05, 0x00, 0x0e, + 0x29, 0x19, 0x86, 0x23, 0x34, 0xfd, 0xa1, 0xcd, 0x8d, 0xe2, 0x49, 0xc1, 0x42, 0x37, 0x0c, 0x79, + 0x98, 0x48, 0xc4, 0xa4, 0x09, 0x43, 0xfc, 0xd7, 0x8c, 0xbe, 0x44, 0x1b, 0x5c, 0xcd, 0x07, 0xaf, + 0x5e, 0xf4, 0xa5, 0x19, 0x95, 0xce, 0x65, 0x99, 0x74, 0xd2, 0xf2, 0x9c, 0xf5, 0xf1, 0xa2, 0x98, + 0x19, 0x4f, 0x8b, 0xaa, 0x1a, 0x88, 0x93, 0xc7, 0xa4, 0x5c, 0x86, 0x4d, 0x98, 0x53, 0xb6, 0xb3, + 0xa6, 0x3b, 0x06, 0x35, 0xc6, 0xd7, 0xe5, 0x09, 0x73, 0xd9, 0x07, 0xd7, 0x96, 0x64, 0x1d, 0x90, + 0xc9, 0xc9, 0x04, 0x0c, 0x73, 0x6e, 0xd5, 0xf6, 0x12, 0xf6, 0x7d, 0x5f, 0x42, 0x5a, 0x6e, 0x7b, + 0x29, 0xde, 0xdf, 0xd1, 0x32, 0x6c, 0x4c, 0x72, 0xc0, 0x6d, 0xea, 0xb0, 0xd9, 0x14, 0xd5, 0x5f, + 0x8c, 0x49, 0xc1, 0xe4, 0x1e, 0xc7, 0x24, 0x79, 0x88, 0x22, 0x67, 0x5e, 0x85, 0xb1, 0x84, 0x28, + 0xc8, 0x28, 0xe4, 0xee, 0xd2, 0x75, 0xae, 0x2e, 0x1a, 0xfb, 0x93, 0x9c, 0x80, 0xde, 0x7b, 0x7a, + 0xa3, 0x2d, 0xd6, 0x32, 0x8d, 0xff, 0x78, 0x31, 0xfb, 0x81, 0x0c, 0x9b, 0xfa, 0xc9, 0x84, 0x6d, + 0x59, 0xb4, 0xee, 0xc9, 0xb3, 0xff, 0x73, 0x30, 0x30, 0x63, 0xd7, 0xf5, 0x06, 0xf6, 0x23, 0xd7, + 0x3b, 0x65, 0x73, 0xa3, 0x78, 0x82, 0x75, 0xe0, 0xe5, 0x06, 0xc3, 0x48, 0x6d, 0x0a, 0x49, 0x99, + 0x02, 0x68, 0xb4, 0x69, 0x7b, 0x14, 0x0b, 0x66, 0x43, 0x05, 0xc0, 0x82, 0x0e, 0xa2, 0x64, 0x05, + 0x08, 0x89, 0xc9, 0x15, 0xe8, 0x5f, 0x60, 0x0b, 0x5e, 0xdd, 0x6e, 0x08, 0xe5, 0xc3, 0x39, 0x19, + 0x17, 0x41, 0x79, 0xd0, 0xf8, 0x44, 0xea, 0x34, 0x8c, 0x4c, 0x34, 0x4c, 0x6a, 0x79, 0x72, 0xab, + 0xd9, 0x90, 0x2a, 0xad, 0x50, 0xcb, 0x93, 0x5b, 0x8d, 0x83, 0x4f, 0x67, 0x50, 0xb9, 0xd5, 0x01, + 0xa9, 0xfa, 0x4f, 0x73, 0xf0, 0xd0, 0xcd, 0xf6, 0x12, 0x75, 0x2c, 0xea, 0x51, 0x57, 0xac, 0x8c, + 0x01, 0xd7, 0x39, 0x18, 0x4b, 0x20, 0x05, 0x77, 0x5c, 0xb1, 0xee, 0x06, 0xc8, 0x9a, 0x58, 0x6c, + 0xe5, 0x69, 0x2f, 0x51, 0x94, 0x4c, 0xc3, 0xb1, 0x10, 0xc8, 0x1a, 0xe1, 0x2a, 0x59, 0x9c, 0xd3, + 0xcf, 0x6f, 0x6e, 0x14, 0xcf, 0x48, 0xdc, 0x58, 0xb3, 0x65, 0x0d, 0x8e, 0x17, 0x23, 0x37, 0x61, + 0x34, 0x04, 0x5d, 0x77, 0xec, 0x76, 0xcb, 0x55, 0x72, 0xc8, 0xaa, 0xb8, 0xb9, 0x51, 0x7c, 0x58, + 0x62, 0xb5, 0x82, 0x48, 0x79, 0x25, 0x8d, 0x17, 0x24, 0xdf, 0x99, 0x91, 0xb9, 0x89, 0x51, 0x98, + 0xc7, 0x51, 0xf8, 0xbc, 0x3f, 0x0a, 0x3b, 0x0a, 0xe9, 0x72, 0xbc, 0xa4, 0x18, 0x94, 0xb1, 0x66, + 0x24, 0x06, 0x65, 0xa2, 0xc6, 0x33, 0x13, 0x70, 0x32, 0x95, 0xd7, 0x8e, 0xb4, 0xfa, 0x8f, 0x72, + 0x32, 0x97, 0x05, 0xdb, 0x08, 0x3a, 0x73, 0x5e, 0xee, 0xcc, 0x05, 0xdb, 0x40, 0x73, 0x29, 0x13, + 0x2e, 0x62, 0x52, 0x63, 0x5b, 0xb6, 0x11, 0xb7, 0x9a, 0x92, 0x65, 0xc9, 0xc7, 0xe1, 0x54, 0x02, + 0xc8, 0xa7, 0x6b, 0xae, 0xfd, 0x17, 0x36, 0x37, 0x8a, 0x6a, 0x0a, 0xd7, 0xf8, 0xec, 0xdd, 0x81, + 0x0b, 0xd1, 0xe1, 0xb4, 0x24, 0x75, 0xdb, 0xf2, 0x74, 0xd3, 0x12, 0x56, 0x1e, 0x1f, 0x25, 0xef, + 0xdd, 0xdc, 0x28, 0x3e, 0x26, 0xeb, 0xa0, 0x4f, 0x13, 0x6f, 0x7c, 0x27, 0x3e, 0xc4, 0x00, 0x25, + 0x05, 0x55, 0x69, 0xea, 0x2b, 0xbe, 0xe9, 0x7a, 0x71, 0x73, 0xa3, 0xf8, 0x9e, 0xd4, 0x3a, 0x4c, + 0x46, 0x25, 0x2f, 0x95, 0x9d, 0x38, 0x11, 0x0d, 0x48, 0x88, 0x9b, 0xb3, 0x0d, 0x8a, 0xdf, 0xd0, + 0x8b, 0xfc, 0xd5, 0xcd, 0x8d, 0xe2, 0x79, 0x89, 0xbf, 0x65, 0x1b, 0x34, 0xde, 0xfc, 0x94, 0xd2, + 0xea, 0xaf, 0xe6, 0xe0, 0x7c, 0xb5, 0x34, 0x3b, 0x53, 0x31, 0x7c, 0xdb, 0x62, 0xc1, 0xb1, 0xef, + 0x99, 0x86, 0x34, 0x7a, 0x97, 0xe0, 0x74, 0x0c, 0x35, 0x89, 0xe6, 0x4c, 0x60, 0xd5, 0xe2, 0xb7, + 0xf9, 0x76, 0x4b, 0x4b, 0xd0, 0xd4, 0xb8, 0xcd, 0x53, 0x8b, 0x98, 0xf4, 0x9d, 0x18, 0xb1, 0x3e, + 0x8a, 0xa1, 0xaa, 0xab, 0xb6, 0xe3, 0xd5, 0xdb, 0x9e, 0x50, 0x02, 0xec, 0xa3, 0x44, 0x1d, 0xae, + 0x20, 0xea, 0x52, 0x85, 0xcf, 0x87, 0x7c, 0x3a, 0x03, 0xa3, 0x25, 0xcf, 0x73, 0xcc, 0xa5, 0xb6, + 0x47, 0x67, 0xf5, 0x56, 0xcb, 0xb4, 0x56, 0x70, 0xac, 0x0f, 0x5e, 0x7d, 0x39, 0x58, 0x23, 0xbb, + 0x4a, 0xe2, 0x72, 0xbc, 0xb8, 0x34, 0x44, 0x75, 0x1f, 0x55, 0x6b, 0x72, 0x9c, 0x3c, 0x44, 0xe3, + 0xe5, 0xd8, 0x10, 0x4d, 0xe5, 0xb5, 0xa3, 0x21, 0xfa, 0x85, 0x1c, 0x9c, 0x9d, 0xbf, 0xeb, 0xe9, + 0x1a, 0x75, 0xed, 0xb6, 0x53, 0xa7, 0xee, 0xad, 0x96, 0xa1, 0x7b, 0x34, 0x1c, 0xa9, 0x45, 0xe8, + 0x2d, 0x19, 0x06, 0x35, 0x90, 0x5d, 0x2f, 0xdf, 0x7f, 0xe9, 0x0c, 0xa0, 0x71, 0x38, 0x79, 0x1c, + 0xfa, 0x44, 0x19, 0xe4, 0xde, 0x3b, 0x3e, 0xb8, 0xb9, 0x51, 0xec, 0x6b, 0x73, 0x90, 0xe6, 0xe3, + 0x18, 0x59, 0x99, 0x36, 0x28, 0x23, 0xcb, 0x85, 0x64, 0x06, 0x07, 0x69, 0x3e, 0x8e, 0xbc, 0x0e, + 0x23, 0xc8, 0x36, 0x68, 0x8f, 0x98, 0xfb, 0x4e, 0xf8, 0xd2, 0x95, 0x1b, 0xcb, 0x97, 0x26, 0x6c, + 0x4d, 0xcd, 0xf1, 0x0b, 0x68, 0x31, 0x06, 0xe4, 0x0e, 0x8c, 0x8a, 0x46, 0x84, 0x4c, 0x7b, 0xbb, + 0x30, 0x3d, 0xb9, 0xb9, 0x51, 0x1c, 0x13, 0xed, 0x97, 0xd8, 0x26, 0x98, 0x30, 0xc6, 0xa2, 0xd9, + 0x21, 0xe3, 0xc2, 0x56, 0x8c, 0xc5, 0x17, 0xcb, 0x8c, 0xe3, 0x4c, 0xd4, 0x37, 0x60, 0x48, 0x2e, + 0x48, 0x4e, 0xe1, 0x1e, 0x97, 0x8f, 0x13, 0xdc, 0x1d, 0x9b, 0x06, 0x6e, 0x6c, 0x9f, 0x86, 0xc1, + 0x32, 0x75, 0xeb, 0x8e, 0xd9, 0x62, 0x56, 0x83, 0x50, 0xf2, 0x63, 0x9b, 0x1b, 0xc5, 0x41, 0x23, + 0x04, 0x6b, 0x32, 0x8d, 0xfa, 0x27, 0x19, 0x38, 0xc5, 0x78, 0x97, 0x5c, 0xd7, 0x5c, 0xb1, 0x9a, + 0xf2, 0xb2, 0xfd, 0x24, 0x14, 0xaa, 0x58, 0x9f, 0xa8, 0xe9, 0xc4, 0xe6, 0x46, 0x71, 0x94, 0xb7, + 0x40, 0xd2, 0x43, 0x41, 0x13, 0x6c, 0xf0, 0xb2, 0x5b, 0x6c, 0xf0, 0x98, 0x49, 0xeb, 0xe9, 0x8e, + 0x67, 0x5a, 0x2b, 0x55, 0x4f, 0xf7, 0xda, 0x6e, 0xc4, 0xa4, 0x15, 0x98, 0x9a, 0x8b, 0xa8, 0x88, + 0x49, 0x1b, 0x29, 0x44, 0x5e, 0x85, 0xa1, 0x49, 0xcb, 0x08, 0x99, 0xf0, 0x09, 0xf1, 0x61, 0x66, + 0x69, 0x52, 0x84, 0x27, 0x59, 0x44, 0x0a, 0xa8, 0x7f, 0x23, 0x03, 0x0a, 0xdf, 0x8d, 0xcd, 0x98, + 0xae, 0x37, 0x4b, 0x9b, 0x4b, 0xd2, 0xec, 0x34, 0xe5, 0x6f, 0xef, 0x18, 0x4e, 0x5a, 0x8b, 0xd0, + 0x14, 0x10, 0xdb, 0xbb, 0x86, 0xe9, 0x7a, 0xf1, 0xc9, 0x30, 0x56, 0x8a, 0x54, 0xa0, 0x8f, 0x73, + 0xe6, 0xb6, 0xc4, 0xe0, 0x55, 0xc5, 0x57, 0x84, 0x78, 0xd5, 0x5c, 0x19, 0x9a, 0x9c, 0x58, 0xde, + 0x9f, 0x8b, 0xf2, 0xea, 0xdf, 0xcc, 0xc2, 0x68, 0xbc, 0x10, 0xb9, 0x03, 0xfd, 0x37, 0x6c, 0xd3, + 0xa2, 0xc6, 0xbc, 0x85, 0x2d, 0xec, 0x7e, 0x4a, 0xe1, 0xdb, 0xe2, 0xc7, 0xdf, 0xc4, 0x32, 0x35, + 0xd9, 0x82, 0xc5, 0x43, 0x8b, 0x80, 0x19, 0xf9, 0x30, 0x0c, 0x30, 0x1b, 0xf0, 0x1e, 0x72, 0xce, + 0x6e, 0xc9, 0xf9, 0x11, 0xc1, 0xf9, 0x84, 0xc3, 0x0b, 0x25, 0x59, 0x87, 0xec, 0x98, 0x5e, 0x69, + 0x54, 0x77, 0x6d, 0x4b, 0xf4, 0x3c, 0xea, 0x95, 0x83, 0x10, 0x59, 0xaf, 0x38, 0x0d, 0x33, 0x5d, + 0xf9, 0xc7, 0x62, 0x37, 0x48, 0x7b, 0x17, 0x2e, 0xab, 0x78, 0x0f, 0x48, 0xc4, 0xea, 0x77, 0x67, + 0xe1, 0xa9, 0x50, 0x64, 0x1a, 0xbd, 0x67, 0xd2, 0x35, 0x21, 0xce, 0x55, 0xb3, 0x25, 0x36, 0x8f, + 0x4c, 0xe5, 0xdd, 0x89, 0x55, 0xdd, 0x5a, 0xa1, 0x06, 0xb9, 0x04, 0xbd, 0x6c, 0x87, 0xef, 0x2a, + 0x19, 0x34, 0xd7, 0x70, 0x3a, 0x71, 0x18, 0x40, 0x3e, 0x7d, 0x40, 0x0a, 0x62, 0x43, 0x61, 0xd1, + 0xd1, 0x4d, 0xcf, 0xef, 0xd9, 0x52, 0xb2, 0x67, 0xb7, 0x51, 0xe3, 0x65, 0xce, 0x83, 0xcf, 0xf9, + 0x28, 0x08, 0x0f, 0x01, 0xb2, 0x20, 0x38, 0xc9, 0x99, 0x17, 0x60, 0x50, 0x22, 0xde, 0xd1, 0xa4, + 0xfe, 0xe5, 0xbc, 0xac, 0xeb, 0x7e, 0xb3, 0x84, 0xae, 0x5f, 0x61, 0x3a, 0xea, 0xba, 0xcc, 0xaa, + 0xe0, 0x4a, 0x2e, 0x34, 0x11, 0x41, 0x51, 0x4d, 0x44, 0x10, 0x79, 0x06, 0xfa, 0x39, 0x8b, 0x60, + 0xff, 0x8a, 0x7b, 0x5f, 0x07, 0x61, 0xd1, 0xa5, 0x39, 0x20, 0x24, 0x3f, 0x9b, 0x81, 0x73, 0x5d, + 0x25, 0x81, 0xca, 0x30, 0x78, 0xf5, 0xd9, 0x5d, 0x89, 0x71, 0xfc, 0xa9, 0xcd, 0x8d, 0xe2, 0xa5, + 0x66, 0x40, 0x52, 0x73, 0x24, 0x9a, 0x5a, 0x9d, 0x13, 0x49, 0xed, 0xea, 0xde, 0x14, 0x66, 0x3c, + 0xf2, 0x4a, 0xa7, 0xf0, 0x0c, 0xc7, 0xaa, 0xaf, 0xfb, 0x8d, 0xcc, 0x87, 0xc6, 0xa3, 0xf8, 0xde, + 0x65, 0x9f, 0x24, 0xa5, 0x9a, 0x0e, 0x5c, 0x48, 0x1d, 0x4e, 0x73, 0x4c, 0x59, 0x5f, 0x9f, 0x5f, + 0x9e, 0xb5, 0x2d, 0x6f, 0xd5, 0xaf, 0xa0, 0x57, 0x3e, 0x04, 0xc1, 0x0a, 0x0c, 0x7d, 0xbd, 0x66, + 0x2f, 0xd7, 0x9a, 0x8c, 0x2a, 0xa5, 0x8e, 0x4e, 0x9c, 0xd8, 0x44, 0x2b, 0xc6, 0x9c, 0x3f, 0x05, + 0x15, 0xc2, 0x23, 0x2a, 0x7f, 0x9c, 0x26, 0x27, 0x9c, 0x58, 0x21, 0xb5, 0x02, 0x43, 0x33, 0x76, + 0xfd, 0x6e, 0xa0, 0x2e, 0x2f, 0x40, 0x61, 0x51, 0x77, 0x56, 0xa8, 0x87, 0xb2, 0x18, 0xbc, 0x3a, + 0x76, 0x99, 0x1f, 0xfb, 0x32, 0x22, 0x8e, 0x18, 0x1f, 0x11, 0xb3, 0x41, 0xc1, 0xc3, 0xdf, 0x9a, + 0x28, 0xa0, 0x7e, 0xbd, 0x17, 0x86, 0xc4, 0x11, 0x25, 0xce, 0xe6, 0xe4, 0xc5, 0xf0, 0xd0, 0x57, + 0x4c, 0x5f, 0xc1, 0x31, 0x4d, 0x70, 0xbc, 0x34, 0xc4, 0x98, 0xfd, 0xf6, 0x46, 0x31, 0xb3, 0xb9, + 0x51, 0xec, 0xd1, 0xfa, 0xa5, 0x4d, 0x65, 0xb8, 0xde, 0x48, 0x0b, 0xac, 0x7c, 0xe8, 0x18, 0x2b, + 0xcb, 0xd7, 0x9f, 0x57, 0xa1, 0x4f, 0xb4, 0x41, 0x68, 0xdc, 0xe9, 0xf0, 0x2c, 0x23, 0x72, 0xd4, + 0x1a, 0x2b, 0xed, 0x97, 0x22, 0x2f, 0x43, 0x81, 0xef, 0xed, 0x85, 0x00, 0x4e, 0xa5, 0x9f, 0x85, + 0xc4, 0x8a, 0x8b, 0x32, 0x64, 0x1a, 0x20, 0xdc, 0xd7, 0x07, 0x27, 0xcb, 0x82, 0x43, 0x72, 0xc7, + 0x1f, 0xe3, 0x22, 0x95, 0x25, 0xcf, 0xc1, 0xd0, 0x22, 0x75, 0x9a, 0xa6, 0xa5, 0x37, 0xaa, 0xe6, + 0x5b, 0xfe, 0xe1, 0x32, 0x2e, 0xbc, 0xae, 0xf9, 0x96, 0x3c, 0x72, 0x23, 0x74, 0xe4, 0x63, 0x69, + 0xfb, 0xe6, 0x3e, 0x6c, 0xc8, 0xa3, 0x5b, 0x6e, 0x28, 0x63, 0xed, 0x49, 0xd9, 0x46, 0xbf, 0x0e, + 0xc3, 0x91, 0x2d, 0x93, 0x38, 0x3d, 0x3c, 0x97, 0x64, 0x2d, 0xed, 0xff, 0x62, 0x6c, 0xa3, 0x1c, + 0x98, 0x26, 0x57, 0x2c, 0xd3, 0x33, 0xf5, 0xc6, 0x84, 0xdd, 0x6c, 0xea, 0x96, 0xa1, 0x0c, 0x84, + 0x9a, 0x6c, 0x72, 0x4c, 0xad, 0xce, 0x51, 0xb2, 0x26, 0x47, 0x0b, 0xb1, 0x6d, 0xb9, 0xe8, 0x43, + 0x8d, 0xd6, 0x6d, 0x87, 0xd9, 0x02, 0x78, 0x38, 0x28, 0xb6, 0xe5, 0x2e, 0xc7, 0xd5, 0x1c, 0x1f, + 0x29, 0x1b, 0xdb, 0xf1, 0x82, 0x37, 0xf2, 0xfd, 0x83, 0xa3, 0x43, 0xf1, 0xf3, 0x5c, 0xf5, 0x67, + 0x72, 0x30, 0x28, 0x48, 0xd9, 0x52, 0x7a, 0xa4, 0xe0, 0x7b, 0x51, 0xf0, 0x54, 0x45, 0x2d, 0xec, + 0x97, 0xa2, 0xaa, 0x9f, 0xc9, 0x06, 0xb3, 0xd1, 0x82, 0x63, 0x5a, 0x7b, 0x9b, 0x8d, 0x2e, 0x00, + 0x4c, 0xac, 0xb6, 0xad, 0xbb, 0xfc, 0xde, 0x2a, 0x1b, 0xde, 0x5b, 0xd5, 0x4d, 0x4d, 0xc2, 0x90, + 0x73, 0x90, 0x2f, 0x33, 0xfe, 0xac, 0x67, 0x86, 0xc6, 0x07, 0xde, 0xe6, 0x9c, 0x32, 0x4f, 0x69, + 0x08, 0x66, 0x9b, 0xab, 0xf1, 0x75, 0x8f, 0x72, 0x73, 0x36, 0xc7, 0x37, 0x57, 0x4b, 0x0c, 0xa0, + 0x71, 0x38, 0xb9, 0x06, 0x63, 0x65, 0xda, 0xd0, 0xd7, 0x67, 0xcd, 0x46, 0xc3, 0x74, 0x69, 0xdd, + 0xb6, 0x0c, 0x17, 0x85, 0x2c, 0xaa, 0x6b, 0xba, 0x5a, 0x92, 0x80, 0xa8, 0x50, 0x98, 0x5f, 0x5e, + 0x76, 0xa9, 0x87, 0xe2, 0xcb, 0x8d, 0x03, 0x9b, 0x9c, 0x6d, 0x84, 0x68, 0x02, 0xa3, 0xfe, 0x42, + 0x86, 0xed, 0x5e, 0xdc, 0xbb, 0x9e, 0xdd, 0x0a, 0xb4, 0x7c, 0x4f, 0x22, 0xb9, 0x14, 0xda, 0x15, + 0x59, 0xfc, 0xda, 0x63, 0xe2, 0x6b, 0xfb, 0x84, 0x6d, 0x11, 0x5a, 0x14, 0xa9, 0x5f, 0x95, 0xdb, + 0xe2, 0xab, 0xd4, 0x3f, 0xce, 0xc2, 0x69, 0xd1, 0xe2, 0x89, 0x86, 0xd9, 0x5a, 0xb2, 0x75, 0xc7, + 0xd0, 0x68, 0x9d, 0x9a, 0xf7, 0xe8, 0xe1, 0x1c, 0x78, 0xd1, 0xa1, 0x93, 0xdf, 0xc3, 0xd0, 0xb9, + 0x8a, 0x1b, 0x41, 0x26, 0x19, 0x3c, 0xf0, 0xe5, 0x46, 0xc5, 0xe8, 0xe6, 0x46, 0x71, 0xc8, 0xe0, + 0x60, 0x3c, 0xf2, 0xd7, 0x64, 0x22, 0xa6, 0x24, 0x33, 0xd4, 0x5a, 0xf1, 0x56, 0x51, 0x49, 0x7a, + 0xb9, 0x92, 0x34, 0x10, 0xa2, 0x09, 0x8c, 0xfa, 0x1f, 0xb3, 0x70, 0x22, 0x2e, 0xf2, 0x2a, 0xb5, + 0x8c, 0x23, 0x79, 0xbf, 0x33, 0xf2, 0xfe, 0x66, 0x0e, 0x1e, 0x16, 0x65, 0xaa, 0xab, 0xba, 0x43, + 0x8d, 0xb2, 0xe9, 0xd0, 0xba, 0x67, 0x3b, 0xeb, 0x87, 0xd8, 0x80, 0xda, 0x3f, 0xb1, 0x5f, 0x83, + 0x82, 0xd8, 0xfe, 0xf3, 0x75, 0x66, 0x24, 0x68, 0x09, 0x42, 0x13, 0x2b, 0x14, 0x3f, 0x3a, 0x88, + 0x75, 0x56, 0x61, 0x3b, 0x9d, 0xf5, 0x01, 0x18, 0x0e, 0x44, 0x8f, 0x1b, 0xd1, 0xbe, 0xd0, 0xda, + 0x32, 0x7c, 0x04, 0xee, 0x45, 0xb5, 0x28, 0x21, 0xd6, 0xe6, 0x03, 0x2a, 0x65, 0xb4, 0x86, 0x86, + 0x45, 0x6d, 0x41, 0x39, 0xd3, 0xd0, 0x64, 0x22, 0x75, 0x23, 0x0f, 0x67, 0xd2, 0xbb, 0x5d, 0xa3, + 0xba, 0x71, 0xd4, 0xeb, 0xdf, 0x92, 0xbd, 0x4e, 0x1e, 0x85, 0xfc, 0x82, 0xee, 0xad, 0x8a, 0x7b, + 0x70, 0xbc, 0x13, 0x5e, 0x36, 0x1b, 0xb4, 0xd6, 0xd2, 0xbd, 0x55, 0x0d, 0x51, 0xd2, 0x9c, 0x01, + 0xc8, 0x31, 0x65, 0xce, 0x90, 0x16, 0xfb, 0xc1, 0x47, 0x32, 0x17, 0xf3, 0xa9, 0x8b, 0xfd, 0xd7, + 0xf3, 0x9d, 0xe6, 0x95, 0x3b, 0x8e, 0xe9, 0xd1, 0x23, 0x0d, 0x3b, 0xd2, 0xb0, 0x3d, 0x6a, 0xd8, + 0xef, 0x66, 0x61, 0x38, 0xd8, 0x34, 0xbd, 0x49, 0xeb, 0x07, 0xb3, 0x56, 0x85, 0x5b, 0x99, 0xdc, + 0x9e, 0xb7, 0x32, 0x7b, 0x51, 0x28, 0x35, 0x38, 0xf2, 0xe4, 0xa6, 0x01, 0x4a, 0x8c, 0x1f, 0x79, + 0x06, 0x07, 0x9d, 0x8f, 0x42, 0xdf, 0xac, 0x7e, 0xdf, 0x6c, 0xb6, 0x9b, 0xc2, 0x4a, 0x47, 0xbf, + 0xae, 0xa6, 0x7e, 0x5f, 0xf3, 0xe1, 0xea, 0x3f, 0xcf, 0xc0, 0x88, 0x10, 0xaa, 0x60, 0xbe, 0x27, + 0xa9, 0x86, 0xd2, 0xc9, 0xee, 0x59, 0x3a, 0xb9, 0xdd, 0x4b, 0x47, 0xfd, 0xd1, 0x1c, 0x28, 0x53, + 0x66, 0x83, 0x2e, 0x3a, 0xba, 0xe5, 0x2e, 0x53, 0x47, 0x6c, 0xa7, 0x27, 0x19, 0xab, 0x3d, 0x7d, + 0xa0, 0x34, 0xa5, 0x64, 0x77, 0x35, 0xa5, 0xbc, 0x0f, 0x06, 0x44, 0x63, 0x02, 0x9f, 0x42, 0x1c, + 0x35, 0x8e, 0x0f, 0xd4, 0x42, 0x3c, 0x23, 0x2e, 0xb5, 0x5a, 0x8e, 0x7d, 0x8f, 0x3a, 0xfc, 0x96, + 0x4a, 0x10, 0xeb, 0x3e, 0x50, 0x0b, 0xf1, 0x12, 0x67, 0xea, 0xdb, 0x8b, 0x32, 0x67, 0xea, 0x68, + 0x21, 0x9e, 0x5c, 0x84, 0xfe, 0x19, 0xbb, 0xae, 0xa3, 0xa0, 0xf9, 0xb4, 0x32, 0xb4, 0xb9, 0x51, + 0xec, 0x6f, 0x08, 0x98, 0x16, 0x60, 0x19, 0x65, 0xd9, 0x5e, 0xb3, 0x1a, 0xb6, 0xce, 0x9d, 0x5f, + 0xfa, 0x39, 0xa5, 0x21, 0x60, 0x5a, 0x80, 0x65, 0x94, 0x4c, 0xe6, 0xe8, 0x54, 0xd4, 0x1f, 0xf2, + 0x5c, 0x16, 0x30, 0x2d, 0xc0, 0xaa, 0xbf, 0x90, 0x67, 0xda, 0xeb, 0x9a, 0x6f, 0x3d, 0xf0, 0xeb, + 0x42, 0x38, 0x60, 0x7a, 0x77, 0x31, 0x60, 0x1e, 0x98, 0x03, 0x3b, 0xf5, 0x4f, 0xfb, 0x00, 0x84, + 0xf4, 0x27, 0x8f, 0x36, 0x87, 0x7b, 0xd3, 0x9a, 0x32, 0x8c, 0x4d, 0x5a, 0xab, 0xba, 0x55, 0xa7, + 0x46, 0x78, 0x6c, 0x59, 0xc0, 0xa1, 0x8d, 0x3e, 0xbd, 0x54, 0x20, 0xc3, 0x73, 0x4b, 0x2d, 0x59, + 0x80, 0x3c, 0x0d, 0x83, 0x15, 0xcb, 0xa3, 0x8e, 0x5e, 0xf7, 0xcc, 0x7b, 0x54, 0x4c, 0x0d, 0x78, + 0x33, 0x6c, 0x86, 0x60, 0x4d, 0xa6, 0x21, 0xd7, 0x60, 0x68, 0x41, 0x77, 0x3c, 0xb3, 0x6e, 0xb6, + 0x74, 0xcb, 0x73, 0x95, 0x7e, 0x9c, 0xd1, 0xd0, 0xc2, 0x68, 0x49, 0x70, 0x2d, 0x42, 0x45, 0x3e, + 0x06, 0x03, 0xb8, 0x35, 0x45, 0xc7, 0xe9, 0x81, 0x2d, 0x2f, 0x0e, 0x1f, 0x0b, 0xdd, 0x03, 0xf9, + 0xe9, 0x2b, 0xde, 0x00, 0xc7, 0xef, 0x0e, 0x03, 0x8e, 0xe4, 0x43, 0xd0, 0x37, 0x69, 0x19, 0xc8, + 0x1c, 0xb6, 0x64, 0xae, 0x0a, 0xe6, 0xa7, 0x42, 0xe6, 0x76, 0x2b, 0xc6, 0xdb, 0x67, 0x97, 0x3e, + 0xca, 0x06, 0xdf, 0xb9, 0x51, 0x36, 0xf4, 0x0e, 0x1c, 0x8b, 0x0f, 0xef, 0xd7, 0xb1, 0xf8, 0xc8, + 0x2e, 0x8f, 0xc5, 0xd5, 0xb7, 0x60, 0x70, 0x7c, 0x61, 0x2a, 0x18, 0xbd, 0x0f, 0x41, 0x6e, 0x41, + 0x78, 0x2a, 0xe4, 0xb9, 0x3d, 0xd3, 0x32, 0x0d, 0x8d, 0xc1, 0xc8, 0x25, 0xe8, 0x9f, 0x40, 0xf7, + 0x37, 0x71, 0x8b, 0x98, 0xe7, 0xeb, 0x5f, 0x1d, 0x61, 0xe8, 0x05, 0xeb, 0xa3, 0xc9, 0xe3, 0xd0, + 0xb7, 0xe0, 0xd8, 0x2b, 0x8e, 0xde, 0x14, 0x6b, 0x30, 0xba, 0x8a, 0xb4, 0x38, 0x48, 0xf3, 0x71, + 0xea, 0xf7, 0x65, 0x7c, 0xb3, 0x9d, 0x95, 0xa8, 0xb6, 0xf1, 0x68, 0x1e, 0xeb, 0xee, 0xe7, 0x25, + 0x5c, 0x0e, 0xd2, 0x7c, 0x1c, 0xb9, 0x04, 0xbd, 0x93, 0x8e, 0x63, 0x3b, 0xb2, 0xb3, 0x39, 0x65, + 0x00, 0xf9, 0xba, 0x17, 0x29, 0xc8, 0xf3, 0x30, 0xc8, 0xe7, 0x1c, 0x7e, 0xa2, 0x99, 0xeb, 0x76, + 0x53, 0x2a, 0x53, 0xaa, 0x5f, 0xcd, 0x49, 0x36, 0x1b, 0x97, 0xf8, 0x03, 0x78, 0x2b, 0xf0, 0x0c, + 0xe4, 0xc6, 0x17, 0xa6, 0xc4, 0x04, 0x78, 0xdc, 0x2f, 0x2a, 0xa9, 0x4a, 0xac, 0x1c, 0xa3, 0x26, + 0x67, 0x21, 0xbf, 0xc0, 0xd4, 0xa7, 0x80, 0xea, 0xd1, 0xbf, 0xb9, 0x51, 0xcc, 0xb7, 0x98, 0xfe, + 0x20, 0x14, 0xb1, 0x6c, 0x33, 0xc3, 0x77, 0x4c, 0x1c, 0x1b, 0xee, 0x63, 0xce, 0x42, 0xbe, 0xe4, + 0xac, 0xdc, 0x13, 0xb3, 0x16, 0x62, 0x75, 0x67, 0xe5, 0x9e, 0x86, 0x50, 0x72, 0x05, 0x40, 0xa3, + 0x5e, 0xdb, 0xb1, 0xf0, 0x1d, 0xc8, 0x00, 0x9e, 0xbf, 0xe1, 0x6c, 0xe8, 0x20, 0xb4, 0x56, 0xb7, + 0x0d, 0xaa, 0x49, 0x24, 0xea, 0x4f, 0x85, 0x17, 0x3b, 0x65, 0xd3, 0xbd, 0x7b, 0xd4, 0x85, 0x3b, + 0xe8, 0x42, 0x5d, 0x1c, 0x71, 0x26, 0x3b, 0xa9, 0x08, 0xbd, 0x53, 0x0d, 0x7d, 0xc5, 0xc5, 0x3e, + 0x14, 0xbe, 0x64, 0xcb, 0x0c, 0xa0, 0x71, 0x78, 0xac, 0x9f, 0xfa, 0xb7, 0xee, 0xa7, 0x2f, 0xf6, + 0x06, 0xa3, 0x6d, 0x8e, 0x7a, 0x6b, 0xb6, 0x73, 0xd4, 0x55, 0xdb, 0xed, 0xaa, 0x0b, 0xd0, 0x57, + 0x75, 0xea, 0xd2, 0xd1, 0x05, 0xee, 0x07, 0x5c, 0xa7, 0xce, 0x8f, 0x2d, 0x7c, 0x24, 0xa3, 0x2b, + 0xbb, 0x1e, 0xd2, 0xf5, 0x85, 0x74, 0x86, 0xeb, 0x09, 0x3a, 0x81, 0x14, 0x74, 0x0b, 0xb6, 0xe3, + 0x89, 0x8e, 0x0b, 0xe8, 0x5a, 0xb6, 0xe3, 0x69, 0x3e, 0x92, 0xbc, 0x0f, 0x60, 0x71, 0x62, 0xc1, + 0x77, 0xb6, 0x1f, 0x08, 0x7d, 0x01, 0x85, 0x97, 0xbd, 0x26, 0xa1, 0xc9, 0x22, 0x0c, 0xcc, 0xb7, + 0xa8, 0xc3, 0xb7, 0x42, 0xfc, 0x65, 0xc7, 0x7b, 0x63, 0xa2, 0x15, 0xfd, 0x7e, 0x59, 0xfc, 0x1f, + 0x90, 0xf3, 0xf5, 0xc5, 0xf6, 0x7f, 0x6a, 0x21, 0x23, 0xf2, 0x3c, 0x14, 0x4a, 0xdc, 0xce, 0x1b, + 0x44, 0x96, 0x81, 0xc8, 0x70, 0x0b, 0xca, 0x51, 0x7c, 0xcf, 0xae, 0xe3, 0xdf, 0x9a, 0x20, 0x57, + 0x2f, 0xc1, 0x68, 0xbc, 0x1a, 0x32, 0x08, 0x7d, 0x13, 0xf3, 0x73, 0x73, 0x93, 0x13, 0x8b, 0xa3, + 0x3d, 0xa4, 0x1f, 0xf2, 0xd5, 0xc9, 0xb9, 0xf2, 0x68, 0x46, 0xfd, 0x39, 0x69, 0x06, 0x61, 0xaa, + 0x75, 0x74, 0x35, 0xbc, 0xa7, 0xfb, 0x96, 0x51, 0xbc, 0x0f, 0xc5, 0x13, 0x83, 0xa6, 0xe9, 0x79, + 0xd4, 0x10, 0xab, 0x04, 0xde, 0x17, 0x7a, 0xf7, 0xb5, 0x04, 0x9e, 0x3c, 0x09, 0xc3, 0x08, 0x13, + 0x57, 0x84, 0x7c, 0x7f, 0x2c, 0x0a, 0x38, 0xf7, 0xb5, 0x28, 0x52, 0xfd, 0x5a, 0x78, 0x3b, 0x3c, + 0x43, 0xf5, 0xc3, 0x7a, 0xa3, 0xf8, 0x2e, 0xe9, 0x2f, 0xf5, 0x2f, 0xf2, 0xfc, 0x09, 0x08, 0x7f, + 0xb8, 0x77, 0x10, 0xa2, 0x0c, 0x8f, 0x74, 0x73, 0x3b, 0x38, 0xd2, 0x7d, 0x12, 0x0a, 0xb3, 0xd4, + 0x5b, 0xb5, 0x7d, 0xc7, 0x2f, 0xf4, 0xd0, 0x6b, 0x22, 0x44, 0xf6, 0xd0, 0xe3, 0x34, 0xe4, 0x2e, + 0x10, 0xff, 0x55, 0x5e, 0xe0, 0x88, 0xed, 0x1f, 0x21, 0x9f, 0x4e, 0xec, 0x53, 0xaa, 0xf8, 0x24, + 0x17, 0x7d, 0xec, 0x4f, 0x04, 0x8e, 0xde, 0x92, 0x27, 0xd6, 0x9f, 0x6f, 0x14, 0x0b, 0x9c, 0x46, + 0x4b, 0x61, 0x4b, 0x5e, 0x87, 0x81, 0xd9, 0xa9, 0x92, 0x78, 0xa1, 0xc7, 0xbd, 0x22, 0x1e, 0x0a, + 0xa4, 0xe8, 0x23, 0x02, 0x91, 0xe0, 0x7b, 0x9b, 0xe6, 0xb2, 0x9e, 0x7c, 0xa0, 0x17, 0x72, 0x61, + 0xda, 0xc2, 0x5f, 0xee, 0x88, 0xd3, 0x85, 0x40, 0x5b, 0xa2, 0xef, 0x79, 0xe2, 0xb2, 0xe2, 0xd8, + 0x98, 0xb6, 0xf4, 0xef, 0x61, 0x74, 0xcf, 0xc3, 0x58, 0xa9, 0xd5, 0x6a, 0x98, 0xd4, 0x40, 0x7d, + 0xd1, 0xda, 0x0d, 0xea, 0x0a, 0x97, 0x1f, 0x7c, 0x0c, 0xa2, 0x73, 0x64, 0x0d, 0xdf, 0x85, 0xd6, + 0x9c, 0x76, 0xd4, 0x3f, 0x33, 0x59, 0x56, 0xfd, 0x81, 0x2c, 0x9c, 0x9a, 0x70, 0xa8, 0xee, 0xd1, + 0xd9, 0xa9, 0x52, 0xa9, 0x8d, 0x3e, 0x72, 0x8d, 0x06, 0xb5, 0x56, 0x0e, 0x66, 0x58, 0xbf, 0x04, + 0x23, 0x41, 0x03, 0xaa, 0x75, 0xbb, 0x45, 0xe5, 0x87, 0x55, 0x75, 0x1f, 0x53, 0x73, 0x19, 0x4a, + 0x8b, 0x91, 0x92, 0x9b, 0x70, 0x3c, 0x80, 0x94, 0x1a, 0x0d, 0x7b, 0x4d, 0xa3, 0x6d, 0x97, 0x3b, + 0xc6, 0xf6, 0x73, 0xc7, 0xd8, 0x90, 0x83, 0xce, 0xf0, 0x35, 0x87, 0x11, 0x68, 0x69, 0xa5, 0xd4, + 0x2f, 0xe5, 0xe0, 0xf4, 0x6d, 0xbd, 0x61, 0x1a, 0xa1, 0x68, 0x34, 0xea, 0xb6, 0x6c, 0xcb, 0xa5, + 0x87, 0x68, 0x94, 0x46, 0x86, 0x42, 0x7e, 0x5f, 0x86, 0x42, 0xb2, 0x8b, 0x7a, 0xf7, 0xdc, 0x45, + 0x85, 0x5d, 0x75, 0xd1, 0x7f, 0xc8, 0xc0, 0xa8, 0xef, 0xf8, 0x2f, 0xbf, 0xa6, 0x96, 0xbc, 0xd2, + 0xf1, 0x08, 0x31, 0xe6, 0x07, 0x8d, 0x78, 0x52, 0x85, 0xbe, 0xc9, 0xfb, 0x2d, 0xd3, 0xa1, 0xee, + 0x36, 0x9c, 0xb8, 0xcf, 0x89, 0xe3, 0x92, 0x31, 0xca, 0x8b, 0x24, 0x4e, 0x4a, 0x38, 0x18, 0x9f, + 0xf3, 0xf1, 0xa7, 0x0f, 0xe3, 0xfe, 0x13, 0x71, 0xfe, 0x9c, 0x4f, 0x3c, 0x91, 0x88, 0xbc, 0xcf, + 0x0c, 0x49, 0xc9, 0x63, 0x90, 0x5b, 0x5c, 0x9c, 0x11, 0x33, 0x29, 0x3e, 0xcd, 0xf7, 0x3c, 0xf9, + 0xbd, 0x22, 0xc3, 0xaa, 0x7f, 0x90, 0x05, 0x60, 0xaa, 0xc0, 0x87, 0xeb, 0x81, 0x28, 0xe1, 0x38, + 0xf4, 0xfb, 0x02, 0x17, 0x6a, 0x18, 0x78, 0xed, 0xc7, 0x3b, 0x22, 0x5e, 0x77, 0xf0, 0x42, 0xa3, + 0xe8, 0x3b, 0x92, 0xf3, 0x7b, 0x00, 0xdc, 0xd9, 0xa0, 0x23, 0xb9, 0xef, 0x3e, 0xfe, 0x3e, 0x18, + 0x10, 0x33, 0x9e, 0x1d, 0x39, 0xff, 0xaf, 0xfb, 0x40, 0x2d, 0xc4, 0xc7, 0xa6, 0xd6, 0xc2, 0x1e, + 0x16, 0x62, 0x5f, 0xbc, 0xbc, 0x57, 0x8e, 0xc4, 0xbb, 0xcf, 0xe2, 0xfd, 0x9c, 0x10, 0x2f, 0x7f, + 0xc1, 0x73, 0x68, 0xc5, 0xbb, 0x6f, 0x67, 0xdf, 0xea, 0xef, 0x66, 0x80, 0xb0, 0x66, 0x2d, 0xe8, + 0xae, 0xbb, 0x66, 0x3b, 0x06, 0x77, 0x4e, 0x3f, 0x10, 0xc1, 0xec, 0xdf, 0x7d, 0xe5, 0x57, 0xfb, + 0xe1, 0x78, 0xc4, 0xf1, 0xf7, 0x90, 0x4f, 0x56, 0x97, 0xa2, 0xa3, 0xa9, 0xdb, 0xab, 0x97, 0xf7, + 0xc8, 0x17, 0xa2, 0xbd, 0x91, 0x07, 0x68, 0xd2, 0x4d, 0xe8, 0x53, 0x30, 0x24, 0x7e, 0xb0, 0x15, + 0xda, 0xbf, 0xe9, 0xc2, 0x51, 0xea, 0x32, 0x80, 0x16, 0x41, 0x93, 0x67, 0x61, 0x80, 0x0d, 0x98, + 0x15, 0x8c, 0xe2, 0xd1, 0x17, 0xbe, 0x28, 0x31, 0x7c, 0xa0, 0xbc, 0x9e, 0x04, 0x94, 0xd2, 0x3b, + 0xa2, 0xfe, 0x6d, 0xbc, 0x23, 0xfa, 0x38, 0x0c, 0x96, 0x2c, 0xcb, 0xf6, 0x70, 0x93, 0xee, 0x8a, + 0xab, 0x89, 0x8e, 0x56, 0xf9, 0x63, 0xf8, 0x38, 0x3e, 0xa4, 0x4f, 0x35, 0xcb, 0x65, 0x86, 0xe4, + 0xaa, 0xff, 0x2a, 0x86, 0x3a, 0xc2, 0xab, 0x1c, 0xaf, 0x67, 0x1c, 0x01, 0x4b, 0x3e, 0x8a, 0xc1, + 0xce, 0x1b, 0x5e, 0x70, 0xec, 0x96, 0xed, 0x52, 0x83, 0x0b, 0x6a, 0x30, 0x0c, 0x35, 0xd0, 0x12, + 0x08, 0x7c, 0xc7, 0x16, 0x89, 0xa8, 0x11, 0x29, 0x42, 0x96, 0xe1, 0x84, 0x7f, 0x51, 0x1c, 0xbc, + 0x18, 0xac, 0x94, 0x5d, 0x65, 0x08, 0x5f, 0x25, 0x91, 0xb8, 0x32, 0x54, 0xca, 0xe3, 0xe7, 0xfd, + 0x6b, 0x11, 0xff, 0xc9, 0x61, 0xcd, 0x34, 0xe4, 0xae, 0x4e, 0xe5, 0x47, 0xbe, 0x0d, 0x06, 0x67, + 0xf5, 0xfb, 0xe5, 0xb6, 0x38, 0x7b, 0x19, 0xde, 0xfe, 0xed, 0x4b, 0x53, 0xbf, 0x5f, 0x33, 0x44, + 0xb9, 0x98, 0x4d, 0x21, 0xb3, 0x24, 0x35, 0x38, 0xb5, 0xe0, 0xd8, 0x4d, 0xdb, 0xa3, 0x46, 0xec, + 0xf1, 0xdd, 0xb1, 0xf0, 0xb5, 0x6e, 0x4b, 0x50, 0xd4, 0xba, 0xbc, 0xc2, 0xeb, 0xc0, 0x86, 0x34, + 0xe1, 0x58, 0xc9, 0x75, 0xdb, 0x4d, 0x1a, 0xde, 0x50, 0x8d, 0x6e, 0xf9, 0x19, 0xef, 0x15, 0x5e, + 0xcb, 0x0f, 0xeb, 0x58, 0x94, 0x5f, 0x50, 0xd5, 0x3c, 0x53, 0xae, 0x11, 0xbf, 0x25, 0xce, 0xfb, + 0x46, 0xbe, 0x7f, 0x64, 0xf4, 0x98, 0x76, 0x3a, 0xd9, 0x98, 0x45, 0xd3, 0x6b, 0x50, 0xf5, 0x2b, + 0x19, 0x80, 0x50, 0xc0, 0xe4, 0xa9, 0x68, 0xa8, 0xa0, 0x4c, 0x78, 0xd1, 0x21, 0xa2, 0x17, 0x44, + 0x62, 0x03, 0x91, 0xb3, 0x90, 0xc7, 0x08, 0x17, 0xd9, 0xf0, 0x60, 0xf5, 0xae, 0x69, 0x19, 0x1a, + 0x42, 0x19, 0x56, 0x7a, 0x8a, 0x8e, 0x58, 0xbc, 0xd4, 0xe7, 0x56, 0x61, 0x19, 0x8e, 0x55, 0xdb, + 0x4b, 0x7e, 0xdd, 0xd2, 0xbb, 0x3a, 0x0c, 0xb4, 0xe1, 0xb6, 0x97, 0x82, 0xc7, 0xa8, 0x91, 0x30, + 0x26, 0xd1, 0x22, 0xea, 0x2f, 0x64, 0x62, 0xb3, 0xe0, 0x01, 0x2e, 0x7a, 0xef, 0x49, 0xfa, 0x69, + 0x24, 0xa7, 0x25, 0xf5, 0xc7, 0xb2, 0x30, 0xb8, 0x60, 0x3b, 0x9e, 0x08, 0x19, 0x72, 0xb8, 0x57, + 0x21, 0x69, 0xaf, 0x94, 0xdf, 0xc1, 0x5e, 0xe9, 0x2c, 0xe4, 0x25, 0x17, 0x65, 0x7e, 0x2f, 0x62, + 0x18, 0x8e, 0x86, 0x50, 0xf5, 0xdb, 0xb3, 0x00, 0x1f, 0x7a, 0xfa, 0xe9, 0x07, 0x58, 0x40, 0xea, + 0x8f, 0x64, 0xe0, 0x98, 0xb8, 0xa8, 0x93, 0x82, 0x6e, 0xf5, 0xf9, 0x57, 0xac, 0xf2, 0xb8, 0xe4, + 0x20, 0xcd, 0xc7, 0xb1, 0x25, 0x60, 0xf2, 0xbe, 0xe9, 0xe1, 0x5d, 0x85, 0x14, 0x75, 0x8b, 0x0a, + 0x98, 0xbc, 0x04, 0xf8, 0x74, 0xe4, 0x29, 0xff, 0x0a, 0x32, 0x17, 0xae, 0x7b, 0xac, 0xc0, 0x64, + 0xea, 0x35, 0xa4, 0xfa, 0xcb, 0x79, 0xc8, 0x4f, 0xde, 0xa7, 0xf5, 0x43, 0xde, 0x35, 0xd2, 0xc1, + 0x66, 0x7e, 0x8f, 0x07, 0x9b, 0xbb, 0xf1, 0xa9, 0x78, 0x35, 0xec, 0xcf, 0x42, 0xb4, 0xfa, 0x58, + 0xcf, 0xc7, 0xab, 0xf7, 0x7b, 0xfa, 0xf0, 0xb9, 0xe4, 0xfc, 0xc3, 0x1c, 0xe4, 0xaa, 0x13, 0x0b, + 0x47, 0x7a, 0x73, 0xa0, 0x7a, 0xd3, 0xfd, 0xce, 0x5a, 0x0d, 0xae, 0xa1, 0xfa, 0x43, 0x2f, 0xd1, + 0xd8, 0x8d, 0xd3, 0x37, 0x73, 0x30, 0x52, 0x9d, 0x5a, 0x5c, 0x90, 0x4e, 0x82, 0x6f, 0x72, 0x4f, + 0x3e, 0xf4, 0x29, 0xe3, 0x5d, 0x7a, 0x36, 0x61, 0xcf, 0xdc, 0xaa, 0x58, 0xde, 0x73, 0xd7, 0x6e, + 0xeb, 0x8d, 0x36, 0xc5, 0xa3, 0x17, 0xee, 0xf7, 0xeb, 0x9a, 0x6f, 0xd1, 0x2f, 0xe1, 0xc3, 0x7f, + 0x9f, 0x01, 0x79, 0x09, 0x72, 0xb7, 0x84, 0x47, 0x46, 0x27, 0x3e, 0xcf, 0x5c, 0xe5, 0x7c, 0xd8, + 0x24, 0x98, 0x6b, 0x9b, 0x06, 0x72, 0x60, 0xa5, 0x58, 0xe1, 0xeb, 0x62, 0x01, 0xde, 0x56, 0xe1, + 0x15, 0xbf, 0xf0, 0xf5, 0x4a, 0x99, 0x54, 0x61, 0x70, 0x81, 0x3a, 0x4d, 0x13, 0x3b, 0xca, 0x9f, + 0xb3, 0xbb, 0x33, 0x61, 0x3b, 0x95, 0xc1, 0x56, 0x58, 0x08, 0x99, 0xc9, 0x5c, 0xc8, 0x1b, 0x00, + 0xdc, 0x46, 0xd9, 0x66, 0x20, 0xc7, 0x73, 0x68, 0xf7, 0x73, 0xd3, 0x32, 0xc5, 0xc6, 0x93, 0x98, + 0x91, 0xbb, 0x30, 0x3a, 0x6b, 0x1b, 0xe6, 0xb2, 0xc9, 0x5d, 0x2f, 0xb1, 0x82, 0xc2, 0xd6, 0x0e, + 0x4f, 0xcc, 0x94, 0x6c, 0x4a, 0xe5, 0xd2, 0xaa, 0x49, 0x30, 0x56, 0xff, 0x5e, 0x2f, 0xe4, 0x59, + 0xb7, 0x1f, 0x8d, 0xdf, 0xbd, 0x8c, 0xdf, 0x12, 0x8c, 0xde, 0xb1, 0x9d, 0xbb, 0xa6, 0xb5, 0x12, + 0x78, 0xc5, 0x8b, 0xbd, 0x29, 0x7a, 0xf2, 0xac, 0x71, 0x5c, 0x2d, 0x70, 0xa0, 0xd7, 0x12, 0xe4, + 0x5b, 0x8c, 0xe0, 0x17, 0x00, 0xf8, 0x5b, 0x77, 0xa4, 0xe9, 0x0f, 0x83, 0x55, 0xf0, 0x97, 0xf0, + 0xe8, 0x68, 0x2f, 0x07, 0xab, 0x08, 0x89, 0xd9, 0x26, 0x9c, 0xfb, 0x42, 0x0c, 0xa0, 0xdf, 0x3d, + 0x6e, 0xc2, 0xd1, 0x17, 0x42, 0x36, 0x02, 0xb8, 0x57, 0xc4, 0x02, 0x80, 0x74, 0xbf, 0x04, 0x31, + 0x41, 0x44, 0x26, 0x07, 0x11, 0x1e, 0x2e, 0xe5, 0x7a, 0x49, 0x93, 0x78, 0x90, 0xe7, 0x62, 0x17, + 0xe0, 0x24, 0xc2, 0xad, 0xe3, 0xfd, 0x77, 0xe8, 0x40, 0x35, 0xb4, 0x95, 0x03, 0x95, 0xfa, 0x99, + 0x2c, 0x0c, 0x54, 0xdb, 0x4b, 0xee, 0xba, 0xeb, 0xd1, 0xe6, 0x21, 0x57, 0x63, 0x7f, 0x7b, 0x95, + 0x4f, 0xdd, 0x5e, 0x3d, 0xe6, 0x0b, 0x45, 0x3a, 0x77, 0x0c, 0x4c, 0x3a, 0x5f, 0x1c, 0x7f, 0x2b, + 0x0b, 0xa3, 0xfc, 0xe2, 0xac, 0x6c, 0xba, 0xf5, 0x7d, 0x70, 0xe6, 0x3f, 0x78, 0xa9, 0xec, 0xed, + 0xb2, 0x79, 0x1b, 0x4f, 0x24, 0xd4, 0x4f, 0x66, 0x61, 0xb0, 0xd4, 0xf6, 0x56, 0x4b, 0x1e, 0xea, + 0xd6, 0x03, 0xb9, 0x3f, 0xf9, 0xcd, 0x0c, 0x1c, 0x63, 0x0d, 0x59, 0xb4, 0xef, 0x52, 0x6b, 0x1f, + 0x0e, 0x1e, 0xe5, 0x03, 0xc4, 0xec, 0x2e, 0x0f, 0x10, 0x7d, 0x59, 0xe6, 0x76, 0x26, 0x4b, 0x3c, + 0x2e, 0xd7, 0xec, 0x06, 0x3d, 0xdc, 0x9f, 0xb1, 0x8f, 0xc7, 0xe5, 0xbe, 0x40, 0xf6, 0xe1, 0x7a, + 0xe6, 0x5b, 0x4b, 0x20, 0xfb, 0x70, 0xb6, 0xf4, 0xad, 0x21, 0x90, 0xaf, 0x66, 0x60, 0x60, 0xdc, + 0xf6, 0x0e, 0xf9, 0xc0, 0x17, 0x5f, 0x71, 0xb8, 0xd5, 0xdc, 0xff, 0x8a, 0xc3, 0xad, 0x9b, 0xea, + 0x0f, 0x66, 0xe1, 0x84, 0x08, 0xd2, 0x2d, 0xce, 0x1f, 0x8e, 0xa6, 0x63, 0x31, 0xd8, 0x92, 0xa2, + 0x39, 0x9a, 0x87, 0x84, 0x68, 0x7e, 0x3a, 0x07, 0x27, 0x30, 0x94, 0x29, 0xdb, 0x96, 0x7d, 0x0b, + 0xd8, 0x22, 0xa4, 0x1e, 0xbd, 0x04, 0x9d, 0x4d, 0xb9, 0x04, 0xfd, 0xf3, 0x8d, 0xe2, 0x73, 0x2b, + 0xa6, 0xb7, 0xda, 0x5e, 0xba, 0x5c, 0xb7, 0x9b, 0x57, 0x56, 0x1c, 0xfd, 0x9e, 0xc9, 0xaf, 0xff, + 0xf4, 0xc6, 0x95, 0x20, 0xdf, 0x85, 0xde, 0x32, 0x45, 0x26, 0x8c, 0x2a, 0xee, 0x75, 0x18, 0x57, + 0xff, 0xfa, 0xd4, 0x05, 0xb8, 0x61, 0x9b, 0x96, 0xf0, 0x29, 0xe4, 0x86, 0x6e, 0x95, 0xed, 0x0f, + 0xdf, 0xb4, 0x4d, 0xab, 0x16, 0x77, 0x2c, 0xdc, 0x69, 0x7d, 0x21, 0x6b, 0x4d, 0xaa, 0x46, 0xfd, + 0x67, 0x19, 0x78, 0x28, 0xaa, 0xc5, 0xdf, 0x0a, 0xb6, 0xe3, 0x0f, 0x65, 0xe1, 0xe4, 0x75, 0x14, + 0x4e, 0xe0, 0xc8, 0x71, 0x34, 0x6f, 0x89, 0xc1, 0x99, 0x22, 0x9b, 0x23, 0x8b, 0xb2, 0xb3, 0x6c, + 0x8e, 0x26, 0x75, 0x21, 0x9b, 0xdf, 0xca, 0xc0, 0xf1, 0xf9, 0x4a, 0x79, 0xe2, 0x5b, 0x64, 0x44, + 0x25, 0xbf, 0xe7, 0x90, 0x1b, 0x9c, 0x89, 0xef, 0x39, 0xe4, 0xa6, 0xe7, 0x17, 0xb2, 0x70, 0xbc, + 0x5a, 0x9a, 0x9d, 0xf9, 0x56, 0x99, 0xc1, 0x27, 0x64, 0xaf, 0x43, 0xff, 0x10, 0x4c, 0xd8, 0x02, + 0xf2, 0x67, 0xde, 0xbe, 0xda, 0xd9, 0x1b, 0x31, 0x29, 0x94, 0x43, 0x3e, 0x75, 0xef, 0x8b, 0x50, + 0x98, 0xe6, 0x47, 0xa8, 0x0f, 0xb9, 0xe6, 0xff, 0x83, 0x02, 0x0c, 0xde, 0x6c, 0x2f, 0x51, 0xe1, + 0x9c, 0xf2, 0x40, 0x9f, 0xfc, 0x5e, 0x85, 0x41, 0x21, 0x06, 0xbc, 0x35, 0x91, 0x82, 0xe7, 0x89, + 0x60, 0x28, 0x3c, 0x3e, 0x91, 0x4c, 0x44, 0xce, 0x42, 0xfe, 0x36, 0x75, 0x96, 0xe4, 0x77, 0xa5, + 0xf7, 0xa8, 0xb3, 0xa4, 0x21, 0x94, 0xcc, 0x84, 0x2e, 0xf3, 0xa5, 0x85, 0x0a, 0x26, 0x52, 0x11, + 0x17, 0x36, 0x98, 0x19, 0x26, 0xf0, 0x7b, 0xd3, 0x5b, 0x26, 0x4f, 0xc1, 0x22, 0xbf, 0x69, 0x8f, + 0x97, 0x24, 0x73, 0x30, 0x26, 0x3b, 0x3e, 0xf1, 0x2c, 0x22, 0xfd, 0x29, 0xec, 0xd2, 0xf2, 0x87, + 0x24, 0x8b, 0x92, 0x57, 0x61, 0xc8, 0x07, 0xa2, 0x0b, 0xd7, 0x40, 0x18, 0xba, 0x3e, 0x60, 0x15, + 0x4b, 0x51, 0x14, 0x29, 0x20, 0x33, 0xc0, 0x6b, 0x08, 0x48, 0x61, 0x10, 0x73, 0x89, 0x8b, 0x14, + 0x20, 0xcf, 0x22, 0x03, 0x7c, 0xe6, 0x81, 0xce, 0x2a, 0x83, 0xf8, 0xe8, 0x12, 0x5d, 0xf2, 0x1d, + 0x01, 0xe7, 0x4f, 0x6b, 0x23, 0x64, 0x64, 0x1e, 0x20, 0x74, 0x2a, 0x10, 0x01, 0x0c, 0x76, 0xec, + 0xee, 0x20, 0xb1, 0x90, 0xaf, 0x03, 0x87, 0x77, 0x73, 0x1d, 0xa8, 0xfe, 0x4e, 0x16, 0x06, 0x4b, + 0xad, 0x56, 0x30, 0x14, 0x9e, 0x82, 0x42, 0xa9, 0xd5, 0xba, 0xa5, 0x55, 0xe4, 0x50, 0xe6, 0x7a, + 0xab, 0x55, 0x6b, 0x3b, 0xa6, 0xec, 0x13, 0xca, 0x89, 0xc8, 0x04, 0x0c, 0x97, 0x5a, 0xad, 0x85, + 0xf6, 0x52, 0xc3, 0xac, 0x4b, 0x99, 0x91, 0x78, 0x12, 0xb7, 0x56, 0xab, 0xd6, 0x42, 0x4c, 0x3c, + 0x3d, 0x56, 0xb4, 0x0c, 0xf9, 0x38, 0x86, 0xfd, 0x11, 0x89, 0x79, 0x78, 0xea, 0x0f, 0x35, 0x08, + 0x62, 0x1e, 0xb6, 0xed, 0x72, 0x40, 0xc4, 0x83, 0xbd, 0x9f, 0xf5, 0x43, 0xe6, 0xb3, 0x8a, 0x12, + 0x09, 0x78, 0x42, 0x96, 0xe4, 0xfd, 0xd0, 0x57, 0x6a, 0xb5, 0xa4, 0xfb, 0x26, 0x74, 0x2a, 0x62, + 0xa5, 0x62, 0x7d, 0xec, 0x93, 0x9d, 0x79, 0x19, 0x46, 0xa2, 0x95, 0xed, 0x28, 0x58, 0xfc, 0x9f, + 0x65, 0xf0, 0x83, 0x0e, 0xb9, 0x4f, 0xf3, 0x33, 0x90, 0x2b, 0xb5, 0x5a, 0x62, 0x3e, 0x3a, 0x9e, + 0xd2, 0x1f, 0xf1, 0x27, 0xd0, 0xa5, 0x56, 0xcb, 0xff, 0xf4, 0x43, 0xfe, 0x38, 0x62, 0x57, 0x9f, + 0xfe, 0x55, 0xfe, 0xe9, 0x87, 0xfb, 0xe1, 0x82, 0xfa, 0xcb, 0x39, 0x38, 0x56, 0x6a, 0xb5, 0x8e, + 0x82, 0xcc, 0xef, 0xd7, 0x43, 0xeb, 0xa7, 0x01, 0xa4, 0xe9, 0xb1, 0x2f, 0x78, 0xba, 0x35, 0x28, + 0x4d, 0x8d, 0x4a, 0x46, 0x93, 0x88, 0x7c, 0xf5, 0xeb, 0xdf, 0x91, 0xfa, 0x7d, 0x32, 0x87, 0x53, + 0xf1, 0x61, 0x0f, 0x1a, 0xf5, 0x6e, 0xe9, 0x36, 0xd1, 0x07, 0x85, 0x1d, 0xf5, 0xc1, 0x6f, 0x44, + 0x06, 0x0f, 0x06, 0x2d, 0x3f, 0xea, 0x85, 0xde, 0x3d, 0x99, 0xc5, 0x23, 0xb2, 0x30, 0x45, 0x24, + 0x1b, 0x3f, 0x91, 0x92, 0x88, 0xab, 0x54, 0x67, 0xa8, 0x9a, 0x69, 0x68, 0x31, 0x5a, 0xbf, 0x0f, + 0xfb, 0x76, 0xd4, 0x87, 0x1b, 0x59, 0x7c, 0x3b, 0x1d, 0xc4, 0x65, 0xda, 0xfb, 0xee, 0xe2, 0x0a, + 0x00, 0xf7, 0x3c, 0x08, 0xdc, 0x9a, 0x87, 0x79, 0x08, 0x16, 0x9e, 0x5f, 0x49, 0x84, 0x60, 0x09, + 0x49, 0x02, 0x0f, 0xa9, 0x5c, 0xaa, 0x87, 0xd4, 0x25, 0xe8, 0xd7, 0xf4, 0xb5, 0xd7, 0xdb, 0xd4, + 0x59, 0x17, 0xe6, 0x0c, 0x0f, 0x7b, 0xa8, 0xaf, 0xd5, 0x3e, 0xc1, 0x80, 0x5a, 0x80, 0x26, 0x6a, + 0xf0, 0xf8, 0x5e, 0xf2, 0x08, 0xe1, 0x67, 0xe4, 0xc1, 0x93, 0xfb, 0xdd, 0x28, 0x3a, 0x79, 0x11, + 0x72, 0xa5, 0x3b, 0x55, 0x21, 0xd9, 0xa0, 0x6b, 0x4b, 0x77, 0xaa, 0x42, 0x5e, 0x1d, 0xcb, 0xde, + 0xa9, 0xaa, 0x9f, 0xcc, 0x02, 0x49, 0x52, 0x92, 0xe7, 0x60, 0x00, 0xa1, 0x2b, 0x4c, 0x67, 0xe4, + 0xc4, 0x9c, 0x6b, 0x6e, 0xcd, 0x41, 0x68, 0xc4, 0xb8, 0xf3, 0x49, 0xc9, 0x0b, 0x98, 0x83, 0x58, + 0xa4, 0x86, 0x8b, 0x24, 0xe6, 0x5c, 0x73, 0xfd, 0xac, 0xbd, 0xb1, 0x14, 0xc4, 0x82, 0x18, 0xed, + 0xc2, 0x3b, 0xd5, 0x69, 0xdb, 0xf5, 0x84, 0xa8, 0xb9, 0x5d, 0xb8, 0xe6, 0x62, 0x46, 0xd8, 0x88, + 0x5d, 0xc8, 0xc9, 0x30, 0xab, 0xd5, 0x9d, 0x2a, 0x7f, 0xa6, 0x62, 0x68, 0x76, 0xc3, 0x37, 0x28, + 0x79, 0x56, 0xab, 0x35, 0xb7, 0xc6, 0x9f, 0xb8, 0x18, 0x98, 0xfc, 0x38, 0x92, 0xd5, 0x2a, 0x52, + 0x4a, 0xfd, 0x6c, 0x3f, 0x8c, 0x96, 0x75, 0x4f, 0x5f, 0xd2, 0x5d, 0x2a, 0xed, 0xa6, 0x8f, 0xf9, + 0x30, 0xff, 0x73, 0x24, 0x39, 0x18, 0x4b, 0x29, 0x5f, 0x13, 0x2f, 0x40, 0x5e, 0x0a, 0xf9, 0x06, + 0x39, 0x47, 0xe5, 0x24, 0x66, 0x4b, 0xb5, 0x96, 0x00, 0x6b, 0x09, 0x42, 0xf2, 0x24, 0x0c, 0xfa, + 0x30, 0xb6, 0x01, 0xc8, 0x85, 0x3a, 0x63, 0x2c, 0x31, 0xfb, 0x5f, 0x93, 0xd1, 0xe4, 0x05, 0x18, + 0xf2, 0x7f, 0x4a, 0xa6, 0x35, 0xcf, 0xc8, 0xb6, 0x94, 0xd8, 0x3d, 0xc9, 0xa4, 0x72, 0x51, 0x9c, + 0xdf, 0x7a, 0x23, 0x45, 0x63, 0x49, 0xcf, 0x22, 0xa4, 0xe4, 0x13, 0x30, 0xe2, 0xff, 0x16, 0x1b, + 0x06, 0x9e, 0x1f, 0xee, 0xc9, 0x20, 0xb7, 0x72, 0x4c, 0xac, 0x97, 0xa3, 0xe4, 0x7c, 0xeb, 0xf0, + 0xb0, 0x9f, 0xc7, 0xcb, 0x58, 0x4a, 0xee, 0x1c, 0x62, 0x15, 0x90, 0x0a, 0x8c, 0xf9, 0x90, 0x50, + 0x43, 0xfb, 0xc2, 0x1d, 0xa3, 0xb1, 0x54, 0x4b, 0x55, 0xd2, 0x64, 0x29, 0xd2, 0x80, 0xb3, 0x11, + 0xa0, 0xe1, 0xae, 0x9a, 0xcb, 0x9e, 0xd8, 0xee, 0x89, 0x18, 0xc4, 0x22, 0x71, 0x63, 0xc0, 0x95, + 0xd3, 0xf8, 0x19, 0x58, 0xa3, 0xd9, 0xa1, 0xba, 0x72, 0x23, 0x55, 0x38, 0xe1, 0xe3, 0xaf, 0x4f, + 0x2c, 0x2c, 0x38, 0xf6, 0x9b, 0xb4, 0xee, 0x55, 0xca, 0x62, 0xbb, 0x8c, 0xb1, 0xe9, 0x8c, 0xa5, + 0xda, 0x4a, 0xbd, 0xc5, 0x94, 0x82, 0xe1, 0xa2, 0xcc, 0x53, 0x0b, 0x93, 0xdb, 0x70, 0x52, 0x82, + 0x57, 0x2c, 0xd7, 0xd3, 0xad, 0x3a, 0xad, 0x94, 0xc5, 0x1e, 0x1a, 0xf7, 0xf3, 0x82, 0xab, 0x29, + 0x90, 0x51, 0xb6, 0xe9, 0xc5, 0xc9, 0xcb, 0x30, 0xec, 0x23, 0xf8, 0x2d, 0xe2, 0x20, 0xde, 0x22, + 0xe2, 0x90, 0x34, 0x96, 0x6a, 0xf1, 0xd7, 0x94, 0x51, 0x62, 0x59, 0xa3, 0x30, 0xb5, 0xfd, 0x50, + 0x44, 0xa3, 0xbc, 0xf5, 0x56, 0xaa, 0x32, 0x62, 0xba, 0xfb, 0x57, 0x43, 0x8d, 0x9a, 0x77, 0xcc, + 0x15, 0x93, 0xef, 0xa4, 0xfd, 0x07, 0x94, 0x4b, 0x35, 0x1b, 0x81, 0x69, 0xfa, 0xc1, 0xc9, 0xcf, + 0x94, 0xe0, 0x78, 0x8a, 0x8e, 0xed, 0x68, 0xc7, 0xf8, 0x99, 0x6c, 0xd8, 0x88, 0x43, 0xbe, 0x6d, + 0x1c, 0x87, 0x7e, 0xff, 0x4b, 0x84, 0xf1, 0xa0, 0x74, 0x1a, 0x9a, 0x71, 0x1e, 0x3e, 0x3e, 0x22, + 0x8e, 0x43, 0xbe, 0x95, 0xdc, 0x0f, 0x71, 0xbc, 0x9d, 0x09, 0xc5, 0x71, 0xc8, 0xb7, 0x97, 0xbf, + 0x95, 0x0b, 0xe7, 0xa4, 0xa3, 0x3d, 0xe6, 0x7e, 0x99, 0xc9, 0xa1, 0x1f, 0x6c, 0x61, 0x07, 0x0f, + 0x19, 0x65, 0xd5, 0xec, 0xdb, 0xa5, 0x6a, 0xfe, 0x5e, 0xb2, 0x3f, 0xb9, 0xe9, 0x79, 0x28, 0xfb, + 0x73, 0x1f, 0x06, 0x2b, 0xb9, 0x1a, 0xae, 0x63, 0xdc, 0x46, 0xef, 0x95, 0x42, 0xfc, 0x2d, 0x09, + 0x13, 0x3d, 0x4a, 0x42, 0x3e, 0x02, 0xa7, 0x23, 0x80, 0x05, 0xdd, 0xd1, 0x9b, 0xd4, 0x0b, 0x33, + 0x0e, 0x62, 0xd0, 0x26, 0xbf, 0x74, 0xad, 0x15, 0xa0, 0xe5, 0x2c, 0x86, 0x1d, 0x38, 0x48, 0xca, + 0xd1, 0xb7, 0x03, 0x27, 0xe9, 0x2f, 0xe6, 0x42, 0x53, 0x25, 0x1a, 0x7c, 0x55, 0xa3, 0x6e, 0xbb, + 0xe1, 0x3d, 0xb8, 0x1d, 0xbc, 0xbb, 0xd4, 0x16, 0xd3, 0x70, 0xac, 0xb4, 0xbc, 0x4c, 0xeb, 0x9e, + 0x1f, 0x53, 0xda, 0x15, 0xe1, 0xf6, 0xf8, 0xd6, 0x41, 0xa0, 0x44, 0x8c, 0xe0, 0x48, 0x6e, 0xfc, + 0x58, 0x31, 0xf5, 0xf7, 0xf3, 0xa0, 0x04, 0xa6, 0x7b, 0xf0, 0x50, 0xeb, 0x00, 0x97, 0xc9, 0x77, + 0x45, 0xaf, 0x98, 0x30, 0x16, 0x0a, 0xa3, 0xda, 0x6e, 0x36, 0x75, 0x1c, 0x7a, 0x6c, 0x6b, 0x50, + 0x8c, 0x33, 0x0b, 0x09, 0xf9, 0x6e, 0xe0, 0x8c, 0xd8, 0x0d, 0x90, 0xf0, 0x21, 0x5c, 0xcd, 0xe5, + 0x2c, 0xb4, 0x24, 0x57, 0xf2, 0xb9, 0x0c, 0x9c, 0xf0, 0x3b, 0x65, 0x7e, 0x89, 0x99, 0xc5, 0x13, + 0x76, 0xdb, 0xf2, 0xfc, 0x9d, 0xc8, 0x8b, 0x9d, 0xab, 0xe3, 0x9d, 0x74, 0x39, 0xad, 0x30, 0x6f, + 0x49, 0x10, 0x58, 0x22, 0x50, 0x08, 0x1b, 0x69, 0x6a, 0x75, 0x24, 0xd2, 0x52, 0xeb, 0x3d, 0x73, + 0x1d, 0x1e, 0xea, 0xc8, 0x72, 0x2b, 0x33, 0xb4, 0x57, 0x36, 0x43, 0xff, 0x45, 0x26, 0x9c, 0x88, + 0x62, 0x42, 0x22, 0x97, 0x01, 0x42, 0x90, 0xd8, 0x98, 0x8e, 0x6c, 0x6e, 0x14, 0x21, 0x14, 0x9a, + 0x26, 0x51, 0x90, 0x79, 0x28, 0x08, 0xb1, 0xf0, 0xec, 0xbe, 0xef, 0xdb, 0xa2, 0x17, 0x2e, 0xcb, + 0x72, 0xc0, 0x4d, 0xa7, 0xf8, 0x66, 0xc1, 0xe6, 0xcc, 0x0b, 0x30, 0xb8, 0xdb, 0xef, 0xfa, 0x5c, + 0x0e, 0x88, 0xbc, 0x8b, 0x3c, 0x40, 0x13, 0xfb, 0x10, 0x4f, 0x61, 0x17, 0xa1, 0x9f, 0x7d, 0x02, + 0xe6, 0xbb, 0x90, 0xe2, 0xdb, 0xb6, 0x05, 0x4c, 0x0b, 0xb0, 0x61, 0x70, 0xa9, 0xbe, 0xf4, 0xe0, + 0x52, 0xea, 0xf7, 0xe7, 0xe0, 0x94, 0xdc, 0x21, 0x65, 0x8a, 0x21, 0xf3, 0x8f, 0x3a, 0xe5, 0x1d, + 0xec, 0x14, 0x15, 0x0a, 0x7c, 0xf3, 0x20, 0x72, 0x17, 0xf0, 0x83, 0x1d, 0x84, 0x68, 0x02, 0xa3, + 0xfe, 0xdb, 0x2c, 0x0c, 0x2f, 0xd8, 0xae, 0xb7, 0xe2, 0x50, 0x77, 0x41, 0x77, 0xdc, 0x07, 0xb8, + 0x3b, 0x3e, 0x00, 0xc3, 0x18, 0x1e, 0xa8, 0x49, 0x2d, 0x1e, 0x42, 0xa7, 0x57, 0x4a, 0x36, 0xe2, + 0x23, 0x44, 0x5e, 0xa9, 0x08, 0x21, 0xd3, 0x7e, 0x6e, 0xf9, 0x49, 0x41, 0x9b, 0xb8, 0xd9, 0xc7, + 0xe1, 0xea, 0x4f, 0xe4, 0x60, 0xc8, 0x97, 0xf2, 0xb8, 0x79, 0x58, 0x6f, 0x6a, 0x0e, 0x56, 0xc8, + 0x57, 0x00, 0x16, 0x6c, 0xc7, 0xd3, 0x1b, 0x73, 0xa1, 0xe6, 0xe3, 0x11, 0x67, 0x0b, 0xa1, 0xbc, + 0x8c, 0x44, 0x82, 0xeb, 0x57, 0x68, 0x56, 0xf3, 0x89, 0x89, 0xaf, 0x5f, 0x01, 0x54, 0x93, 0x28, + 0xd4, 0x5f, 0xcb, 0xc2, 0x31, 0xbf, 0x93, 0x26, 0xef, 0xd3, 0x7a, 0xfb, 0x41, 0x9e, 0x9b, 0xa2, + 0xd2, 0xee, 0xdd, 0x52, 0xda, 0xea, 0x7f, 0x95, 0x26, 0x92, 0x89, 0x86, 0x7d, 0x34, 0x91, 0xfc, + 0x65, 0xe8, 0xb8, 0xfa, 0x9d, 0x39, 0x38, 0xe1, 0x4b, 0x7d, 0xaa, 0x6d, 0xe1, 0xe1, 0xc0, 0x84, + 0xde, 0x68, 0x3c, 0xc8, 0xbb, 0xf1, 0x41, 0x5f, 0x10, 0xf3, 0x22, 0xde, 0x9e, 0xc8, 0xf1, 0xb7, + 0x2c, 0xc0, 0x35, 0xdb, 0x34, 0x34, 0x99, 0x88, 0xbc, 0x0a, 0x43, 0xfe, 0xcf, 0x92, 0xb3, 0xe2, + 0x6f, 0xc1, 0xf1, 0xa8, 0x3f, 0x28, 0xa4, 0x3b, 0x91, 0xb0, 0x02, 0x91, 0x02, 0xea, 0xbf, 0x2f, + 0xc0, 0x99, 0x3b, 0xa6, 0x65, 0xd8, 0x6b, 0xae, 0x9f, 0x22, 0xf2, 0xd0, 0x1f, 0x75, 0x1d, 0x74, + 0x6a, 0xc8, 0xd7, 0xe1, 0x64, 0x5c, 0xa4, 0x4e, 0x10, 0xb8, 0x5b, 0xf4, 0xce, 0x1a, 0x27, 0xa8, + 0xf9, 0xc9, 0x22, 0xc5, 0x7d, 0x99, 0x96, 0x5e, 0x32, 0x9e, 0x6d, 0xb2, 0x6f, 0x3b, 0xd9, 0x26, + 0x9f, 0x80, 0x42, 0xd9, 0x6e, 0xea, 0xa6, 0x1f, 0x60, 0x06, 0x47, 0x71, 0x50, 0x2f, 0x62, 0x34, + 0x41, 0xc1, 0xf8, 0x8b, 0x8a, 0xb1, 0xcb, 0x06, 0x42, 0xfe, 0x7e, 0x01, 0x66, 0xa5, 0x69, 0x32, + 0x11, 0xb1, 0x61, 0x58, 0x54, 0x27, 0x6e, 0xb7, 0x00, 0x37, 0x4f, 0xcf, 0xfa, 0x32, 0xea, 0xac, + 0x56, 0x97, 0x23, 0xe5, 0xf8, 0x36, 0x8a, 0x27, 0xc1, 0x14, 0x1f, 0xc3, 0xef, 0xb9, 0xb4, 0x28, + 0x7f, 0x49, 0x08, 0x38, 0xc9, 0x0c, 0x26, 0x85, 0x80, 0xb3, 0x8c, 0x4c, 0x44, 0x26, 0x61, 0x0c, + 0xc3, 0x2b, 0x07, 0x5b, 0x29, 0xa6, 0x12, 0x43, 0x68, 0x54, 0xe2, 0xa5, 0x09, 0x8f, 0xc8, 0xcc, + 0x3e, 0xae, 0x56, 0x17, 0x68, 0x2d, 0x59, 0xe2, 0xcc, 0x6b, 0x40, 0x92, 0x6d, 0xde, 0xd1, 0xb5, + 0xc9, 0x3f, 0x92, 0xf6, 0x75, 0x87, 0xdd, 0xf1, 0x65, 0x3f, 0x66, 0xbb, 0x48, 0xea, 0xb0, 0xde, + 0x77, 0x32, 0x75, 0x58, 0x61, 0x5f, 0x53, 0x87, 0xa9, 0x3f, 0x9f, 0x81, 0xb1, 0x44, 0x9c, 0x71, + 0xf2, 0x0c, 0x00, 0x87, 0x48, 0xf1, 0x1c, 0x31, 0x40, 0x4a, 0x18, 0x7b, 0x5c, 0xac, 0x81, 0x21, + 0x19, 0xb9, 0x02, 0xfd, 0xfc, 0x97, 0x88, 0xc1, 0x94, 0x2c, 0xd2, 0x6e, 0x9b, 0x86, 0x16, 0x10, + 0x85, 0xb5, 0xe0, 0xc5, 0x61, 0x2e, 0xb5, 0x88, 0xb7, 0xde, 0x0a, 0x6a, 0x61, 0x64, 0xea, 0x67, + 0xb3, 0x30, 0x14, 0x34, 0xb8, 0x64, 0x1c, 0x94, 0xce, 0x15, 0x44, 0xc8, 0xf6, 0xdc, 0x56, 0x21, + 0xdb, 0x63, 0x93, 0xaa, 0x88, 0xd1, 0xbe, 0x7f, 0xef, 0x9e, 0x3e, 0x9f, 0x85, 0x63, 0x41, 0xad, + 0x07, 0x78, 0x47, 0xf5, 0x2e, 0x12, 0xc9, 0xe7, 0x32, 0xa0, 0x8c, 0x9b, 0x8d, 0x86, 0x69, 0xad, + 0x54, 0xac, 0x65, 0xdb, 0x69, 0xe2, 0xac, 0x77, 0x70, 0xe7, 0xb4, 0xea, 0xf7, 0x64, 0x60, 0x4c, + 0x34, 0x68, 0x42, 0x77, 0x8c, 0x83, 0x3b, 0x04, 0x8b, 0xb7, 0xe4, 0xe0, 0xf4, 0x45, 0xfd, 0x72, + 0x16, 0x60, 0xc6, 0xae, 0xdf, 0x3d, 0xe4, 0xcf, 0xa6, 0x5e, 0x82, 0x02, 0x0f, 0x84, 0x25, 0x34, + 0x76, 0x4c, 0x3c, 0x0f, 0x62, 0x9f, 0xc6, 0x11, 0xe3, 0xa3, 0x62, 0x3e, 0x2e, 0xf0, 0x40, 0x5a, + 0x4a, 0x46, 0x13, 0x45, 0x58, 0xa5, 0x8c, 0x4e, 0x2c, 0x18, 0x41, 0xa5, 0x0c, 0x16, 0xad, 0x74, + 0x73, 0xa3, 0x98, 0x6f, 0xd8, 0xf5, 0xbb, 0x1a, 0xd2, 0xab, 0x7f, 0x91, 0xe1, 0xb2, 0x3b, 0xe4, + 0x8f, 0x3f, 0xfd, 0xcf, 0xcf, 0xef, 0xf0, 0xf3, 0xbf, 0x37, 0x03, 0x27, 0x34, 0x5a, 0xb7, 0xef, + 0x51, 0x67, 0x7d, 0xc2, 0x36, 0xe8, 0x75, 0x6a, 0x51, 0xe7, 0xa0, 0x46, 0xd4, 0xdf, 0xc5, 0x1c, + 0x17, 0x61, 0x63, 0x6e, 0xb9, 0xd4, 0x38, 0x3c, 0xf9, 0x47, 0xd4, 0xbf, 0xdd, 0x07, 0x4a, 0xaa, + 0x69, 0x7b, 0x68, 0xcd, 0xb9, 0x8e, 0xfb, 0x95, 0xfc, 0x7e, 0xed, 0x57, 0x7a, 0x77, 0xb6, 0x5f, + 0x29, 0xec, 0x74, 0xbf, 0xd2, 0xb7, 0x9d, 0xfd, 0x4a, 0x33, 0xbe, 0x5f, 0xe9, 0xc7, 0xfd, 0xca, + 0x33, 0x5d, 0xf7, 0x2b, 0x93, 0x96, 0xb1, 0xcb, 0xdd, 0xca, 0xa1, 0xcd, 0x8d, 0xbb, 0x9b, 0x6d, + 0xd6, 0x45, 0x36, 0x29, 0xd6, 0x6d, 0xc7, 0xa0, 0x86, 0xd8, 0x5d, 0xe1, 0xd1, 0xbe, 0x23, 0x60, + 0x5a, 0x80, 0x4d, 0x24, 0x1a, 0x1e, 0xde, 0x4e, 0xa2, 0xe1, 0x7d, 0xd8, 0x7f, 0x7d, 0x26, 0x0b, + 0x63, 0x13, 0xd4, 0xf1, 0x78, 0xa4, 0xcd, 0xfd, 0xf0, 0x5c, 0x2b, 0xc1, 0x31, 0x89, 0x21, 0x5a, + 0xe4, 0xd9, 0xd0, 0x1b, 0xaf, 0x4e, 0x1d, 0x2f, 0xee, 0xcc, 0x17, 0xa7, 0x67, 0xd5, 0xfb, 0xc9, + 0xbe, 0xc4, 0xd8, 0x0d, 0xaa, 0xf7, 0xe1, 0x5c, 0x90, 0xa6, 0xf8, 0xa5, 0x05, 0xf4, 0x52, 0xfe, + 0xae, 0xfc, 0xce, 0xf3, 0x77, 0xa9, 0x3f, 0x97, 0x81, 0x0b, 0x1a, 0xb5, 0xe8, 0x9a, 0xbe, 0xd4, + 0xa0, 0x52, 0xb3, 0xc4, 0xca, 0xc0, 0x66, 0x0d, 0xd3, 0x6d, 0xea, 0x5e, 0x7d, 0x75, 0x4f, 0x32, + 0x9a, 0x82, 0x21, 0x79, 0xfe, 0xda, 0xc1, 0xdc, 0x16, 0x29, 0xa7, 0xfe, 0xa7, 0x1c, 0xf4, 0x8d, + 0xdb, 0xde, 0x0d, 0x7b, 0x8f, 0x09, 0xe5, 0xc2, 0x29, 0x3f, 0xbb, 0x83, 0x03, 0x9d, 0xf7, 0x63, + 0xe5, 0x52, 0x8c, 0x7d, 0xf4, 0xf4, 0x5c, 0xb2, 0x13, 0xb9, 0x08, 0x7c, 0xb2, 0x1d, 0xa6, 0x92, + 0x7b, 0x0e, 0x06, 0x30, 0x48, 0x8b, 0x74, 0xe4, 0x8a, 0x7e, 0xd4, 0x1e, 0x03, 0xc6, 0xeb, 0x08, + 0x49, 0xc9, 0x47, 0x22, 0xa1, 0x41, 0x0b, 0x7b, 0x4f, 0x3d, 0x27, 0x47, 0x09, 0x7d, 0x86, 0xdf, + 0xd6, 0x61, 0x9b, 0xa4, 0x34, 0x1d, 0x78, 0x54, 0x12, 0x6b, 0x52, 0x40, 0xb8, 0x7f, 0x69, 0xe1, + 0xd4, 0x6f, 0xe6, 0x61, 0xc8, 0x77, 0xb9, 0x3d, 0xa0, 0x6e, 0x7f, 0x0a, 0x0a, 0xd3, 0xb6, 0x94, + 0x64, 0x00, 0x5d, 0x74, 0x57, 0x6d, 0x37, 0xe6, 0x7b, 0x2c, 0x88, 0x98, 0xc0, 0xe6, 0x6c, 0x43, + 0x76, 0x30, 0x47, 0x81, 0x59, 0xb6, 0x91, 0x78, 0xa0, 0x1b, 0x10, 0x92, 0x0b, 0x90, 0x47, 0xdf, + 0x7c, 0xe9, 0xa0, 0x3d, 0xe6, 0x8f, 0x8f, 0x78, 0x49, 0xa1, 0x0a, 0x3b, 0x55, 0xa8, 0xbe, 0xdd, + 0x2a, 0x54, 0xff, 0xfe, 0x2a, 0xd4, 0x1b, 0x30, 0x84, 0x35, 0xf9, 0x39, 0xca, 0xb6, 0x5e, 0x13, + 0x1f, 0x12, 0xcb, 0xd6, 0x30, 0x6f, 0xb7, 0xc8, 0x54, 0x86, 0xab, 0x55, 0x84, 0x55, 0x4c, 0xed, + 0x60, 0x0f, 0x6a, 0xf7, 0x7b, 0x19, 0xe8, 0xbb, 0x65, 0xdd, 0xb5, 0xec, 0xb5, 0xbd, 0x69, 0xdc, + 0x33, 0x30, 0x28, 0xd8, 0x48, 0x0b, 0x03, 0xbe, 0xb9, 0x6e, 0x73, 0x70, 0x0d, 0x39, 0x69, 0x32, + 0x15, 0x79, 0x39, 0x28, 0x84, 0xcf, 0x6f, 0x72, 0x61, 0x9a, 0x0e, 0xbf, 0x50, 0x3d, 0x9a, 0x59, + 0x40, 0x26, 0x27, 0x67, 0x21, 0x5f, 0x66, 0x4d, 0x95, 0xe2, 0xd4, 0xb2, 0xa6, 0x68, 0x08, 0x55, + 0x3f, 0x93, 0x87, 0x91, 0xd8, 0x99, 0xd5, 0x13, 0x30, 0x20, 0xce, 0x8c, 0x4c, 0x3f, 0xd5, 0x01, + 0x3e, 0xcf, 0x09, 0x80, 0x5a, 0x3f, 0xff, 0xb3, 0x62, 0x90, 0x0f, 0x42, 0x9f, 0xed, 0xe2, 0x7a, + 0x86, 0xdf, 0x32, 0x12, 0x0e, 0xa1, 0xf9, 0x2a, 0x6b, 0x3b, 0x1f, 0x1c, 0x82, 0x44, 0xd6, 0x48, + 0xdb, 0xc5, 0x4f, 0xbb, 0x06, 0x03, 0xba, 0xeb, 0x52, 0xaf, 0xe6, 0xe9, 0x2b, 0x72, 0xf6, 0x83, + 0x00, 0x28, 0x8f, 0x0e, 0x04, 0x2e, 0xea, 0x2b, 0xe4, 0x35, 0x18, 0xae, 0x3b, 0x14, 0x57, 0x3c, + 0xbd, 0xc1, 0x5a, 0x29, 0x59, 0xa4, 0x11, 0x84, 0x7c, 0xbf, 0x11, 0x22, 0x2a, 0x06, 0xb9, 0x0d, + 0xc3, 0xe2, 0x73, 0xb8, 0x6f, 0x3c, 0x0e, 0xb4, 0x91, 0x70, 0x05, 0xe2, 0x22, 0xe1, 0xde, 0xf1, + 0xe2, 0x89, 0x84, 0x4c, 0x2e, 0xf3, 0x35, 0x24, 0x52, 0x32, 0x0f, 0x64, 0x8d, 0x2e, 0xd5, 0xf4, + 0xb6, 0xb7, 0xca, 0xea, 0xe2, 0xc1, 0xbb, 0x45, 0xd2, 0x3f, 0x7c, 0x57, 0x90, 0xc4, 0xca, 0xcf, + 0x2d, 0xd6, 0xe8, 0x52, 0x29, 0x82, 0x24, 0x77, 0xe0, 0x64, 0xb2, 0x08, 0xfb, 0x64, 0x7e, 0x78, + 0xff, 0xd8, 0xe6, 0x46, 0xb1, 0x98, 0x4a, 0x20, 0xb1, 0x3d, 0x9e, 0x60, 0x5b, 0x31, 0x6e, 0xe4, + 0xfb, 0xfb, 0x46, 0xfb, 0xb5, 0x11, 0x56, 0xd6, 0xb7, 0xfe, 0x4c, 0x43, 0xfd, 0x5a, 0x86, 0x59, + 0x79, 0xec, 0x83, 0x30, 0xeb, 0x31, 0xd3, 0xf5, 0xe6, 0x0e, 0x75, 0xbd, 0x19, 0xe6, 0x27, 0x2c, + 0xb8, 0x5d, 0x66, 0x57, 0x4d, 0x60, 0xc9, 0x65, 0x28, 0x18, 0xf2, 0x81, 0xd7, 0xa9, 0x68, 0x27, + 0xf8, 0xf5, 0x68, 0x82, 0x8a, 0x5c, 0x84, 0x3c, 0x5b, 0x6d, 0xe2, 0xbb, 0x5d, 0xd9, 0x30, 0xd0, + 0x90, 0x42, 0xfd, 0xf6, 0x2c, 0x0c, 0x49, 0x5f, 0x73, 0x75, 0x4f, 0x9f, 0xf3, 0xe2, 0xf6, 0x9a, + 0xe9, 0x3b, 0xa5, 0xe0, 0x36, 0xc8, 0x6f, 0xf2, 0xb5, 0x40, 0x14, 0xdb, 0xba, 0x30, 0x12, 0x82, + 0x79, 0x4e, 0x7c, 0x68, 0x61, 0xfb, 0x3b, 0x3f, 0x46, 0x7f, 0x23, 0xdf, 0x9f, 0x1d, 0xcd, 0xdd, + 0xc8, 0xf7, 0xe7, 0x47, 0x7b, 0x31, 0xd2, 0x15, 0x06, 0x97, 0xe6, 0xdb, 0x6a, 0x6b, 0xd9, 0x5c, + 0x39, 0xe4, 0xaf, 0x33, 0xf6, 0x37, 0x0a, 0x58, 0x4c, 0x36, 0x87, 0xfc, 0xa9, 0xc6, 0x3b, 0x2a, + 0x9b, 0xa3, 0x7c, 0x86, 0x42, 0x36, 0xbf, 0x9f, 0x01, 0x25, 0x55, 0x36, 0xa5, 0x03, 0xf2, 0x53, + 0xd8, 0xbf, 0xac, 0x86, 0xdf, 0xc8, 0xc2, 0x58, 0xc5, 0xf2, 0xe8, 0x0a, 0xdf, 0xec, 0x1d, 0xf2, + 0xa9, 0xe2, 0x26, 0x0c, 0x4a, 0x1f, 0x23, 0xfa, 0xfc, 0xe1, 0x60, 0x2b, 0x1d, 0xa2, 0x3a, 0x70, + 0x92, 0x4b, 0xef, 0x63, 0x22, 0xf4, 0x98, 0x90, 0x0f, 0xf9, 0x9c, 0x73, 0x38, 0x84, 0x7c, 0xc8, + 0x27, 0xaf, 0x77, 0xa9, 0x90, 0xff, 0x73, 0x06, 0x8e, 0xa7, 0x54, 0x4e, 0x2e, 0x40, 0x5f, 0xb5, + 0xbd, 0x84, 0x81, 0xad, 0x32, 0xa1, 0x47, 0xaf, 0xdb, 0x5e, 0xc2, 0x98, 0x56, 0x9a, 0x8f, 0x24, + 0x8b, 0xf8, 0x7c, 0x7d, 0xbe, 0x52, 0x9e, 0x10, 0x52, 0x55, 0xa5, 0x87, 0xf8, 0x0c, 0x9c, 0xf6, + 0x65, 0xc1, 0x13, 0x77, 0xdb, 0x34, 0xea, 0xb1, 0x27, 0xee, 0xac, 0x0c, 0xf9, 0x28, 0x0c, 0x94, + 0xde, 0x6a, 0x3b, 0x14, 0xf9, 0x72, 0x89, 0xbf, 0x27, 0xe0, 0xeb, 0x23, 0xd2, 0x38, 0xf3, 0xd7, + 0xfa, 0x8c, 0x22, 0xce, 0x3b, 0x64, 0xa8, 0x7e, 0x36, 0x03, 0x67, 0x3a, 0xb7, 0x8e, 0xbc, 0x1f, + 0xfa, 0xd8, 0xce, 0xbc, 0xa4, 0xcd, 0x89, 0x4f, 0xe7, 0x19, 0x40, 0xed, 0x06, 0xad, 0xe9, 0x8e, + 0x6c, 0xec, 0xfb, 0x64, 0xe4, 0x15, 0x18, 0xac, 0xb8, 0x6e, 0x9b, 0x3a, 0xd5, 0x67, 0x6e, 0x69, + 0x15, 0xb1, 0x27, 0xc4, 0x3d, 0x87, 0x89, 0xe0, 0x9a, 0xfb, 0x4c, 0x2c, 0x74, 0x95, 0x4c, 0xaf, + 0x7e, 0x2a, 0x03, 0x67, 0xbb, 0x7d, 0x15, 0x79, 0x06, 0xfa, 0x17, 0xa9, 0xa5, 0x5b, 0x5e, 0xa5, + 0x2c, 0x9a, 0x84, 0x5b, 0x2c, 0x0f, 0x61, 0xd1, 0x9d, 0x42, 0x40, 0xc8, 0x0a, 0xf1, 0x23, 0xc1, + 0xc0, 0x07, 0x81, 0x1f, 0x5f, 0x22, 0x2c, 0x56, 0xc8, 0x27, 0x54, 0xff, 0x64, 0x09, 0x7a, 0xe7, + 0x2d, 0x3a, 0xbf, 0x4c, 0x9e, 0x86, 0x01, 0xa6, 0xfb, 0x98, 0x7e, 0x5f, 0x0c, 0xb4, 0x31, 0x79, + 0xc0, 0x20, 0x62, 0xba, 0x47, 0x0b, 0xa9, 0xc8, 0x35, 0x39, 0xe7, 0xb7, 0x50, 0x07, 0x22, 0x97, + 0xe1, 0x98, 0xe9, 0x1e, 0x4d, 0xce, 0x0d, 0x7e, 0x4d, 0xce, 0xb5, 0x2c, 0x3a, 0x3b, 0x52, 0x8a, + 0x63, 0xfc, 0x52, 0x62, 0x1a, 0x98, 0x49, 0x4b, 0x48, 0x1c, 0xb7, 0x09, 0x92, 0x14, 0xd3, 0x3d, + 0x5a, 0x7a, 0x22, 0xe3, 0x21, 0xd9, 0x8d, 0x29, 0x7e, 0x0b, 0x29, 0xe3, 0xa6, 0x7b, 0xb4, 0x08, + 0x2d, 0x79, 0x1e, 0x06, 0xc5, 0xef, 0x1b, 0xb6, 0x69, 0xc5, 0x63, 0x58, 0x48, 0xa8, 0xe9, 0x1e, + 0x4d, 0xa6, 0x94, 0x2a, 0x5d, 0x70, 0x4c, 0xcb, 0x13, 0x2f, 0xe3, 0xe2, 0x95, 0x22, 0x4e, 0xaa, + 0x14, 0x7f, 0x93, 0x57, 0x60, 0x38, 0x08, 0x0e, 0xf2, 0x26, 0xad, 0x7b, 0xe2, 0x48, 0xe7, 0x64, + 0xac, 0x30, 0x47, 0x4e, 0xf7, 0x68, 0x51, 0x6a, 0x72, 0x11, 0x0a, 0x1a, 0x75, 0xcd, 0xb7, 0xfc, + 0xfb, 0x8b, 0x11, 0x69, 0x3a, 0x33, 0xdf, 0x62, 0x52, 0x12, 0x78, 0xd6, 0x3b, 0xe1, 0x85, 0x89, + 0x38, 0x80, 0x21, 0xb1, 0x5a, 0x26, 0x2d, 0x83, 0xf5, 0x8e, 0x74, 0x5b, 0xf6, 0x5a, 0x18, 0x32, + 0x45, 0x24, 0x5a, 0x1b, 0x8c, 0xbf, 0x4d, 0x95, 0xb1, 0xd3, 0x3d, 0x5a, 0x8c, 0x5e, 0x92, 0x6a, + 0xd9, 0x74, 0xef, 0x8a, 0x28, 0x75, 0x71, 0xa9, 0x32, 0x94, 0x24, 0x55, 0xf6, 0x53, 0xaa, 0x7a, + 0x8e, 0x7a, 0x6b, 0xb6, 0x73, 0x57, 0xc4, 0xa4, 0x8b, 0x57, 0x2d, 0xb0, 0x52, 0xd5, 0x02, 0x22, + 0x57, 0xcd, 0x16, 0x99, 0x91, 0xf4, 0xaa, 0x75, 0x4f, 0x97, 0xab, 0xe6, 0xfb, 0x4b, 0xbf, 0x93, + 0x66, 0xa8, 0x7e, 0x8f, 0xe7, 0xbb, 0x4d, 0x76, 0x28, 0xe2, 0xa4, 0x0e, 0xc5, 0xdf, 0xac, 0x52, + 0x29, 0xa7, 0xa9, 0x48, 0x68, 0x1b, 0x54, 0x2a, 0xa1, 0x58, 0xa5, 0x72, 0xf6, 0xd3, 0x6b, 0x72, + 0xaa, 0x4f, 0x65, 0x2c, 0xda, 0x41, 0x21, 0x86, 0x75, 0x90, 0x94, 0x12, 0xb4, 0x88, 0x69, 0x04, + 0x15, 0x82, 0xe4, 0x83, 0x41, 0x0b, 0x27, 0x16, 0xa6, 0x7b, 0x34, 0x4c, 0x30, 0xa8, 0xf2, 0x04, + 0x95, 0xca, 0x71, 0xa4, 0x18, 0xf2, 0x29, 0x18, 0x6c, 0xba, 0x47, 0xe3, 0xc9, 0x2b, 0x9f, 0x96, + 0x52, 0x41, 0x29, 0x27, 0xa2, 0x53, 0x44, 0x80, 0x60, 0x53, 0x44, 0x98, 0x30, 0x6a, 0x2a, 0x99, + 0x2e, 0x49, 0x39, 0x19, 0x5d, 0x51, 0xe3, 0xf8, 0xe9, 0x1e, 0x2d, 0x99, 0x62, 0xe9, 0xf9, 0x48, + 0x06, 0x21, 0xe5, 0x54, 0x2c, 0x70, 0x4c, 0x88, 0x62, 0xe2, 0x92, 0x73, 0x0d, 0xcd, 0xa7, 0xe6, + 0xfc, 0x56, 0x4e, 0x47, 0x97, 0xe3, 0x14, 0x92, 0xe9, 0x1e, 0x2d, 0x35, 0x5b, 0xf8, 0x44, 0x22, + 0x8f, 0x8f, 0xa2, 0x44, 0x2f, 0x6b, 0x63, 0xe8, 0xe9, 0x1e, 0x2d, 0x91, 0xf9, 0xe7, 0x9a, 0x9c, + 0x40, 0x47, 0x79, 0x28, 0xda, 0x89, 0x21, 0x86, 0x75, 0xa2, 0x94, 0x68, 0xe7, 0x9a, 0x9c, 0x54, + 0x45, 0x39, 0x93, 0x2c, 0x15, 0xce, 0x9c, 0x52, 0xf2, 0x15, 0x2d, 0x3d, 0x4f, 0x84, 0xf2, 0xb0, + 0xc8, 0xd4, 0x27, 0xca, 0xa7, 0xd1, 0x4c, 0xf7, 0x68, 0xe9, 0x39, 0x26, 0xb4, 0xf4, 0x04, 0x0b, + 0xca, 0xd9, 0x6e, 0x3c, 0x83, 0xd6, 0xa5, 0x27, 0x67, 0xd0, 0xbb, 0x84, 0xbb, 0x57, 0xce, 0x45, + 0xa3, 0x56, 0x76, 0x24, 0x9c, 0xee, 0xd1, 0xba, 0x04, 0xcd, 0xbf, 0xd5, 0x21, 0xf6, 0xbc, 0x72, + 0x3e, 0x9a, 0xa8, 0x33, 0x95, 0x68, 0xba, 0x47, 0xeb, 0x10, 0xb9, 0xfe, 0x56, 0x87, 0xd0, 0xe4, + 0x4a, 0xb1, 0x2b, 0xdb, 0x40, 0x1e, 0x1d, 0x02, 0x9b, 0xcf, 0xa7, 0x46, 0xf5, 0x56, 0x1e, 0x89, + 0xaa, 0x6e, 0x0a, 0x09, 0x53, 0xdd, 0xb4, 0x78, 0xe0, 0xf3, 0xa9, 0x61, 0xa8, 0x95, 0x47, 0xbb, + 0x30, 0x0c, 0xda, 0x98, 0x1a, 0xc0, 0x7a, 0x3e, 0x35, 0x0e, 0xb4, 0xa2, 0x46, 0x19, 0xa6, 0x90, + 0x30, 0x86, 0x69, 0x11, 0xa4, 0xe7, 0x53, 0xc3, 0x05, 0x2b, 0x8f, 0x75, 0x61, 0x18, 0xb6, 0x30, + 0x2d, 0xd0, 0xf0, 0xf3, 0x91, 0x78, 0xbd, 0xca, 0x7b, 0xa2, 0xf3, 0x86, 0x84, 0x62, 0xf3, 0x86, + 0x1c, 0xd9, 0x77, 0x22, 0x11, 0x91, 0x50, 0x79, 0x3c, 0x3a, 0xcc, 0x63, 0x68, 0x36, 0xcc, 0xe3, + 0x31, 0x0c, 0x27, 0x12, 0x91, 0xd9, 0x94, 0x0b, 0x9d, 0x98, 0x20, 0x3a, 0xca, 0x84, 0xc7, 0x72, + 0xab, 0xa4, 0x84, 0x06, 0x53, 0xde, 0x1b, 0x75, 0x34, 0x4c, 0x10, 0x4c, 0xf7, 0x68, 0x29, 0x01, + 0xc5, 0xb4, 0xf4, 0x38, 0x18, 0xca, 0xc5, 0xe8, 0xb0, 0x4d, 0xa3, 0x61, 0xc3, 0x36, 0x35, 0x86, + 0xc6, 0x4c, 0x9a, 0x37, 0xb4, 0x72, 0x29, 0x6a, 0x98, 0x25, 0x29, 0x98, 0x61, 0x96, 0xe2, 0x45, + 0xad, 0xa5, 0x47, 0x76, 0x50, 0x9e, 0xe8, 0xda, 0x42, 0xa4, 0x49, 0x69, 0x21, 0x0f, 0x74, 0x10, + 0xda, 0x4e, 0xb7, 0x5a, 0x0d, 0x5b, 0x37, 0x94, 0xf7, 0xa5, 0xda, 0x4e, 0x1c, 0x29, 0xd9, 0x4e, + 0x1c, 0xc0, 0x56, 0x79, 0xd9, 0xe9, 0x56, 0x79, 0x32, 0xba, 0xca, 0xcb, 0x38, 0xb6, 0xca, 0x47, + 0x1c, 0x74, 0x27, 0x12, 0x0e, 0xaa, 0xca, 0x53, 0x51, 0x05, 0x88, 0xa1, 0x99, 0x02, 0xc4, 0x5d, + 0x5a, 0x3f, 0xde, 0xd9, 0xa5, 0x53, 0xb9, 0x8c, 0xdc, 0x1e, 0xf1, 0xb9, 0x75, 0xa2, 0x9b, 0xee, + 0xd1, 0x3a, 0xbb, 0x85, 0x56, 0x52, 0x3c, 0x34, 0x95, 0x2b, 0x51, 0x05, 0x4b, 0x10, 0x30, 0x05, + 0x4b, 0xfa, 0x75, 0x56, 0x52, 0x5c, 0x2c, 0x95, 0xf7, 0x77, 0x64, 0x15, 0x7c, 0x73, 0x8a, 0x63, + 0xe6, 0x35, 0xd9, 0x47, 0x52, 0x79, 0x3a, 0xba, 0xd8, 0x85, 0x18, 0xb6, 0xd8, 0x49, 0xbe, 0x94, + 0xd7, 0x64, 0xef, 0x40, 0xe5, 0x6a, 0xb2, 0x54, 0xb8, 0x44, 0x4a, 0x5e, 0x84, 0x5a, 0xba, 0x53, + 0x9d, 0xf2, 0x4c, 0x54, 0xeb, 0xd2, 0x68, 0x98, 0xd6, 0xa5, 0x3a, 0xe4, 0x4d, 0x25, 0x7d, 0xe3, + 0x94, 0x6b, 0xf1, 0xb3, 0x84, 0x28, 0x9e, 0x59, 0x3e, 0x09, 0x7f, 0xba, 0xd7, 0xe2, 0x41, 0x9a, + 0x94, 0x67, 0x63, 0x97, 0x19, 0x11, 0x2c, 0xb3, 0x6f, 0x63, 0x41, 0x9d, 0x5e, 0x8b, 0xc7, 0x35, + 0x52, 0x9e, 0x4b, 0xe7, 0x10, 0xe8, 0x4a, 0x3c, 0x0e, 0xd2, 0x6b, 0xf1, 0x50, 0x40, 0xca, 0xf3, + 0xe9, 0x1c, 0x02, 0xe9, 0xc6, 0x43, 0x07, 0x3d, 0x2d, 0x05, 0x27, 0x56, 0x3e, 0x10, 0x35, 0x1d, + 0x03, 0x04, 0x33, 0x1d, 0xc3, 0x10, 0xc6, 0x4f, 0x4b, 0x41, 0x7d, 0x95, 0x17, 0x12, 0x45, 0x82, + 0xc6, 0x4a, 0xa1, 0x7f, 0x9f, 0x96, 0x82, 0xe1, 0x2a, 0x2f, 0x26, 0x8a, 0x04, 0xad, 0x93, 0x42, + 0xe6, 0x1a, 0xdd, 0x5e, 0x4d, 0x29, 0x2f, 0x45, 0x8f, 0x38, 0x3a, 0x53, 0x4e, 0xf7, 0x68, 0xdd, + 0x5e, 0x5f, 0x7d, 0xbc, 0xb3, 0xa7, 0xa1, 0xf2, 0x72, 0x74, 0x08, 0x77, 0xa2, 0x63, 0x43, 0xb8, + 0xa3, 0xb7, 0xe2, 0x2b, 0xb1, 0x17, 0xd4, 0xca, 0x2b, 0xd1, 0x29, 0x2e, 0x82, 0x64, 0x53, 0x5c, + 0xfc, 0xbd, 0x75, 0xe4, 0x69, 0xb0, 0xf2, 0xc1, 0xe8, 0x14, 0x27, 0xe3, 0xd8, 0x14, 0x17, 0x79, + 0x46, 0x3c, 0x91, 0x78, 0xb1, 0xaa, 0xbc, 0x1a, 0x9d, 0xe2, 0x62, 0x68, 0x36, 0xc5, 0xc5, 0xdf, + 0xb8, 0xbe, 0x12, 0x7b, 0xb8, 0xa9, 0xbc, 0x96, 0xde, 0x7e, 0x44, 0xca, 0xed, 0xe7, 0xcf, 0x3c, + 0xb5, 0xf4, 0x17, 0x88, 0x4a, 0x29, 0x3a, 0x7e, 0xd3, 0x68, 0xd8, 0xf8, 0x4d, 0x7d, 0xbd, 0x18, + 0xdf, 0x38, 0x08, 0xad, 0x1a, 0xef, 0xb2, 0x71, 0x08, 0x4d, 0x91, 0x14, 0x70, 0x64, 0x8f, 0xcc, + 0x37, 0x42, 0x13, 0x1d, 0xf6, 0xc8, 0xfe, 0x36, 0x28, 0x46, 0xcf, 0x66, 0xd7, 0x84, 0xe3, 0x9b, + 0x52, 0x8e, 0xce, 0xae, 0x09, 0x02, 0x36, 0xbb, 0x26, 0xdd, 0xe5, 0xa6, 0x60, 0x54, 0x68, 0x11, + 0xf7, 0xe7, 0x33, 0xad, 0x15, 0x65, 0x32, 0xf6, 0x00, 0x28, 0x86, 0x67, 0xb3, 0x53, 0x1c, 0x86, + 0xeb, 0x35, 0x87, 0x4d, 0x34, 0xcc, 0xd6, 0x92, 0xad, 0x3b, 0x46, 0x95, 0x5a, 0x86, 0x32, 0x15, + 0x5b, 0xaf, 0x53, 0x68, 0x70, 0xbd, 0x4e, 0x81, 0x63, 0x60, 0xa2, 0x18, 0x5c, 0xa3, 0x75, 0x6a, + 0xde, 0xa3, 0xca, 0x75, 0x64, 0x5b, 0xec, 0xc4, 0x56, 0x90, 0x4d, 0xf7, 0x68, 0x9d, 0x38, 0x30, + 0x5b, 0x7d, 0x76, 0xbd, 0xfa, 0xfa, 0x4c, 0xf0, 0xe8, 0x75, 0xc1, 0xa1, 0x2d, 0xdd, 0xa1, 0xca, + 0x74, 0xd4, 0x56, 0x4f, 0x25, 0x62, 0xb6, 0x7a, 0x2a, 0x22, 0xc9, 0xd6, 0x1f, 0x0b, 0x95, 0x6e, + 0x6c, 0xc3, 0x11, 0x91, 0x5e, 0x9a, 0xcd, 0x4e, 0x51, 0x04, 0x13, 0xd0, 0x8c, 0x6d, 0xad, 0xe0, + 0x49, 0xc5, 0x8d, 0xe8, 0xec, 0xd4, 0x99, 0x92, 0xcd, 0x4e, 0x9d, 0xb1, 0x4c, 0xd5, 0xa3, 0x58, + 0x3e, 0x06, 0x6f, 0x46, 0x55, 0x3d, 0x85, 0x84, 0xa9, 0x7a, 0x0a, 0x38, 0xc9, 0x50, 0xa3, 0x2e, + 0xf5, 0x94, 0x99, 0x6e, 0x0c, 0x91, 0x24, 0xc9, 0x10, 0xc1, 0x49, 0x86, 0x53, 0xd4, 0xab, 0xaf, + 0x2a, 0xb3, 0xdd, 0x18, 0x22, 0x49, 0x92, 0x21, 0x82, 0xd9, 0x66, 0x33, 0x0a, 0x1e, 0x6f, 0x37, + 0xee, 0xfa, 0x7d, 0x36, 0x17, 0xdd, 0x6c, 0x76, 0x24, 0x64, 0x9b, 0xcd, 0x8e, 0x48, 0xf2, 0xa9, + 0x6d, 0x3b, 0x66, 0x2a, 0xf3, 0x58, 0xe1, 0xe5, 0xd0, 0x2e, 0xd8, 0x4e, 0xa9, 0xe9, 0x1e, 0x6d, + 0xbb, 0x8e, 0x9f, 0xef, 0x0b, 0x5c, 0xa1, 0x94, 0x05, 0xac, 0xea, 0x58, 0x70, 0x56, 0xc1, 0xc1, + 0xd3, 0x3d, 0x5a, 0xe0, 0x2c, 0xf5, 0x3c, 0x0c, 0xe2, 0x47, 0x55, 0x2c, 0xd3, 0x2b, 0x8f, 0x2b, + 0xaf, 0x47, 0xb7, 0x4c, 0x12, 0x8a, 0x6d, 0x99, 0xa4, 0x9f, 0x6c, 0x12, 0xc7, 0x9f, 0x7c, 0x8a, + 0x29, 0x8f, 0x2b, 0x5a, 0x74, 0x12, 0x8f, 0x20, 0xd9, 0x24, 0x1e, 0x01, 0x04, 0xf5, 0x96, 0x1d, + 0xbb, 0x55, 0x1e, 0x57, 0xaa, 0x29, 0xf5, 0x72, 0x54, 0x50, 0x2f, 0xff, 0x19, 0xd4, 0x5b, 0x5d, + 0x6d, 0x7b, 0x65, 0xf6, 0x8d, 0x8b, 0x29, 0xf5, 0xfa, 0xc8, 0xa0, 0x5e, 0x1f, 0xc0, 0xa6, 0x42, + 0x04, 0x2c, 0x38, 0x36, 0x9b, 0xb4, 0x6f, 0x9a, 0x8d, 0x86, 0x72, 0x2b, 0x3a, 0x15, 0xc6, 0xf1, + 0x6c, 0x2a, 0x8c, 0xc3, 0x98, 0xe9, 0xc9, 0x5b, 0x45, 0x97, 0xda, 0x2b, 0xca, 0xed, 0xa8, 0xe9, + 0x19, 0x62, 0x98, 0xe9, 0x19, 0xfe, 0xc2, 0xdd, 0x05, 0xfb, 0xa5, 0xd1, 0x65, 0x87, 0xba, 0xab, + 0xca, 0x9d, 0xd8, 0xee, 0x42, 0xc2, 0xe1, 0xee, 0x42, 0xfa, 0x4d, 0x56, 0xe0, 0xe1, 0xc8, 0x42, + 0xe3, 0xdf, 0x3d, 0x55, 0xa9, 0xee, 0xd4, 0x57, 0x95, 0x0f, 0x21, 0xab, 0xc7, 0x52, 0x97, 0xaa, + 0x28, 0xe9, 0x74, 0x8f, 0xd6, 0x8d, 0x13, 0x6e, 0xcb, 0x5f, 0x9f, 0xe1, 0x11, 0x04, 0xb5, 0x85, + 0x09, 0x7f, 0x13, 0xfa, 0x46, 0x6c, 0x5b, 0x9e, 0x24, 0xc1, 0x6d, 0x79, 0x12, 0x4c, 0x5a, 0x70, + 0x3e, 0xb6, 0x55, 0x9b, 0xd5, 0x1b, 0x6c, 0x5f, 0x42, 0x8d, 0x05, 0xbd, 0x7e, 0x97, 0x7a, 0xca, + 0x87, 0x91, 0xf7, 0x85, 0x0e, 0x1b, 0xbe, 0x18, 0xf5, 0x74, 0x8f, 0xb6, 0x05, 0x3f, 0xa2, 0x42, + 0xbe, 0x3a, 0xb5, 0xb8, 0xa0, 0x7c, 0x24, 0x7a, 0xbe, 0xc9, 0x60, 0xd3, 0x3d, 0x1a, 0xe2, 0x98, + 0x95, 0x76, 0xab, 0xb5, 0xe2, 0xe8, 0x06, 0xe5, 0x86, 0x16, 0xda, 0x6e, 0xc2, 0x00, 0xfd, 0x68, + 0xd4, 0x4a, 0xeb, 0x44, 0xc7, 0xac, 0xb4, 0x4e, 0x38, 0xa6, 0xa8, 0x91, 0x60, 0xf9, 0xca, 0xc7, + 0xa2, 0x8a, 0x1a, 0x41, 0x32, 0x45, 0x8d, 0x86, 0xd6, 0xff, 0x10, 0x9c, 0x0a, 0xf6, 0xf3, 0x62, + 0xfd, 0xe5, 0x9d, 0xa6, 0x7c, 0x1c, 0xf9, 0x9c, 0x4f, 0x5c, 0x06, 0x44, 0xa8, 0xa6, 0x7b, 0xb4, + 0x0e, 0xe5, 0xd9, 0x8a, 0x9b, 0xc8, 0x03, 0x23, 0xcc, 0x8b, 0x6f, 0x8b, 0xae, 0xb8, 0x1d, 0xc8, + 0xd8, 0x8a, 0xdb, 0x01, 0x95, 0xca, 0x5c, 0x08, 0x55, 0xdf, 0x82, 0x79, 0x20, 0xd3, 0x4e, 0x1c, + 0x52, 0x99, 0x0b, 0x4b, 0x6d, 0x69, 0x0b, 0xe6, 0x81, 0xb5, 0xd6, 0x89, 0x03, 0xb9, 0x08, 0x85, + 0x6a, 0x75, 0x56, 0x6b, 0x5b, 0x4a, 0x3d, 0xe6, 0x03, 0x86, 0xd0, 0xe9, 0x1e, 0x4d, 0xe0, 0x99, + 0x19, 0x34, 0xd9, 0xd0, 0x5d, 0xcf, 0xac, 0xbb, 0x38, 0x62, 0xfc, 0x11, 0x62, 0x44, 0xcd, 0xa0, + 0x34, 0x1a, 0x66, 0x06, 0xa5, 0xc1, 0x99, 0xbd, 0x38, 0xa1, 0xbb, 0xae, 0x6e, 0x19, 0x8e, 0x3e, + 0x8e, 0xcb, 0x04, 0x8d, 0x3d, 0x0f, 0x88, 0x60, 0x99, 0xbd, 0x18, 0x85, 0xe0, 0xe1, 0xbb, 0x0f, + 0xf1, 0xcd, 0x9c, 0xe5, 0xd8, 0xe1, 0x7b, 0x0c, 0x8f, 0x87, 0xef, 0x31, 0x18, 0xda, 0x9d, 0x3e, + 0x4c, 0xa3, 0x2b, 0x26, 0x13, 0x91, 0xb2, 0x12, 0xb3, 0x3b, 0xe3, 0x04, 0x68, 0x77, 0xc6, 0x81, + 0x91, 0x26, 0xf9, 0xcb, 0xed, 0x6a, 0x87, 0x26, 0x85, 0xab, 0x6c, 0xa2, 0x0c, 0x5b, 0xbf, 0xc3, + 0xc1, 0x51, 0x5e, 0xb7, 0xf4, 0xa6, 0x5d, 0x1e, 0xf7, 0xa5, 0x6e, 0x46, 0xd7, 0xef, 0x8e, 0x84, + 0x6c, 0xfd, 0xee, 0x88, 0x64, 0xb3, 0xab, 0xbf, 0xd1, 0x5a, 0xd5, 0x1d, 0x6a, 0x94, 0x4d, 0x07, + 0x4f, 0x16, 0xd7, 0xf9, 0xd6, 0xf0, 0xcd, 0xe8, 0xec, 0xda, 0x85, 0x94, 0xcd, 0xae, 0x5d, 0xd0, + 0xcc, 0xc8, 0x4b, 0x47, 0x6b, 0x54, 0x37, 0x94, 0xbb, 0x51, 0x23, 0xaf, 0x33, 0x25, 0x33, 0xf2, + 0x3a, 0x63, 0x3b, 0x7f, 0xce, 0x1d, 0xc7, 0xf4, 0xa8, 0xd2, 0xd8, 0xce, 0xe7, 0x20, 0x69, 0xe7, + 0xcf, 0x41, 0x34, 0xdb, 0x10, 0xc6, 0x3b, 0xa4, 0x19, 0xdd, 0x10, 0x26, 0xbb, 0x21, 0x5e, 0x82, + 0x59, 0x2c, 0xe2, 0x95, 0x88, 0x62, 0x45, 0x2d, 0x16, 0x01, 0x66, 0x16, 0x4b, 0xf8, 0x8e, 0x24, + 0xf2, 0xc0, 0x40, 0xb1, 0xa3, 0x6b, 0xa8, 0x8c, 0x63, 0x6b, 0x68, 0xe4, 0x31, 0xc2, 0xf3, 0x11, + 0xef, 0x59, 0xa5, 0x15, 0xb5, 0x3a, 0x24, 0x14, 0xb3, 0x3a, 0x64, 0x3f, 0xdb, 0x09, 0x38, 0x86, + 0xb7, 0xe0, 0x5a, 0x3b, 0xb8, 0xc7, 0xf9, 0x44, 0xf4, 0x33, 0x63, 0x68, 0xf6, 0x99, 0x31, 0x50, + 0x84, 0x89, 0x98, 0xb6, 0x9c, 0x0e, 0x4c, 0xc2, 0xf3, 0xc1, 0x18, 0x88, 0xcc, 0x00, 0xa9, 0x96, + 0x66, 0x67, 0x2a, 0xc6, 0x82, 0x7c, 0x45, 0xe6, 0x46, 0x4f, 0x60, 0x93, 0x14, 0xd3, 0x3d, 0x5a, + 0x4a, 0x39, 0xf2, 0x26, 0x9c, 0x15, 0x50, 0xf1, 0x04, 0x10, 0xd3, 0x45, 0x1b, 0xc1, 0x82, 0xe0, + 0x45, 0xbd, 0x33, 0xba, 0xd1, 0x4e, 0xf7, 0x68, 0x5d, 0x79, 0x75, 0xae, 0x4b, 0xac, 0x0f, 0xed, + 0xed, 0xd4, 0x15, 0x2c, 0x12, 0x5d, 0x79, 0x75, 0xae, 0x4b, 0xc8, 0xfd, 0xde, 0x76, 0xea, 0x0a, + 0x3a, 0xa1, 0x2b, 0x2f, 0xe2, 0x42, 0xb1, 0x1b, 0xbe, 0xd4, 0x68, 0x28, 0x6b, 0x58, 0xdd, 0x7b, + 0xb7, 0x53, 0x5d, 0x09, 0x0d, 0xce, 0xad, 0x38, 0xb2, 0x59, 0x7a, 0xbe, 0x45, 0xad, 0x6a, 0x64, + 0x01, 0xba, 0x1f, 0x9d, 0xa5, 0x13, 0x04, 0x6c, 0x96, 0x4e, 0x00, 0xd9, 0x80, 0x92, 0x9d, 0xb0, + 0x95, 0xf5, 0xe8, 0x80, 0x92, 0x71, 0x6c, 0x40, 0x45, 0x1c, 0xb6, 0xe7, 0xe1, 0xf8, 0xfc, 0x5d, + 0x4f, 0xf7, 0x2d, 0x48, 0x57, 0x74, 0xe5, 0x5b, 0xb1, 0x4b, 0xa6, 0x24, 0x09, 0x5e, 0x32, 0x25, + 0xc1, 0x6c, 0x8c, 0x30, 0x70, 0x75, 0xdd, 0xaa, 0x4f, 0xe9, 0x66, 0xa3, 0xed, 0x50, 0xe5, 0x7f, + 0x8b, 0x8e, 0x91, 0x18, 0x9a, 0x8d, 0x91, 0x18, 0x88, 0x2d, 0xd0, 0x0c, 0x54, 0x72, 0x5d, 0x73, + 0xc5, 0x12, 0xfb, 0xca, 0x76, 0xc3, 0x53, 0xfe, 0xf7, 0xe8, 0x02, 0x9d, 0x46, 0xc3, 0x16, 0xe8, + 0x34, 0x38, 0x9e, 0x3a, 0xa5, 0xa4, 0x52, 0x57, 0xfe, 0x8f, 0xd8, 0xa9, 0x53, 0x0a, 0x0d, 0x9e, + 0x3a, 0xa5, 0xa5, 0x61, 0x9f, 0x82, 0x51, 0x6e, 0x93, 0xcd, 0x98, 0xc1, 0x5d, 0xf5, 0xff, 0x19, + 0x5d, 0x1f, 0xe3, 0x78, 0xb6, 0x3e, 0xc6, 0x61, 0x51, 0x3e, 0xa2, 0x0b, 0xfe, 0xaf, 0x4e, 0x7c, + 0x02, 0xf9, 0x27, 0xca, 0x90, 0xeb, 0x32, 0x1f, 0x31, 0x52, 0xbe, 0x3d, 0xd3, 0x89, 0x51, 0x30, + 0x3c, 0x12, 0x85, 0xa2, 0x8c, 0x34, 0x7a, 0xcf, 0xa4, 0x6b, 0xca, 0x27, 0x3b, 0x32, 0xe2, 0x04, + 0x51, 0x46, 0x1c, 0x46, 0xde, 0x80, 0x53, 0x21, 0x6c, 0x96, 0x36, 0x97, 0x82, 0x99, 0xe9, 0x3b, + 0x32, 0x51, 0x33, 0x38, 0x9d, 0x8c, 0x99, 0xc1, 0xe9, 0x98, 0x34, 0xd6, 0x42, 0x74, 0xff, 0xf7, + 0x16, 0xac, 0x03, 0x09, 0x76, 0x60, 0x90, 0xc6, 0x5a, 0x48, 0xf3, 0x3b, 0xb7, 0x60, 0x1d, 0xc8, + 0xb4, 0x03, 0x03, 0xf2, 0xe9, 0x0c, 0x5c, 0x48, 0x47, 0x95, 0x1a, 0x8d, 0x29, 0xdb, 0x09, 0x71, + 0xca, 0x77, 0x65, 0xa2, 0x07, 0x0d, 0xdb, 0x2b, 0x36, 0xdd, 0xa3, 0x6d, 0xb3, 0x02, 0xf2, 0x41, + 0x18, 0x2e, 0xb5, 0x0d, 0xd3, 0xc3, 0x8b, 0x37, 0x66, 0x38, 0x7f, 0x77, 0x26, 0xb6, 0xc5, 0x91, + 0xb1, 0xb8, 0xc5, 0x91, 0x01, 0xe4, 0x06, 0x8c, 0x55, 0x69, 0xbd, 0xed, 0x98, 0xde, 0xba, 0x86, + 0x69, 0xf2, 0x19, 0x8f, 0xef, 0xc9, 0x44, 0x27, 0xb1, 0x04, 0x05, 0x9b, 0xc4, 0x12, 0x40, 0x72, + 0xbb, 0x43, 0x32, 0x75, 0xe5, 0x53, 0x99, 0xae, 0xd7, 0xf2, 0x41, 0x5f, 0x76, 0xc8, 0xc5, 0xbe, + 0x90, 0x9a, 0x9c, 0x5a, 0xf9, 0x74, 0xa6, 0xcb, 0x35, 0xba, 0x34, 0xc3, 0xa5, 0xe4, 0xb5, 0x5e, + 0x48, 0xcd, 0x1c, 0xac, 0x7c, 0x6f, 0xa6, 0xcb, 0xb5, 0x77, 0xc8, 0x31, 0x2d, 0xe9, 0xf0, 0xb3, + 0xdc, 0x53, 0x44, 0x30, 0xfa, 0x7f, 0x32, 0x49, 0x57, 0x91, 0xa0, 0xbc, 0x44, 0xc8, 0x8a, 0xdd, + 0x72, 0x03, 0xa5, 0xff, 0x4c, 0x26, 0xe9, 0x9b, 0x17, 0x16, 0x0b, 0x7f, 0x11, 0x0a, 0x67, 0x26, + 0xef, 0x7b, 0xd4, 0xb1, 0xf4, 0x06, 0x76, 0x67, 0xd5, 0xb3, 0x1d, 0x7d, 0x85, 0x4e, 0x5a, 0xfa, + 0x52, 0x83, 0x2a, 0x9f, 0xcd, 0x44, 0x2d, 0xd8, 0xce, 0xa4, 0xcc, 0x82, 0xed, 0x8c, 0x25, 0xab, + 0xf0, 0x70, 0x1a, 0xb6, 0x6c, 0xba, 0x58, 0xcf, 0xe7, 0x32, 0x51, 0x13, 0xb6, 0x0b, 0x2d, 0x33, + 0x61, 0xbb, 0xa0, 0xc9, 0x55, 0x18, 0x18, 0xb7, 0xfd, 0xe9, 0xf7, 0xff, 0x8d, 0x39, 0x43, 0x06, + 0x98, 0xe9, 0x1e, 0x2d, 0x24, 0x13, 0x65, 0xc4, 0xa0, 0xfe, 0x7c, 0xb2, 0x4c, 0x78, 0xf9, 0x14, + 0xfc, 0x10, 0x65, 0x84, 0xb8, 0xff, 0xbf, 0x64, 0x99, 0xf0, 0x8e, 0x2b, 0xf8, 0xc1, 0x66, 0x12, + 0x5e, 0xe3, 0xec, 0x54, 0x89, 0xd9, 0x6d, 0x13, 0xab, 0x7a, 0xa3, 0x41, 0xad, 0x15, 0xaa, 0x7c, + 0x21, 0x36, 0x93, 0xa4, 0x93, 0xb1, 0x99, 0x24, 0x1d, 0x43, 0x3e, 0x0a, 0xa7, 0x6f, 0xeb, 0x0d, + 0xd3, 0x08, 0x71, 0x7e, 0x1e, 0x59, 0xe5, 0xfb, 0x32, 0xd1, 0xdd, 0x74, 0x07, 0x3a, 0xb6, 0x9b, + 0xee, 0x80, 0x22, 0xb3, 0x40, 0x70, 0x19, 0x0d, 0x66, 0x0b, 0xb6, 0x3e, 0x2b, 0xff, 0x7f, 0x26, + 0x6a, 0xa7, 0x26, 0x49, 0x98, 0x9d, 0x9a, 0x84, 0x92, 0x5a, 0xe7, 0x80, 0xf4, 0xca, 0xf7, 0x67, + 0xa2, 0xa7, 0x35, 0x9d, 0x08, 0xa7, 0x7b, 0xb4, 0xce, 0x51, 0xed, 0xaf, 0xc3, 0x68, 0x75, 0xa1, + 0x32, 0x35, 0x35, 0x59, 0xbd, 0x5d, 0x29, 0xa3, 0xfb, 0xae, 0xa1, 0xfc, 0x40, 0x6c, 0xc5, 0x8a, + 0x13, 0xb0, 0x15, 0x2b, 0x0e, 0x23, 0x2f, 0xc1, 0x10, 0x6b, 0x3f, 0x1b, 0x30, 0xf8, 0xc9, 0x5f, + 0xcc, 0x44, 0xcd, 0x29, 0x19, 0xc9, 0xcc, 0x29, 0xf9, 0x37, 0xa9, 0xc2, 0x09, 0x26, 0xc5, 0x05, + 0x87, 0x2e, 0x53, 0x87, 0x5a, 0x75, 0x7f, 0x4c, 0xff, 0x60, 0x26, 0x6a, 0x65, 0xa4, 0x11, 0x31, + 0x2b, 0x23, 0x0d, 0x4e, 0xee, 0xc2, 0xd9, 0xf8, 0x49, 0x90, 0xfc, 0x98, 0x4a, 0xf9, 0xa1, 0x4c, + 0xcc, 0x18, 0xee, 0x42, 0x8c, 0xc6, 0x70, 0x17, 0x3c, 0xb1, 0xe0, 0x9c, 0x38, 0x56, 0x11, 0x0e, + 0x97, 0xf1, 0xda, 0x7e, 0x98, 0xd7, 0xf6, 0x78, 0xe8, 0x10, 0xd8, 0x85, 0x7a, 0xba, 0x47, 0xeb, + 0xce, 0x8e, 0xe9, 0x59, 0x32, 0xec, 0xba, 0xf2, 0x23, 0x99, 0x74, 0x8f, 0x94, 0x88, 0x9b, 0x72, + 0x5a, 0xbc, 0xf6, 0x37, 0x3a, 0x05, 0x0d, 0x57, 0x7e, 0x34, 0x36, 0xde, 0xd2, 0xc9, 0xd8, 0x78, + 0xeb, 0x10, 0x75, 0xfc, 0x06, 0x8c, 0x71, 0xa5, 0x5e, 0xd0, 0x71, 0x18, 0x5a, 0x2b, 0xd4, 0x50, + 0xfe, 0x4a, 0x6c, 0xb5, 0x4b, 0x50, 0xa0, 0x6b, 0x4f, 0x1c, 0xc8, 0xa6, 0xee, 0x6a, 0x4b, 0xb7, + 0x2c, 0x3c, 0x66, 0x55, 0xfe, 0x6a, 0x6c, 0xea, 0x0e, 0x51, 0xe8, 0xb8, 0x1b, 0xfc, 0x62, 0x9a, + 0xd0, 0x2d, 0xe1, 0x86, 0xf2, 0x63, 0x31, 0x4d, 0xe8, 0x46, 0xcc, 0x34, 0xa1, 0x6b, 0xf6, 0x8e, + 0xdb, 0x1d, 0x1e, 0x36, 0x2a, 0x5f, 0x8a, 0xad, 0xc8, 0xa9, 0x54, 0x6c, 0x45, 0x4e, 0x7f, 0x17, + 0x79, 0xbb, 0xc3, 0xa3, 0x40, 0xe5, 0xc7, 0xbb, 0xf3, 0x0d, 0x57, 0xfa, 0xf4, 0x37, 0x85, 0xb7, + 0x3b, 0x3c, 0xa8, 0x53, 0x7e, 0xa2, 0x3b, 0xdf, 0xd0, 0xb1, 0x2f, 0xfd, 0x3d, 0x5e, 0xad, 0xf3, + 0x63, 0x34, 0xe5, 0x27, 0xe3, 0x53, 0x57, 0x07, 0x42, 0x9c, 0xba, 0x3a, 0xbd, 0x68, 0xbb, 0x91, + 0xf2, 0x24, 0x4c, 0xf9, 0xa9, 0x98, 0x62, 0x25, 0x28, 0x98, 0x62, 0x25, 0x5f, 0x92, 0xdd, 0x48, + 0x79, 0xf9, 0xa4, 0xfc, 0xb5, 0xce, 0xbc, 0x02, 0xa1, 0xa6, 0x3c, 0x98, 0xba, 0x91, 0xf2, 0xc0, + 0x47, 0xf9, 0xeb, 0x9d, 0x79, 0x85, 0xfe, 0x41, 0xc9, 0x77, 0x41, 0x6f, 0xc0, 0x29, 0x3e, 0xd3, + 0x4e, 0x51, 0x83, 0x46, 0x3e, 0xf4, 0xa7, 0x63, 0xe3, 0x32, 0x9d, 0x0c, 0x8f, 0xc3, 0x53, 0x31, + 0x69, 0xac, 0x45, 0x5b, 0x7f, 0x66, 0x0b, 0xd6, 0xa1, 0xb1, 0x9e, 0x8e, 0x19, 0xef, 0x83, 0x5e, + 0xdc, 0x27, 0xab, 0x5f, 0xca, 0xc0, 0x50, 0xd5, 0x73, 0xa8, 0xde, 0x14, 0x31, 0x2a, 0xce, 0x40, + 0x3f, 0x77, 0x38, 0xf3, 0xdf, 0x7c, 0x68, 0xc1, 0x6f, 0x72, 0x01, 0x46, 0x66, 0x74, 0xd7, 0xc3, + 0x92, 0x15, 0xcb, 0xa0, 0xf7, 0xf1, 0xb1, 0x45, 0x4e, 0x8b, 0x41, 0xc9, 0x0c, 0xa7, 0xe3, 0xe5, + 0x30, 0xa2, 0x50, 0x6e, 0xcb, 0xd0, 0x0c, 0xfd, 0x6f, 0x6f, 0x14, 0x7b, 0x30, 0x12, 0x43, 0xac, + 0xac, 0xfa, 0xb5, 0x0c, 0x24, 0x5c, 0xe1, 0x76, 0xff, 0x16, 0x6b, 0x1e, 0x8e, 0xc5, 0xa2, 0x58, + 0x89, 0x17, 0x23, 0xdb, 0x0c, 0x72, 0x15, 0x2f, 0x4d, 0xde, 0x1b, 0xbc, 0x54, 0xb8, 0xa5, 0xcd, + 0x88, 0xb0, 0x1b, 0x7d, 0x9b, 0x1b, 0xc5, 0x5c, 0xdb, 0x69, 0x68, 0x12, 0x4a, 0x3c, 0xab, 0xfe, + 0xa5, 0xd1, 0x30, 0x44, 0x0f, 0xb9, 0x20, 0x1e, 0x86, 0x65, 0xc2, 0x60, 0x1d, 0xb1, 0x04, 0x90, + 0xfc, 0x21, 0xd8, 0x07, 0x61, 0xa8, 0xd2, 0x6c, 0x51, 0xc7, 0xb5, 0x2d, 0xdd, 0xb3, 0xfd, 0x44, + 0xf3, 0x18, 0xc8, 0xc1, 0x94, 0xe0, 0x72, 0x70, 0x01, 0x99, 0x9e, 0x5c, 0xf2, 0x73, 0x52, 0xe4, + 0x30, 0x38, 0x12, 0x46, 0xf8, 0x8c, 0x27, 0x15, 0xe4, 0x14, 0x8c, 0xf4, 0x96, 0xab, 0xe3, 0x9b, + 0x96, 0x80, 0xb4, 0xcd, 0x00, 0x32, 0x29, 0x52, 0x90, 0x27, 0xa1, 0x80, 0x67, 0x80, 0x2e, 0xe6, + 0x9a, 0x11, 0x21, 0x44, 0x1a, 0x08, 0x91, 0x03, 0x36, 0x70, 0x1a, 0x72, 0x13, 0x46, 0xc3, 0x0b, + 0x8e, 0xeb, 0x8e, 0xdd, 0x6e, 0xf9, 0xd1, 0xa5, 0x31, 0x19, 0xe3, 0xdd, 0x00, 0x57, 0x5b, 0x41, + 0xa4, 0xc4, 0x22, 0x51, 0x90, 0x4c, 0xc3, 0xb1, 0x10, 0xc6, 0x44, 0xe4, 0x47, 0xb5, 0xc7, 0x8c, + 0x42, 0x12, 0x2f, 0x26, 0xce, 0x48, 0x46, 0xa1, 0x58, 0x31, 0x52, 0x81, 0x3e, 0x3f, 0x7e, 0x48, + 0xff, 0x96, 0x4a, 0x7a, 0x5c, 0xc4, 0x0f, 0xe9, 0x93, 0x23, 0x87, 0xf8, 0xe5, 0xc9, 0x14, 0x8c, + 0x68, 0x76, 0xdb, 0xa3, 0x8b, 0xb6, 0xb0, 0x0c, 0x44, 0xd8, 0x63, 0x6c, 0x93, 0xc3, 0x30, 0x35, + 0xcf, 0xf6, 0x73, 0x59, 0xca, 0x39, 0x15, 0xa3, 0xa5, 0xc8, 0x1c, 0x8c, 0x25, 0xae, 0x82, 0xe4, + 0x0c, 0x93, 0xd2, 0xe7, 0x25, 0x99, 0x25, 0x8b, 0x92, 0xef, 0xce, 0x40, 0x61, 0xd1, 0xd1, 0x4d, + 0xcf, 0x15, 0xcf, 0x61, 0x4e, 0x5e, 0x5e, 0x73, 0xf4, 0x16, 0xd3, 0x8f, 0xcb, 0x18, 0xfd, 0xea, + 0xb6, 0xde, 0x68, 0x53, 0x77, 0xfc, 0x0e, 0xfb, 0xba, 0x7f, 0xb9, 0x51, 0x7c, 0x69, 0x05, 0x37, + 0x9c, 0x97, 0xeb, 0x76, 0xf3, 0xca, 0x8a, 0xa3, 0xdf, 0x33, 0x3d, 0x9c, 0x3a, 0xf4, 0xc6, 0x15, + 0x8f, 0x36, 0x70, 0x5f, 0x7b, 0x45, 0x6f, 0x99, 0x57, 0x30, 0xca, 0xe2, 0x95, 0x80, 0x13, 0xaf, + 0x81, 0xa9, 0x80, 0x87, 0x7f, 0xc9, 0x2a, 0xc0, 0x71, 0x64, 0x8e, 0x6d, 0x07, 0xf1, 0x53, 0x4b, + 0xad, 0x96, 0x78, 0x5b, 0x23, 0xed, 0x06, 0x7d, 0x0c, 0x57, 0xec, 0x40, 0x60, 0x7a, 0xab, 0x25, + 0xe7, 0xb0, 0x0d, 0xe9, 0x98, 0x16, 0x2c, 0x8a, 0x16, 0xf9, 0x62, 0x1a, 0x0e, 0x25, 0xee, 0x37, + 0x36, 0x45, 0x48, 0xf1, 0x62, 0x64, 0x09, 0x8e, 0x09, 0xbe, 0x41, 0x1c, 0xe2, 0x91, 0xe8, 0xac, + 0x10, 0x43, 0x73, 0xa5, 0x0d, 0xda, 0x68, 0x08, 0xb0, 0x5c, 0x47, 0xac, 0x04, 0x19, 0x0f, 0x93, + 0xa3, 0xcd, 0xe9, 0x4d, 0xea, 0x2a, 0xc7, 0x50, 0x63, 0xcf, 0x6e, 0x6e, 0x14, 0x15, 0xbf, 0x3c, + 0x86, 0xd2, 0x49, 0x4d, 0xf5, 0x89, 0x45, 0x64, 0x1e, 0x5c, 0xeb, 0x47, 0x53, 0x78, 0xc4, 0x75, + 0x3e, 0x5a, 0x84, 0x4c, 0xc0, 0x70, 0xe0, 0xda, 0x7b, 0xeb, 0x56, 0xa5, 0x8c, 0x8f, 0x77, 0x06, + 0xc6, 0xcf, 0x6d, 0x6e, 0x14, 0x1f, 0x8a, 0x45, 0x0a, 0x96, 0x99, 0x44, 0xca, 0x48, 0xaf, 0xfc, + 0xf8, 0x6b, 0x9e, 0xd8, 0x2b, 0xbf, 0x56, 0xca, 0x2b, 0xbf, 0x05, 0xf2, 0x0a, 0x0c, 0x96, 0xee, + 0x54, 0xc5, 0xeb, 0x45, 0x57, 0x39, 0x1e, 0xc6, 0x96, 0xc7, 0x6c, 0xaf, 0xe2, 0xa5, 0xa3, 0xdc, + 0x74, 0x99, 0x9e, 0x4c, 0xc2, 0x48, 0xc4, 0x3b, 0xc0, 0x55, 0x4e, 0x20, 0x07, 0x6c, 0xb9, 0x8e, + 0x98, 0x9a, 0x23, 0x50, 0x91, 0xfc, 0xc3, 0x91, 0x42, 0x4c, 0x6b, 0xd8, 0x06, 0xbb, 0xd1, 0xb0, + 0xd7, 0x34, 0x8a, 0x0f, 0x25, 0xf1, 0x29, 0x50, 0x3f, 0xd7, 0x1a, 0x43, 0xa0, 0x6a, 0x0e, 0xc7, + 0x45, 0x12, 0x0e, 0x47, 0x8b, 0x91, 0x37, 0x81, 0x60, 0x64, 0x6f, 0x6a, 0xf8, 0x87, 0xc5, 0x95, + 0xb2, 0xab, 0x9c, 0xc2, 0x28, 0x80, 0x24, 0xfe, 0x52, 0xb7, 0x52, 0x1e, 0xbf, 0x20, 0xa6, 0x8f, + 0xf3, 0x3a, 0x2f, 0x55, 0x73, 0x04, 0xae, 0x66, 0x46, 0xd2, 0x9e, 0xa5, 0x70, 0x25, 0x6b, 0x70, + 0x7a, 0xc1, 0xa1, 0xf7, 0x4c, 0xbb, 0xed, 0xfa, 0xcb, 0x87, 0x3f, 0x6f, 0x9d, 0xde, 0x72, 0xde, + 0x7a, 0x54, 0x54, 0x7c, 0xb2, 0xe5, 0xd0, 0x7b, 0x35, 0x3f, 0xf6, 0x5b, 0x24, 0xfe, 0x51, 0x27, + 0xee, 0x98, 0xbc, 0xed, 0xad, 0xb6, 0x43, 0x05, 0xdc, 0xa4, 0xae, 0xa2, 0x84, 0x53, 0x2d, 0x7f, + 0xf3, 0x6a, 0x06, 0xb8, 0x48, 0xf2, 0xb6, 0x68, 0x31, 0xa2, 0x01, 0xb9, 0x3e, 0xe1, 0x5f, 0x1c, + 0x94, 0xea, 0x3c, 0xc5, 0x95, 0xf2, 0x10, 0x32, 0x53, 0x99, 0x58, 0x56, 0xea, 0x41, 0x1c, 0xc8, + 0x9a, 0x2e, 0xf0, 0xb2, 0x58, 0x92, 0xa5, 0xc9, 0x0c, 0x8c, 0x2e, 0x38, 0xb8, 0x8d, 0xb9, 0x49, + 0xd7, 0x17, 0xec, 0x86, 0x59, 0x5f, 0xc7, 0x17, 0x49, 0x62, 0xaa, 0x6c, 0x71, 0x5c, 0xed, 0x2e, + 0x5d, 0xaf, 0xb5, 0x10, 0x2b, 0x2f, 0x2b, 0xf1, 0x92, 0x72, 0x5c, 0xb6, 0x87, 0xb7, 0x17, 0x97, + 0x8d, 0xc2, 0xa8, 0xb8, 0x76, 0xb8, 0xef, 0x51, 0x8b, 0x2d, 0xf5, 0xae, 0x78, 0x7d, 0xa4, 0xc4, + 0xae, 0x29, 0x02, 0xbc, 0x48, 0x3e, 0xcc, 0x47, 0x19, 0x0d, 0xc0, 0x72, 0xc3, 0xe2, 0x45, 0xd4, + 0x5f, 0xca, 0xc9, 0x53, 0x27, 0x39, 0x0b, 0x79, 0x29, 0x2c, 0x38, 0x46, 0x66, 0xc2, 0x10, 0x8a, + 0x79, 0x11, 0x2b, 0x6e, 0x40, 0x98, 0x1d, 0xc1, 0x13, 0x5c, 0x4c, 0xf6, 0x12, 0x46, 0xeb, 0xd1, + 0x42, 0x02, 0x4c, 0xb4, 0xd1, 0x5e, 0x6a, 0x98, 0x75, 0x0c, 0xac, 0x99, 0x93, 0x12, 0x6d, 0x20, + 0x94, 0xc7, 0xd5, 0x94, 0x48, 0xc8, 0x55, 0x18, 0xf4, 0x77, 0xbe, 0x61, 0x64, 0x32, 0x8c, 0xb7, + 0xe8, 0xa7, 0x69, 0xe6, 0xe1, 0x1c, 0x25, 0x22, 0xf2, 0x22, 0x26, 0x2a, 0xf7, 0x9f, 0x37, 0xf7, + 0x86, 0xe6, 0x8b, 0x3c, 0xf0, 0x63, 0x99, 0xca, 0xfd, 0x57, 0xce, 0xe3, 0x30, 0x2c, 0x6b, 0x92, + 0x9f, 0x5a, 0x08, 0xe7, 0xbc, 0x88, 0xfa, 0xc9, 0x7d, 0x1b, 0x2d, 0x42, 0xe6, 0x61, 0x2c, 0xa1, + 0x3c, 0x22, 0x8e, 0x19, 0xa6, 0x97, 0x4c, 0xd1, 0x3c, 0x79, 0x4d, 0x4d, 0x94, 0x25, 0x8f, 0x41, + 0xee, 0x96, 0x56, 0x11, 0xb1, 0x94, 0x78, 0x18, 0xae, 0xc8, 0x43, 0x6b, 0x86, 0x55, 0xbf, 0x23, + 0x9b, 0x58, 0x56, 0x98, 0xf4, 0x04, 0x2b, 0xa9, 0x07, 0x51, 0x7a, 0x7e, 0xfd, 0x5c, 0x7a, 0x12, + 0x11, 0xb9, 0x08, 0xfd, 0xb1, 0x84, 0xe6, 0xf8, 0x2a, 0x3e, 0xc8, 0x66, 0x1e, 0x60, 0xc9, 0x55, + 0x29, 0x23, 0x96, 0x14, 0x59, 0xd0, 0xcf, 0x88, 0x15, 0x0f, 0xb1, 0x87, 0xb9, 0xb1, 0xae, 0xc6, + 0x82, 0xef, 0xfb, 0x79, 0xa7, 0x93, 0x4b, 0x5a, 0x18, 0x6c, 0x3f, 0x30, 0x28, 0x7b, 0xb7, 0x32, + 0x28, 0xd5, 0x5f, 0xcf, 0x24, 0x87, 0x08, 0xb9, 0x96, 0x8c, 0x14, 0xc6, 0x53, 0x4e, 0xfb, 0x40, + 0xb9, 0xd6, 0x20, 0x66, 0x58, 0x24, 0xe6, 0x57, 0x76, 0xd7, 0x31, 0xbf, 0x72, 0x3b, 0x8c, 0xf9, + 0xa5, 0xfe, 0xf7, 0x7c, 0x57, 0x0f, 0xb7, 0x03, 0x89, 0x0d, 0xf1, 0x02, 0xdb, 0x14, 0xb1, 0xda, + 0x4b, 0x6e, 0xc2, 0xb4, 0xe7, 0x0e, 0x3c, 0x35, 0x9d, 0x0f, 0x2d, 0x57, 0x8b, 0x52, 0x92, 0x57, + 0x61, 0xc8, 0xff, 0x00, 0x8c, 0x25, 0x27, 0xc5, 0x40, 0x0b, 0x16, 0xa4, 0x78, 0xd6, 0x70, 0xb9, + 0x00, 0x79, 0x16, 0x06, 0xd0, 0x1c, 0x69, 0xe9, 0x75, 0x3f, 0xd0, 0x20, 0x8f, 0x4c, 0xe8, 0x03, + 0xe5, 0xf8, 0x07, 0x01, 0x25, 0xf9, 0x18, 0x14, 0x22, 0x69, 0xeb, 0xaf, 0x6c, 0xc3, 0x25, 0xf0, + 0xb2, 0x1c, 0x24, 0x97, 0x6f, 0x30, 0xe2, 0x29, 0xeb, 0x05, 0x53, 0xb2, 0x08, 0xc7, 0x17, 0x1c, + 0x6a, 0xa0, 0xf3, 0xe9, 0xe4, 0xfd, 0x96, 0x23, 0x42, 0x18, 0xf3, 0x51, 0x8e, 0xeb, 0x4b, 0xcb, + 0x47, 0xb3, 0x95, 0x4f, 0xe0, 0xe5, 0x68, 0x67, 0x29, 0xc5, 0x99, 0xd1, 0xc1, 0x5b, 0x72, 0x93, + 0xae, 0xaf, 0x61, 0xea, 0xd2, 0xfe, 0xd0, 0xe8, 0x10, 0x82, 0xbe, 0x2b, 0x50, 0xb2, 0xd1, 0x11, + 0x2d, 0x74, 0xe6, 0x05, 0x18, 0xdc, 0x6d, 0xa0, 0xd9, 0x5f, 0xcc, 0x76, 0xf0, 0x15, 0x7f, 0x70, + 0x73, 0x7d, 0x04, 0x59, 0xe6, 0x7a, 0x3b, 0x64, 0x99, 0xfb, 0x66, 0xb6, 0x83, 0x23, 0xfc, 0x03, + 0x9d, 0x0d, 0x2a, 0x10, 0x46, 0x34, 0x1b, 0x54, 0x98, 0x88, 0xcb, 0x34, 0x34, 0x99, 0x28, 0x96, + 0x37, 0xae, 0xb0, 0x65, 0xde, 0xb8, 0x9f, 0xce, 0x75, 0x7b, 0x28, 0x70, 0x24, 0xfb, 0x9d, 0xc8, + 0xfe, 0x2a, 0x0c, 0x06, 0x92, 0xad, 0x94, 0xd1, 0xe8, 0x19, 0x0e, 0xc2, 0x5a, 0x73, 0x30, 0x96, + 0x91, 0x88, 0xc8, 0x25, 0xde, 0xd6, 0xaa, 0xf9, 0x16, 0x8f, 0xd2, 0x3a, 0x2c, 0xe2, 0x6f, 0xea, + 0x9e, 0x5e, 0x73, 0xcd, 0xb7, 0xa8, 0x16, 0xa0, 0xd5, 0xbf, 0x9f, 0x4d, 0x7d, 0x6d, 0x71, 0xd4, + 0x47, 0x3b, 0xe8, 0xa3, 0x14, 0x21, 0xf2, 0x77, 0x22, 0x47, 0x42, 0xdc, 0x81, 0x10, 0xff, 0x38, + 0x9b, 0xfa, 0xaa, 0xe6, 0x48, 0x88, 0x3b, 0x99, 0x2d, 0x9e, 0x84, 0x01, 0xcd, 0x5e, 0x73, 0x31, + 0x49, 0xb4, 0x98, 0x2b, 0x70, 0xa2, 0x76, 0xec, 0x35, 0x97, 0x27, 0xd0, 0xd6, 0x42, 0x02, 0xf5, + 0xcf, 0xb2, 0x5d, 0xde, 0x1d, 0x1d, 0x09, 0xfe, 0x9d, 0x5c, 0x22, 0x7f, 0x25, 0x1b, 0x79, 0xd7, + 0xf4, 0x40, 0xa7, 0x55, 0xad, 0xd6, 0x57, 0x69, 0x53, 0x8f, 0xa7, 0x55, 0x75, 0x11, 0x2a, 0x92, + 0x9b, 0x85, 0x24, 0xea, 0x97, 0xb3, 0xb1, 0x87, 0x5d, 0x47, 0xb2, 0xdb, 0xb6, 0xec, 0x02, 0xad, + 0x13, 0x6f, 0xd5, 0x8e, 0x24, 0xb7, 0x5d, 0xc9, 0x7d, 0x2a, 0x1b, 0x7b, 0xd6, 0xf7, 0xc0, 0xca, + 0x8e, 0x0d, 0xc0, 0xe4, 0x73, 0xc3, 0x07, 0x56, 0x93, 0x9e, 0x84, 0x01, 0x21, 0x87, 0x60, 0xa9, + 0xe0, 0xf3, 0x3e, 0x07, 0xe2, 0x29, 0x6b, 0x40, 0xa0, 0x7e, 0x57, 0x16, 0xa2, 0xcf, 0x2d, 0x1f, + 0x50, 0x1d, 0xfa, 0x95, 0x6c, 0xf4, 0xa1, 0xe9, 0x83, 0xab, 0x3f, 0x97, 0x01, 0xaa, 0xed, 0xa5, + 0xba, 0x88, 0x53, 0xd8, 0x2b, 0x1d, 0xd3, 0x07, 0x50, 0x4d, 0xa2, 0x50, 0xff, 0x47, 0x36, 0xf5, + 0xf5, 0xeb, 0x83, 0x2b, 0xc0, 0x67, 0xf0, 0x54, 0xbc, 0x6e, 0x85, 0x13, 0x39, 0x1e, 0x42, 0xb2, + 0xf1, 0x97, 0x48, 0x8f, 0xe2, 0x13, 0x92, 0x0f, 0xa4, 0x98, 0x6b, 0x18, 0xbc, 0x35, 0x34, 0xd7, + 0xe4, 0x6b, 0x08, 0xc9, 0x70, 0xfb, 0x27, 0xd9, 0xad, 0x1e, 0x0b, 0x3f, 0xc8, 0xab, 0x6a, 0xdf, + 0x82, 0xbe, 0x8e, 0x41, 0xad, 0x58, 0x4f, 0x0c, 0xf1, 0xe4, 0x1d, 0x2d, 0x0e, 0x92, 0xaf, 0xcd, + 0x04, 0x95, 0xfa, 0x47, 0xbd, 0xe9, 0x2f, 0x55, 0x1f, 0x5c, 0x11, 0x9e, 0x85, 0xfc, 0x82, 0xee, + 0xad, 0x0a, 0x4d, 0xc6, 0x2b, 0xbd, 0x96, 0xee, 0xad, 0x6a, 0x08, 0x25, 0x97, 0xa0, 0x5f, 0xd3, + 0xd7, 0xf8, 0x99, 0x67, 0x21, 0x4c, 0xac, 0xe2, 0xe8, 0x6b, 0x35, 0x7e, 0xee, 0x19, 0xa0, 0x89, + 0x1a, 0x24, 0xf6, 0xe1, 0x27, 0xdf, 0x98, 0x55, 0x82, 0x27, 0xf6, 0x09, 0xd2, 0xf9, 0x9c, 0x85, + 0xfc, 0xb8, 0x6d, 0xac, 0xe3, 0xf5, 0xd5, 0x10, 0xaf, 0x6c, 0xc9, 0x36, 0xd6, 0x35, 0x84, 0x92, + 0x4f, 0x67, 0xa0, 0x6f, 0x9a, 0xea, 0x06, 0x1b, 0x21, 0x03, 0xdd, 0x1c, 0x46, 0x3e, 0xb4, 0x3f, + 0x0e, 0x23, 0x63, 0xab, 0xbc, 0x32, 0x59, 0x51, 0x44, 0xfd, 0xe4, 0x3a, 0xf4, 0x4f, 0xe8, 0x1e, + 0x5d, 0xb1, 0x9d, 0x75, 0x74, 0x81, 0x19, 0x09, 0xbd, 0x1d, 0x23, 0xfa, 0xe3, 0x13, 0xf1, 0x9b, + 0xb1, 0xba, 0xf8, 0xa5, 0x05, 0x85, 0x99, 0x58, 0x44, 0x96, 0xd0, 0xc1, 0x50, 0x2c, 0x3c, 0x1d, + 0x68, 0x90, 0x0c, 0x34, 0x38, 0x56, 0x1e, 0x4a, 0x3f, 0x56, 0x46, 0xeb, 0x11, 0xdd, 0xe4, 0x30, + 0x9d, 0xce, 0x30, 0x2e, 0xfa, 0xdc, 0x7a, 0x44, 0x28, 0x66, 0xd3, 0xd1, 0x24, 0x12, 0xf5, 0xeb, + 0xbd, 0x90, 0xfa, 0xae, 0xed, 0x48, 0xc9, 0x8f, 0x94, 0x3c, 0x54, 0xf2, 0x72, 0x42, 0xc9, 0xcf, + 0x24, 0x5f, 0x4a, 0xbe, 0x4b, 0x35, 0xfc, 0x8b, 0xf9, 0xc4, 0x3b, 0xeb, 0x07, 0x7b, 0x77, 0x19, + 0x4a, 0xaf, 0x77, 0x4b, 0xe9, 0x05, 0x03, 0xa2, 0xb0, 0xe5, 0x80, 0xe8, 0xdb, 0xee, 0x80, 0xe8, + 0xef, 0x38, 0x20, 0x42, 0x05, 0x19, 0xe8, 0xa8, 0x20, 0x15, 0x31, 0x68, 0xa0, 0x7b, 0xaa, 0xb6, + 0xb3, 0x9b, 0x1b, 0xc5, 0x11, 0x36, 0x9a, 0x52, 0x93, 0xb4, 0x21, 0x0b, 0xf5, 0x6b, 0xf9, 0x2e, + 0xc1, 0x11, 0x0e, 0x44, 0x47, 0x9e, 0x81, 0x5c, 0xa9, 0xd5, 0x12, 0xfa, 0x71, 0x5c, 0x8a, 0xcb, + 0xd0, 0xa1, 0x14, 0xa3, 0x26, 0x2f, 0x42, 0xae, 0x74, 0xa7, 0x1a, 0x0f, 0xf1, 0x5e, 0xba, 0x53, + 0x15, 0x5f, 0xd2, 0xb1, 0xec, 0x9d, 0x2a, 0x79, 0x39, 0x8c, 0xb5, 0xb6, 0xda, 0xb6, 0xee, 0x8a, + 0x8d, 0xa2, 0xf0, 0x94, 0xf5, 0xdd, 0x71, 0xea, 0x0c, 0xc5, 0xb6, 0x8b, 0x31, 0xda, 0x98, 0x36, + 0x15, 0xb6, 0xaf, 0x4d, 0x7d, 0x5b, 0x6a, 0x53, 0xff, 0x76, 0xb5, 0x69, 0x60, 0x1b, 0xda, 0x04, + 0x5b, 0x6a, 0xd3, 0xe0, 0xde, 0xb5, 0xa9, 0x05, 0x67, 0x92, 0x01, 0x6d, 0x02, 0x8d, 0xd0, 0x80, + 0x24, 0xb1, 0xc2, 0xb1, 0x04, 0xaf, 0xfe, 0xdb, 0x1c, 0x5b, 0xe3, 0xd9, 0x7c, 0xe3, 0xb9, 0x70, + 0xb5, 0x94, 0xd2, 0xea, 0x2f, 0x66, 0x3b, 0xc7, 0xe1, 0x39, 0x9c, 0x53, 0xdc, 0xb7, 0xa5, 0x4a, + 0x29, 0x1f, 0x7d, 0x17, 0xd9, 0x59, 0xca, 0x31, 0xb6, 0x69, 0x32, 0xfb, 0x6a, 0xa6, 0x53, 0x70, + 0xa0, 0x3d, 0x49, 0xec, 0xf1, 0xa4, 0x47, 0x1b, 0xba, 0xd8, 0xbb, 0x51, 0x57, 0xb6, 0x78, 0x72, + 0xd8, 0xdc, 0x2e, 0x93, 0xc3, 0xfe, 0x7a, 0x06, 0x8e, 0xdf, 0x6c, 0x2f, 0x51, 0xe1, 0xc1, 0x16, + 0x34, 0xe3, 0x4d, 0x00, 0x06, 0x16, 0x4e, 0x2c, 0x19, 0x74, 0x62, 0x79, 0x9f, 0x1c, 0xd8, 0x27, + 0x56, 0xe0, 0x72, 0x48, 0xcd, 0x1d, 0x58, 0xce, 0xf9, 0x7e, 0x98, 0x77, 0xdb, 0x4b, 0xb4, 0x96, + 0xf0, 0x64, 0x91, 0xb8, 0x9f, 0x79, 0x85, 0x7b, 0xb8, 0xef, 0xd6, 0x69, 0xe4, 0xe7, 0xb3, 0x1d, + 0x63, 0x29, 0x1d, 0xda, 0x54, 0x36, 0x1f, 0x49, 0xed, 0x95, 0x78, 0x4a, 0x9b, 0x14, 0x92, 0x18, + 0xc7, 0x34, 0x2e, 0xe9, 0x02, 0x3b, 0xe4, 0x09, 0x96, 0xde, 0x51, 0x81, 0xfd, 0x4e, 0xa6, 0x63, + 0xcc, 0xab, 0xc3, 0x2a, 0x30, 0xf5, 0xdf, 0xe5, 0xfc, 0x50, 0x5b, 0x7b, 0xfa, 0x84, 0x27, 0x61, + 0x40, 0xbc, 0x38, 0x8c, 0x3a, 0xe0, 0x8a, 0xa3, 0x3c, 0x3c, 0x1a, 0x0e, 0x08, 0xd8, 0x32, 0xef, + 0x87, 0x02, 0x0a, 0x32, 0x03, 0xe3, 0x32, 0x6f, 0x0a, 0x28, 0xa3, 0x97, 0x48, 0xd8, 0x42, 0x3e, + 0x79, 0xdf, 0xf4, 0xd0, 0x2a, 0x60, 0x7d, 0x99, 0xe3, 0x0b, 0x39, 0xbd, 0x6f, 0x7a, 0xdc, 0x26, + 0x08, 0xd0, 0x6c, 0x91, 0xae, 0x86, 0xe9, 0x23, 0xc5, 0x22, 0xed, 0x8a, 0x2c, 0x9a, 0xe2, 0xc5, + 0xd7, 0x93, 0x30, 0x20, 0xbc, 0x5a, 0x85, 0x9b, 0x89, 0x68, 0xad, 0xf0, 0x83, 0xc5, 0xd6, 0x06, + 0x04, 0x8c, 0xa3, 0x46, 0x57, 0x42, 0xc7, 0x3a, 0xe4, 0xe8, 0x20, 0x44, 0x13, 0x18, 0x72, 0x15, + 0x46, 0xaa, 0x9e, 0x6e, 0x19, 0xba, 0x63, 0xcc, 0xb7, 0xbd, 0x56, 0xdb, 0x93, 0x8d, 0x52, 0xd7, + 0x33, 0xec, 0xb6, 0xa7, 0xc5, 0x28, 0xc8, 0xfb, 0x61, 0xd8, 0x87, 0x4c, 0x3a, 0x8e, 0xed, 0xc8, + 0x96, 0x87, 0xeb, 0x19, 0xd4, 0x71, 0xb4, 0x28, 0x01, 0xf9, 0x00, 0x0c, 0x57, 0xac, 0x7b, 0x36, + 0xcf, 0x4b, 0x7a, 0x4b, 0x9b, 0x11, 0x76, 0x08, 0xbe, 0xa2, 0x32, 0x03, 0x44, 0xad, 0xed, 0x34, + 0xb4, 0x28, 0xa1, 0xba, 0x99, 0x4d, 0x46, 0x24, 0x7b, 0x70, 0x37, 0x2d, 0x97, 0xa2, 0xce, 0x74, + 0xe8, 0x41, 0x8a, 0x06, 0xa1, 0xec, 0xcb, 0xcb, 0xed, 0xc2, 0xab, 0xd0, 0x7f, 0x93, 0xae, 0x73, + 0xbf, 0xcf, 0x42, 0xe8, 0x2a, 0x7c, 0x57, 0xc0, 0xe4, 0x13, 0x57, 0x9f, 0x4e, 0xfd, 0x4a, 0x36, + 0x19, 0x6b, 0xed, 0xc1, 0x15, 0xf6, 0xfb, 0xa1, 0x0f, 0x45, 0x59, 0xf1, 0x8f, 0xfc, 0x51, 0x80, + 0x28, 0xee, 0xa8, 0x07, 0xb2, 0x4f, 0xa6, 0xfe, 0x78, 0x21, 0x1e, 0x80, 0xef, 0xc1, 0x95, 0xde, + 0x4b, 0x30, 0x38, 0x61, 0x5b, 0xae, 0xe9, 0x7a, 0xd4, 0xaa, 0xfb, 0x0a, 0xfb, 0x10, 0x33, 0xa8, + 0xea, 0x21, 0x58, 0x7e, 0x3e, 0x24, 0x51, 0xef, 0x46, 0x79, 0xc9, 0x73, 0x30, 0x80, 0x22, 0x47, + 0x3f, 0x69, 0x29, 0xef, 0xf9, 0x12, 0x03, 0xc6, 0x9d, 0xa4, 0x43, 0x52, 0x72, 0x0b, 0xfa, 0x27, + 0x56, 0xcd, 0x86, 0xe1, 0x50, 0x0b, 0xfd, 0x85, 0xa5, 0x30, 0x80, 0xd1, 0xbe, 0xbc, 0x8c, 0xff, + 0x22, 0x2d, 0x6f, 0x4e, 0x5d, 0x14, 0x8b, 0x3c, 0xa0, 0x12, 0xb0, 0x33, 0xdf, 0x9f, 0x05, 0x08, + 0x0b, 0x90, 0x47, 0x20, 0x1b, 0x64, 0x66, 0x43, 0x37, 0x95, 0x88, 0x06, 0x65, 0x71, 0xa9, 0x10, + 0x63, 0x3b, 0xbb, 0xe5, 0xd8, 0xbe, 0x05, 0x05, 0x7e, 0xe2, 0x85, 0x9e, 0xe4, 0x52, 0x4c, 0xb0, + 0x8e, 0x0d, 0xbe, 0x8c, 0xf4, 0x7c, 0x33, 0x8b, 0x96, 0x67, 0xc4, 0x2b, 0x9b, 0x33, 0x3b, 0x53, + 0x87, 0x5e, 0xfc, 0x8b, 0x5c, 0x80, 0x3c, 0x4a, 0x31, 0x83, 0xfb, 0x58, 0x9c, 0xa5, 0x63, 0xf2, + 0x43, 0x3c, 0xeb, 0xa6, 0x09, 0xdb, 0xf2, 0x58, 0xd5, 0xd8, 0xea, 0x21, 0x21, 0x17, 0x01, 0x8b, + 0xc8, 0x45, 0xc0, 0xd4, 0x7f, 0x9c, 0x4d, 0x09, 0x0d, 0xf9, 0xe0, 0x0e, 0x93, 0x17, 0x00, 0xf0, + 0x35, 0x36, 0x93, 0xa7, 0xff, 0x44, 0x03, 0x47, 0x09, 0x32, 0x42, 0xb5, 0x8d, 0x6c, 0x3b, 0x42, + 0x62, 0xf5, 0x37, 0x33, 0x89, 0x78, 0x82, 0x7b, 0x92, 0xa3, 0x6c, 0x95, 0x65, 0x77, 0x69, 0xc6, + 0xfa, 0x7d, 0x91, 0xdb, 0x59, 0x5f, 0x44, 0xbf, 0x65, 0x1f, 0x2c, 0xd3, 0x83, 0xfc, 0x96, 0xaf, + 0x67, 0xd3, 0xa2, 0x2b, 0x1e, 0x4e, 0x15, 0xbf, 0x16, 0x18, 0xa5, 0xf9, 0xed, 0xe4, 0x34, 0x17, + 0x66, 0xea, 0xc7, 0xe1, 0x58, 0x2c, 0xe6, 0xa0, 0x48, 0x97, 0x78, 0xa1, 0x7b, 0xf0, 0xc2, 0xce, + 0xef, 0xf8, 0x23, 0x64, 0xea, 0xff, 0xcc, 0x74, 0x8f, 0x38, 0x79, 0xe0, 0xaa, 0x93, 0x22, 0x80, + 0xdc, 0x5f, 0x8e, 0x00, 0xf6, 0x61, 0x1b, 0x7c, 0xb8, 0x05, 0xf0, 0x2e, 0x99, 0x3c, 0xde, 0x69, + 0x01, 0xfc, 0x78, 0x66, 0xcb, 0x80, 0xa1, 0x07, 0x2d, 0x03, 0xf5, 0x5f, 0x67, 0x52, 0x03, 0x7b, + 0xee, 0xa9, 0x5d, 0x2f, 0x43, 0x81, 0xbb, 0xd5, 0x88, 0x56, 0x49, 0xa9, 0x50, 0x18, 0xb4, 0x43, + 0x79, 0x51, 0x86, 0xcc, 0x40, 0x1f, 0x6f, 0x83, 0x11, 0x4f, 0x19, 0x9c, 0xd2, 0x4e, 0xa3, 0xd3, + 0xe4, 0x28, 0xd0, 0xea, 0x6f, 0x64, 0x12, 0x71, 0x46, 0x0f, 0xf0, 0xdb, 0xc2, 0xa9, 0x3a, 0xb7, + 0xfd, 0xa9, 0x5a, 0xfd, 0xc3, 0x6c, 0x7a, 0x98, 0xd3, 0x03, 0xfc, 0x90, 0xfd, 0x38, 0x4e, 0xdb, + 0xdd, 0xba, 0xb5, 0x08, 0x23, 0x51, 0x59, 0x88, 0x65, 0xeb, 0x7c, 0x7a, 0xb0, 0xd7, 0x0e, 0xad, + 0x88, 0xf1, 0x50, 0xdf, 0xce, 0x24, 0x23, 0xb4, 0x1e, 0xf8, 0xfc, 0xb4, 0x3b, 0x6d, 0x89, 0x7e, + 0xca, 0xbb, 0x64, 0xad, 0xd9, 0x8f, 0x4f, 0x79, 0x97, 0xac, 0x1a, 0xbb, 0xfb, 0x94, 0x9f, 0xcd, + 0x76, 0x0a, 0x70, 0x7b, 0xe0, 0x1f, 0xf4, 0x61, 0x59, 0xc8, 0xbc, 0x65, 0xe2, 0xd3, 0x1e, 0xe9, + 0x14, 0x51, 0xb6, 0x03, 0xcf, 0x04, 0x9f, 0xdd, 0x8d, 0xf1, 0x54, 0x61, 0xbd, 0x4b, 0x14, 0xf9, + 0x70, 0x08, 0xeb, 0x5d, 0x32, 0x54, 0xde, 0x7d, 0xc2, 0xfa, 0x3b, 0xd9, 0xed, 0x46, 0x55, 0x3e, + 0x12, 0x5e, 0x42, 0x78, 0x9f, 0xcf, 0x26, 0xa3, 0x7d, 0x1f, 0xb8, 0x98, 0xa6, 0xa0, 0x20, 0xe2, + 0x8e, 0x77, 0x14, 0x0e, 0xc7, 0x77, 0xb2, 0x68, 0xc4, 0x77, 0x5c, 0x03, 0x71, 0x91, 0xb3, 0x3d, + 0x91, 0x70, 0x5a, 0xf5, 0xcf, 0x32, 0xb1, 0xd0, 0xd8, 0x07, 0x72, 0x84, 0xb0, 0xab, 0x25, 0x89, + 0xbc, 0xe2, 0x1f, 0x66, 0xe6, 0x63, 0xa1, 0x49, 0x83, 0xef, 0x29, 0x53, 0x4f, 0x37, 0x1b, 0xf1, + 0xf2, 0x22, 0x26, 0xc0, 0x57, 0xb2, 0x30, 0x96, 0x20, 0x25, 0x17, 0x22, 0xa1, 0x74, 0xf0, 0x58, + 0x32, 0xe6, 0x3c, 0xce, 0x83, 0xea, 0xec, 0xe0, 0x24, 0xf5, 0x02, 0xe4, 0xcb, 0xfa, 0x3a, 0xff, + 0xb6, 0x5e, 0xce, 0xd2, 0xd0, 0xd7, 0xe5, 0x13, 0x37, 0xc4, 0x93, 0x25, 0x38, 0xc9, 0xef, 0x43, + 0x4c, 0xdb, 0x5a, 0x34, 0x9b, 0xb4, 0x62, 0xcd, 0x9a, 0x8d, 0x86, 0xe9, 0x8a, 0x4b, 0xbd, 0x27, + 0x37, 0x37, 0x8a, 0x17, 0x3d, 0xdb, 0xd3, 0x1b, 0x35, 0xea, 0x93, 0xd5, 0x3c, 0xb3, 0x49, 0x6b, + 0xa6, 0x55, 0x6b, 0x22, 0xa5, 0xc4, 0x32, 0x9d, 0x15, 0xa9, 0xf0, 0x28, 0xb4, 0xd5, 0xba, 0x6e, + 0x59, 0xd4, 0xa8, 0x58, 0xe3, 0xeb, 0x1e, 0xe5, 0x97, 0x81, 0x39, 0x7e, 0x24, 0xc8, 0xdf, 0x86, + 0x73, 0x34, 0x63, 0xbc, 0xc4, 0x08, 0xb4, 0x94, 0x42, 0xea, 0xaf, 0xe5, 0x53, 0xa2, 0xa2, 0x1f, + 0x22, 0xf5, 0xf1, 0x7b, 0x3a, 0xbf, 0x45, 0x4f, 0x5f, 0x81, 0xbe, 0xdb, 0xd4, 0xc1, 0xf3, 0x2d, + 0x7e, 0xc1, 0x80, 0xce, 0xec, 0xf7, 0x38, 0x48, 0xbe, 0xa1, 0x11, 0x54, 0xa4, 0x01, 0x67, 0x16, + 0x59, 0x37, 0xa5, 0x77, 0x66, 0x61, 0x17, 0x9d, 0xd9, 0x85, 0x1f, 0x79, 0x03, 0x4e, 0x23, 0x36, + 0xa5, 0x5b, 0xfb, 0xb0, 0x2a, 0x0c, 0x2f, 0xc5, 0xab, 0x4a, 0xef, 0xdc, 0x4e, 0xe5, 0xc9, 0x87, + 0x61, 0x28, 0x18, 0x20, 0x26, 0x75, 0xc5, 0xcd, 0x45, 0x97, 0x71, 0xc6, 0x63, 0xb7, 0x31, 0x30, + 0xba, 0x90, 0x45, 0xe3, 0x7f, 0x45, 0x78, 0xa9, 0xff, 0x2a, 0xd3, 0x2d, 0x3a, 0xfb, 0x81, 0xcf, + 0xca, 0xaf, 0x40, 0x9f, 0xc1, 0x3f, 0x4a, 0xe8, 0x54, 0xf7, 0xf8, 0xed, 0x9c, 0x54, 0xf3, 0xcb, + 0xa8, 0x7f, 0x90, 0xe9, 0x1a, 0x14, 0xfe, 0xb0, 0x7f, 0xde, 0xe7, 0x73, 0x1d, 0x3e, 0x4f, 0x4c, + 0xa2, 0x97, 0x60, 0xd4, 0x0c, 0x23, 0xe3, 0xd6, 0xc2, 0xf0, 0x53, 0xda, 0x31, 0x09, 0x8e, 0xa3, + 0xeb, 0x1a, 0x9c, 0xf2, 0x1d, 0x1f, 0x1d, 0xdf, 0x43, 0xcc, 0xad, 0xb5, 0x1d, 0x93, 0x8f, 0x4b, + 0xed, 0x84, 0x1b, 0x73, 0x1f, 0x73, 0x6f, 0x39, 0x26, 0xab, 0x40, 0xf7, 0x56, 0xa9, 0xa5, 0xd7, + 0xd6, 0x6c, 0xe7, 0x2e, 0x06, 0x08, 0xe5, 0x83, 0x53, 0x3b, 0xc6, 0xe1, 0x77, 0x7c, 0x30, 0x79, + 0x0c, 0x86, 0x57, 0x1a, 0x6d, 0x1a, 0x84, 0x64, 0xe4, 0x77, 0x7d, 0xda, 0x10, 0x03, 0x06, 0x37, + 0x24, 0xe7, 0x00, 0x90, 0xc8, 0xc3, 0x90, 0xfd, 0x78, 0xb1, 0xa7, 0x0d, 0x30, 0xc8, 0xa2, 0xe8, + 0xae, 0x33, 0x5c, 0xab, 0xb9, 0x90, 0x6a, 0x0d, 0xdb, 0x5a, 0xa9, 0x79, 0xd4, 0x69, 0x62, 0x43, + 0xd1, 0x99, 0x41, 0x3b, 0x85, 0x14, 0x78, 0x75, 0xe2, 0xce, 0xd8, 0xd6, 0xca, 0x22, 0x75, 0x9a, + 0xac, 0xa9, 0x4f, 0x02, 0x11, 0x4d, 0x75, 0xf0, 0xd0, 0x83, 0x7f, 0x1c, 0x7a, 0x33, 0x68, 0xe2, + 0x23, 0xf8, 0x69, 0x08, 0x7e, 0x58, 0x11, 0x06, 0x79, 0x5c, 0x3a, 0x2e, 0x34, 0x74, 0x61, 0xd0, + 0x80, 0x83, 0x50, 0x5e, 0xa7, 0x40, 0x78, 0x57, 0x70, 0xaf, 0x6e, 0x4d, 0xfc, 0x52, 0x3f, 0x93, + 0x4b, 0x8b, 0x63, 0xbf, 0x27, 0x45, 0x0b, 0xa7, 0xd5, 0xec, 0x8e, 0xa6, 0xd5, 0x63, 0x56, 0xbb, + 0x59, 0xd3, 0x5b, 0xad, 0xda, 0xb2, 0xd9, 0xc0, 0x67, 0x55, 0xb8, 0xf0, 0x69, 0xc3, 0x56, 0xbb, + 0x59, 0x6a, 0xb5, 0xa6, 0x38, 0x90, 0x3c, 0x01, 0x63, 0x8c, 0x0e, 0x3b, 0x29, 0xa0, 0xcc, 0x23, + 0x25, 0x63, 0x80, 0x81, 0x5d, 0x7d, 0xda, 0x87, 0xa0, 0x5f, 0xf0, 0xe4, 0x6b, 0x55, 0xaf, 0xd6, + 0xc7, 0x99, 0xb9, 0xac, 0xe7, 0x02, 0x36, 0x7c, 0x72, 0xed, 0xd5, 0x06, 0xfc, 0xf2, 0x18, 0xbe, + 0xd8, 0x6a, 0x37, 0x79, 0x44, 0xac, 0x3e, 0x44, 0x06, 0xbf, 0xc9, 0x05, 0x18, 0x61, 0x5c, 0x02, + 0x81, 0xf1, 0x88, 0xaf, 0xbd, 0x5a, 0x0c, 0x4a, 0xae, 0xc2, 0x89, 0x08, 0x84, 0xdb, 0xa0, 0xfc, + 0x99, 0x40, 0xaf, 0x96, 0x8a, 0x53, 0xbf, 0x9c, 0x8b, 0x46, 0xd7, 0x3f, 0x80, 0x8e, 0x38, 0x0d, + 0x7d, 0xb6, 0xb3, 0x52, 0x6b, 0x3b, 0x0d, 0x31, 0xf6, 0x0a, 0xb6, 0xb3, 0x72, 0xcb, 0x69, 0x90, + 0x93, 0x50, 0x60, 0xbd, 0x63, 0x1a, 0x62, 0x88, 0xf5, 0xea, 0xad, 0x56, 0xc5, 0x20, 0x25, 0xde, + 0x21, 0x18, 0x2d, 0xb4, 0x56, 0xc7, 0xad, 0x3d, 0x77, 0x4a, 0xe8, 0xe5, 0x2b, 0x5e, 0x02, 0x89, + 0xfd, 0x84, 0x31, 0x44, 0xf9, 0x41, 0x40, 0x8c, 0x85, 0x81, 0xdb, 0x12, 0x83, 0xf7, 0x49, 0x9c, + 0x85, 0x40, 0x86, 0x2c, 0xf8, 0x26, 0xc6, 0x20, 0x65, 0x20, 0x21, 0x55, 0xd3, 0x36, 0xcc, 0x65, + 0x93, 0xf2, 0x57, 0x1d, 0xbd, 0xfc, 0xe2, 0x37, 0x89, 0xd5, 0x46, 0x7d, 0x26, 0xb3, 0x02, 0x42, + 0x5e, 0xe2, 0x4a, 0xc8, 0xe9, 0x70, 0xed, 0xe3, 0x7d, 0xcb, 0xed, 0xb4, 0x18, 0x0a, 0x35, 0x13, + 0xcb, 0xe3, 0x42, 0xa8, 0xbe, 0x9d, 0x4b, 0xa6, 0x58, 0x38, 0x10, 0xbb, 0x66, 0x1a, 0x40, 0x64, + 0x50, 0x09, 0x2f, 0xd7, 0x02, 0x8f, 0xf3, 0x10, 0xd3, 0x81, 0x87, 0x54, 0x96, 0x5c, 0x82, 0x7e, + 0xfe, 0x45, 0x95, 0xb2, 0xb0, 0x77, 0xd0, 0x45, 0xcc, 0x6d, 0x99, 0xcb, 0xcb, 0xe8, 0x4f, 0x16, + 0xa0, 0xc9, 0x05, 0xe8, 0x2b, 0xcf, 0x55, 0xab, 0xa5, 0x39, 0xff, 0xa6, 0x18, 0xdf, 0x97, 0x18, + 0x96, 0x5b, 0x73, 0x75, 0xcb, 0xd5, 0x7c, 0x24, 0x79, 0x0c, 0x0a, 0x95, 0x05, 0x24, 0xe3, 0xaf, + 0x26, 0x07, 0x37, 0x37, 0x8a, 0x7d, 0x66, 0x8b, 0x53, 0x09, 0x14, 0xd6, 0x7b, 0xbb, 0x52, 0x96, + 0xdc, 0x25, 0x78, 0xbd, 0xf7, 0x4c, 0x03, 0xaf, 0x9d, 0xb5, 0x00, 0x4d, 0x9e, 0x85, 0xa1, 0x2a, + 0x75, 0x4c, 0xbd, 0x31, 0xd7, 0xc6, 0xad, 0xa2, 0x14, 0x4a, 0xd1, 0x45, 0x78, 0xcd, 0x42, 0x84, + 0x16, 0x21, 0x23, 0x67, 0x21, 0x3f, 0x6d, 0x5a, 0xfe, 0x13, 0x06, 0xf4, 0x71, 0x5f, 0x35, 0x2d, + 0x4f, 0x43, 0xa8, 0xfa, 0x5f, 0xb2, 0xe9, 0x79, 0x2a, 0x0e, 0x60, 0x38, 0xee, 0xf2, 0xa6, 0x37, + 0xa6, 0x04, 0xf9, 0x3d, 0x28, 0xc1, 0x32, 0x1c, 0x2b, 0x19, 0x4d, 0xd3, 0x2a, 0xe1, 0x4f, 0x77, + 0x76, 0xaa, 0x84, 0xc3, 0x5b, 0x7a, 0x42, 0x17, 0x43, 0x8b, 0xef, 0xe1, 0xf1, 0x74, 0x19, 0xaa, + 0xa6, 0x73, 0x5c, 0xad, 0xb9, 0xac, 0xd7, 0xea, 0x3c, 0xc5, 0x83, 0x16, 0x67, 0xaa, 0x7e, 0x5f, + 0x76, 0x8b, 0xd4, 0x1a, 0x0f, 0xa2, 0xf4, 0xd5, 0x2f, 0x64, 0xbb, 0x67, 0x37, 0x79, 0x20, 0x85, + 0xf2, 0xc7, 0xd9, 0x94, 0x5c, 0x23, 0x7b, 0x92, 0xc4, 0x25, 0xe8, 0xe7, 0x6c, 0x02, 0x57, 0x5b, + 0x9c, 0x71, 0xb8, 0xb2, 0xe2, 0x4c, 0xe7, 0xa3, 0xc9, 0x1c, 0x9c, 0x28, 0x2d, 0x2f, 0xd3, 0xba, + 0x17, 0x46, 0x56, 0x9e, 0x0b, 0x03, 0xa5, 0xf2, 0x70, 0xb4, 0x02, 0x1f, 0x46, 0x66, 0xc6, 0x80, + 0x20, 0xa9, 0xe5, 0xc8, 0x22, 0x9c, 0x8a, 0xc3, 0xab, 0xdc, 0x4c, 0xcf, 0x4b, 0x11, 0x6a, 0x13, + 0x1c, 0xf9, 0x7f, 0x5a, 0x87, 0xb2, 0x69, 0xad, 0xc4, 0xe9, 0xb4, 0xb7, 0x5b, 0x2b, 0x71, 0x6e, + 0x4d, 0x2d, 0xa7, 0x7e, 0x25, 0x27, 0xa7, 0x64, 0x79, 0x70, 0x9d, 0xa2, 0xae, 0x45, 0x5c, 0xa1, + 0xb7, 0x3b, 0x64, 0x9e, 0x15, 0x51, 0x3e, 0x8c, 0xb6, 0xe3, 0x7b, 0x0d, 0x06, 0x51, 0x06, 0x10, + 0x28, 0xfb, 0xff, 0x05, 0x94, 0xa4, 0x02, 0xf9, 0x92, 0xb3, 0xc2, 0x4d, 0xd0, 0xad, 0x1e, 0x3e, + 0xe9, 0xce, 0x8a, 0x9b, 0xfe, 0xf0, 0x89, 0xb1, 0x50, 0x7f, 0x38, 0xdb, 0x29, 0xc3, 0xc8, 0x61, + 0x75, 0x66, 0xda, 0xc7, 0xf9, 0x24, 0x4d, 0x38, 0x87, 0xdb, 0xd3, 0x6b, 0xff, 0x84, 0xf3, 0xc4, + 0x2c, 0x0f, 0x06, 0x7d, 0xd3, 0xb4, 0x0c, 0xf2, 0x10, 0x9c, 0xbc, 0x55, 0x9d, 0xd4, 0x6a, 0x37, + 0x2b, 0x73, 0xe5, 0xda, 0xad, 0xb9, 0xea, 0xc2, 0xe4, 0x44, 0x65, 0xaa, 0x32, 0x59, 0x1e, 0xed, + 0x21, 0xc7, 0xe1, 0x58, 0x88, 0x9a, 0xbe, 0x35, 0x5b, 0x9a, 0x1b, 0xcd, 0x90, 0x31, 0x18, 0x0e, + 0x81, 0xe3, 0xf3, 0x8b, 0xa3, 0xd9, 0x27, 0xde, 0x0b, 0x83, 0xb8, 0xdb, 0xe5, 0x2b, 0x3f, 0x19, + 0x82, 0xfe, 0xf9, 0xf1, 0xea, 0xa4, 0x76, 0x1b, 0x99, 0x00, 0x14, 0xca, 0x93, 0x73, 0x8c, 0x61, + 0xe6, 0x89, 0xff, 0x96, 0x01, 0xa8, 0x4e, 0x2d, 0x2e, 0x08, 0xc2, 0x41, 0xe8, 0xab, 0xcc, 0xdd, + 0x2e, 0xcd, 0x54, 0x18, 0x5d, 0x3f, 0xe4, 0xe7, 0x17, 0x26, 0x59, 0x0d, 0x03, 0xd0, 0x3b, 0x31, + 0x33, 0x5f, 0x9d, 0x1c, 0xcd, 0x32, 0xa0, 0x36, 0x59, 0x2a, 0x8f, 0xe6, 0x18, 0xf0, 0x8e, 0x56, + 0x59, 0x9c, 0x1c, 0xcd, 0xb3, 0x3f, 0x67, 0xaa, 0x8b, 0xa5, 0xc5, 0xd1, 0x5e, 0xf6, 0xe7, 0x14, + 0xfe, 0x59, 0x60, 0xcc, 0xaa, 0x93, 0x8b, 0xf8, 0xa3, 0x8f, 0x35, 0x61, 0xca, 0xff, 0xd5, 0xcf, + 0x50, 0x8c, 0x75, 0xb9, 0xa2, 0x8d, 0x0e, 0xb0, 0x1f, 0x8c, 0x25, 0xfb, 0x01, 0xac, 0x71, 0xda, + 0xe4, 0xec, 0xfc, 0xed, 0xc9, 0xd1, 0x41, 0xc6, 0x6b, 0xf6, 0x26, 0x03, 0x0f, 0xb1, 0x3f, 0xb5, + 0x59, 0xf6, 0xe7, 0x30, 0xe3, 0xa4, 0x4d, 0x96, 0x66, 0x16, 0x4a, 0x8b, 0xd3, 0xa3, 0x23, 0xac, + 0x3d, 0xc8, 0xf3, 0x18, 0x2f, 0x39, 0x57, 0x9a, 0x9d, 0x1c, 0x1d, 0x15, 0x34, 0xe5, 0x99, 0xca, + 0xdc, 0xcd, 0xd1, 0x31, 0x6c, 0xc8, 0x1b, 0xb3, 0xf8, 0x83, 0xb0, 0x02, 0xf8, 0xd7, 0xf1, 0x27, + 0x3e, 0x0a, 0x85, 0xf9, 0x2a, 0xda, 0xb7, 0xa7, 0xe1, 0xf8, 0x7c, 0xb5, 0xb6, 0xf8, 0xc6, 0xc2, + 0x64, 0x4c, 0xde, 0x63, 0x30, 0xec, 0x23, 0x66, 0x2a, 0x73, 0xb7, 0x3e, 0xc4, 0xa5, 0xed, 0x83, + 0x66, 0x4b, 0x13, 0xf3, 0xd5, 0xd1, 0x2c, 0xeb, 0x15, 0x1f, 0x74, 0xa7, 0x32, 0x57, 0x9e, 0xbf, + 0x53, 0x1d, 0xcd, 0x3d, 0x71, 0xcf, 0x4f, 0x88, 0x3b, 0xef, 0x98, 0x2b, 0xa6, 0x45, 0xce, 0xc1, + 0x43, 0xe5, 0xc9, 0xdb, 0x95, 0x89, 0xc9, 0xda, 0xbc, 0x56, 0xb9, 0x5e, 0x99, 0x8b, 0xd5, 0x74, + 0x12, 0xc6, 0xa2, 0xe8, 0xd2, 0x42, 0x65, 0x34, 0x43, 0x4e, 0x01, 0x89, 0x82, 0x6f, 0x94, 0x66, + 0xa7, 0x46, 0xb3, 0x44, 0x81, 0x13, 0x51, 0x78, 0x65, 0x6e, 0xf1, 0xd6, 0xdc, 0xe4, 0x68, 0xee, + 0x89, 0x9f, 0xcc, 0xc0, 0xc9, 0xd4, 0x70, 0x0b, 0x44, 0x85, 0xf3, 0x93, 0x33, 0xa5, 0xea, 0x62, + 0x65, 0xa2, 0x3a, 0x59, 0xd2, 0x26, 0xa6, 0x6b, 0x13, 0xa5, 0xc5, 0xc9, 0xeb, 0xf3, 0xda, 0x1b, + 0xb5, 0xeb, 0x93, 0x73, 0x93, 0x5a, 0x69, 0x66, 0xb4, 0x87, 0x3c, 0x06, 0xc5, 0x0e, 0x34, 0xd5, + 0xc9, 0x89, 0x5b, 0x5a, 0x65, 0xf1, 0x8d, 0xd1, 0x0c, 0x79, 0x14, 0xce, 0x75, 0x24, 0x62, 0xbf, + 0x47, 0xb3, 0xe4, 0x3c, 0x9c, 0xe9, 0x44, 0xf2, 0xfa, 0xcc, 0x68, 0xee, 0x89, 0x1f, 0xcc, 0x00, + 0x49, 0xbe, 0x97, 0x27, 0x8f, 0xc0, 0x59, 0xa6, 0x17, 0xb5, 0xce, 0x0d, 0x7c, 0x14, 0xce, 0xa5, + 0x52, 0x48, 0xcd, 0x2b, 0xc2, 0xc3, 0x1d, 0x48, 0x44, 0xe3, 0xce, 0x82, 0x92, 0x4e, 0x80, 0x4d, + 0xfb, 0xe5, 0x0c, 0x9c, 0x4c, 0x35, 0xb6, 0xc9, 0x45, 0x78, 0x4f, 0xa9, 0x3c, 0xcb, 0xfa, 0x66, + 0x62, 0xb1, 0x32, 0x3f, 0x57, 0xad, 0xcd, 0x4e, 0x95, 0x6a, 0x4c, 0xfb, 0x6e, 0x55, 0x63, 0xbd, + 0x79, 0x01, 0xd4, 0x2e, 0x94, 0x13, 0xd3, 0xa5, 0xb9, 0xeb, 0x6c, 0xf8, 0x91, 0xf7, 0xc0, 0x23, + 0x1d, 0xe9, 0x26, 0xe7, 0x4a, 0xe3, 0x33, 0x93, 0xe5, 0xd1, 0x2c, 0x79, 0x1c, 0x1e, 0xed, 0x48, + 0x55, 0xae, 0x54, 0x39, 0x59, 0x6e, 0xbc, 0xfc, 0xf6, 0xbf, 0x39, 0xdf, 0xf3, 0xf6, 0x37, 0xce, + 0x67, 0x7e, 0xfb, 0x1b, 0xe7, 0x33, 0x7f, 0xf8, 0x8d, 0xf3, 0x99, 0x0f, 0x5f, 0xdd, 0x49, 0x1c, + 0x04, 0x3e, 0x6d, 0x2d, 0x15, 0x70, 0xe1, 0x7b, 0xe6, 0x7f, 0x05, 0x00, 0x00, 0xff, 0xff, 0x0e, + 0x68, 0x60, 0xc5, 0xa2, 0x58, 0x01, 0x00, } func (m *Metadata) Marshal() (dAtA []byte, err error) { @@ -28507,6 +28635,52 @@ func (m *OneOf_IntegrationDelete) MarshalToSizedBuffer(dAtA []byte) (int, error) } return len(dAtA) - i, nil } +func (m *OneOf_SPIFFEFederationCreate) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *OneOf_SPIFFEFederationCreate) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.SPIFFEFederationCreate != nil { + { + size, err := m.SPIFFEFederationCreate.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + i-- + dAtA[i] = 0xc2 + } + return len(dAtA) - i, nil +} +func (m *OneOf_SPIFFEFederationDelete) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *OneOf_SPIFFEFederationDelete) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.SPIFFEFederationDelete != nil { + { + size, err := m.SPIFFEFederationDelete.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + i-- + dAtA[i] = 0xca + } + return len(dAtA) - i, nil +} func (m *StreamStatus) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -28531,12 +28705,12 @@ func (m *StreamStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n611, err611 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastUploadTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastUploadTime):]) - if err611 != nil { - return 0, err611 + n613, err613 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastUploadTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastUploadTime):]) + if err613 != nil { + return 0, err613 } - i -= n611 - i = encodeVarintEvents(dAtA, i, uint64(n611)) + i -= n613 + i = encodeVarintEvents(dAtA, i, uint64(n613)) i-- dAtA[i] = 0x1a if m.LastEventIndex != 0 { @@ -28686,12 +28860,12 @@ func (m *Identity) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0xc2 } } - n615, err615 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.PreviousIdentityExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.PreviousIdentityExpires):]) - if err615 != nil { - return 0, err615 + n617, err617 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.PreviousIdentityExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.PreviousIdentityExpires):]) + if err617 != nil { + return 0, err617 } - i -= n615 - i = encodeVarintEvents(dAtA, i, uint64(n615)) + i -= n617 + i = encodeVarintEvents(dAtA, i, uint64(n617)) i-- dAtA[i] = 0x1 i-- @@ -28839,12 +29013,12 @@ func (m *Identity) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x4a } - n619, err619 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err619 != nil { - return 0, err619 + n621, err621 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err621 != nil { + return 0, err621 } - i -= n619 - i = encodeVarintEvents(dAtA, i, uint64(n619)) + i -= n621 + i = encodeVarintEvents(dAtA, i, uint64(n621)) i-- dAtA[i] = 0x42 if len(m.KubernetesUsers) > 0 { @@ -33978,6 +34152,140 @@ func (m *SpannerRPC) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *SPIFFEFederationCreate) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SPIFFEFederationCreate) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SPIFFEFederationCreate) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + { + size, err := m.ConnectionMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + { + size, err := m.UserMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + { + size, err := m.ResourceMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + { + size, err := m.Metadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *SPIFFEFederationDelete) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SPIFFEFederationDelete) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SPIFFEFederationDelete) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + { + size, err := m.ConnectionMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + { + size, err := m.UserMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + { + size, err := m.ResourceMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + { + size, err := m.Metadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + func encodeVarintEvents(dAtA []byte, offset int, v uint64) int { offset -= sovEvents(v) base := offset @@ -39680,6 +39988,30 @@ func (m *OneOf_IntegrationDelete) Size() (n int) { } return n } +func (m *OneOf_SPIFFEFederationCreate) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.SPIFFEFederationCreate != nil { + l = m.SPIFFEFederationCreate.Size() + n += 2 + l + sovEvents(uint64(l)) + } + return n +} +func (m *OneOf_SPIFFEFederationDelete) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.SPIFFEFederationDelete != nil { + l = m.SPIFFEFederationDelete.Size() + n += 2 + l + sovEvents(uint64(l)) + } + return n +} func (m *StreamStatus) Size() (n int) { if m == nil { return 0 @@ -41703,6 +42035,46 @@ func (m *SpannerRPC) Size() (n int) { return n } +func (m *SPIFFEFederationCreate) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Metadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.ResourceMetadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.UserMetadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.ConnectionMetadata.Size() + n += 1 + l + sovEvents(uint64(l)) + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *SPIFFEFederationDelete) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Metadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.ResourceMetadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.UserMetadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.ConnectionMetadata.Size() + n += 1 + l + sovEvents(uint64(l)) + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func sovEvents(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -78147,6 +78519,76 @@ func (m *OneOf) Unmarshal(dAtA []byte) error { } m.Event = &OneOf_IntegrationDelete{v} iNdEx = postIndex + case 168: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SPIFFEFederationCreate", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &SPIFFEFederationCreate{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Event = &OneOf_SPIFFEFederationCreate{v} + iNdEx = postIndex + case 169: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SPIFFEFederationDelete", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &SPIFFEFederationDelete{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Event = &OneOf_SPIFFEFederationDelete{v} + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipEvents(dAtA[iNdEx:]) @@ -94448,6 +94890,372 @@ func (m *SpannerRPC) Unmarshal(dAtA []byte) error { } return nil } +func (m *SPIFFEFederationCreate) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SPIFFEFederationCreate: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SPIFFEFederationCreate: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipEvents(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvents + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SPIFFEFederationDelete) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SPIFFEFederationDelete: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SPIFFEFederationDelete: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipEvents(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvents + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipEvents(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/api/types/events/oneof.go b/api/types/events/oneof.go index a713feb1bf492..fc35862527d89 100644 --- a/api/types/events/oneof.go +++ b/api/types/events/oneof.go @@ -700,6 +700,14 @@ func ToOneOf(in AuditEvent) (*OneOf, error) { out.Event = &OneOf_IntegrationDelete{ IntegrationDelete: e, } + case *SPIFFEFederationCreate: + out.Event = &OneOf_SPIFFEFederationCreate{ + SPIFFEFederationCreate: e, + } + case *SPIFFEFederationDelete: + out.Event = &OneOf_SPIFFEFederationDelete{ + SPIFFEFederationDelete: e, + } default: slog.ErrorContext(context.Background(), "Attempted to convert dynamic event of unknown type into protobuf event.", "event_type", in.GetType()) diff --git a/lib/events/api.go b/lib/events/api.go index 46b58ad844828..d303460a6cceb 100644 --- a/lib/events/api.go +++ b/lib/events/api.go @@ -757,6 +757,10 @@ const ( // SPIFFESVIDIssuedEvent is emitted when a SPIFFE SVID is issued. SPIFFESVIDIssuedEvent = "spiffe.svid.issued" + // SPIFFEFederationCreateEvent is emitted when a SPIFFE federation is created. + SPIFFEFederationCreateEvent = "spiffe.federation.create" + // SPIFFEFederationDeleteEvent is emitted when a SPIFFE federation is deleted. + SPIFFEFederationDeleteEvent = "spiffe.federation.delete" // AuthPreferenceUpdateEvent is emitted when a user updates the cluster authentication preferences. AuthPreferenceUpdateEvent = "auth_preference.update" diff --git a/lib/events/codes.go b/lib/events/codes.go index 425be76b3406f..6de2c314f091c 100644 --- a/lib/events/codes.go +++ b/lib/events/codes.go @@ -610,6 +610,10 @@ const ( SPIFFESVIDIssuedSuccessCode = "TSPIFFE000I" // SPIFFESVIDIssuedFailureCode is the SPIFFE SVID issued failure code. SPIFFESVIDIssuedFailureCode = "TSPIFFE000E" + // SPIFFEFederationCreateCode is the SPIFFE Federation created code. + SPIFFEFederationCreateCode = "TSPIFFE001I" + // SPIFFEFederationDeleteCode is the SPIFFE Federation deleted code. + SPIFFEFederationDeleteCode = "TSPIFFE002I" // AuthPreferenceUpdateCode is the auth preference updated event code. AuthPreferenceUpdateCode = "TCAUTH001I" diff --git a/lib/events/dynamic.go b/lib/events/dynamic.go index 29787eff14067..f200a4d209ef7 100644 --- a/lib/events/dynamic.go +++ b/lib/events/dynamic.go @@ -401,6 +401,10 @@ func FromEventFields(fields EventFields) (events.AuditEvent, error) { case DiscoveryConfigDeleteAllEvent: e = &events.DiscoveryConfigDeleteAll{} + case SPIFFEFederationCreateEvent: + e = &events.SPIFFEFederationCreate{} + case SPIFFEFederationDeleteEvent: + e = &events.SPIFFEFederationDelete{} case IntegrationCreateEvent: e = &events.IntegrationCreate{} case IntegrationUpdateEvent: diff --git a/lib/events/events_test.go b/lib/events/events_test.go index afc82ac1f415b..f7e90d38e2d64 100644 --- a/lib/events/events_test.go +++ b/lib/events/events_test.go @@ -212,6 +212,8 @@ var eventsMap = map[string]apievents.AuditEvent{ IntegrationCreateEvent: &apievents.IntegrationCreate{}, IntegrationUpdateEvent: &apievents.IntegrationUpdate{}, IntegrationDeleteEvent: &apievents.IntegrationDelete{}, + SPIFFEFederationCreateEvent: &apievents.SPIFFEFederationCreate{}, + SPIFFEFederationDeleteEvent: &apievents.SPIFFEFederationDelete{}, } // TestJSON tests JSON marshal events From 945ade61877fea5db07c0634dddca16933a93f48 Mon Sep 17 00:00:00 2001 From: Noah Stride Date: Thu, 8 Aug 2024 13:24:13 +0100 Subject: [PATCH 105/139] [v16] Workload Identity: Federation bundle endpoint (#44998) * Add SPIFFE bundle endpoint * Add comment explaining mountpoint * Add test * Fix misspelling of equivalent * Update lib/web/spiffe.go Co-authored-by: Edoardo Spadolini * Update lib/web/spiffe.go Co-authored-by: Edoardo Spadolini * Update lib/web/spiffe.go Co-authored-by: Edoardo Spadolini * Update lib/web/spiffe_test.go Co-authored-by: Edoardo Spadolini * Fix test * Fix imports * Go mod tidy --------- Co-authored-by: Edoardo Spadolini --- integrations/terraform/go.sum | 6 +++ lib/web/apiserver.go | 3 ++ lib/web/spiffe.go | 93 +++++++++++++++++++++++++++++++++++ lib/web/spiffe_test.go | 71 ++++++++++++++++++++++++++ 4 files changed, 173 insertions(+) create mode 100644 lib/web/spiffe.go create mode 100644 lib/web/spiffe_test.go diff --git a/integrations/terraform/go.sum b/integrations/terraform/go.sum index 02ed32106d312..c9be34645e6db 100644 --- a/integrations/terraform/go.sum +++ b/integrations/terraform/go.sum @@ -1060,6 +1060,8 @@ github.com/go-gorp/gorp/v3 v3.1.0 h1:ItKF/Vbuj31dmV4jxA1qblpSwkl9g1typ24xoe70IGs github.com/go-gorp/gorp/v3 v3.1.0/go.mod h1:dLEjIyyRNiXvNZ8PSmzpt1GsWAUK8kjVhEpjH8TixEw= github.com/go-jose/go-jose/v3 v3.0.3 h1:fFKWeig/irsp7XD2zBxvnmA/XaRWp5V3CBsZXJF7G7k= github.com/go-jose/go-jose/v3 v3.0.3/go.mod h1:5b+7YgP7ZICgJDBdfjZaIt+H/9L9T/YQrVfLAMboGkQ= +github.com/go-jose/go-jose/v4 v4.0.1 h1:QVEPDE3OluqXBQZDcnNvQrInro2h0e4eqNbnZSWqS6U= +github.com/go-jose/go-jose/v4 v4.0.1/go.mod h1:WVf9LFMHh/QVrmqrOfqun0C45tMe3RoiKJMPvgWwLfY= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= @@ -1827,6 +1829,8 @@ github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyh github.com/spf13/pflag v1.0.2/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spiffe/go-spiffe/v2 v2.2.0 h1:9Vf06UsvsDbLYK/zJ4sYsIsHmMFknUD+feA7IYoWMQY= +github.com/spiffe/go-spiffe/v2 v2.2.0/go.mod h1:Urzb779b3+IwDJD2ZbN8fVl3Aa8G4N/PiUe6iXC0XxU= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= @@ -1918,6 +1922,8 @@ github.com/zclconf/go-cty v1.14.4 h1:uXXczd9QDGsgu0i/QFR/hzI5NYCHLf6NQw/atrbnhq8 github.com/zclconf/go-cty v1.14.4/go.mod h1:VvMs5i0vgZdhYawQNq5kePSpLAoz8u1xvZgrPIxfnZE= github.com/zclconf/go-cty-debug v0.0.0-20191215020915-b22d67c1ba0b/go.mod h1:ZRKQfBXbGkpdV6QMzT3rU1kSTAnfu1dO8dPKjYprgj8= github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= +github.com/zeebo/errs v1.3.0 h1:hmiaKqgYZzcVgRL1Vkc1Mn2914BbzB0IBxs+ebeutGs= +github.com/zeebo/errs v1.3.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4= github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= github.com/zmap/rc2 v0.0.0-20131011165748-24b9757f5521/go.mod h1:3YZ9o3WnatTIZhuOtot4IcUfzoKVjUHqu6WALIyI0nE= github.com/zmap/rc2 v0.0.0-20190804163417-abaa70531248/go.mod h1:3YZ9o3WnatTIZhuOtot4IcUfzoKVjUHqu6WALIyI0nE= diff --git a/lib/web/apiserver.go b/lib/web/apiserver.go index 2c43ae4c2506f..d1402525e3869 100644 --- a/lib/web/apiserver.go +++ b/lib/web/apiserver.go @@ -918,6 +918,9 @@ func (h *Handler) bindDefaultEndpoints() { h.GET(OIDCJWKWURI, h.WithLimiter(h.jwksOIDC)) h.GET("/webapi/thumbprint", h.WithLimiter(h.thumbprint)) + // SPIFFE Federation Trust Bundle + h.GET("/webapi/spiffe/bundle.json", h.WithLimiter(h.getSPIFFEBundle)) + // DiscoveryConfig CRUD h.GET("/webapi/sites/:site/discoveryconfig", h.WithClusterAuth(h.discoveryconfigList)) h.POST("/webapi/sites/:site/discoveryconfig", h.WithClusterAuth(h.discoveryconfigCreate)) diff --git a/lib/web/spiffe.go b/lib/web/spiffe.go new file mode 100644 index 0000000000000..a47e938c51387 --- /dev/null +++ b/lib/web/spiffe.go @@ -0,0 +1,93 @@ +// Teleport +// Copyright (C) 2024 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package web + +import ( + "net/http" + "time" + + "github.com/gravitational/trace" + "github.com/julienschmidt/httprouter" + "github.com/spiffe/go-spiffe/v2/bundle/spiffebundle" + "github.com/spiffe/go-spiffe/v2/spiffeid" + + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/services" + "github.com/gravitational/teleport/lib/tlsca" +) + +// getSPIFFEBundle returns the SPIFFE-compatible trust bundle which allows other +// trust domains to federate with this Teleport cluster. +// +// Mounted at /webapi/spiffe/bundle.json +// +// Must abide by the standard for a "https_web" profile as described in +// https://github.com/spiffe/spiffe/blob/main/standards/SPIFFE_Federation.md#5-serving-and-consuming-a-spiffe-bundle-endpoint +func (h *Handler) getSPIFFEBundle(w http.ResponseWriter, r *http.Request, _ httprouter.Params) (any, error) { + cn, err := h.GetAccessPoint().GetClusterName() + if err != nil { + return nil, trace.Wrap(err, "fetching cluster name") + } + + td, err := spiffeid.TrustDomainFromString(cn.GetClusterName()) + if err != nil { + return nil, trace.Wrap(err, "creating trust domain") + } + + bundle := spiffebundle.New(td) + // The refresh hint indicates how often a federated trust domain should + // check for updates to the bundle. This should be a low value to ensure + // that CA rotations are picked up quickly. Since we're leveraging + // https_web, it's not critical for a federated trust domain to catch + // all phases of the rotation - however, if we support https_spiffe in + // future, we may need to consider a lower value or enforcing a wait + // period during rotations equivalent to the refresh hint. + bundle.SetRefreshHint(5 * time.Minute) + // TODO(noah): + // For now, we omit the SequenceNumber field. This is only a SHOULD not a + // MUST per the spec. To add this, we will add a sequence number to the + // cert authority and increment it on every update. + + const loadKeysFalse = false + spiffeCA, err := h.GetAccessPoint().GetCertAuthority(r.Context(), types.CertAuthID{ + Type: types.SPIFFECA, + DomainName: cn.GetClusterName(), + }, loadKeysFalse) + if err != nil { + return nil, trace.Wrap(err, "fetching SPIFFE CA") + } + + for _, certPEM := range services.GetTLSCerts(spiffeCA) { + cert, err := tlsca.ParseCertificatePEM(certPEM) + if err != nil { + return nil, trace.Wrap(err, "parsing certificate") + } + bundle.AddX509Authority(cert) + } + + bundleBytes, err := bundle.Marshal() + if err != nil { + return nil, trace.Wrap(err, "marshaling bundle") + } + + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + if _, err = w.Write(bundleBytes); err != nil { + h.logger.DebugContext(h.cfg.Context, "Failed to write SPIFFE bundle response", "error", err) + } + return nil, nil +} diff --git a/lib/web/spiffe_test.go b/lib/web/spiffe_test.go new file mode 100644 index 0000000000000..7d04c80ad7465 --- /dev/null +++ b/lib/web/spiffe_test.go @@ -0,0 +1,71 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package web + +import ( + "context" + "crypto/x509" + "testing" + + "github.com/gravitational/roundtrip" + "github.com/spiffe/go-spiffe/v2/bundle/spiffebundle" + "github.com/spiffe/go-spiffe/v2/spiffeid" + "github.com/stretchr/testify/require" + + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/client" + "github.com/gravitational/teleport/lib/services" + "github.com/gravitational/teleport/lib/tlsca" +) + +func TestGetSPIFFEBundle(t *testing.T) { + ctx := context.Background() + env := newWebPack(t, 1) + authServer := env.server.Auth() + cn, err := authServer.GetClusterName() + require.NoError(t, err) + ca, err := authServer.GetCertAuthority(ctx, types.CertAuthID{ + Type: types.SPIFFECA, + DomainName: cn.GetClusterName(), + }, false) + require.NoError(t, err) + + var wantCACerts []*x509.Certificate + for _, certPem := range services.GetTLSCerts(ca) { + cert, err := tlsca.ParseCertificatePEM(certPem) + require.NoError(t, err) + wantCACerts = append(wantCACerts, cert) + } + + clt, err := client.NewWebClient(env.proxies[0].webURL.String(), roundtrip.HTTPClient(client.NewInsecureWebClient())) + require.NoError(t, err) + + res, err := clt.Get(ctx, clt.Endpoint("webapi", "spiffe", "bundle.json"), nil) + require.NoError(t, err) + + td, err := spiffeid.TrustDomainFromString(cn.GetClusterName()) + require.NoError(t, err) + gotBundle, err := spiffebundle.Read(td, res.Reader()) + require.NoError(t, err) + + require.Len(t, gotBundle.X509Authorities(), len(wantCACerts)) + for _, caCert := range wantCACerts { + require.True(t, gotBundle.HasX509Authority(caCert), "certificate not found in bundle") + } +} From 26afbe571a3d83dea24859858fefd66b6b81f0db Mon Sep 17 00:00:00 2001 From: Steven Martin Date: Thu, 8 Aug 2024 11:10:09 -0400 Subject: [PATCH 106/139] [v16] docs: include description in role reference (#45249) * docs: include description in role reference * docs: update verbiage on example role description Co-authored-by: Zac Bergquist --------- Co-authored-by: Steven Martin Co-authored-by: Zac Bergquist --- docs/pages/includes/role-spec.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/pages/includes/role-spec.mdx b/docs/pages/includes/role-spec.mdx index dd672ff19a0cd..f743f2bbbb7d3 100644 --- a/docs/pages/includes/role-spec.mdx +++ b/docs/pages/includes/role-spec.mdx @@ -3,6 +3,7 @@ kind: role version: v7 metadata: name: example + description: This is an example role. spec: # options specify connection, in case if user has multiple non-default # conflicting options, teleport chooses the least permissive value. From 1764c7fae91389c7adef219f6c00609a2df26bc0 Mon Sep 17 00:00:00 2001 From: Leszek Charkiewicz Date: Thu, 8 Aug 2024 17:16:11 +0200 Subject: [PATCH 107/139] Fix typo in PagerDuty plugin docs (#45262) --- .../access-request-plugins/ssh-approval-pagerduty.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/pages/access-controls/access-request-plugins/ssh-approval-pagerduty.mdx b/docs/pages/access-controls/access-request-plugins/ssh-approval-pagerduty.mdx index cbd8dbaf83db7..135755d1026dc 100644 --- a/docs/pages/access-controls/access-request-plugins/ssh-approval-pagerduty.mdx +++ b/docs/pages/access-controls/access-request-plugins/ssh-approval-pagerduty.mdx @@ -56,7 +56,7 @@ Access Request Notifications` service when certain users create an Access Request. For users on the on-call team for `My Critical Service` (in this case, your -PagerDuty user), we will configure the PagerDuy plugin to approve Access +PagerDuty user), we will configure the PagerDuty plugin to approve Access Requests automatically, letting them investigate incidents on the service quickly. From 6ec7e26c50d99bbc9211d7736468fe0f0c2a1210 Mon Sep 17 00:00:00 2001 From: Grzegorz Zdunek Date: Thu, 8 Aug 2024 17:31:27 +0200 Subject: [PATCH 108/139] [v16] Improve copy/paste behavior in Connect terminal (#45265) * Allow reading clipboard content in renderer process * Make keyboard shortcuts to copy/paste text in terminal configurable, set reasonable defaults for Windows and Linux * Allow copying text in terminal with selection and a right click * Remove check for `selection.trim()`, check if there's something selected in callsites, rename `copy` to `copySelection` * Show copy/paste keyboard shortcuts in the context menu * Remove redundant `to` * Add `Copy in Terminal` and `Paste in Terminal` shortcuts to `KeyboardShortcutsPanel` * Set `rightClickSelectsWord: true` only if `terminal.rightClick` is `menu` * Add docs * Patched jsdom `global.matchMedia` should return `matches: false`, not `true` * Small docs correction --- .../connect-your-client/teleport-connect.mdx | 4 + .../jest/jest-environment-patched-jsdom.js | 15 ++ .../contextMenus/terminalContextMenu.ts | 8 +- .../teleterm/src/mainProcess/mainProcess.ts | 2 +- .../src/mainProcess/windowsManager.ts | 5 +- .../src/services/config/appConfigSchema.ts | 30 +++- .../teleterm/src/ui/Document/Document.tsx | 16 +- .../ui/DocumentTerminal/DocumentTerminal.tsx | 4 +- .../Terminal/Terminal.test.tsx | 154 ++++++++++++++++++ .../ui/DocumentTerminal/Terminal/Terminal.tsx | 24 ++- .../src/ui/DocumentTerminal/Terminal/ctrl.ts | 94 ++++++++++- .../ui/Documents/KeyboardShortcutsPanel.tsx | 21 ++- .../keyboardShortcutsService.ts | 17 +- 13 files changed, 363 insertions(+), 31 deletions(-) create mode 100644 web/packages/teleterm/src/ui/DocumentTerminal/Terminal/Terminal.test.tsx diff --git a/docs/pages/connect-your-client/teleport-connect.mdx b/docs/pages/connect-your-client/teleport-connect.mdx index 91739ecb26aa4..72f2f8ad058c0 100644 --- a/docs/pages/connect-your-client/teleport-connect.mdx +++ b/docs/pages/connect-your-client/teleport-connect.mdx @@ -447,11 +447,15 @@ Below is the list of the supported config properties. | `terminal.fontFamily` | `Menlo, Monaco, monospace` on macOS
`Consolas, monospace` on Windows
`'Droid Sans Mono', monospace` on Linux | Font family for the terminal. | | `terminal.fontSize` | 15 | Font size for the terminal. | | `terminal.windowsBackend` | `auto` | `auto` uses modern [ConPTY](https://devblogs.microsoft.com/commandline/windows-command-line-introducing-the-windows-pseudo-console-conpty/) system if available, which requires Windows 10 (19H1) or above. Set to `winpty` to use winpty even if ConPTY is available. | +| `terminal.rightClick` | `menu` on macOS/Linux
`copyPaste` on Windows | `paste` pastes clipboard content, `copyPaste` copies if text is selected, otherwise pastes, `menu` shows context menu. | +| `terminal.copyOnSelect` | false | Automatically copies selected text to the clipboard. | | `usageReporting.enabled` | `false` | Enables collecting anonymous usage data (see [Telemetry](#telemetry)). | | `keymap.tab1` - `keymap.tab9` | `Command+1` - `Command+9` on macOS
`Ctrl+1` - `Ctrl+9` on Windows
`Alt+1` - `Alt+9` on Linux | Shortcut to open tab 1–9. | | `keymap.closeTab` | `Command+W` on macOS
`Ctrl+Shift+W` on Windows/Linux | Shortcut to close a tab. | | `keymap.newTab` | `Command+T` on macOS
`Ctrl+Shift+T` on Windows/Linux | Shortcut to open a new tab. | | `keymap.newTerminalTab` | `` Control+Shift+` `` on macOS
`` Ctrl+Shift+` `` on Windows/Linux | Shortcut to open a new terminal tab. | +| `keymap.terminalCopy` | `Command+C` on macOS
`Ctrl+Shift+C` on Windows/Linux | Shortcut to copy text in the terminal. | +| `keymap.terminalPaste` | `Command+V` on macOS
`Ctrl+Shift+V` on Windows/Linux | Shortcut to paste text in the terminal. | | `keymap.previousTab` | `Control+Shift+Tab` on macOS
`Ctrl+Shift+Tab` on Windows/Linux | Shortcut to go to the previous tab. | | `keymap.nextTab` | `Control+Tab` on macOS
`Ctrl+Tab` on Windows/Linux | Shortcut to go to the next tab. | | `keymap.openConnections` | `Command+P` on macOS
`Ctrl+Shift+P` on Windows/Linux | Shortcut to open the connection list. | diff --git a/web/packages/build/jest/jest-environment-patched-jsdom.js b/web/packages/build/jest/jest-environment-patched-jsdom.js index 01de01f0fd9d3..642a360b9e395 100644 --- a/web/packages/build/jest/jest-environment-patched-jsdom.js +++ b/web/packages/build/jest/jest-environment-patched-jsdom.js @@ -33,6 +33,21 @@ export default class PatchedJSDOMEnvironment extends JSDOMEnvironment { if (!global.Element.prototype.scrollIntoView) { global.Element.prototype.scrollIntoView = () => {}; } + + // TODO(gzdunek): Remove this once JSDOM provides matchMedia. + // https://github.com/jsdom/jsdom/issues/3522 + if (!global.matchMedia) { + global.matchMedia = query => ({ + matches: false, + media: query, + onchange: null, + addListener: () => {}, + removeListener: () => {}, + addEventListener: () => {}, + removeEventListener: () => {}, + dispatchEvent: () => {}, + }); + } } } export const TestEnvironment = PatchedJSDOMEnvironment; diff --git a/web/packages/teleterm/src/mainProcess/contextMenus/terminalContextMenu.ts b/web/packages/teleterm/src/mainProcess/contextMenus/terminalContextMenu.ts index 3ba18f08355c2..b4aa181677f3a 100644 --- a/web/packages/teleterm/src/mainProcess/contextMenus/terminalContextMenu.ts +++ b/web/packages/teleterm/src/mainProcess/contextMenus/terminalContextMenu.ts @@ -18,18 +18,24 @@ import { ipcMain, ipcRenderer, Menu } from 'electron'; +import { ConfigService } from 'teleterm/services/config'; + import { TerminalContextMenuEventChannel } from '../types'; -export function subscribeToTerminalContextMenuEvent(): void { +export function subscribeToTerminalContextMenuEvent( + configService: ConfigService +): void { ipcMain.on(TerminalContextMenuEventChannel, () => { Menu.buildFromTemplate([ { label: 'Copy', role: 'copy', + accelerator: configService.get('keymap.terminalCopy').value, }, { label: 'Paste', role: 'paste', + accelerator: configService.get('keymap.terminalPaste').value, }, ]).popup(); }); diff --git a/web/packages/teleterm/src/mainProcess/mainProcess.ts b/web/packages/teleterm/src/mainProcess/mainProcess.ts index 58cf66059aeed..1e2c8d35b410f 100644 --- a/web/packages/teleterm/src/mainProcess/mainProcess.ts +++ b/web/packages/teleterm/src/mainProcess/mainProcess.ts @@ -501,7 +501,7 @@ export default class MainProcess { } ); - subscribeToTerminalContextMenuEvent(); + subscribeToTerminalContextMenuEvent(this.configService); subscribeToTabContextMenuEvent(); subscribeToConfigServiceEvents(this.configService); subscribeToFileStorageEvents(this.appStateFileStorage); diff --git a/web/packages/teleterm/src/mainProcess/windowsManager.ts b/web/packages/teleterm/src/mainProcess/windowsManager.ts index 01281ba77397f..daa0935122c4c 100644 --- a/web/packages/teleterm/src/mainProcess/windowsManager.ts +++ b/web/packages/teleterm/src/mainProcess/windowsManager.ts @@ -154,7 +154,10 @@ export class WindowsManager { return callback(false); } - if (permission === 'clipboard-sanitized-write') { + if ( + permission === 'clipboard-sanitized-write' || + permission === 'clipboard-read' + ) { return callback(true); } return callback(false); diff --git a/web/packages/teleterm/src/services/config/appConfigSchema.ts b/web/packages/teleterm/src/services/config/appConfigSchema.ts index 453198daca3af..34a85cda610b5 100644 --- a/web/packages/teleterm/src/services/config/appConfigSchema.ts +++ b/web/packages/teleterm/src/services/config/appConfigSchema.ts @@ -63,6 +63,16 @@ export const createAppConfigSchema = (platform: Platform) => { .describe( '`auto` uses modern ConPTY system if available, which requires Windows 10 (19H1) or above. Set to `winpty` to use winpty even if ConPTY is available.' ), + 'terminal.rightClick': z + .enum(['paste', 'copyPaste', 'menu']) + .default(platform === 'win32' ? 'copyPaste' : 'menu') + .describe( + '`paste` pastes clipboard content, `copyPaste` copies if text is selected, otherwise pastes, `menu` shows context menu.' + ), + 'terminal.copyOnSelect': z + .boolean() + .default(false) + .describe('Automatically copies selected text to the clipboard.'), 'usageReporting.enabled': z .boolean() .default(false) @@ -103,6 +113,16 @@ export const createAppConfigSchema = (platform: Platform) => { 'keymap.newTerminalTab': shortcutSchema .default(defaultKeymap['newTerminalTab']) .describe(getShortcutDesc('open a new terminal tab')), + // Even if this is set to a non-default copy shortcut for a given platform, + // the default shortcut will still work (for example, Command+C on Macs). + 'keymap.terminalCopy': shortcutSchema + .default(defaultKeymap['terminalCopy']) + .describe(getShortcutDesc('copy text in the terminal')), + // Even if this is set to a non-default paste shortcut for a given platform, + // the default shortcut will still work (for example, Command+V on Macs). + 'keymap.terminalPaste': shortcutSchema + .default(defaultKeymap['terminalPaste']) + .describe(getShortcutDesc('paste text in the terminal')), 'keymap.previousTab': shortcutSchema .default(defaultKeymap['previousTab']) .describe(getShortcutDesc('go to the previous tab')), @@ -152,7 +172,9 @@ export type KeyboardShortcutAction = | 'openSearchBar' | 'openConnections' | 'openClusters' - | 'openProfiles'; + | 'openProfiles' + | 'terminalCopy' + | 'terminalPaste'; const getDefaultKeymap = ( platform: Platform @@ -178,6 +200,8 @@ const getDefaultKeymap = ( openConnections: 'Ctrl+Shift+P', openClusters: 'Ctrl+Shift+E', openProfiles: 'Ctrl+Shift+I', + terminalCopy: 'Ctrl+Shift+C', + terminalPaste: 'Ctrl+Shift+V', }; case 'linux': return { @@ -199,6 +223,8 @@ const getDefaultKeymap = ( openConnections: 'Ctrl+Shift+P', openClusters: 'Ctrl+Shift+E', openProfiles: 'Ctrl+Shift+I', + terminalCopy: 'Ctrl+Shift+C', + terminalPaste: 'Ctrl+Shift+V', }; case 'darwin': return { @@ -220,6 +246,8 @@ const getDefaultKeymap = ( openConnections: 'Command+P', openClusters: 'Command+E', openProfiles: 'Command+I', + terminalCopy: 'Command+C', + terminalPaste: 'Command+V', }; } }; diff --git a/web/packages/teleterm/src/ui/Document/Document.tsx b/web/packages/teleterm/src/ui/Document/Document.tsx index 9a68d5e1b349a..454134fbb2441 100644 --- a/web/packages/teleterm/src/ui/Document/Document.tsx +++ b/web/packages/teleterm/src/ui/Document/Document.tsx @@ -22,33 +22,19 @@ import { useRefAutoFocus } from 'shared/hooks'; const Document: React.FC<{ visible: boolean; - onContextMenu?(): void; autoFocusDisabled?: boolean; [x: string]: any; -}> = ({ visible, children, onContextMenu, autoFocusDisabled, ...styles }) => { +}> = ({ visible, children, autoFocusDisabled, ...styles }) => { const ref = useRefAutoFocus({ shouldFocus: visible && !autoFocusDisabled, }); - function handleContextMenu( - e: React.MouseEvent - ): void { - if (onContextMenu) { - // `preventDefault` prevents opening the universal context menu - // and thus only the document-specific menu gets displayed. - // Opening two menus at the same time on Linux causes flickering. - e.preventDefault(); - onContextMenu(); - } - } - return ( {$fileTransfer} @@ -133,6 +132,9 @@ export function DocumentTerminal(props: { fontSize={terminalFontSize} onEnterKey={attempt.data.refreshTitle} windowsPty={attempt.data.windowsPty} + openContextMenu={attempt.data.openContextMenu} + configService={configService} + keyboardShortcutsService={ctx.keyboardShortcutsService} /> )} diff --git a/web/packages/teleterm/src/ui/DocumentTerminal/Terminal/Terminal.test.tsx b/web/packages/teleterm/src/ui/DocumentTerminal/Terminal/Terminal.test.tsx new file mode 100644 index 0000000000000..a4bf19e149829 --- /dev/null +++ b/web/packages/teleterm/src/ui/DocumentTerminal/Terminal/Terminal.test.tsx @@ -0,0 +1,154 @@ +/** + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import 'jest-canvas-mock'; +import { EventEmitter } from 'node:events'; + +import userEvent from '@testing-library/user-event'; +import { screen, waitFor } from '@testing-library/react'; +import { render } from 'design/utils/testing'; + +import { MockAppContext } from 'teleterm/ui/fixtures/mocks'; +import Logger, { NullService } from 'teleterm/logger'; +import { IAppContext } from 'teleterm/ui/types'; + +import { Terminal } from './Terminal'; + +beforeAll(() => { + Logger.init(new NullService()); +}); + +beforeEach(() => { + userEvent.setup(); +}); + +// TODO(gzdunek): Add tests for copying text. +// Unfortunately, simulating text selection with a single right click or +// mouseMove doesn't work. +// Probably because xterm doesn't render properly in JSDOM? +// I can see that the element with `xterm-screen` class has zero width and height. + +test('keyboard shortcut pastes text', async () => { + const appContext = new MockAppContext({ platform: 'win32' }); + + render(); + + await navigator.clipboard.writeText('some-command'); + await userEvent.keyboard('{Control>}{Shift>}V'); // Ctrl+Shift+V + + await waitFor(() => { + expect(screen.getByText('some-command')).toBeInTheDocument(); + }); +}); + +test.each([ + { + name: "mouse right click pastes text when 'terminal.rightClick: paste' is configured", + getAppContext: () => { + const appContext = new MockAppContext(); + appContext.configService.set('terminal.rightClick', 'paste'); + return appContext; + }, + }, + { + name: "mouse right click pastes text when 'terminal.rightClick: copyPaste' is configured", + getAppContext: () => { + const appContext = new MockAppContext(); + appContext.configService.set('terminal.rightClick', 'copyPaste'); + return appContext; + }, + }, +])(`$name`, async testCase => { + const appContext = testCase.getAppContext(); + + render(); + + await userEvent.keyboard('some-command '); + const terminalContent = await screen.findByText('some-command'); + + await navigator.clipboard.writeText('--flag=test'); + await userEvent.pointer({ keys: '[MouseRight>]', target: terminalContent }); + + await waitFor(() => { + expect(screen.getByText('some-command --flag=test')).toBeInTheDocument(); + }); +}); + +test("mouse right click opens context menu when 'terminal.rightClick: menu' is configured", async () => { + const appContext = new MockAppContext(); + jest.spyOn(appContext.mainProcessClient, 'openTerminalContextMenu'); + appContext.configService.set('terminal.rightClick', 'menu'); + const openContextMenu = jest.fn(); + + render( + + ); + + await userEvent.keyboard('some-command '); + const terminalContent = await screen.findByText('some-command'); + + await navigator.clipboard.writeText('--flag=test'); + await userEvent.pointer({ keys: '[MouseRight>]', target: terminalContent }); + + expect(openContextMenu).toHaveBeenCalledTimes(1); + expect(openContextMenu).toHaveBeenCalledWith( + expect.objectContaining({ defaultPrevented: true }) + ); +}); + +function ConfiguredTerminal(props: { + appContext: IAppContext; + onOpenContextMenu?(): void; +}) { + const emitter = new EventEmitter(); + const writeFn = jest.fn().mockImplementation(a => { + emitter.emit('', a); + }); + return ( + '', + write: writeFn, + getPtyId: () => '', + dispose: async () => {}, + getCwd: async () => '', + onData: handler => { + const listener = event => handler(event); + emitter.addListener('', listener); + return () => emitter.removeListener('', listener); + }, + onExit: () => () => {}, + onOpen: () => () => {}, + onStartError: () => () => {}, + resize: () => {}, + }} + reconnect={() => {}} + visible={true} + unsanitizedFontFamily={'monospace'} + fontSize={12} + openContextMenu={props.onOpenContextMenu} + windowsPty={undefined} + configService={props.appContext.configService} + keyboardShortcutsService={props.appContext.keyboardShortcutsService} + /> + ); +} diff --git a/web/packages/teleterm/src/ui/DocumentTerminal/Terminal/Terminal.tsx b/web/packages/teleterm/src/ui/DocumentTerminal/Terminal/Terminal.tsx index fb6f2f4e7cc50..8bc1fb7f0e706 100644 --- a/web/packages/teleterm/src/ui/DocumentTerminal/Terminal/Terminal.tsx +++ b/web/packages/teleterm/src/ui/DocumentTerminal/Terminal/Terminal.tsx @@ -30,6 +30,9 @@ import { import { WindowsPty } from 'teleterm/services/pty'; import { IPtyProcess } from 'teleterm/sharedProcess/ptyHost'; import { DocumentTerminal } from 'teleterm/ui/services/workspacesService'; +import { KeyboardShortcutsService } from 'teleterm/ui/services/keyboardShortcuts'; + +import { ConfigService } from 'teleterm/services/config'; import { Reconnect } from '../Reconnect'; @@ -50,6 +53,9 @@ type TerminalProps = { fontSize: number; onEnterKey?(): void; windowsPty: WindowsPty; + openContextMenu(): void; + configService: ConfigService; + keyboardShortcutsService: KeyboardShortcutsService; }; export function Terminal(props: TerminalProps) { @@ -70,12 +76,18 @@ export function Terminal(props: TerminalProps) { setStartPtyProcessAttempt(makeSuccessAttempt(undefined)); }); - const ctrl = new XTermCtrl(props.ptyProcess, { - el: refElement.current, - fontSize: props.fontSize, - theme: theme.colors.terminal, - windowsPty: props.windowsPty, - }); + const ctrl = new XTermCtrl( + props.ptyProcess, + { + el: refElement.current, + fontSize: props.fontSize, + theme: theme.colors.terminal, + windowsPty: props.windowsPty, + openContextMenu: props.openContextMenu, + }, + props.configService, + props.keyboardShortcutsService + ); // Start the PTY process. ctrl.open(); diff --git a/web/packages/teleterm/src/ui/DocumentTerminal/Terminal/ctrl.ts b/web/packages/teleterm/src/ui/DocumentTerminal/Terminal/ctrl.ts index 1a30c9aa78a6b..5e7c5776ca71d 100644 --- a/web/packages/teleterm/src/ui/DocumentTerminal/Terminal/ctrl.ts +++ b/web/packages/teleterm/src/ui/DocumentTerminal/Terminal/ctrl.ts @@ -24,6 +24,8 @@ import { debounce } from 'shared/utils/highbar'; import { WindowsPty } from 'teleterm/services/pty'; import { IPtyProcess } from 'teleterm/sharedProcess/ptyHost'; import Logger from 'teleterm/logger'; +import { ConfigService, AppConfig } from 'teleterm/services/config'; +import { KeyboardShortcutsService } from 'teleterm/ui/services/keyboardShortcuts'; const WINDOW_RESIZE_DEBOUNCE_DELAY = 200; @@ -32,6 +34,7 @@ type Options = { fontSize: number; theme: ITheme; windowsPty: WindowsPty; + openContextMenu(e: MouseEvent): void; }; export default class TtyTerminal { @@ -42,13 +45,23 @@ export default class TtyTerminal { private debouncedResize: () => void; private logger = new Logger('lib/term/terminal'); private removePtyProcessOnDataListener: () => void; + private config: Pick< + AppConfig, + 'terminal.rightClick' | 'terminal.copyOnSelect' + >; constructor( private ptyProcess: IPtyProcess, - private options: Options + private options: Options, + configService: ConfigService, + private keyboardShortcutsService: KeyboardShortcutsService ) { this.el = options.el; this.term = null; + this.config = { + 'terminal.rightClick': configService.get('terminal.rightClick').value, + 'terminal.copyOnSelect': configService.get('terminal.copyOnSelect').value, + }; this.debouncedResize = debounce( this.requestResize.bind(this), @@ -69,6 +82,7 @@ export default class TtyTerminal { fontSize: this.options.fontSize, scrollback: 5000, minimumContrastRatio: 4.5, // minimum for WCAG AA compliance + rightClickSelectsWord: this.config['terminal.rightClick'] === 'menu', theme: this.options.theme, windowsPty: this.options.windowsPty && { backend: this.options.windowsPty.useConpty ? 'conpty' : 'winpty', @@ -79,12 +93,80 @@ export default class TtyTerminal { }, }); + this.term.onSelectionChange(() => { + if (this.config['terminal.copyOnSelect'] && this.term.hasSelection()) { + void this.copySelection(); + } + }); + this.term.loadAddon(this.fitAddon); this.registerResizeHandler(); this.term.open(this.el); + this.term.attachCustomKeyEventHandler(e => { + const action = this.keyboardShortcutsService.getShortcutAction(e); + const isKeyDown = e.type === 'keydown'; + if (action === 'terminalCopy' && isKeyDown && this.term.hasSelection()) { + void this.copySelection(); + // Do not invoke a copy action from the menu. + e.preventDefault(); + // Event handled, do not process it in xterm. + return false; + } + if (action === 'terminalPaste' && isKeyDown) { + void this.paste(); + // Do not invoke a copy action from the menu. + e.preventDefault(); + // Event handled, do not process it in xterm. + return false; + } + + return true; + }); + + this.term.element.addEventListener('contextmenu', e => { + // We always call preventDefault because: + // 1. When `terminalRightClick` is not `menu`, we don't want to show it. + // 2. When `terminalRightClick` is `menu`, opening two menus at + // the same time on Linux causes flickering. + e.preventDefault(); + + if (this.config['terminal.rightClick'] === 'menu') { + this.options.openContextMenu(e); + } + }); + + this.term.element.addEventListener('mousedown', e => { + // Secondary button, usually the right button. + if (e.button !== 2) { + return; + } + + e.stopImmediatePropagation(); + e.stopPropagation(); + e.preventDefault(); + + const terminalRightClick = this.config['terminal.rightClick']; + + switch (terminalRightClick) { + case 'paste': { + void this.paste(); + break; + } + case 'copyPaste': { + if (this.term.hasSelection()) { + void this.copySelection(); + this.term.clearSelection(); + } else { + void this.paste(); + } + break; + } + } + }); + this.fitAddon.fit(); this.term.onData(data => { @@ -131,6 +213,16 @@ export default class TtyTerminal { window.removeEventListener('resize', this.debouncedResize); } + private async copySelection(): Promise { + const selection = this.term.getSelection(); + await navigator.clipboard.writeText(selection); + } + + private async paste(): Promise { + const text = await navigator.clipboard.readText(); + this.term.paste(text); + } + private registerResizeHandler(): void { let prevCols: number, prevRows: number; this.resizeHandler = this.term.parser.registerCsiHandler( diff --git a/web/packages/teleterm/src/ui/Documents/KeyboardShortcutsPanel.tsx b/web/packages/teleterm/src/ui/Documents/KeyboardShortcutsPanel.tsx index 1df3cc707f2a9..58554c11cbf1c 100644 --- a/web/packages/teleterm/src/ui/Documents/KeyboardShortcutsPanel.tsx +++ b/web/packages/teleterm/src/ui/Documents/KeyboardShortcutsPanel.tsx @@ -24,9 +24,13 @@ import styled from 'styled-components'; import Document from 'teleterm/ui/Document'; import { useKeyboardShortcutFormatters } from 'teleterm/ui/services/keyboardShortcuts'; import { KeyboardShortcutAction } from 'teleterm/services/config'; +import { useAppContext } from 'teleterm/ui/appContextProvider'; export function KeyboardShortcutsPanel() { + const { mainProcessClient } = useAppContext(); + const { platform } = mainProcessClient.getRuntimeSettings(); const { getAccelerator } = useKeyboardShortcutFormatters(); + const isNotMac = platform !== 'darwin'; const items: { title: string; shortcutAction: KeyboardShortcutAction }[] = [ { @@ -53,12 +57,22 @@ export function KeyboardShortcutsPanel() { title: 'Open Profiles', shortcutAction: 'openProfiles', }, + // We don't need to show these shortcuts on macOS, + // 99% of the users are not going to change them. + isNotMac && { + title: 'Copy in Terminal', + shortcutAction: 'terminalCopy', + }, + isNotMac && { + title: 'Paste in Terminal', + shortcutAction: 'terminalPaste', + }, ]; return ( - {items.map(item => ( + {items.filter(Boolean).map(item => ( props.theme.space[4]}px; + row-gap: ${props => props.theme.space[3]}px; margin: auto; + padding-block: ${props => props.theme.space[3]}px; `; diff --git a/web/packages/teleterm/src/ui/services/keyboardShortcuts/keyboardShortcutsService.ts b/web/packages/teleterm/src/ui/services/keyboardShortcuts/keyboardShortcutsService.ts index 2f8d1700e01ae..8a3374ee6e48f 100644 --- a/web/packages/teleterm/src/ui/services/keyboardShortcuts/keyboardShortcutsService.ts +++ b/web/packages/teleterm/src/ui/services/keyboardShortcuts/keyboardShortcutsService.ts @@ -28,6 +28,15 @@ import { KeyboardShortcutEventSubscriber, } from './types'; +/** + * These actions are handled outside the keyboard event subscribers, + * allow them to pass through (without calling preventDefault and stopPropagation). + */ +const EXTERNALLY_HANDLED_ACTIONS = new Set([ + 'terminalCopy', + 'terminalPaste', +]); + export class KeyboardShortcutsService { private eventsSubscribers = new Set(); private readonly acceleratorsToActions = new Map< @@ -64,6 +73,8 @@ export class KeyboardShortcutsService { openConnections: this.configService.get('keymap.openConnections').value, openClusters: this.configService.get('keymap.openClusters').value, openProfiles: this.configService.get('keymap.openProfiles').value, + terminalCopy: this.configService.get('keymap.terminalCopy').value, + terminalPaste: this.configService.get('keymap.terminalPaste').value, }; this.acceleratorsToActions = mapAcceleratorsToActions(this.shortcutsConfig); this.attachKeydownHandler(); @@ -104,6 +115,10 @@ export class KeyboardShortcutsService { return; } + if (EXTERNALLY_HANDLED_ACTIONS.has(shortcutAction)) { + return; + } + event.preventDefault(); event.stopPropagation(); this.notifyEventsSubscribers({ action: shortcutAction }); @@ -114,7 +129,7 @@ export class KeyboardShortcutsService { }); } - private getShortcutAction( + public getShortcutAction( event: KeyboardEvent ): KeyboardShortcutAction | undefined { // If only a modifier is pressed, `code` is this modifier name From c19bc2f47d7487674285887107c670ea00c5b6d4 Mon Sep 17 00:00:00 2001 From: Carson Anderson Date: Thu, 8 Aug 2024 10:09:47 -0600 Subject: [PATCH 109/139] v16 spiffe role (#45264) --- .../machine-id/workload-identity/getting-started.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/pages/enroll-resources/machine-id/workload-identity/getting-started.mdx b/docs/pages/enroll-resources/machine-id/workload-identity/getting-started.mdx index 0a409b33b2d59..1d24e185471b5 100644 --- a/docs/pages/enroll-resources/machine-id/workload-identity/getting-started.mdx +++ b/docs/pages/enroll-resources/machine-id/workload-identity/getting-started.mdx @@ -45,7 +45,7 @@ Create a new file named `spiffe-issuer-role.yaml`: kind: role version: v6 metadata: - name: svid-issuer + name: spiffe-issuer spec: allow: spiffe: @@ -202,4 +202,4 @@ Workload Identity. - [Best Practices](./best-practices.mdx): Best practices for using Workload Identity in Production. - Read the [configuration reference](../reference/configuration.mdx) to explore -all the available configuration options. \ No newline at end of file +all the available configuration options. From 0eb37c43e4923f6d62b3e95975ed5a708a55c651 Mon Sep 17 00:00:00 2001 From: Steven Martin Date: Thu, 8 Aug 2024 13:03:49 -0400 Subject: [PATCH 110/139] docs: remove v12 reference for saml idp (#45268) Co-authored-by: Steven Martin --- docs/pages/access-controls/idps/saml-reference.mdx | 5 ----- 1 file changed, 5 deletions(-) diff --git a/docs/pages/access-controls/idps/saml-reference.mdx b/docs/pages/access-controls/idps/saml-reference.mdx index c6a629cf9ce7b..207e51f0d8acc 100644 --- a/docs/pages/access-controls/idps/saml-reference.mdx +++ b/docs/pages/access-controls/idps/saml-reference.mdx @@ -138,11 +138,6 @@ version: v2 This will disable access to the SAML identity provider for all users regardless of their role level permissions. -## Notes - -The SAML identity provider supports [HSM](../../choose-an-edition/teleport-enterprise/hsm.mdx). -in 12.2.5 and later. - ## Troubleshooting ### `Bad Request` when logging into an external application From d5e5719136734f7dba9f57a1c55146ff478ce053 Mon Sep 17 00:00:00 2001 From: rosstimothy <39066650+rosstimothy@users.noreply.github.com> Date: Thu, 8 Aug 2024 15:45:11 -0400 Subject: [PATCH 111/139] [v16] Make rejected connections easier to identify (#45278) * Add additional information to unsupported rejection alerts The alert message now contains more information to allow admins to identify better whether the connection is from an agent or a user. * Add version warning when tsh is an invalid version Prior version warnings were only emitted to users during login which can cause confusion if switching between versions while still possesing valid credentials on disk. Now when an error is detected that may have been from a version related rejection tsh will Ping the proxy to determine the minimum version. The Ping with connector endpoint was also update to populate the minimum client version. --- lib/auth/helpers.go | 5 ++- lib/auth/middleware.go | 35 ++++++++++----- lib/auth/middleware_test.go | 89 ++++++++++++++++++++++++++++++++++++- lib/client/api.go | 8 ++++ lib/web/apiserver.go | 7 +-- 5 files changed, 126 insertions(+), 18 deletions(-) diff --git a/lib/auth/helpers.go b/lib/auth/helpers.go index 424493da2ab0d..2e020bbab2248 100644 --- a/lib/auth/helpers.go +++ b/lib/auth/helpers.go @@ -971,8 +971,9 @@ func TestBuiltin(role types.SystemRole) TestIdentity { func TestServerID(role types.SystemRole, serverID string) TestIdentity { return TestIdentity{ I: authz.BuiltinRole{ - Role: role, - Username: serverID, + Role: types.RoleInstance, + Username: serverID, + AdditionalSystemRoles: types.SystemRoles{role}, Identity: tlsca.Identity{ Username: serverID, }, diff --git a/lib/auth/middleware.go b/lib/auth/middleware.go index 3bc1abf457e0e..dad4a8a15f2a0 100644 --- a/lib/auth/middleware.go +++ b/lib/auth/middleware.go @@ -409,11 +409,12 @@ func (a *Middleware) ValidateClientVersion(ctx context.Context, info IdentityInf } ua := metadata.UserAgentFromContext(ctx) - logger := log.WithFields(logrus.Fields{"user_agent": ua, "identity": info.IdentityGetter.GetIdentity().Username, "version": clientVersionString}) + + logger := log.WithFields(logrus.Fields{"user_agent": ua, "identity": info.IdentityGetter.GetIdentity().Username, "version": clientVersionString, "addr": info.Conn.RemoteAddr().String()}) clientVersion, err := semver.NewVersion(clientVersionString) if err != nil { logger.WithError(err).Warn("Failed to determine client version") - a.displayRejectedClientAlert(ctx, ua) + a.displayRejectedClientAlert(ctx, clientVersionString, info.Conn.RemoteAddr(), ua, info.IdentityGetter) if err := info.Conn.Close(); err != nil { logger.WithError(err).Warn("Failed to close client connection") } @@ -423,7 +424,7 @@ func (a *Middleware) ValidateClientVersion(ctx context.Context, info IdentityInf if clientVersion.LessThan(*a.OldestSupportedVersion) { logger.Info("Terminating connection of client using unsupported version") - a.displayRejectedClientAlert(ctx, ua) + a.displayRejectedClientAlert(ctx, clientVersionString, info.Conn.RemoteAddr(), ua, info.IdentityGetter) if err := info.Conn.Close(); err != nil { logger.WithError(err).Warn("Failed to close client connection") @@ -442,17 +443,11 @@ var clientUARegex = regexp.MustCompile(`(tsh|tbot|tctl)\/\d+`) // being denied to prevent causing issues. Alerts are limited to being // created once per day to reduce backend writes if there are a large // number of unsupported clients constantly being rejected. -func (a *Middleware) displayRejectedClientAlert(ctx context.Context, userAgent string) { +func (a *Middleware) displayRejectedClientAlert(ctx context.Context, clientVersion string, addr net.Addr, userAgent string, ident authz.IdentityGetter) { if a.AlertCreator == nil { return } - connectionType := "agents" - match := clientUARegex.FindStringSubmatch(userAgent) - if len(match) > 1 { - connectionType = match[1] - } - now := time.Now() lastAlert := a.lastRejectedAlertTime.Load() then := time.Unix(0, lastAlert) @@ -469,9 +464,27 @@ func (a *Middleware) displayRejectedClientAlert(ctx context.Context, userAgent s Minor: a.OldestSupportedVersion.Minor, Patch: a.OldestSupportedVersion.Patch, } + + match := clientUARegex.FindStringSubmatch(userAgent) + i := ident.GetIdentity() + br, builtin := ident.(authz.BuiltinRole) + rbr, remoteBuiltin := ident.(authz.RemoteBuiltinRole) + + var message string + switch { + case len(match) > 1: // A match indicates the connection was from a client tool + message = fmt.Sprintf("Connection from %s v%s by %s was rejected. Connections will be allowed after upgrading %s to v%s or newer", match[1], clientVersion, i.Username, match[1], alertVersion.String()) + case builtin: // If the identity is a builtin then this connection is from an agent + message = fmt.Sprintf("Connection from %s %s at %s, running an unsupported version of v%s was rejected. Connections will be allowed after upgrading the agent to v%s or newer", br.AdditionalSystemRoles, i.Username, addr.String(), clientVersion, alertVersion.String()) + case remoteBuiltin: // If the identity is a remote builtin then this connection is from an agent, or leaf cluster + message = fmt.Sprintf("Connection from %s %s at %s in cluster %s, running an unsupported version of v%s was rejected. Connections will be allowed after upgrading the agent to v%s or newer", rbr.Username, i.Username, addr.String(), rbr.ClusterName, clientVersion, alertVersion.String()) + default: // The connection is from an old client tool that does not provide a user agent. + message = fmt.Sprintf("Connection from tsh, tctl, tbot, or a plugin running v%s by %s was rejected. Connections will be allowed after upgrading to v%s or newer", clientVersion, i.Username, alertVersion.String()) + } + alert, err := types.NewClusterAlert( "rejected-unsupported-connection", - fmt.Sprintf("Connections were rejected from %s running unsupported Teleport versions(<%s), they will be inaccessible until upgraded.", connectionType, alertVersion), + message, types.WithAlertSeverity(types.AlertSeverity_MEDIUM), types.WithAlertLabel(types.AlertOnLogin, "yes"), types.WithAlertLabel(types.AlertVerbPermit, fmt.Sprintf("%s:%s", types.KindToken, types.VerbCreate)), diff --git a/lib/auth/middleware_test.go b/lib/auth/middleware_test.go index 971953d4c82ab..c245ae24ca8d9 100644 --- a/lib/auth/middleware_test.go +++ b/lib/auth/middleware_test.go @@ -25,6 +25,7 @@ import ( "crypto/x509" "crypto/x509/pkix" "encoding/json" + "fmt" "net" "net/http" "net/http/httptest" @@ -674,7 +675,10 @@ func (f *fakeConn) Close() error { } func (f *fakeConn) RemoteAddr() net.Addr { - return &utils.NetAddr{} + return &utils.NetAddr{ + Addr: "127.0.0.1:6514", + AddrNetwork: "tcp", + } } func TestValidateClientVersion(t *testing.T) { @@ -760,6 +764,88 @@ func TestValidateClientVersion(t *testing.T) { } } +func TestRejectedClientClusterAlertContents(t *testing.T) { + var alerts []types.ClusterAlert + mw := Middleware{ + OldestSupportedVersion: &teleport.MinClientSemVersion, + AlertCreator: func(ctx context.Context, a types.ClusterAlert) error { + alerts = append(alerts, a) + return nil + }, + } + + alertVersion := semver.Version{ + Major: mw.OldestSupportedVersion.Major, + Minor: mw.OldestSupportedVersion.Minor, + Patch: mw.OldestSupportedVersion.Patch, + }.String() + + version := semver.Version{Major: teleport.SemVersion.Major - 5}.String() + + tests := []struct { + name string + userAgent string + identity authz.IdentityGetter + expected string + }{ + { + name: "invalid node", + identity: TestServerID(types.RoleNode, "1-2-3-4").I, + expected: fmt.Sprintf("Connection from Node 1-2-3-4 at 127.0.0.1:6514, running an unsupported version of v%s was rejected. Connections will be allowed after upgrading the agent to v%s or newer", version, alertVersion), + }, + { + name: "invalid tsh", + userAgent: "tsh/" + teleport.Version, + identity: TestUser("llama").I, + expected: fmt.Sprintf("Connection from tsh v%s by llama was rejected. Connections will be allowed after upgrading tsh to v%s or newer", version, alertVersion), + }, + { + name: "invalid remote node", + identity: authz.RemoteBuiltinRole{ + Role: types.RoleNode, + Username: string(types.RoleNode), + ClusterName: "leaf", + Identity: tlsca.Identity{ + Username: "1-2-3-4", + }, + }, + expected: fmt.Sprintf("Connection from Node 1-2-3-4 at 127.0.0.1:6514 in cluster leaf, running an unsupported version of v%s was rejected. Connections will be allowed after upgrading the agent to v%s or newer", version, alertVersion), + }, + + { + name: "invalid tool", + identity: TestUser("llama").I, + expected: fmt.Sprintf("Connection from tsh, tctl, tbot, or a plugin running v%s by llama was rejected. Connections will be allowed after upgrading to v%s or newer", version, alertVersion), + }, + } + + // Trigger alerts from a variety of identities and validate the content of emitted alerts. + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + + ctx := metadata.NewIncomingContext(context.Background(), metadata.New(map[string]string{ + "version": version, + "user-agent": test.userAgent, + })) + + err := mw.ValidateClientVersion(ctx, IdentityInfo{Conn: &fakeConn{}, IdentityGetter: test.identity}) + assert.Error(t, err) + + // Assert that only an alert was created and the content matches expectations. + require.Len(t, alerts, 1) + require.Equal(t, "rejected-unsupported-connection", alerts[0].GetName()) + require.Equal(t, test.expected, alerts[0].Spec.Message) + + // Reset the test alerts. + alerts = nil + + // Reset the last alert time to a time beyond the rate limit, allowing the next + // rejection to trigger another alert. + mw.lastRejectedAlertTime.Store(time.Now().Add(-25 * time.Hour).UnixNano()) + }) + } +} + func TestRejectedClientClusterAlert(t *testing.T) { var alerts []types.ClusterAlert mw := Middleware{ @@ -788,7 +874,6 @@ func TestRejectedClientClusterAlert(t *testing.T) { // Assert that only a single alert was created based on the above rejections. require.Len(t, alerts, 1) require.Equal(t, "rejected-unsupported-connection", alerts[0].GetName()) - require.Contains(t, alerts[0].Spec.Message, "agents") // Assert that the version in the message does not contain any prereleases require.NotContains(t, alerts[0].Spec.Message, "-aa") diff --git a/lib/client/api.go b/lib/client/api.go index 5886995e24f38..4f1086827dd9c 100644 --- a/lib/client/api.go +++ b/lib/client/api.go @@ -600,6 +600,14 @@ func RetryWithRelogin(ctx context.Context, tc *TeleportClient, fn func() error, case tc.NonInteractive: return trace.Wrap(fnErr, "cannot relogin in non-interactive session") case !IsErrorResolvableWithRelogin(fnErr): + // If the connection to Auth was unexpectedly cut, see if the client is too + // old to interact with the cluster. + if errors.Is(fnErr, io.EOF) || (trace.IsConnectionProblem(fnErr) && strings.Contains(fnErr.Error(), "error reading from server: EOF")) { + // The results are intentionally ignored - Ping prints warnings + // related to versions, and that's all that is needed here. + _, _ = tc.Ping(ctx) + } + return trace.Wrap(fnErr) } opt := defaultRetryWithReloginOptions() diff --git a/lib/web/apiserver.go b/lib/web/apiserver.go index d1402525e3869..c36e256e9ab0f 100644 --- a/lib/web/apiserver.go +++ b/lib/web/apiserver.go @@ -1463,9 +1463,10 @@ func (h *Handler) pingWithConnector(w http.ResponseWriter, r *http.Request, p ht return nil, trace.Wrap(err) } response := &webclient.PingResponse{ - Proxy: *proxyConfig, - ServerVersion: teleport.Version, - ClusterName: h.auth.clusterName, + Proxy: *proxyConfig, + ServerVersion: teleport.Version, + MinClientVersion: teleport.MinClientVersion, + ClusterName: h.auth.clusterName, } hasMessageOfTheDay := cap.GetMessageOfTheDay() != "" From 8ca776cc1f616da3415cb6329ad0241f21d9c10a Mon Sep 17 00:00:00 2001 From: Sakshyam Shah Date: Thu, 8 Aug 2024 22:39:27 -0400 Subject: [PATCH 112/139] use gravitational/saml fork (#45299) --- go.mod | 1 + go.sum | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 82db07045e7fd..8514d9b3de13a 100644 --- a/go.mod +++ b/go.mod @@ -542,6 +542,7 @@ require ( replace ( github.com/alecthomas/kingpin/v2 => github.com/gravitational/kingpin/v2 v2.1.11-0.20230515143221-4ec6b70ecd33 github.com/coreos/go-oidc => github.com/gravitational/go-oidc v0.1.1 + github.com/crewjam/saml => github.com/gravitational/saml v0.4.15-teleport.1 github.com/datastax/go-cassandra-native-protocol => github.com/gravitational/go-cassandra-native-protocol v0.0.0-20221005103706-b9e66c056e90 github.com/go-mysql-org/go-mysql => github.com/gravitational/go-mysql v1.5.0-teleport.1 github.com/gogo/protobuf => github.com/gravitational/protobuf v1.3.2-teleport.1 diff --git a/go.sum b/go.sum index 9318192807824..4e97ee224ea6a 100644 --- a/go.sum +++ b/go.sum @@ -1054,8 +1054,6 @@ github.com/creack/pty v1.1.21 h1:1/QdRyBaHHJP61QkWMXlOIBfsgdDeeKfK8SYVUWJKf0= github.com/creack/pty v1.1.21/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/crewjam/httperr v0.2.0 h1:b2BfXR8U3AlIHwNeFFvZ+BV1LFvKLlzMjzaTnZMybNo= github.com/crewjam/httperr v0.2.0/go.mod h1:Jlz+Sg/XqBQhyMjdDiC+GNNRzZTD7x39Gu3pglZ5oH4= -github.com/crewjam/saml v0.4.14 h1:g9FBNx62osKusnFzs3QTN5L9CVA/Egfgm+stJShzw/c= -github.com/crewjam/saml v0.4.14/go.mod h1:UVSZCf18jJkk6GpWNVqcyQJMD5HsRugBPf4I1nl2mME= github.com/cyberphone/json-canonicalization v0.0.0-20231011164504-785e29786b46 h1:2Dx4IHfC1yHWI12AxQDJM1QbRCDfk6M+blLzlZCXdrc= github.com/cyberphone/json-canonicalization v0.0.0-20231011164504-785e29786b46/go.mod h1:uzvlm1mxhHkdfqitSA92i7Se+S9ksOn3a3qmv/kyOCw= github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= @@ -1542,6 +1540,8 @@ github.com/gravitational/redis/v9 v9.0.2-teleport.2 h1:br9gSGJLpfrIoKsF5N99zWgjP github.com/gravitational/redis/v9 v9.0.2-teleport.2/go.mod h1:/xDTe9EF1LM61hek62Poq2nzQSGj0xSrEtEHbBQevps= github.com/gravitational/roundtrip v1.0.2 h1:eOCY0NEKKaB0ksJmvhO6lPMFz1pIIef+vyPBTBROQ5c= github.com/gravitational/roundtrip v1.0.2/go.mod h1:fuI1booM2hLRA/B/m5MRAPOU6mBZNYcNycono2UuTw0= +github.com/gravitational/saml v0.4.15-teleport.1 h1:kYSLpxEBEc7JLJJ+VjsZU8PbWI4gWxdCgll5cq1/rGU= +github.com/gravitational/saml v0.4.15-teleport.1/go.mod h1:S4+611dxnKt8z/ulbvaJzcgSHsuhjVc1QHNTcr1R7Fw= github.com/gravitational/spdystream v0.0.0-20230512133543-4e46862ca9bf h1:aXnqDSit8L1qhI0+QdbJh+MTUFKXG7qbkZXnfr7L96A= github.com/gravitational/spdystream v0.0.0-20230512133543-4e46862ca9bf/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= github.com/gravitational/trace v1.4.0 h1:TtTeMElVwMX21Udb1nmK2tpWYAAMJoyjevzKOaxIFZQ= From d7b6280810f0547787ce1a9d34d71746740caf6f Mon Sep 17 00:00:00 2001 From: Lisa Kim Date: Fri, 9 Aug 2024 08:22:32 -0700 Subject: [PATCH 113/139] Web: stricter icon name guessing (#45272) Ignores paranthesis and brackets and any words inside of them --- .../shared/guessAppIcon.test.ts | 29 +++++++++++++++ .../UnifiedResources/shared/guessAppIcon.ts | 35 +++++++++++++++---- 2 files changed, 57 insertions(+), 7 deletions(-) diff --git a/web/packages/shared/components/UnifiedResources/shared/guessAppIcon.test.ts b/web/packages/shared/components/UnifiedResources/shared/guessAppIcon.test.ts index cbfbde3cf3bb4..8af64c7237581 100644 --- a/web/packages/shared/components/UnifiedResources/shared/guessAppIcon.test.ts +++ b/web/packages/shared/components/UnifiedResources/shared/guessAppIcon.test.ts @@ -65,6 +65,14 @@ const testCases: { name: string; app: App; expectedIcon: string }[] = [ }), expectedIcon: 'outreach.io', }, + { + name: 'match by label - default value', + app: makeApp({ + name: 'no-match', + labels: [{ name: 'teleport.icon', value: 'default' }], + }), + expectedIcon: 'application', + }, { name: 'no matches', app: makeApp({ @@ -79,6 +87,27 @@ const testCases: { name: string; app: App; expectedIcon: string }[] = [ }), expectedIcon: 'microsoft', }, + { + name: 'match by name with paranthesis and brackets', + app: makeApp({ + name: 'Clearfeed (adobe) [adobe]', + }), + expectedIcon: 'clearfeed', + }, + { + name: 'match by name if whole text starts and ends with paranthesis', + app: makeApp({ + name: '(clearfeed)', + }), + expectedIcon: 'clearfeed', + }, + { + name: 'match by name if whole text starts and ends with bracket', + app: makeApp({ + name: '[clearfeed]', + }), + expectedIcon: 'clearfeed', + }, ]; test.each(testCases)('guessAppIcon: $name', ({ app, expectedIcon }) => { diff --git a/web/packages/shared/components/UnifiedResources/shared/guessAppIcon.ts b/web/packages/shared/components/UnifiedResources/shared/guessAppIcon.ts index c3bfe54b3007f..fa93ffd5e3670 100644 --- a/web/packages/shared/components/UnifiedResources/shared/guessAppIcon.ts +++ b/web/packages/shared/components/UnifiedResources/shared/guessAppIcon.ts @@ -27,17 +27,21 @@ import { UnifiedResourceApp } from '../types'; export function guessAppIcon(resource: UnifiedResourceApp): ResourceIconName { const { awsConsole = false, name, friendlyName, labels } = resource; - if (awsConsole) { - return 'aws'; - } - // Label matching takes precedence and we can assume it can be a direct lookup // since we expect a certain format. const labelIconValue = labels?.find(l => l.name === 'teleport.icon')?.value; + if (labelIconValue === 'default') { + // Allow opting out of a specific icon. + return 'application'; + } if (labelIconValue && resourceIconSpecs[labelIconValue]) { return labelIconValue as ResourceIconName; } + if (awsConsole) { + return 'aws'; + } + const app = { name: withoutWhiteSpaces(name)?.toLocaleLowerCase(), friendlyName: withoutWhiteSpaces(friendlyName)?.toLocaleLowerCase(), @@ -104,9 +108,26 @@ function match( } /** - * Dashes may be a common separator for the app `name` field. - * White spaces may be a common separator for `friendlyName` field. + * Strips characters like dashes and white space and strips + * paranthesis and brackets and whatever words were inside of them. + * + * - Dashes may be a common separator for the app `name` field. + * - White spaces may be a common separator for `friendlyName` field. + * - Words inside paranthesis/brackets may contain other unrelated + * keywords eg: "Clearfeed (Google Auth)" */ function withoutWhiteSpaces(text?: string) { - return text?.replace(/-|\s/g, ''); + if (!text) { + return ''; + } + + // Remove paranthesis and brackets and words inside them. + let modifiedText = text.replace(/\[[^\]]*\]|\([^)]*\)/g, ''); + // If for whatever reason the whole text begain + // with a paranthesis or bracket. + if (!modifiedText) { + modifiedText = text; + } + // Remove rest of characters. + return modifiedText.replace(/-|\s/g, ''); } From 3bf5e32d2ae506ee0ddb6a615edcaa7d2897c413 Mon Sep 17 00:00:00 2001 From: Yassine Bounekhla <56373201+rudream@users.noreply.github.com> Date: Fri, 9 Aug 2024 11:32:08 -0400 Subject: [PATCH 114/139] add expiry to global notification wrapper metadata (#45294) --- lib/services/local/notifications.go | 11 ++++++++--- lib/services/local/notifications_test.go | 3 +++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/lib/services/local/notifications.go b/lib/services/local/notifications.go index 3fe337ac53241..c1fec623b9844 100644 --- a/lib/services/local/notifications.go +++ b/lib/services/local/notifications.go @@ -229,15 +229,20 @@ func (s *NotificationsService) CreateGlobalNotification(ctx context.Context, glo if err != nil { return nil, trace.Wrap(err) } - globalNotification.Metadata = &headerv1.Metadata{Name: uuid.String()} - globalNotification.Spec.Notification.Metadata.Name = uuid.String() if err := CheckAndSetExpiry(globalNotification.Spec.Notification, s.clock); err != nil { return nil, trace.Wrap(err) } - globalNotification.Spec.Notification.Spec.Created = timestamppb.New(s.clock.Now()) + globalNotification.Metadata = &headerv1.Metadata{ + Name: uuid.String(), + // Set the same expiry on the outer GlobalNotification wrapper's metadata. This is necessary for the sqlite cleanup routine + // to be able to delete this notification when it expires. + Expires: globalNotification.GetSpec().GetNotification().GetMetadata().Expires, + } + globalNotification.Spec.Notification.Spec.Created = timestamppb.New(s.clock.Now()) + globalNotification.Spec.Notification.Metadata.Name = uuid.String() globalNotification.Spec.Notification.Metadata.Labels[types.NotificationScope] = "global" created, err := s.globalNotificationService.CreateResource(ctx, globalNotification) diff --git a/lib/services/local/notifications_test.go b/lib/services/local/notifications_test.go index 2755540f8fe36..c5934b772b324 100644 --- a/lib/services/local/notifications_test.go +++ b/lib/services/local/notifications_test.go @@ -160,6 +160,9 @@ func TestGlobalNotificationCRUD(t *testing.T) { _, err = service.CreateGlobalNotification(ctx, globalNotificationLateExpiry) require.True(t, trace.IsBadParameter(err), "got error %T, expected a bad parameter error due to notification-late-expiry having an expiry date more than 90 days later", err) + // Verify that the Metada.Expires on the global notification wrapper is the same as in the inner notification. + require.Equal(t, notification.Metadata.Expires, notification.Spec.Notification.Metadata.Expires) + // Test deleting a notification. err = service.DeleteGlobalNotification(ctx, globalNotification1Id) require.NoError(t, err) From f71041296aaa06e5cbfe24c9a6b55e62d1b4fb29 Mon Sep 17 00:00:00 2001 From: Paul Schisa <75806143+pschisa@users.noreply.github.com> Date: Fri, 9 Aug 2024 11:37:46 -0400 Subject: [PATCH 115/139] Update tsh.mdx to include TELEPORT_IDENTITY_FILE env variable (#45312) introduced in https://github.com/gravitational/teleport/pull/18644/files but not docuemented --- docs/pages/reference/cli/tsh.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/pages/reference/cli/tsh.mdx b/docs/pages/reference/cli/tsh.mdx index 1c8c2c3076ea9..35609874c562e 100644 --- a/docs/pages/reference/cli/tsh.mdx +++ b/docs/pages/reference/cli/tsh.mdx @@ -26,6 +26,7 @@ Environment variables configure your tsh client and can help you avoid using fla | TELEPORT_USE_LOCAL_SSH_AGENT | Disable or enable local SSH agent integration | true, false | | TELEPORT_GLOBAL_TSH_CONFIG | Override location of global `tsh` config file from default `/etc/tsh.yaml` | /opt/teleport/tsh.yaml | | TELEPORT_HEADLESS | Use headless authentication | true, false, 1, 0 | +| TELEPORT_IDENTITY_FILE | File path to identity file | /opt/identity | ## tsh global flags From f54e4ae4b121ee75ce30d1cb1adddc54c6670765 Mon Sep 17 00:00:00 2001 From: rosstimothy <39066650+rosstimothy@users.noreply.github.com> Date: Fri, 9 Aug 2024 11:58:51 -0400 Subject: [PATCH 116/139] Restore enterprise auth connectors in tctl get all output (#45319) When enterprise tctl was removed in v16 the ability to retrieve SAML and OIDC connectors via tctl get all was inadvertently removed. This ensures a resource marshaler and unmarshaler is registered for the two types so that the tctl get all machinery includes them in the group of resources retrieved. Tests were updated to ensure that tctl get all output contains the expected resource types. --- lib/services/resource.go | 38 +++++++++++++++++++++++ tool/tctl/common/resource_command.go | 2 +- tool/tctl/common/resource_command_test.go | 19 ++++++++++++ 3 files changed, 58 insertions(+), 1 deletion(-) diff --git a/lib/services/resource.go b/lib/services/resource.go index 48ed0a566d506..fcb76f3e99a04 100644 --- a/lib/services/resource.go +++ b/lib/services/resource.go @@ -558,6 +558,44 @@ func init() { return githubConnector, nil }) + RegisterResourceMarshaler(types.KindSAMLConnector, func(resource types.Resource, opts ...MarshalOption) ([]byte, error) { + samlConnector, ok := resource.(types.SAMLConnector) + if !ok { + return nil, trace.BadParameter("expected SAMLConnector, got %T", resource) + } + bytes, err := MarshalSAMLConnector(samlConnector, opts...) + if err != nil { + return nil, trace.Wrap(err) + } + return bytes, nil + }) + RegisterResourceUnmarshaler(types.KindSAMLConnector, func(bytes []byte, opts ...MarshalOption) (types.Resource, error) { + samlConnector, err := UnmarshalSAMLConnector(bytes, opts...) + if err != nil { + return nil, trace.Wrap(err) + } + return samlConnector, nil + }) + + RegisterResourceMarshaler(types.KindOIDCConnector, func(resource types.Resource, opts ...MarshalOption) ([]byte, error) { + oidConnector, ok := resource.(types.OIDCConnector) + if !ok { + return nil, trace.BadParameter("expected OIDCConnector, got %T", resource) + } + bytes, err := MarshalOIDCConnector(oidConnector, opts...) + if err != nil { + return nil, trace.Wrap(err) + } + return bytes, nil + }) + RegisterResourceUnmarshaler(types.KindOIDCConnector, func(bytes []byte, opts ...MarshalOption) (types.Resource, error) { + oidcConnector, err := UnmarshalOIDCConnector(bytes, opts...) + if err != nil { + return nil, trace.Wrap(err) + } + return oidcConnector, nil + }) + RegisterResourceMarshaler(types.KindRole, func(resource types.Resource, opts ...MarshalOption) ([]byte, error) { role, ok := resource.(types.Role) if !ok { diff --git a/tool/tctl/common/resource_command.go b/tool/tctl/common/resource_command.go index ab0a1fbedf038..beac4b87d2bef 100644 --- a/tool/tctl/common/resource_command.go +++ b/tool/tctl/common/resource_command.go @@ -290,7 +290,7 @@ func (rc *ResourceCommand) GetMany(ctx context.Context, client *authclient.Clien } resources = append(resources, collection.resources()...) } - if err := utils.WriteYAML(os.Stdout, resources); err != nil { + if err := utils.WriteYAML(rc.stdout, resources); err != nil { return trace.Wrap(err) } return nil diff --git a/tool/tctl/common/resource_command_test.go b/tool/tctl/common/resource_command_test.go index e74a382166781..4b4e2f5cccf56 100644 --- a/tool/tctl/common/resource_command_test.go +++ b/tool/tctl/common/resource_command_test.go @@ -34,6 +34,7 @@ import ( "github.com/google/uuid" "github.com/gravitational/trace" "github.com/jonboulle/clockwork" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "google.golang.org/protobuf/testing/protocmp" "k8s.io/apimachinery/pkg/util/yaml" @@ -1411,6 +1412,17 @@ func TestCreateResources(t *testing.T) { test.create(t, rootClient) }) } + + // Verify that the created resources appear in tctl get all + out, err := runResourceCommand(t, rootClient, []string{"get", "all"}) + require.NoError(t, err) + s := out.String() + require.NotEmpty(t, s) + assert.Contains(t, s, "kind: github") + assert.Contains(t, s, "kind: cluster_auth_preference") + assert.Contains(t, s, "kind: cluster_networking_config") + assert.Contains(t, s, "kind: user") + assert.Contains(t, s, "kind: role") } func testCreateGithubConnector(t *testing.T, clt *authclient.Client) { @@ -2051,6 +2063,13 @@ func TestCreateEnterpriseResources(t *testing.T) { }) } + // Verify that the created resources appear in tctl get all + out, err := runResourceCommand(t, clt, []string{"get", "all"}) + require.NoError(t, err) + s := out.String() + require.NotEmpty(t, s) + assert.Contains(t, s, "kind: saml") + assert.Contains(t, s, "kind: oidc") } func testCreateOIDCConnector(t *testing.T, clt *authclient.Client) { From e48668db064c2f491075c46aeb19d873ce9c6bea Mon Sep 17 00:00:00 2001 From: Sakshyam Shah Date: Fri, 9 Aug 2024 13:20:21 -0400 Subject: [PATCH 117/139] update v16 e-ref (#45324) --- e | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e b/e index 7ba90e4948f06..73aad61d4c7f4 160000 --- a/e +++ b/e @@ -1 +1 @@ -Subproject commit 7ba90e4948f06e9dd319bfed6f35fc983f6a24f5 +Subproject commit 73aad61d4c7f4a036de361ce009bd284d883377d From 0aa2e6c3f03872728a9ed3a487ebd8f7bbceb811 Mon Sep 17 00:00:00 2001 From: Forrest <30576607+fspmarshall@users.noreply.github.com> Date: Fri, 9 Aug 2024 11:36:47 -0700 Subject: [PATCH 118/139] fix access request cache panic (#45225) --- lib/services/access_request_cache.go | 26 ++++- lib/services/access_request_cache_test.go | 113 +++++++++++++++++++++- 2 files changed, 134 insertions(+), 5 deletions(-) diff --git a/lib/services/access_request_cache.go b/lib/services/access_request_cache.go index 277358414f415..d58ba38aacca3 100644 --- a/lib/services/access_request_cache.go +++ b/lib/services/access_request_cache.go @@ -56,6 +56,8 @@ type AccessRequestCacheConfig struct { Events types.Events // Getter is an access request getter client. Getter AccessRequestGetter + // MaxRetryPeriod is the maximum retry period on failed watches. + MaxRetryPeriod time.Duration } // CheckAndSetDefaults valides the config and provides reasonable defaults for optional fields. @@ -87,8 +89,12 @@ type AccessRequestCache struct { primaryCache *sortcache.SortCache[*types.AccessRequestV3] ttlCache *utils.FnCache initC chan struct{} + initOnce sync.Once closeContext context.Context cancel context.CancelFunc + // onInit is a callback used in tests to detect + // individual initializations. + onInit func() } // NewAccessRequestCache sets up a new [AccessRequestCache] instance based on the supplied @@ -120,8 +126,9 @@ func NewAccessRequestCache(cfg AccessRequestCacheConfig) (*AccessRequestCache, e } if _, err := newResourceWatcher(ctx, c, ResourceWatcherConfig{ - Component: "access-request-cache", - Client: cfg.Events, + Component: "access-request-cache", + Client: cfg.Events, + MaxRetryPeriod: cfg.MaxRetryPeriod, }); err != nil { cancel() return nil, trace.Wrap(err) @@ -352,10 +359,22 @@ func (c *AccessRequestCache) getResourcesAndUpdateCurrent(ctx context.Context) e c.rw.Lock() defer c.rw.Unlock() c.primaryCache = cache - close(c.initC) + c.initOnce.Do(func() { + close(c.initC) + }) + if c.onInit != nil { + c.onInit() + } return nil } +// SetInitCallback is used in tests that care about cache inits. +func (c *AccessRequestCache) SetInitCallback(cb func()) { + c.rw.Lock() + defer c.rw.Unlock() + c.onInit = cb +} + // processEventsAndUpdateCurrent is part of the resourceCollector interface and is used to update the // primary cache state when modification events occur. func (c *AccessRequestCache) processEventsAndUpdateCurrent(ctx context.Context, events []types.Event) { @@ -395,6 +414,7 @@ func (c *AccessRequestCache) notifyStale() { } c.primaryCache = nil c.initC = make(chan struct{}) + c.initOnce = sync.Once{} } // initializationChan is part of the resourceCollector interface and gets the channel diff --git a/lib/services/access_request_cache_test.go b/lib/services/access_request_cache_test.go index 905e2882f97e5..1be5d24044529 100644 --- a/lib/services/access_request_cache_test.go +++ b/lib/services/access_request_cache_test.go @@ -22,7 +22,10 @@ import ( "testing" "time" + "github.com/google/uuid" + "github.com/gravitational/trace" "github.com/stretchr/testify/require" + "golang.org/x/sync/errgroup" "github.com/gravitational/teleport/api/client/proto" "github.com/gravitational/teleport/api/types" @@ -34,6 +37,8 @@ import ( type accessRequestServices struct { types.Events services.DynamicAccessExt + + bk *memory.Memory } func newAccessRequestPack(t *testing.T) (accessRequestServices, *services.AccessRequestCache) { @@ -43,11 +48,13 @@ func newAccessRequestPack(t *testing.T) (accessRequestServices, *services.Access svcs := accessRequestServices{ Events: local.NewEventsService(bk), DynamicAccessExt: local.NewDynamicAccessService(bk), + bk: bk, } cache, err := services.NewAccessRequestCache(services.AccessRequestCacheConfig{ - Events: svcs, - Getter: svcs, + Events: svcs, + Getter: svcs, + MaxRetryPeriod: time.Millisecond * 100, }) require.NoError(t, err) @@ -60,6 +67,108 @@ func newAccessRequestPack(t *testing.T) (accessRequestServices, *services.Access return svcs, cache } +func TestAccessRequestCacheResets(t *testing.T) { + const ( + requestCount = 100 + workers = 20 + resets = 3 + ) + + t.Parallel() + + svcs, cache := newAccessRequestPack(t) + defer cache.Close() + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + for i := 0; i < requestCount; i++ { + r, err := types.NewAccessRequest(uuid.New().String(), "alice@example.com", "some-role") + require.NoError(t, err) + + _, err = svcs.CreateAccessRequestV2(ctx, r) + require.NoError(t, err) + } + + timeout := time.After(time.Second * 30) + + for { + rsp, err := cache.ListAccessRequests(ctx, &proto.ListAccessRequestsRequest{ + Limit: requestCount, + }) + require.NoError(t, err) + if len(rsp.AccessRequests) == requestCount { + break + } + + select { + case <-timeout: + require.FailNow(t, "timeout waiting for access request cache to populate") + case <-time.After(time.Millisecond * 200): + } + } + + doneC := make(chan struct{}) + reads := make(chan struct{}, workers) + var eg errgroup.Group + + for i := 0; i < workers; i++ { + eg.Go(func() error { + for { + select { + case <-doneC: + return nil + case <-time.After(time.Millisecond * 20): + } + + rsp, err := cache.ListAccessRequests(ctx, &proto.ListAccessRequestsRequest{ + Limit: int32(requestCount), + }) + if err != nil { + return trace.Errorf("unexpected read failure: %v", err) + } + + select { + case reads <- struct{}{}: + default: + } + + if len(rsp.AccessRequests) != requestCount { + return trace.Errorf("unexpected number of access requests: %d (expected %d)", len(rsp.AccessRequests), requestCount) + } + } + }) + } + + inits := make(chan struct{}, resets+1) + cache.SetInitCallback(func() { + inits <- struct{}{} + }) + + timeout = time.After(time.Second * 30) + for i := 0; i < resets; i++ { + svcs.bk.CloseWatchers() + select { + case <-inits: + case <-timeout: + require.FailNowf(t, "timeout waiting for access request cache to reset", "reset=%d", i) + } + + for j := 0; j < workers; j++ { + // ensure that we're not racing ahead of worker reads too + // much if inits are happening quickly. + select { + case <-reads: + case <-timeout: + require.FailNowf(t, "timeout waiting for worker reads to catch up", "reset=%d", i) + } + } + } + + close(doneC) + require.NoError(t, eg.Wait()) +} + // TestAccessRequestCacheBasics verifies the basic expected behaviors of the access request cache, // including correct sorting and handling of put/delete events. func TestAccessRequestCacheBasics(t *testing.T) { From 7a00a171d6e443f1d92d1e797b22a18a68ed3d20 Mon Sep 17 00:00:00 2001 From: Paul Gottschling Date: Fri, 9 Aug 2024 15:06:59 -0400 Subject: [PATCH 119/139] Add redirect for an outdated blog link (#45322) This path will change soon, so this change adds a redirect rather than changing the blog link. --- docs/config.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/config.json b/docs/config.json index 8158c94339f01..c8ac333cea077 100644 --- a/docs/config.json +++ b/docs/config.json @@ -2961,6 +2961,11 @@ "source": "/user-manual/", "destination": "/", "permanent": true + }, + { + "source": "/architecture/overview/", + "destination": "/architecture/introduction/", + "permanent": true } ] } From 9f4cc92214773a786dacec7c9857083ba7a5b267 Mon Sep 17 00:00:00 2001 From: Steven Martin Date: Fri, 9 Aug 2024 15:53:37 -0400 Subject: [PATCH 120/139] [v16] adds check for blank data directory for debug level (#45341) * adds check for blank data directory * correct logic on checking to use configuration data dir --------- Co-authored-by: Steven Martin --- tool/teleport/common/debug.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tool/teleport/common/debug.go b/tool/teleport/common/debug.go index b8fe5fda49f31..fda61c91e43b8 100644 --- a/tool/teleport/common/debug.go +++ b/tool/teleport/common/debug.go @@ -176,9 +176,10 @@ func newDebugClient(configPath string) (DebugClient, string, string, error) { } // ReadConfigFile returns nil configuration if the file doesn't exists. - // In that case, fallback to default data dir path. + // In that case, fallback to default data dir path. The data directory + // is not required so should use the default if not specified. dataDir := defaults.DataDir - if cfg != nil { + if cfg != nil && cfg.DataDir != "" { dataDir = cfg.DataDir } From 3ed2aedaee9fdc23f4de89b9b24fdc3bfc2029ea Mon Sep 17 00:00:00 2001 From: Jakub Nyckowski Date: Fri, 9 Aug 2024 23:14:32 +0200 Subject: [PATCH 121/139] Add Teleport Policy section to upcoming releases. (#45189) Introduces a new section outlining future Teleport Policy updates. It includes a detailed description of UI enhancements for the Access Graph and a new feature for classifying critical resources as "Crown Jewels" for better traceability and auditing. --- docs/pages/upcoming-releases.mdx | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/docs/pages/upcoming-releases.mdx b/docs/pages/upcoming-releases.mdx index 2c3a3cb02de7f..e7e0445044b71 100644 --- a/docs/pages/upcoming-releases.mdx +++ b/docs/pages/upcoming-releases.mdx @@ -77,6 +77,25 @@ Cluster administrators will be able to configure Teleport's `ssh_service` to ensure that certain host users exist on the machine without the need to start an SSH session. +## Teleport Policy + +| Version | Date | +|---------|----------------| +| 1.24.0 | Aug 30th, 2024 | + +### 1.24.0 + +#### New UI + +Access Graph will include navigation updates to enhance the usability and +scalability of the web UI. + +### Crown Jewels + +Access Graph will allow marking the most critical resources as "Crown Jewels," +providing enhanced traceability and auditing capabilities for them. + + ## Teleport Cloud The key deliverables for Teleport Cloud in the next quarter: From 77ff88fb98e06c67eb4d733fecce03cfa3f3d911 Mon Sep 17 00:00:00 2001 From: Paul Schisa <75806143+pschisa@users.noreply.github.com> Date: Fri, 9 Aug 2024 18:24:13 -0400 Subject: [PATCH 122/139] Update active-directory.mdx to increase ToC depth (#45345) increasing ToC depth for better navigation through the manual section substeps --- docs/pages/enroll-resources/desktop-access/active-directory.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/pages/enroll-resources/desktop-access/active-directory.mdx b/docs/pages/enroll-resources/desktop-access/active-directory.mdx index b4496fafdad34..9f092ef4e89da 100644 --- a/docs/pages/enroll-resources/desktop-access/active-directory.mdx +++ b/docs/pages/enroll-resources/desktop-access/active-directory.mdx @@ -2,6 +2,7 @@ title: Configure access for Active Directory manually description: Explains how to manually connect Teleport to an Active Directory domain. videoBanner: YvMqgcq0MTQ +tocDepth: 3 --- This guide demonstrates how to connect an Active Directory domain and how to log From 550809c7be613083c4813a9d48e162b3b46b50bb Mon Sep 17 00:00:00 2001 From: Marco Dinis Date: Mon, 12 Aug 2024 14:19:51 +0100 Subject: [PATCH 123/139] Add tags to SSM Doc when configuring the AWS OIDC EC2 flow (#44813) --- lib/config/configuration.go | 6 +++ .../awsoidc/ec2_ssm_iam_config.go | 19 +++++++++ .../awsoidc/ec2_ssm_iam_config_test.go | 40 ++++++++++++++++++- lib/integrations/awsoidc/tags/tags.go | 13 ++++++ lib/integrations/awsoidc/tags/tags_test.go | 10 +++++ lib/web/integrations_awsoidc.go | 12 ++++++ lib/web/integrations_awsoidc_test.go | 22 ++++++---- tool/teleport/common/integration_configure.go | 2 + tool/teleport/common/teleport.go | 2 + .../DiscoveryConfigSsm/DiscoveryConfigSsm.tsx | 1 + web/packages/teleport/src/config.ts | 3 +- 11 files changed, 119 insertions(+), 11 deletions(-) diff --git a/lib/config/configuration.go b/lib/config/configuration.go index 220d3fe019722..0052fbfcbf475 100644 --- a/lib/config/configuration.go +++ b/lib/config/configuration.go @@ -327,6 +327,12 @@ type IntegrationConfEC2SSMIAM struct { // No trailing / is expected. // Eg https://tenant.teleport.sh ProxyPublicURL string + // ClusterName is the Teleport cluster name. + // Used for resource tagging. + ClusterName string + // IntegrationName is the Teleport AWS OIDC Integration name. + // Used for resource tagging. + IntegrationName string } // IntegrationConfEKSIAM contains the arguments of diff --git a/lib/integrations/awsoidc/ec2_ssm_iam_config.go b/lib/integrations/awsoidc/ec2_ssm_iam_config.go index 8f1903bd19b47..55ebcccaa0a03 100644 --- a/lib/integrations/awsoidc/ec2_ssm_iam_config.go +++ b/lib/integrations/awsoidc/ec2_ssm_iam_config.go @@ -31,6 +31,7 @@ import ( "github.com/gravitational/trace" awslib "github.com/gravitational/teleport/lib/cloud/aws" + "github.com/gravitational/teleport/lib/integrations/awsoidc/tags" ) const ( @@ -60,6 +61,13 @@ type EC2SSMIAMConfigureRequest struct { // No trailing / is expected. // Eg https://tenant.teleport.sh ProxyPublicURL string + + // ClusterName is the Teleport cluster name. + // Used for resource tagging. + ClusterName string + // IntegrationName is the Teleport AWS OIDC Integration name. + // Used for resource tagging. + IntegrationName string } // CheckAndSetDefaults ensures the required fields are present. @@ -84,6 +92,14 @@ func (r *EC2SSMIAMConfigureRequest) CheckAndSetDefaults() error { return trace.BadParameter("proxy public url is required") } + if r.ClusterName == "" { + return trace.BadParameter("cluster name is required") + } + + if r.IntegrationName == "" { + return trace.BadParameter("integration name is required") + } + return nil } @@ -165,11 +181,14 @@ func ConfigureEC2SSM(ctx context.Context, clt EC2SSMConfigureClient, req EC2SSMI slog.InfoContext(ctx, "IntegrationRole: IAM Policy added to Role", "policy", req.IntegrationRoleEC2SSMPolicy, "role", req.IntegrationRole) + ownershipTags := tags.DefaultResourceCreationTags(req.ClusterName, req.IntegrationName) + _, err = clt.CreateDocument(ctx, &ssm.CreateDocumentInput{ Name: aws.String(req.SSMDocumentName), DocumentType: ssmtypes.DocumentTypeCommand, DocumentFormat: ssmtypes.DocumentFormatYaml, Content: aws.String(awslib.EC2DiscoverySSMDocument(req.ProxyPublicURL)), + Tags: ownershipTags.ToSSMTags(), }) if err != nil { var docAlreadyExistsError *ssmtypes.DocumentAlreadyExists diff --git a/lib/integrations/awsoidc/ec2_ssm_iam_config_test.go b/lib/integrations/awsoidc/ec2_ssm_iam_config_test.go index 1e2828be03785..298a464a10492 100644 --- a/lib/integrations/awsoidc/ec2_ssm_iam_config_test.go +++ b/lib/integrations/awsoidc/ec2_ssm_iam_config_test.go @@ -39,6 +39,8 @@ func TestEC2SSMIAMConfigReqDefaults(t *testing.T) { IntegrationRole: "integrationrole", SSMDocumentName: "MyDoc", ProxyPublicURL: "https://proxy.example.com", + ClusterName: "my-cluster", + IntegrationName: "my-integration", } } @@ -58,6 +60,8 @@ func TestEC2SSMIAMConfigReqDefaults(t *testing.T) { IntegrationRoleEC2SSMPolicy: "EC2DiscoverWithSSM", SSMDocumentName: "MyDoc", ProxyPublicURL: "https://proxy.example.com", + ClusterName: "my-cluster", + IntegrationName: "my-integration", }, }, { @@ -78,6 +82,24 @@ func TestEC2SSMIAMConfigReqDefaults(t *testing.T) { }, errCheck: badParameterCheck, }, + { + name: "missing integration name", + req: func() EC2SSMIAMConfigureRequest { + req := baseReq() + req.IntegrationName = "" + return req + }, + errCheck: badParameterCheck, + }, + { + name: "missing cluster name", + req: func() EC2SSMIAMConfigureRequest { + req := baseReq() + req.ClusterName = "" + return req + }, + errCheck: badParameterCheck, + }, { name: "missing ssm document", req: func() EC2SSMIAMConfigureRequest { @@ -118,6 +140,8 @@ func TestEC2SSMIAMConfig(t *testing.T) { IntegrationRole: "integrationrole", SSMDocumentName: "MyDoc", ProxyPublicURL: "https://proxy.example.com", + ClusterName: "my-cluster", + IntegrationName: "my-integration", } } @@ -157,13 +181,21 @@ func TestEC2SSMIAMConfig(t *testing.T) { err := ConfigureEC2SSM(ctx, &clt, tt.req()) tt.errCheck(t, err) + if err == nil { + require.Contains(t, clt.existingDocs, tt.req().SSMDocumentName) + require.ElementsMatch(t, []ssmtypes.Tag{ + {Key: aws.String("teleport.dev/cluster"), Value: aws.String("my-cluster")}, + {Key: aws.String("teleport.dev/integration"), Value: aws.String("my-integration")}, + {Key: aws.String("teleport.dev/origin"), Value: aws.String("integration_awsoidc")}, + }, clt.existingDocs[tt.req().SSMDocumentName]) + } }) } } type mockEC2SSMIAMConfigClient struct { existingRoles []string - existingDocs []string + existingDocs map[string][]ssmtypes.Tag } // PutRolePolicy creates or replaces a Policy by its name in a IAM Role. @@ -179,8 +211,12 @@ func (m *mockEC2SSMIAMConfigClient) PutRolePolicy(ctx context.Context, params *i // CreateDocument creates an SSM document. func (m *mockEC2SSMIAMConfigClient) CreateDocument(ctx context.Context, params *ssm.CreateDocumentInput, optFns ...func(*ssm.Options)) (*ssm.CreateDocumentOutput, error) { - if slices.Contains(m.existingDocs, aws.ToString(params.Name)) { + if m.existingDocs == nil { + m.existingDocs = make(map[string][]ssmtypes.Tag) + } + if _, ok := m.existingDocs[aws.ToString(params.Name)]; ok { return nil, &ssmtypes.DocumentAlreadyExists{} } + m.existingDocs[aws.ToString(params.Name)] = params.Tags return nil, nil } diff --git a/lib/integrations/awsoidc/tags/tags.go b/lib/integrations/awsoidc/tags/tags.go index 0ed290105a19b..f8b39c04a8a2b 100644 --- a/lib/integrations/awsoidc/tags/tags.go +++ b/lib/integrations/awsoidc/tags/tags.go @@ -28,6 +28,7 @@ import ( ecsTypes "github.com/aws/aws-sdk-go-v2/service/ecs/types" iamTypes "github.com/aws/aws-sdk-go-v2/service/iam/types" s3types "github.com/aws/aws-sdk-go-v2/service/s3/types" + ssmtypes "github.com/aws/aws-sdk-go-v2/service/ssm/types" "github.com/gravitational/teleport/api/types" ) @@ -151,6 +152,18 @@ func (d AWSTags) ToAthenaTags() []athenatypes.Tag { return athenaTags } +// ToSSMTags returns the default tags using the expected type for SSM resources: [ssmtypes.Tag] +func (d AWSTags) ToSSMTags() []ssmtypes.Tag { + ssmTags := make([]ssmtypes.Tag, 0, len(d)) + for k, v := range d { + ssmTags = append(ssmTags, ssmtypes.Tag{ + Key: &k, + Value: &v, + }) + } + return ssmTags +} + // ToMap returns the default tags using the expected type for other aws resources. // Eg Glue resources func (d AWSTags) ToMap() map[string]string { diff --git a/lib/integrations/awsoidc/tags/tags_test.go b/lib/integrations/awsoidc/tags/tags_test.go index 7b07e86f9340e..287c4caebe3a6 100644 --- a/lib/integrations/awsoidc/tags/tags_test.go +++ b/lib/integrations/awsoidc/tags/tags_test.go @@ -25,6 +25,7 @@ import ( ec2types "github.com/aws/aws-sdk-go-v2/service/ec2/types" ecstypes "github.com/aws/aws-sdk-go-v2/service/ecs/types" iamtypes "github.com/aws/aws-sdk-go-v2/service/iam/types" + ssmtypes "github.com/aws/aws-sdk-go-v2/service/ssm/types" "github.com/stretchr/testify/require" ) @@ -67,6 +68,15 @@ func TestDefaultTags(t *testing.T) { require.ElementsMatch(t, expectedEC2Tags, d.ToEC2Tags()) }) + t.Run("ssm tags", func(t *testing.T) { + expectedTags := []ssmtypes.Tag{ + {Key: aws.String("teleport.dev/cluster"), Value: aws.String("mycluster")}, + {Key: aws.String("teleport.dev/integration"), Value: aws.String("myawsaccount")}, + {Key: aws.String("teleport.dev/origin"), Value: aws.String("integration_awsoidc")}, + } + require.ElementsMatch(t, expectedTags, d.ToSSMTags()) + }) + t.Run("resource is teleport managed", func(t *testing.T) { t.Run("ECS Tags", func(t *testing.T) { t.Run("all tags match", func(t *testing.T) { diff --git a/lib/web/integrations_awsoidc.go b/lib/web/integrations_awsoidc.go index eb71ab36dff37..9c0ca267130d1 100644 --- a/lib/web/integrations_awsoidc.go +++ b/lib/web/integrations_awsoidc.go @@ -370,6 +370,11 @@ func (h *Handler) awsOIDCConfigureAWSAppAccessIAM(w http.ResponseWriter, r *http func (h *Handler) awsOIDCConfigureEC2SSMIAM(w http.ResponseWriter, r *http.Request, p httprouter.Params) (any, error) { queryParams := r.URL.Query() + integrationName := queryParams.Get("integrationName") + if len(integrationName) == 0 { + return nil, trace.BadParameter("missing integrationName param") + } + role := queryParams.Get("role") if err := aws.IsValidIAMRoleName(role); err != nil { return nil, trace.BadParameter("invalid role %q", role) @@ -391,6 +396,11 @@ func (h *Handler) awsOIDCConfigureEC2SSMIAM(w http.ResponseWriter, r *http.Reque proxyPublicURL = "https://" + proxyPublicURL } + clusterName, err := h.GetProxyClient().GetDomainName(r.Context()) + if err != nil { + return nil, trace.Wrap(err) + } + // The script must execute the following command: // teleport integration configure ec2-ssm-iam argsList := []string{ @@ -399,6 +409,8 @@ func (h *Handler) awsOIDCConfigureEC2SSMIAM(w http.ResponseWriter, r *http.Reque fmt.Sprintf("--aws-region=%s", shsprintf.EscapeDefaultContext(region)), fmt.Sprintf("--ssm-document-name=%s", shsprintf.EscapeDefaultContext(ssmDocumentName)), fmt.Sprintf("--proxy-public-url=%s", shsprintf.EscapeDefaultContext(proxyPublicURL)), + fmt.Sprintf("--cluster=%s", shsprintf.EscapeDefaultContext(clusterName)), + fmt.Sprintf("--name=%s", shsprintf.EscapeDefaultContext(integrationName)), } script, err := oneoff.BuildScript(oneoff.OneOffScriptParams{ TeleportArgs: strings.Join(argsList, " "), diff --git a/lib/web/integrations_awsoidc_test.go b/lib/web/integrations_awsoidc_test.go index 41d01db465c7c..ec0b091f80438 100644 --- a/lib/web/integrations_awsoidc_test.go +++ b/lib/web/integrations_awsoidc_test.go @@ -284,30 +284,36 @@ func TestBuildEC2SSMIAMScript(t *testing.T) { { name: "valid", reqQuery: url.Values{ - "awsRegion": []string{"us-east-1"}, - "role": []string{"myRole"}, - "ssmDocument": []string{"TeleportDiscoveryInstallerTest"}, + "awsRegion": []string{"us-east-1"}, + "role": []string{"myRole"}, + "ssmDocument": []string{"TeleportDiscoveryInstallerTest"}, + "integrationName": []string{"my-integration"}, }, errCheck: require.NoError, expectedTeleportArgs: "integration configure ec2-ssm-iam " + "--role=myRole " + "--aws-region=us-east-1 " + "--ssm-document-name=TeleportDiscoveryInstallerTest " + - "--proxy-public-url=" + proxyPublicURL, + "--proxy-public-url=" + proxyPublicURL + " " + + "--cluster=localhost " + + "--name=my-integration", }, { name: "valid with symbols in role", reqQuery: url.Values{ - "awsRegion": []string{"us-east-1"}, - "role": []string{"Test+1=2,3.4@5-6_7"}, - "ssmDocument": []string{"TeleportDiscoveryInstallerTest"}, + "awsRegion": []string{"us-east-1"}, + "role": []string{"Test+1=2,3.4@5-6_7"}, + "ssmDocument": []string{"TeleportDiscoveryInstallerTest"}, + "integrationName": []string{"my-integration"}, }, errCheck: require.NoError, expectedTeleportArgs: "integration configure ec2-ssm-iam " + "--role=Test\\+1=2,3.4\\@5-6_7 " + "--aws-region=us-east-1 " + "--ssm-document-name=TeleportDiscoveryInstallerTest " + - "--proxy-public-url=" + proxyPublicURL, + "--proxy-public-url=" + proxyPublicURL + " " + + "--cluster=localhost " + + "--name=my-integration", }, { name: "missing aws-region", diff --git a/tool/teleport/common/integration_configure.go b/tool/teleport/common/integration_configure.go index dab36f0a5f8b3..ca2296555e3cf 100644 --- a/tool/teleport/common/integration_configure.go +++ b/tool/teleport/common/integration_configure.go @@ -92,6 +92,8 @@ func onIntegrationConfEC2SSMIAM(ctx context.Context, params config.IntegrationCo IntegrationRole: params.RoleName, SSMDocumentName: params.SSMDocumentName, ProxyPublicURL: params.ProxyPublicURL, + ClusterName: params.ClusterName, + IntegrationName: params.IntegrationName, } return trace.Wrap(awsoidc.ConfigureEC2SSM(ctx, awsClt, confReq)) } diff --git a/tool/teleport/common/teleport.go b/tool/teleport/common/teleport.go index 02f846853e697..b139f8cff3080 100644 --- a/tool/teleport/common/teleport.go +++ b/tool/teleport/common/teleport.go @@ -484,6 +484,8 @@ func Run(options Options) (app *kingpin.Application, executedCommand string, con integrationConfEC2SSMCmd.Flag("ssm-document-name", "The AWS SSM Document name to create that will be used to install teleport.").Required().StringVar(&ccf.IntegrationConfEC2SSMIAMArguments.SSMDocumentName) integrationConfEC2SSMCmd.Flag("proxy-public-url", "Proxy Public URL (eg https://mytenant.teleport.sh).").StringVar(&ccf. IntegrationConfEC2SSMIAMArguments.ProxyPublicURL) + integrationConfEC2SSMCmd.Flag("cluster", "Teleport Cluster's name.").Required().StringVar(&ccf.IntegrationConfEC2SSMIAMArguments.ClusterName) + integrationConfEC2SSMCmd.Flag("name", "Integration name.").Required().StringVar(&ccf.IntegrationConfEC2SSMIAMArguments.IntegrationName) integrationConfAWSAppAccessCmd := integrationConfigureCmd.Command("aws-app-access-iam", "Adds required IAM permissions to connect to AWS using App Access.") integrationConfAWSAppAccessCmd.Flag("role", "The AWS Role name used by the AWS OIDC Integration.").Required().StringVar(&ccf.IntegrationConfAWSAppAccessIAMArguments.RoleName) diff --git a/web/packages/teleport/src/Discover/Server/DiscoveryConfigSsm/DiscoveryConfigSsm.tsx b/web/packages/teleport/src/Discover/Server/DiscoveryConfigSsm/DiscoveryConfigSsm.tsx index 83f83ba16a904..cd0e53ac3814f 100644 --- a/web/packages/teleport/src/Discover/Server/DiscoveryConfigSsm/DiscoveryConfigSsm.tsx +++ b/web/packages/teleport/src/Discover/Server/DiscoveryConfigSsm/DiscoveryConfigSsm.tsx @@ -132,6 +132,7 @@ export function DiscoveryConfigSsm() { iamRoleName: arnResourceName, region: selectedRegion, ssmDocument: ssmDocumentName, + integrationName: agentMeta.awsIntegration.name, }); setScriptUrl(scriptUrl); } diff --git a/web/packages/teleport/src/config.ts b/web/packages/teleport/src/config.ts index 024dd1666ef2a..2849e35ac12c0 100644 --- a/web/packages/teleport/src/config.ts +++ b/web/packages/teleport/src/config.ts @@ -326,7 +326,7 @@ const cfg = { '/v1/webapi/scripts/integrations/configure/aws-app-access-iam.sh?role=:iamRoleName', awsConfigureIamEc2AutoDiscoverWithSsmPath: - '/v1/webapi/scripts/integrations/configure/ec2-ssm-iam.sh?role=:iamRoleName&awsRegion=:region&ssmDocument=:ssmDocument', + '/v1/webapi/scripts/integrations/configure/ec2-ssm-iam.sh?role=:iamRoleName&awsRegion=:region&ssmDocument=:ssmDocument&integrationName=:integrationName', eksClustersListPath: '/v1/webapi/sites/:clusterId/integrations/aws-oidc/:name/eksclusters', @@ -1209,6 +1209,7 @@ export interface UrlAwsConfigureIamEc2AutoDiscoverWithSsmScriptParams { region: Regions; iamRoleName: string; ssmDocument: string; + integrationName: string; } export interface UrlGcpWorkforceConfigParam { From 4f24ebbf6560b160605e88e9a910c399499f74f4 Mon Sep 17 00:00:00 2001 From: Bartosz Leper Date: Mon, 12 Aug 2024 15:21:59 +0200 Subject: [PATCH 124/139] [v16] Bump github.com/docker/docker from 26.1.1+incompatible to 26.1.4+incompatible (#45308) * Bump github.com/docker/docker from 26.1.1+incompatible to 26.1.4+incompatible (#44798) * Bump github.com/docker/docker Bumps [github.com/docker/docker](https://github.com/docker/docker) from 26.1.1+incompatible to 26.1.4+incompatible. - [Release notes](https://github.com/docker/docker/releases) - [Commits](https://github.com/docker/docker/compare/v26.1.1...v26.1.4) --- updated-dependencies: - dependency-name: github.com/docker/docker dependency-type: indirect ... Signed-off-by: dependabot[bot] * go mod tidy integrations * Patch docker in examples/ --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Tim Ross Co-authored-by: Alan Parra * Bump docker to v26.1.5 --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Tim Ross Co-authored-by: Alan Parra --- examples/service-discovery-api-client/go.mod | 2 +- examples/service-discovery-api-client/go.sum | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- integrations/event-handler/go.mod | 2 +- integrations/event-handler/go.sum | 4 ++-- integrations/terraform/go.mod | 2 +- integrations/terraform/go.sum | 4 ++-- 8 files changed, 12 insertions(+), 12 deletions(-) diff --git a/examples/service-discovery-api-client/go.mod b/examples/service-discovery-api-client/go.mod index b391f9995a84f..f39e5c1b89e5e 100644 --- a/examples/service-discovery-api-client/go.mod +++ b/examples/service-discovery-api-client/go.mod @@ -5,7 +5,7 @@ go 1.21 toolchain go1.21.2 require ( - github.com/docker/docker v26.0.2+incompatible + github.com/docker/docker v26.1.5+incompatible github.com/gravitational/teleport/api v0.0.0-20240220221413-126de63e7e40 github.com/gravitational/trace v1.3.1 google.golang.org/grpc v1.63.0 diff --git a/examples/service-discovery-api-client/go.sum b/examples/service-discovery-api-client/go.sum index ec18cb6c8a9dc..dddb385e9e1eb 100644 --- a/examples/service-discovery-api-client/go.sum +++ b/examples/service-discovery-api-client/go.sum @@ -37,8 +37,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= -github.com/docker/docker v26.0.2+incompatible h1:yGVmKUFGgcxA6PXWAokO0sQL22BrQ67cgVjko8tGdXE= -github.com/docker/docker v26.0.2+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v26.1.5+incompatible h1:NEAxTwEjxV6VbBMBoGG3zPqbiJosIApZjxlbrG9q3/g= +github.com/docker/docker v26.1.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= diff --git a/go.mod b/go.mod index 8514d9b3de13a..e06815623c4f1 100644 --- a/go.mod +++ b/go.mod @@ -300,7 +300,7 @@ require ( github.com/dmarkham/enumer v1.5.9 // indirect github.com/docker/cli v25.0.1+incompatible // indirect github.com/docker/distribution v2.8.3+incompatible // indirect - github.com/docker/docker v26.0.2+incompatible // indirect + github.com/docker/docker v26.1.5+incompatible // indirect github.com/docker/docker-credential-helpers v0.8.1 // indirect github.com/docker/go-connections v0.5.0 // indirect github.com/docker/go-metrics v0.0.1 // indirect diff --git a/go.sum b/go.sum index 4e97ee224ea6a..3588e1d39cfe2 100644 --- a/go.sum +++ b/go.sum @@ -1099,8 +1099,8 @@ github.com/docker/cli v25.0.1+incompatible h1:mFpqnrS6Hsm3v1k7Wa/BO23oz0k121MTbT github.com/docker/cli v25.0.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk= github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v26.0.2+incompatible h1:yGVmKUFGgcxA6PXWAokO0sQL22BrQ67cgVjko8tGdXE= -github.com/docker/docker v26.0.2+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v26.1.5+incompatible h1:NEAxTwEjxV6VbBMBoGG3zPqbiJosIApZjxlbrG9q3/g= +github.com/docker/docker v26.1.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker-credential-helpers v0.8.1 h1:j/eKUktUltBtMzKqmfLB0PAgqYyMHOp5vfsD1807oKo= github.com/docker/docker-credential-helpers v0.8.1/go.mod h1:P3ci7E3lwkZg6XiHdRKft1KckHiO9a2rNtyFbZ/ry9M= github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= diff --git a/integrations/event-handler/go.mod b/integrations/event-handler/go.mod index 4da0cb1e93f6a..15a3450563467 100644 --- a/integrations/event-handler/go.mod +++ b/integrations/event-handler/go.mod @@ -113,7 +113,7 @@ require ( github.com/distribution/reference v0.6.0 // indirect github.com/docker/cli v25.0.1+incompatible // indirect github.com/docker/distribution v2.8.3+incompatible // indirect - github.com/docker/docker v26.0.2+incompatible // indirect + github.com/docker/docker v26.1.5+incompatible // indirect github.com/docker/docker-credential-helpers v0.8.1 // indirect github.com/docker/go-connections v0.5.0 // indirect github.com/docker/go-metrics v0.0.1 // indirect diff --git a/integrations/event-handler/go.sum b/integrations/event-handler/go.sum index 44d41a98ea244..9b1400d62fa62 100644 --- a/integrations/event-handler/go.sum +++ b/integrations/event-handler/go.sum @@ -884,8 +884,8 @@ github.com/docker/cli v25.0.1+incompatible h1:mFpqnrS6Hsm3v1k7Wa/BO23oz0k121MTbT github.com/docker/cli v25.0.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk= github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v26.0.2+incompatible h1:yGVmKUFGgcxA6PXWAokO0sQL22BrQ67cgVjko8tGdXE= -github.com/docker/docker v26.0.2+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v26.1.5+incompatible h1:NEAxTwEjxV6VbBMBoGG3zPqbiJosIApZjxlbrG9q3/g= +github.com/docker/docker v26.1.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker-credential-helpers v0.8.1 h1:j/eKUktUltBtMzKqmfLB0PAgqYyMHOp5vfsD1807oKo= github.com/docker/docker-credential-helpers v0.8.1/go.mod h1:P3ci7E3lwkZg6XiHdRKft1KckHiO9a2rNtyFbZ/ry9M= github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= diff --git a/integrations/terraform/go.mod b/integrations/terraform/go.mod index a9dd05a4748b9..da4331cc79e5d 100644 --- a/integrations/terraform/go.mod +++ b/integrations/terraform/go.mod @@ -128,7 +128,7 @@ require ( github.com/distribution/reference v0.6.0 // indirect github.com/docker/cli v25.0.1+incompatible // indirect github.com/docker/distribution v2.8.3+incompatible // indirect - github.com/docker/docker v26.0.2+incompatible // indirect + github.com/docker/docker v26.1.5+incompatible // indirect github.com/docker/docker-credential-helpers v0.8.1 // indirect github.com/docker/go-connections v0.5.0 // indirect github.com/docker/go-metrics v0.0.1 // indirect diff --git a/integrations/terraform/go.sum b/integrations/terraform/go.sum index c9be34645e6db..78480dbdffbd7 100644 --- a/integrations/terraform/go.sum +++ b/integrations/terraform/go.sum @@ -958,8 +958,8 @@ github.com/docker/cli v25.0.1+incompatible h1:mFpqnrS6Hsm3v1k7Wa/BO23oz0k121MTbT github.com/docker/cli v25.0.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk= github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v26.0.2+incompatible h1:yGVmKUFGgcxA6PXWAokO0sQL22BrQ67cgVjko8tGdXE= -github.com/docker/docker v26.0.2+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v26.1.5+incompatible h1:NEAxTwEjxV6VbBMBoGG3zPqbiJosIApZjxlbrG9q3/g= +github.com/docker/docker v26.1.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker-credential-helpers v0.8.1 h1:j/eKUktUltBtMzKqmfLB0PAgqYyMHOp5vfsD1807oKo= github.com/docker/docker-credential-helpers v0.8.1/go.mod h1:P3ci7E3lwkZg6XiHdRKft1KckHiO9a2rNtyFbZ/ry9M= github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= From 2f14074a9d8f5025cca7ff4cc6fbf24daaf11e7f Mon Sep 17 00:00:00 2001 From: Steven Martin Date: Mon, 12 Aug 2024 09:38:23 -0400 Subject: [PATCH 125/139] docs: update web application guide (#45329) --- .../guides/connecting-apps.mdx | 32 ++++--------------- 1 file changed, 6 insertions(+), 26 deletions(-) diff --git a/docs/pages/enroll-resources/application-access/guides/connecting-apps.mdx b/docs/pages/enroll-resources/application-access/guides/connecting-apps.mdx index 9670c961a4408..0f546f1ebdddc 100644 --- a/docs/pages/enroll-resources/application-access/guides/connecting-apps.mdx +++ b/docs/pages/enroll-resources/application-access/guides/connecting-apps.mdx @@ -2,31 +2,13 @@ title: Web Application Access description: In this getting started guide, learn how to connect an application to your Teleport cluster by running the Teleport Application Service. --- +## Prerequisites -Download the latest version of Teleport for your platform from the [downloads page](https://goteleport.com/download) -and follow the installation [instructions](../../../installation.mdx). +(!docs/pages/includes/edition-prereqs-tabs.mdx!) -## Start Auth/Proxy service - -Create a configuration file for a Teleport service that will be running -the Auth and Proxy Services: - -```yaml -teleport: - data_dir: /var/lib/teleport -auth_service: - enabled: "yes" -proxy_service: - enabled: "yes" - # Set public address proxy will be reachable at. - public_addr: teleport.example.com:3080 -ssh_service: - enabled: "no" -``` - -(!docs/pages/includes/permission-warning.mdx!) - -(!docs/pages/includes/start-teleport.mdx!) +- (!docs/pages/includes/tctl.mdx!) +- Web application to connect to such as Grafana. +- Host where you will run the Teleport Application Service. ### Generate a token @@ -36,8 +18,6 @@ in `/tmp/token`: ```code # Log in to your cluster with tsh so you can use tctl from your local machine. -# You can also run tctl on your Auth Service host without running "tsh login" -# first. $ tsh login --user= --proxy= $ tctl tokens add \ --type=app \ @@ -70,7 +50,7 @@ A Teleport user needs their role's permission to access an application. Teleport comes with a built-in `access` role that grants access to all apps: ```code -$ tctl --config=/path/to/teleport.yaml users add --roles=access appuser +$ tctl users add --roles=access appuser ``` ## Start the Application Service with CLI flags From a22980287cfd54c12f578daad5346138610da021 Mon Sep 17 00:00:00 2001 From: Steven Martin Date: Mon, 12 Aug 2024 09:45:54 -0400 Subject: [PATCH 126/139] [v16] docs: update backup and restore (#45332) * docs: update backup and restore * docs: update language used for tctl get all --- docs/pages/management/operations/backup-restore.mdx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/pages/management/operations/backup-restore.mdx b/docs/pages/management/operations/backup-restore.mdx index fd6b3ad71b568..165b65de5f4f3 100644 --- a/docs/pages/management/operations/backup-restore.mdx +++ b/docs/pages/management/operations/backup-restore.mdx @@ -95,9 +95,9 @@ If you're running Teleport at scale, your teams need to have an automated way to -As of version v4.1, you can now quickly export a collection of resources from -Teleport. This feature was designed to help customers migrate from local storage -to etcd. +You can export a collection of resources from +Teleport using the below command. This feature helps for migrating +from one backend to another. Using `tctl get all --with-secrets` will retrieve the below items: @@ -162,9 +162,9 @@ also apply to a new cluster being bootstrapped from the state of an old cluster: -As of version v4.1, you can now quickly export a collection of resources from -Teleport. This feature was designed to help customers migrate from local storage -to etcd. +You can export a collection of resources from +Teleport using the below command. This feature helps for migrating +from one backend to another. Using `tctl get all --with-secrets` will retrieve the below items: From d4599a60c24919678955b5897f6491fcd41a4858 Mon Sep 17 00:00:00 2001 From: Steven Martin Date: Mon, 12 Aug 2024 09:46:09 -0400 Subject: [PATCH 127/139] [v16] docs: correct Teleport config default reference (#45327) * docs: correct Teleport config default reference * docs: verbiage update for config file in debug troubkeshooting Co-authored-by: Zac Bergquist --------- Co-authored-by: Zac Bergquist --- docs/pages/includes/diagnostics/teleport-debug-config.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/pages/includes/diagnostics/teleport-debug-config.mdx b/docs/pages/includes/diagnostics/teleport-debug-config.mdx index 44e470774fb10..18d6bf50ba472 100644 --- a/docs/pages/includes/diagnostics/teleport-debug-config.mdx +++ b/docs/pages/includes/diagnostics/teleport-debug-config.mdx @@ -1,6 +1,6 @@ If your Teleport configuration is not placed on the default path -(`/var/lib/teleport`), you must to specify its location to the CLI command +(`/etc/teleport.yaml`), you must specify its location to the CLI command using the `-c/--config` flag. From ca40fb7443b72f06b9992b314f21b4a185e01ee5 Mon Sep 17 00:00:00 2001 From: "M.C.M." Date: Mon, 12 Aug 2024 07:19:04 -0700 Subject: [PATCH 128/139] [v16] docs: Correcting role creation steps for Teleport Application Access (#45352) * correcting role creation steps * Update docs/pages/enroll-resources/application-access/cloud-apis/aws-console.mdx Co-authored-by: Paul Gottschling --------- Co-authored-by: Paul Gottschling --- .../cloud-apis/aws-console.mdx | 181 +++++++++--------- 1 file changed, 89 insertions(+), 92 deletions(-) diff --git a/docs/pages/enroll-resources/application-access/cloud-apis/aws-console.mdx b/docs/pages/enroll-resources/application-access/cloud-apis/aws-console.mdx index 2fed857f5a061..2416b5b611964 100644 --- a/docs/pages/enroll-resources/application-access/cloud-apis/aws-console.mdx +++ b/docs/pages/enroll-resources/application-access/cloud-apis/aws-console.mdx @@ -77,95 +77,7 @@ You will create the following resources: |`AssumeRole`|IAM policy|Allows the Application Service to assume other roles in order to proxy user requests to AWS.| |`TeleportAWSAccess` (for EC2 deployments) |EC2 instance profile|Associates the `TeleportAWSAccess` role with your EC2 instance.| -### Configure a role for Teleport users to request - -In this section, you will create a role that Teleport users can request access -to when making requests to AWS APIs. The Teleport Application Service assumes -this role when proxying requests: - -1. Obtain AWS credentials for the account where you will run the Teleport - Application Service and make them available to your terminal shell. - -1. Create a trust policy document, which authorizes an entity to assume the role - you want to protect access to. To do so, create a file called - `ro-access.json` with the following content, replacing with the ID of the AWS account where you will - run the Teleport Application Service: - - ```json - { - "Version": "2012-10-17", - "Statement": [ - { - "Effect": "Allow", - "Principal": { - "AWS": "arn:aws:iam:::role/TeleportAWSAccess" - }, - "Action": "sts:AssumeRole" - } - ] - } - ``` - - In the setup we show in this guide, the Teleport Application Service assumes - the `TeleportAWSAccess` role, then uses that role to assume the - `ExampleReadOnlyAccess` role. With the trust policy above, AWS authorizes - this operation. (We will create the `TeleportAWSAccess` role later in this - guide.) - -